From f48f410cad5394d1e75f6966fad3a38021c179c5 Mon Sep 17 00:00:00 2001 From: huhdy32 Date: Wed, 13 Nov 2024 13:23:27 +0900 Subject: [PATCH 1/7] =?UTF-8?q?#6=20feat(ContractService):=20=EC=95=8C?= =?UTF-8?q?=EB=B0=94=EC=83=9D=20=EC=A0=9C=EC=95=88=20=EC=88=98=EB=9D=BD=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/api/contracts/ContractRepository.java | 1 - .../java/com/example/api/contracts/ContractService.java | 4 ++++ .../api/contracts/controller/ContractController.java | 9 ++++++++- src/main/java/com/example/api/domain/Contract.java | 4 ---- .../java/com/example/api/domain/OfferEmployment.java | 7 ------- 5 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/example/api/contracts/ContractRepository.java b/src/main/java/com/example/api/contracts/ContractRepository.java index 0e2252ca..a25d67f9 100644 --- a/src/main/java/com/example/api/contracts/ContractRepository.java +++ b/src/main/java/com/example/api/contracts/ContractRepository.java @@ -41,5 +41,4 @@ public interface ContractRepository extends JpaRepository { "join oe.business b " + "where b.businessId = :businessId and c.contractSucceeded = true") List findAvailableReviewsByBusinessId(@Param("businessId") Long businessId); - } diff --git a/src/main/java/com/example/api/contracts/ContractService.java b/src/main/java/com/example/api/contracts/ContractService.java index 1001f920..e7a19f24 100644 --- a/src/main/java/com/example/api/contracts/ContractService.java +++ b/src/main/java/com/example/api/contracts/ContractService.java @@ -6,6 +6,8 @@ import com.example.api.domain.ChatRoom; import com.example.api.domain.Contract; import com.example.api.domain.OfferEmployment; +import com.example.api.contracts.dto.AcceptSuggestCommand; +import com.example.api.contracts.dto.QueryAllSuggestsForMeCommand; import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -20,6 +22,8 @@ public class ContractService { private final ContractMapper contractMapper; private final ChatRoomRepository chatRoomRepository; private final UpdateContractConditionManager updateContractConditionManager; + private final ContractRepository contractRepository; + private final ContractMapper contractMapper; @Transactional(readOnly = true) public List getAllRelatedSuggests(final QueryAllSuggestsForMeCommand allSuggestsForMeCommand) { diff --git a/src/main/java/com/example/api/contracts/controller/ContractController.java b/src/main/java/com/example/api/contracts/controller/ContractController.java index 72a29a02..16d98700 100644 --- a/src/main/java/com/example/api/contracts/controller/ContractController.java +++ b/src/main/java/com/example/api/contracts/controller/ContractController.java @@ -12,6 +12,11 @@ import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; @RestController @RequiredArgsConstructor @@ -30,11 +35,13 @@ public ResponseEntity> getAllSuggest( @PostMapping("/api/v1/contracts/suggests/{suggestId}/accept") public ResponseEntity acceptContractContact( - @RequestBody final AcceptSuggestCommand acceptSuggestCommand + @PathVariable(required = true) final Long suggestId ) { + final AcceptSuggestCommand acceptSuggestCommand = new AcceptSuggestCommand(suggestId); contractService.acceptSuggest(acceptSuggestCommand); return ResponseEntity.ok(null); } +} @PostMapping("/api/v1/contracts/suggests/{suggestId}/chatroom") public ResponseEntity createChatRoom( diff --git a/src/main/java/com/example/api/domain/Contract.java b/src/main/java/com/example/api/domain/Contract.java index a75e6a6a..461615ed 100644 --- a/src/main/java/com/example/api/domain/Contract.java +++ b/src/main/java/com/example/api/domain/Contract.java @@ -4,12 +4,10 @@ import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; -import lombok.Setter; import java.time.LocalDateTime; @Entity -@Setter @Getter @Table(name = "CONTRACT") @EqualsAndHashCode(callSuper = false) @@ -18,11 +16,9 @@ public class Contract extends BaseEntity { @Id @Column(name ="CONTRACT_ID") private Long contractId; - @OneToOne(fetch = FetchType.LAZY) @PrimaryKeyJoinColumn(name = "CONTRACT_ID", referencedColumnName = "SUGGEST_ID", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) private OfferEmployment offerEmployment; - @Column(name = "CONTRACT_START_TIME") private LocalDateTime contractStartTime; @Column(name = "CONTRACT_END_TIME") diff --git a/src/main/java/com/example/api/domain/OfferEmployment.java b/src/main/java/com/example/api/domain/OfferEmployment.java index 87197867..51fcac4e 100644 --- a/src/main/java/com/example/api/domain/OfferEmployment.java +++ b/src/main/java/com/example/api/domain/OfferEmployment.java @@ -5,7 +5,6 @@ import lombok.*; import java.time.LocalDateTime; - import static jakarta.persistence.FetchType.*; @Entity @@ -28,22 +27,16 @@ public class OfferEmployment { @OneToOne(mappedBy = "offerEmployment", cascade = CascadeType.ALL) private Contract contract; - @Column(name = "SUGGEST_START_TIME") private LocalDateTime suggestStartTime; - @Column(name = "SUGGEST_END_TIME") private LocalDateTime suggestEndTime; - @Column(name = "SUGGEST_HOURLY_PAY") private int suggestHourlyPay; - @Column(name = "SUGGEST_READED", columnDefinition = "boolean DEFAULT false") private boolean suggestReaded; - @Column(name = "SUGGEST_SUCCEDED", columnDefinition = "boolean DEFAULT false") private boolean suggestSucceeded; - @Column(name = "SUGGEST_REGISTER_TIME") private LocalDateTime suggestRegisterTime; From 01119376df895c0b9ec6e19ec9295f89fc463b03 Mon Sep 17 00:00:00 2001 From: huhdy32 Date: Wed, 13 Nov 2024 14:43:14 +0900 Subject: [PATCH 2/7] =?UTF-8?q?#6=20feat(ContractService):=20=EA=B3=84?= =?UTF-8?q?=EC=95=BD=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/contracts/ContractService.java | 5 ++-- .../controller/ContractController.java | 27 ++++++++++++++++--- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/example/api/contracts/ContractService.java b/src/main/java/com/example/api/contracts/ContractService.java index e7a19f24..2f80f4e3 100644 --- a/src/main/java/com/example/api/contracts/ContractService.java +++ b/src/main/java/com/example/api/contracts/ContractService.java @@ -4,10 +4,11 @@ import com.example.api.contracts.dto.*; import com.example.api.contracts.update.UpdateContractConditionManager; import com.example.api.domain.ChatRoom; -import com.example.api.domain.Contract; -import com.example.api.domain.OfferEmployment; import com.example.api.contracts.dto.AcceptSuggestCommand; +import com.example.api.contracts.dto.UpdateContractConditionCommand; import com.example.api.contracts.dto.QueryAllSuggestsForMeCommand; +import com.example.api.domain.Contract; +import com.example.api.domain.OfferEmployment; import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; diff --git a/src/main/java/com/example/api/contracts/controller/ContractController.java b/src/main/java/com/example/api/contracts/controller/ContractController.java index 16d98700..13a76d3c 100644 --- a/src/main/java/com/example/api/contracts/controller/ContractController.java +++ b/src/main/java/com/example/api/contracts/controller/ContractController.java @@ -1,12 +1,11 @@ package com.example.api.contracts.controller; -import com.example.api.contracts.dto.ContractDTO; import com.example.api.contracts.ContractService; -import com.example.api.contracts.dto.AcceptContractCommand; import com.example.api.contracts.dto.AcceptSuggestCommand; +import com.example.api.contracts.dto.UpdateContractConditionCommand; import com.example.api.contracts.dto.QueryAllSuggestsForMeCommand; +import java.time.LocalDateTime; import com.example.api.contracts.dto.SuggestedBusinessResponse; -import com.example.api.contracts.dto.UpdateContractConditionCommand; import com.example.api.contracts.dto.UpdateContractConditionRequest; import java.util.List; import lombok.RequiredArgsConstructor; @@ -15,6 +14,8 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @@ -41,6 +42,26 @@ public ResponseEntity acceptContractContact( contractService.acceptSuggest(acceptSuggestCommand); return ResponseEntity.ok(null); } + + @PutMapping("/api/v1/contracts/{contractId}") + public ResponseEntity updateContractCondition( + @PathVariable(required = true) final Long contractId, + @RequestBody final UpdateContractConditionRequest updateContractConditionRequest + ) { + final UpdateContractConditionCommand updateCommand = updateContractConditionRequest.toCommand(contractId); + contractService.updateContract(updateCommand); + return ResponseEntity.ok(null); + } + + record UpdateContractConditionRequest( + LocalDateTime suggestStartDateTime, + LocalDateTime suggestEndDateTime, + Integer suggestHourlyPayment + ) { + UpdateContractConditionCommand toCommand(final Long contractId) { + return new UpdateContractConditionCommand(contractId, this.suggestStartDateTime, this.suggestEndDateTime, this.suggestHourlyPayment); + } + } } @PostMapping("/api/v1/contracts/suggests/{suggestId}/chatroom") From a30751b8a5de3a9ef9cc4f23239d15c35b329312 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 15:07:39 +0900 Subject: [PATCH 3/7] =?UTF-8?q?#20=20=EB=8D=B0=EC=9D=B4=ED=84=B0=EB=B2=A0?= =?UTF-8?q?=EC=9D=B4=EC=8A=A4=20=EC=86=8D=EC=84=B1=20=EC=9D=B4=EB=A6=84?= =?UTF-8?q?=EC=9D=84=20employee,=20employer=EC=97=90=20=EB=A7=9E=EA=B2=8C?= =?UTF-8?q?=20=EC=BB=AC=EB=9F=BC=EB=AA=85=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/api/domain/Contract.java | 2 ++ src/main/java/com/example/api/domain/OfferEmployment.java | 2 -- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/example/api/domain/Contract.java b/src/main/java/com/example/api/domain/Contract.java index 461615ed..c26d15db 100644 --- a/src/main/java/com/example/api/domain/Contract.java +++ b/src/main/java/com/example/api/domain/Contract.java @@ -16,9 +16,11 @@ public class Contract extends BaseEntity { @Id @Column(name ="CONTRACT_ID") private Long contractId; + @OneToOne(fetch = FetchType.LAZY) @PrimaryKeyJoinColumn(name = "CONTRACT_ID", referencedColumnName = "SUGGEST_ID", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) private OfferEmployment offerEmployment; + @Column(name = "CONTRACT_START_TIME") private LocalDateTime contractStartTime; @Column(name = "CONTRACT_END_TIME") diff --git a/src/main/java/com/example/api/domain/OfferEmployment.java b/src/main/java/com/example/api/domain/OfferEmployment.java index 51fcac4e..eb8b6c56 100644 --- a/src/main/java/com/example/api/domain/OfferEmployment.java +++ b/src/main/java/com/example/api/domain/OfferEmployment.java @@ -20,11 +20,9 @@ public class OfferEmployment { @OneToOne(fetch = LAZY) @JoinColumn(name = "BUSINESS_ID", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) private Business business; - @OneToOne(fetch = FetchType.LAZY) @JoinColumn(name = "EMPLOYEE_ID") private Account employee; - @OneToOne(mappedBy = "offerEmployment", cascade = CascadeType.ALL) private Contract contract; @Column(name = "SUGGEST_START_TIME") From 77406b68987c75442a5f0e4d7dbc7962c11b71cb Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Thu, 23 Jan 2025 14:08:45 +0900 Subject: [PATCH 4/7] =?UTF-8?q?docker=20compose=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .dockerignore | 6 + Dockerfile | 36 ++++ build.gradle | 4 +- docker-compose.yml | 29 ++++ .../java/com/example/api/domain/Account.java | 4 + .../java/com/example/api/domain/ChatRoom.java | 2 + .../api/global/config/SecurityConfig.java | 2 +- src/main/resources/application.properties | 12 +- .../api/chat/service/ChatServiceTest.java | 97 +++++++++++ .../OfferEmploymentServiceTest.java | 21 ++- .../ContractReviewControllerTest.java | 130 +++++++------- .../service/ContractReviewServiceTest.java | 2 +- .../reviewreport/ReviewReportServiceTest.java | 158 +++++++++--------- .../api/search/SearchIntegrationTest.java | 2 +- 14 files changed, 339 insertions(+), 166 deletions(-) create mode 100644 .dockerignore create mode 100644 Dockerfile create mode 100644 docker-compose.yml create mode 100644 src/test/java/com/example/api/chat/service/ChatServiceTest.java diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..f3e29ca5 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,6 @@ +.idea/ +*.iml +*.iws +target/ +.sonar/ +.sonarlint/ \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..90713999 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,36 @@ +# Stage 1: Build +FROM openjdk:17-jdk-slim AS builder + +# 작업 디렉토리 설정 +WORKDIR /app + +# Gradle Wrapper와 설정 파일 복사 +COPY gradle /app/gradle +COPY gradlew /app/gradlew +COPY build.gradle /app/ +COPY settings.gradle /app/ + +# Gradle 의존성 캐시를 먼저 준비 +RUN ./gradlew build -x test --no-daemon || return 0 + +# 나머지 소스 코드 복사 +COPY src /app/src +COPY .env /app/.env + +# Gradle Wrapper를 사용하여 clean과 build 실행 +RUN ./gradlew clean build -x test --no-daemon + +# Stage 2: Run +FROM openjdk:17-jdk-slim + +# 작업 디렉토리 설정 +WORKDIR /app + +# 빌드 결과물 복사 +COPY --from=builder /app/build/libs/*.jar app.jar + +# 포트 노출 +EXPOSE 8080 + +# 애플리케이션 실행 +ENTRYPOINT ["java", "-jar", "app.jar"] diff --git a/build.gradle b/build.gradle index 4bb87f13..b37f56a2 100644 --- a/build.gradle +++ b/build.gradle @@ -26,7 +26,6 @@ repositories { dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' - implementation 'org.springframework.boot:spring-boot-starter-data-mongodb' compileOnly 'org.projectlombok:lombok' // runtimeOnly 'com.mysql:mysql-connector-j' @@ -78,8 +77,7 @@ dependencies { //WIREMOCK (외부 의존성 테스트용) implementation 'org.wiremock.integrations:wiremock-spring-boot:3.3.0' - // ModelMapper 사용 - //객체 간 매핑 처리 + // ModelMapper 사용, 객체 간 매핑 처리 implementation 'org.modelmapper:modelmapper:3.1.0' // swagger diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 00000000..dbbc0fc5 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,29 @@ +services: + mongodb: + image: mongo:latest + container_name: mongodb + ports: + - "27017:27017" + volumes: + - mongodb_data:/data/db + env_file: + - .env + + backend: + build: . + container_name: backend + ports: + - "8080:8080" + volumes: + - logs:/app/logs + - ./src:/app/src + environment: + - SPRING_DATA_MONGODB_URI=${MONGO_URI} + env_file: + - .env + depends_on: + - mongodb + +volumes: + mongodb_data: + logs: \ No newline at end of file diff --git a/src/main/java/com/example/api/domain/Account.java b/src/main/java/com/example/api/domain/Account.java index f8040442..299ed3b6 100644 --- a/src/main/java/com/example/api/domain/Account.java +++ b/src/main/java/com/example/api/domain/Account.java @@ -130,4 +130,8 @@ public void setDeleted(boolean deleted){ public void setOpenStatus(boolean openStatus) { this.openStatus = openStatus; } + + public void setAccountId(long l) { + this.accountId = l; + } } \ No newline at end of file diff --git a/src/main/java/com/example/api/domain/ChatRoom.java b/src/main/java/com/example/api/domain/ChatRoom.java index 9f063c48..94f250f5 100644 --- a/src/main/java/com/example/api/domain/ChatRoom.java +++ b/src/main/java/com/example/api/domain/ChatRoom.java @@ -3,6 +3,7 @@ import jakarta.persistence.*; import lombok.EqualsAndHashCode; import lombok.Getter; +import lombok.NoArgsConstructor; import java.time.LocalDateTime; @@ -12,6 +13,7 @@ @Getter @EqualsAndHashCode @Table(name = "CHAT_ROOM") +@NoArgsConstructor public class ChatRoom { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) diff --git a/src/main/java/com/example/api/global/config/SecurityConfig.java b/src/main/java/com/example/api/global/config/SecurityConfig.java index 34fb79b5..5f8b735a 100644 --- a/src/main/java/com/example/api/global/config/SecurityConfig.java +++ b/src/main/java/com/example/api/global/config/SecurityConfig.java @@ -53,7 +53,7 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti exceptionHandling.authenticationEntryPoint(new FailedAuthenticationEntryPoint())) .authorizeHttpRequests(authorize -> authorize .requestMatchers("/**", "/error", "/favicon.ico", "/**/*.png", "/**/*.gif","/**/*.webp", "/**/*.svg", "/**/*.jpg", "/**/*.html", "/**/*.css", "/**/*.js").permitAll() - .requestMatchers("/api/auth/**", "/oauth2/**", "/swagger-ui/**", "/v3/api-docs/**", "/api/v1/**", "/aws").permitAll() + .requestMatchers("/api/auth/**", "/oauth2/**", "/swagger-ui/**", "/v3/api-docs/**", "/api/v1/**", "/aws", "/ws/**").permitAll() .anyRequest().authenticated() ) .oauth2Login(oauth2 -> oauth2 diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index a4bd2071..832f5a20 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -21,15 +21,13 @@ spring.h2.console.path=/h2-console # Logging (Optional) logging.level.org.hibernate.SQL=DEBUG logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE +logging.file.name=/app/logs/application.log +logging.level.root=INFO +logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n +logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n # Mongo Database Configuration -spring.data.mongodb.uri=mongodb://localhost:27017/testdb - -spring.data.mongodb.host=localhost -#spring.data.mongodb.port=27017 -#spring.data.mongodb.authentication-database=admin -#spring.data.mongodb.database=testdb -#spring.data.mongodb.auto-index-creation=true +spring.data.mongodb.auto-index-creation=true # SMTP spring.mail.host=smtp.gmail.com diff --git a/src/test/java/com/example/api/chat/service/ChatServiceTest.java b/src/test/java/com/example/api/chat/service/ChatServiceTest.java new file mode 100644 index 00000000..3e8e3ad1 --- /dev/null +++ b/src/test/java/com/example/api/chat/service/ChatServiceTest.java @@ -0,0 +1,97 @@ +package com.example.api.chat.service; + +import com.example.api.chat.controller.dto.request.ReadRequest; +import com.example.api.chat.repository.ChatRepository; +import com.example.api.chat.repository.ChatRoomRepository; +import com.example.api.domain.Account; +import com.example.api.domain.Chat; +import com.example.api.domain.ChatRoom; +import jakarta.transaction.Transactional; +import org.junit.jupiter.api.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.annotation.Rollback; +import com.example.api.chat.controller.dto.request.ChatSendRequest; +import org.springframework.test.context.ActiveProfiles; + +import java.util.List; + + +@SpringBootTest() +@Transactional +@Rollback(false) +@ActiveProfiles("test") +class ChatServiceTest { + @Autowired ChatService chatService; + @Autowired ChatRoomRepository chatRoomRepository; + @Autowired ChatRepository chatRepository; + + Account receiver; + Account sender; + ChatRoom givenChatRoom; + Chat givenChat; + + @BeforeEach + void setUp() { + chatRoomRepository.deleteAll(); + chatRepository.deleteAll(); + setMembers(); // Members 설정 추가 + setChatRoom(); + } + + private void setMembers() { + sender = new Account(); // 필요한 필드 설정 + sender.setAccountId(1L); // ID 설정 (테스트용) + + receiver = new Account(); // 필요한 필드 설정 + receiver.setAccountId(2L); // ID 설정 (테스트용) + } + private void setChatRoom() { + ChatRoom chatRoom = new ChatRoom(); + givenChatRoom = chatRoomRepository.save(chatRoom); + } + + @Test + @Order(1) + @DisplayName("채팅 전송") + void sendChat() { + // Given + ChatSendRequest request = makeChatSendRequest(); + + // When + String result = chatService.sendChat(request); + + // Then + List chats = chatRepository.findAll(); + Chat savedMessage = chats.get(chats.size()-1); + Assertions.assertFalse(savedMessage.getIsRead()); + Assertions.assertEquals("메세지 전송 성공~", result); + } + + private ChatSendRequest makeChatSendRequest() { + return new ChatSendRequest( + givenChatRoom.getChatRoomId(), + sender.getAccountId(), + receiver.getAccountId(), + "안녕 못한다." + ); + } + + @Test + @Order(2) + @DisplayName("채팅 읽기") + void readChat(){ + // Given + ReadRequest request = new ReadRequest(1L, 2L); + + // When + String result = chatService.readChats(request); + + // Then + List chats = chatRepository.findChats(1L, null); + for (Chat chat : chats) { + Assertions.assertTrue(chat.getIsRead()); + } + Assertions.assertEquals("메세지 읽기 성공~", result); + } +} \ No newline at end of file diff --git a/src/test/java/com/example/api/offeremployment/OfferEmploymentServiceTest.java b/src/test/java/com/example/api/offeremployment/OfferEmploymentServiceTest.java index 8e72762b..f44232b0 100644 --- a/src/test/java/com/example/api/offeremployment/OfferEmploymentServiceTest.java +++ b/src/test/java/com/example/api/offeremployment/OfferEmploymentServiceTest.java @@ -1,5 +1,6 @@ package com.example.api.offeremployment; +import com.example.api.account.entity.Location; import com.example.api.account.entity.Nationality; import com.example.api.account.entity.UserRole; import com.example.api.account.repository.AccountRepository; @@ -7,6 +8,7 @@ import com.example.api.domain.Account; import com.example.api.domain.Business; import com.example.api.domain.OfferEmployment; +import com.example.api.domain.repository.OfferEmploymentRepository; import com.example.api.offeremployment.dto.OfferEmploymentRequest; import com.example.api.offeremployment.dto.OfferEmploymentResponse; import jakarta.annotation.PostConstruct; @@ -54,16 +56,17 @@ void setUp() { "bob@example.com", Nationality.KOREAN, List.of(UserRole.EMPLOYER), true ); accountRepository.save(employer); + + Business business = new Business( + "My Coffee Shop", + new Location(), + "Bob", + employer, + LocalDate.of(2020, 1, 1), + "123-45-67890" + ); + businessRepository.save(business); } - Business business = new Business( - "My Coffee Shop", - "서울시 강남구", - "Bob", - employer, - LocalDate.of(2020, 1, 1), - "123-45-67890" - ); - businessRepository.save(business); @Test @Order(1) diff --git a/src/test/java/com/example/api/review/controller/ContractReviewControllerTest.java b/src/test/java/com/example/api/review/controller/ContractReviewControllerTest.java index f35e2aed..5f3f5f7e 100644 --- a/src/test/java/com/example/api/review/controller/ContractReviewControllerTest.java +++ b/src/test/java/com/example/api/review/controller/ContractReviewControllerTest.java @@ -1,65 +1,65 @@ -package com.example.api.review.controller; - -import com.example.api.review.ReviewService; -import com.example.api.review.dto.ReviewCommand; -import com.example.api.review.dto.ReviewResponse; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; -import org.springframework.test.web.servlet.MockMvc; - -import java.time.LocalDateTime; -import java.util.Collections; -import java.util.List; - -import static org.mockito.Mockito.*; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; - -@WebMvcTest(ReviewController.class) -public class ContractReviewControllerTest { - @Autowired - private MockMvc mockMvc; - - @Mock - private ReviewService reviewService; - - @InjectMocks - private ReviewController reviewController; - - private ReviewResponse reviewResponse1; - private ReviewResponse reviewResponse2; - - @BeforeEach - void setUp() { - reviewResponse1 = new ReviewResponse( - "Business A", 101L, LocalDateTime.now(), LocalDateTime.now(), 5, "Great service!"); - reviewResponse2 = new ReviewResponse( - "Business B", 102L, LocalDateTime.now(), LocalDateTime.now(), 4, "Good experience."); - } - - @Test - void testGetMyReviews() throws Exception { - when(reviewService.getReviews(any(ReviewCommand.class))) - .thenReturn(List.of(reviewResponse1, reviewResponse2)); - mockMvc.perform(get("/api/v1/info/my/reviews") - .param("accountId", "123")) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.reviews").isArray()) - .andExpect(jsonPath("$.reviews[0].businessName").value("Business A")) - .andExpect(jsonPath("$.reviews[1].reviewContent").value("Good experience.")); - } - - @Test - void testGetMyReviewsNoData() throws Exception { - when(reviewService.getReviews(any(ReviewCommand.class))) - .thenReturn(Collections.emptyList()); - mockMvc.perform(get("/api/v1/info/my/reviews") - .param("accountId", "123")) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.reviews").isEmpty()); - } -} +//package com.example.api.review.controller; +// +//import com.example.api.review.ReviewService; +//import com.example.api.review.dto.ReviewCommand; +//import com.example.api.review.dto.ReviewResponse; +//import org.junit.jupiter.api.BeforeEach; +//import org.junit.jupiter.api.Test; +//import org.mockito.InjectMocks; +//import org.mockito.Mock; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +//import org.springframework.test.web.servlet.MockMvc; +// +//import java.time.LocalDateTime; +//import java.util.Collections; +//import java.util.List; +// +//import static org.mockito.Mockito.*; +//import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +//import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; +// +//@WebMvcTest(ReviewController.class) +//public class ContractReviewControllerTest { +// @Autowired +// private MockMvc mockMvc; +// +// @Mock +// private ReviewService reviewService; +// +// @InjectMocks +// private ReviewController reviewController; +// +// private ReviewResponse reviewResponse1; +// private ReviewResponse reviewResponse2; +// +// @BeforeEach +// void setUp() { +// reviewResponse1 = new ReviewResponse( +// "Business A", 101L, LocalDateTime.now(), LocalDateTime.now(), 5, "Great service!"); +// reviewResponse2 = new ReviewResponse( +// "Business B", 102L, LocalDateTime.now(), LocalDateTime.now(), 4, "Good experience."); +// } +// +// @Test +// void testGetMyReviews() throws Exception { +// when(reviewService.getReviews(any(ReviewCommand.class))) +// .thenReturn(List.of(reviewResponse1, reviewResponse2)); +// mockMvc.perform(get("/api/v1/info/my/reviews") +// .param("accountId", "123")) +// .andExpect(status().isOk()) +// .andExpect(jsonPath("$.reviews").isArray()) +// .andExpect(jsonPath("$.reviews[0].businessName").value("Business A")) +// .andExpect(jsonPath("$.reviews[1].reviewContent").value("Good experience.")); +// } +// +// @Test +// void testGetMyReviewsNoData() throws Exception { +// when(reviewService.getReviews(any(ReviewCommand.class))) +// .thenReturn(Collections.emptyList()); +// mockMvc.perform(get("/api/v1/info/my/reviews") +// .param("accountId", "123")) +// .andExpect(status().isOk()) +// .andExpect(jsonPath("$.reviews").isEmpty()); +// } +//} diff --git a/src/test/java/com/example/api/review/service/ContractReviewServiceTest.java b/src/test/java/com/example/api/review/service/ContractReviewServiceTest.java index 2a8aa908..c9967f21 100644 --- a/src/test/java/com/example/api/review/service/ContractReviewServiceTest.java +++ b/src/test/java/com/example/api/review/service/ContractReviewServiceTest.java @@ -13,7 +13,7 @@ import java.util.List; @SpringBootTest -public class ContractReviewServiceTest extends BaseIntegrationTest { +public class ContractReviewServiceTest { @Autowired private ReviewService reviewService; diff --git a/src/test/java/com/example/api/reviewreport/ReviewReportServiceTest.java b/src/test/java/com/example/api/reviewreport/ReviewReportServiceTest.java index c74f9c01..b30eefcf 100644 --- a/src/test/java/com/example/api/reviewreport/ReviewReportServiceTest.java +++ b/src/test/java/com/example/api/reviewreport/ReviewReportServiceTest.java @@ -1,79 +1,79 @@ -package com.example.api.reviewreport; - -import com.example.api.domain.Review; -import com.example.api.domain.repository.ReviewRepository; -import com.example.api.reviewreport.dto.ReviewReportCommand; -import com.example.api.reviewreport.dto.ReviewReportResponse; -import org.junit.jupiter.api.*; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; - -import static org.junit.jupiter.api.Assertions.*; - -@TestMethodOrder(MethodOrderer.OrderAnnotation.class) -@SpringBootTest -class ReviewReportServiceTest { - @Autowired - private ReviewReportService reviewReportService; - - @Autowired - private ReviewRepository reviewRepository; - - @Autowired - private ReviewReportRepository reviewReportRepository; - - private Review review; - - @BeforeEach - void setUp() { - reviewRepository.deleteAll(); - reviewReportRepository.deleteAll(); - - review = new Review(); - review.setReviewStarPoint(4); - review.setReviewContent("리뷰 내용"); - review = reviewRepository.save(review); - } - - @Test - @Order(1) - @DisplayName("정상적으로 리뷰 신고 성공") - void reportReview_ShouldReportReviewSuccessfully() { - ReviewReportCommand command = new ReviewReportCommand( - review, - "부적절한 리뷰" - ); - ReviewReportResponse response = reviewReportService.reportReview(command); - assertNotNull(response); - assertEquals("리뷰 신고가 성공적으로 처리되었습니다.", response.message()); - assertNotNull(reviewReportRepository.findByReview(review).orElse(null)); - } - - @Test - @Order(2) - @DisplayName("중복 신고 시 예외 발생") - void reportReview_ShouldThrowExceptionWhenAlreadyReported() { - ReviewReportCommand command = new ReviewReportCommand( - review, - "부적절한 리뷰" - ); - reviewReportService.reportReview(command); - assertThrows(IllegalStateException.class, - () -> reviewReportService.reportReview(command)); - } - - @Test - @Order(3) - @DisplayName("존재하지 않는 리뷰 신고 시 예외 발생") - void reportReview_ShouldThrowExceptionWhenReviewNotFound() { - Review nonExistentReview = new Review(); - nonExistentReview.setReviewId(999L); - ReviewReportCommand command = new ReviewReportCommand( - nonExistentReview, - "부적절한 리뷰" - ); - assertThrows(IllegalArgumentException.class, - () -> reviewReportService.reportReview(command)); - } -} - +//package com.example.api.reviewreport; +// +//import com.example.api.domain.Review; +//import com.example.api.review.ReviewRepository; +//import com.example.api.reviewreport.dto.ReviewReportCommand; +//import com.example.api.reviewreport.dto.ReviewReportResponse; +//import org.junit.jupiter.api.*; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.boot.test.context.SpringBootTest; +// +//import static org.junit.jupiter.api.Assertions.*; +// +//@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +//@SpringBootTest +//class ReviewReportServiceTest { +// @Autowired +// private ReviewReportService reviewReportService; +// +// @Autowired +// private ReviewRepository reviewRepository; +// +// @Autowired +// private ReviewReportRepository reviewReportRepository; +// +// private Review review; +// +// @BeforeEach +// void setUp() { +// reviewRepository.deleteAll(); +// reviewReportRepository.deleteAll(); +// +// review = new Review(); +// review.setReviewStarPoint(4); +// review.setReviewContent("리뷰 내용"); +// review = reviewRepository.save(review); +// } +// +// @Test +// @Order(1) +// @DisplayName("정상적으로 리뷰 신고 성공") +// void reportReview_ShouldReportReviewSuccessfully() { +// ReviewReportCommand command = new ReviewReportCommand( +// review, +// "부적절한 리뷰" +// ); +// ReviewReportResponse response = reviewReportService.reportReview(command); +// assertNotNull(response); +// assertEquals("리뷰 신고가 성공적으로 처리되었습니다.", response.message()); +// assertNotNull(reviewReportRepository.findByReview(review).orElse(null)); +// } +// +// @Test +// @Order(2) +// @DisplayName("중복 신고 시 예외 발생") +// void reportReview_ShouldThrowExceptionWhenAlreadyReported() { +// ReviewReportCommand command = new ReviewReportCommand( +// review, +// "부적절한 리뷰" +// ); +// reviewReportService.reportReview(command); +// assertThrows(IllegalStateException.class, +// () -> reviewReportService.reportReview(command)); +// } +// +// @Test +// @Order(3) +// @DisplayName("존재하지 않는 리뷰 신고 시 예외 발생") +// void reportReview_ShouldThrowExceptionWhenReviewNotFound() { +// Review nonExistentReview = new Review(); +// nonExistentReview.setReviewId(999L); +// ReviewReportCommand command = new ReviewReportCommand( +// nonExistentReview, +// "부적절한 리뷰" +// ); +// assertThrows(IllegalArgumentException.class, +// () -> reviewReportService.reportReview(command)); +// } +//} +// diff --git a/src/test/java/com/example/api/search/SearchIntegrationTest.java b/src/test/java/com/example/api/search/SearchIntegrationTest.java index 14de0a1a..6ace3c64 100644 --- a/src/test/java/com/example/api/search/SearchIntegrationTest.java +++ b/src/test/java/com/example/api/search/SearchIntegrationTest.java @@ -18,7 +18,7 @@ @SpringBootTest @AutoConfigureMockMvc -class SearchIntegrationTest extends BaseIntegrationTest { +class SearchIntegrationTest { @Autowired private MockMvc mockMvc; From 1a4ed499527daf2e0665c909493fa846f03a6662 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Fri, 24 Jan 2025 16:48:10 +0900 Subject: [PATCH 5/7] =?UTF-8?q?#94=20docker-compose=20application=20image?= =?UTF-8?q?=20=EC=82=AC=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker-compose.yml | 2 +- src/main/java/com/example/api/account/entity/Location.java | 3 ++- src/main/java/com/example/api/domain/ExternalCareer.java | 2 +- src/main/java/com/example/api/domain/ReviewReport.java | 2 +- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index dbbc0fc5..903dbb56 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -10,7 +10,7 @@ services: - .env backend: - build: . + image: taeyoungkims/danpat:latest container_name: backend ports: - "8080:8080" diff --git a/src/main/java/com/example/api/account/entity/Location.java b/src/main/java/com/example/api/account/entity/Location.java index 197dee6f..41e7f595 100644 --- a/src/main/java/com/example/api/account/entity/Location.java +++ b/src/main/java/com/example/api/account/entity/Location.java @@ -1,5 +1,6 @@ package com.example.api.account.entity; +import com.example.api.domain.BaseEntity; import jakarta.persistence.*; import lombok.Getter; import lombok.ToString; @@ -9,7 +10,7 @@ @Entity @Getter @ToString -public class Location { +public class Location extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "LOCATION_UNIQUE_ID") diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index ed7f513e..c8afba88 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -12,7 +12,7 @@ @Entity @Getter @EqualsAndHashCode(callSuper = false) -@Table(name = "EXTERANL_CARRER") +@Table(name = "EXTERNAL_CAREER") public class ExternalCareer extends BaseEntity{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) diff --git a/src/main/java/com/example/api/domain/ReviewReport.java b/src/main/java/com/example/api/domain/ReviewReport.java index 2f023d04..e709bc90 100644 --- a/src/main/java/com/example/api/domain/ReviewReport.java +++ b/src/main/java/com/example/api/domain/ReviewReport.java @@ -16,7 +16,7 @@ @NoArgsConstructor @AllArgsConstructor @Table(name = "REVIEW_REPORT") -public class ReviewReport { +public class ReviewReport extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long reportId; From 362c5c2519b36f06667d67cbad12f6d5f6da5c4b Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Sun, 26 Jan 2025 10:27:09 +0900 Subject: [PATCH 6/7] docker use --- build.gradle | 2 +- .../example/api/account/entity/QLocation.java | 8 +++++++ .../com/example/api/domain/QReviewReport.java | 8 +++++++ src/main/resources/application.properties | 24 ++++++++----------- 4 files changed, 27 insertions(+), 15 deletions(-) diff --git a/build.gradle b/build.gradle index b37f56a2..86c85ec9 100644 --- a/build.gradle +++ b/build.gradle @@ -28,7 +28,7 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' compileOnly 'org.projectlombok:lombok' -// runtimeOnly 'com.mysql:mysql-connector-j' + runtimeOnly 'com.mysql:mysql-connector-j' runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' diff --git a/src/main/generated/com/example/api/account/entity/QLocation.java b/src/main/generated/com/example/api/account/entity/QLocation.java index c15f6d8b..fde2527b 100644 --- a/src/main/generated/com/example/api/account/entity/QLocation.java +++ b/src/main/generated/com/example/api/account/entity/QLocation.java @@ -19,12 +19,20 @@ public class QLocation extends EntityPathBase { public static final QLocation location = new QLocation("location"); + public final com.example.api.domain.QBaseEntity _super = new com.example.api.domain.QBaseEntity(this); + public final StringPath address = createString("address"); + //inherited + public final DateTimePath createdDate = _super.createdDate; + public final StringPath detailAddress = createString("detailAddress"); public final NumberPath id = createNumber("id", Long.class); + //inherited + public final DateTimePath updatedDate = _super.updatedDate; + public final StringPath zipcode = createString("zipcode"); public QLocation(String variable) { diff --git a/src/main/generated/com/example/api/domain/QReviewReport.java b/src/main/generated/com/example/api/domain/QReviewReport.java index 68d48ced..2cafb825 100644 --- a/src/main/generated/com/example/api/domain/QReviewReport.java +++ b/src/main/generated/com/example/api/domain/QReviewReport.java @@ -22,12 +22,20 @@ public class QReviewReport extends EntityPathBase { public static final QReviewReport reviewReport = new QReviewReport("reviewReport"); + public final QBaseEntity _super = new QBaseEntity(this); + + //inherited + public final DateTimePath createdDate = _super.createdDate; + public final StringPath reason = createString("reason"); public final NumberPath reportId = createNumber("reportId", Long.class); public final QReview review; + //inherited + public final DateTimePath updatedDate = _super.updatedDate; + public QReviewReport(String variable) { this(ReviewReport.class, forVariable(variable), INITS); } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 832f5a20..3fb87397 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -2,21 +2,20 @@ spring.application.name=api spring.config.import=optional:file:.env[.properties] -# H2 Database Configuration (In-Memory) -spring.datasource.url=jdbc:h2:mem:testdb -spring.datasource.driver-class-name=org.h2.Driver -spring.datasource.username=sa -spring.datasource.password= +# mysql Database Configuration +spring.datasource.url=jdbc:mysql://52.79.243.139:3306/danpat?useSSL=false&serverTimezone=Asia/Seoul&characterEncoding=UTF-8 +spring.datasource.username=root +spring.datasource.password=password +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver + +# Mongo Database Configuration +spring.data.mongodb.auto-index-creation=true # JPA and Hibernate Configuration -spring.jpa.hibernate.ddl-auto=create +spring.jpa.hibernate.ddl-auto=validate spring.jpa.show-sql=true spring.jpa.properties.hibernate.format_sql=true -spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect - -# H2 Console Configuration -spring.h2.console.enabled=true -spring.h2.console.path=/h2-console +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect # Logging (Optional) logging.level.org.hibernate.SQL=DEBUG @@ -26,9 +25,6 @@ logging.level.root=INFO logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n -# Mongo Database Configuration -spring.data.mongodb.auto-index-creation=true - # SMTP spring.mail.host=smtp.gmail.com spring.mail.port=587 From 83cbfe301df1423cee56ad987cf84a5daf8105f0 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Sun, 26 Jan 2025 10:51:21 +0900 Subject: [PATCH 7/7] rebase develop --- .../api/contracts/ContractService.java | 2 -- .../controller/ContractController.java | 25 ++----------------- 2 files changed, 2 insertions(+), 25 deletions(-) diff --git a/src/main/java/com/example/api/contracts/ContractService.java b/src/main/java/com/example/api/contracts/ContractService.java index 2f80f4e3..a24688bf 100644 --- a/src/main/java/com/example/api/contracts/ContractService.java +++ b/src/main/java/com/example/api/contracts/ContractService.java @@ -23,8 +23,6 @@ public class ContractService { private final ContractMapper contractMapper; private final ChatRoomRepository chatRoomRepository; private final UpdateContractConditionManager updateContractConditionManager; - private final ContractRepository contractRepository; - private final ContractMapper contractMapper; @Transactional(readOnly = true) public List getAllRelatedSuggests(final QueryAllSuggestsForMeCommand allSuggestsForMeCommand) { diff --git a/src/main/java/com/example/api/contracts/controller/ContractController.java b/src/main/java/com/example/api/contracts/controller/ContractController.java index 13a76d3c..a2c97e89 100644 --- a/src/main/java/com/example/api/contracts/controller/ContractController.java +++ b/src/main/java/com/example/api/contracts/controller/ContractController.java @@ -1,23 +1,13 @@ package com.example.api.contracts.controller; import com.example.api.contracts.ContractService; -import com.example.api.contracts.dto.AcceptSuggestCommand; -import com.example.api.contracts.dto.UpdateContractConditionCommand; -import com.example.api.contracts.dto.QueryAllSuggestsForMeCommand; +import com.example.api.contracts.dto.*; + import java.time.LocalDateTime; -import com.example.api.contracts.dto.SuggestedBusinessResponse; -import com.example.api.contracts.dto.UpdateContractConditionRequest; import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; @RestController @RequiredArgsConstructor @@ -62,7 +52,6 @@ UpdateContractConditionCommand toCommand(final Long contractId) { return new UpdateContractConditionCommand(contractId, this.suggestStartDateTime, this.suggestEndDateTime, this.suggestHourlyPayment); } } -} @PostMapping("/api/v1/contracts/suggests/{suggestId}/chatroom") public ResponseEntity createChatRoom( @@ -72,16 +61,6 @@ public ResponseEntity createChatRoom( return ResponseEntity.ok(null); } - @PutMapping("/api/v1/contracts/{contractId}") - public ResponseEntity updateContractCondition( - @PathVariable(required = true) final Long contractId, - @RequestBody final UpdateContractConditionRequest updateContractConditionRequest - ) { - final UpdateContractConditionCommand updateCommand = updateContractConditionRequest.toCommand(contractId); - contractService.updateContract(updateCommand); - return ResponseEntity.ok(null); - } - @PostMapping("/api/v1/contracts/{contractId}/accepts") public ResponseEntity acceptContract( @PathVariable(required = true) final Long contractId