From c7dc6610c1899a45a532037f6a6efc2463b19494 Mon Sep 17 00:00:00 2001 From: huhdy32 Date: Tue, 12 Nov 2024 11:52:09 +0900 Subject: [PATCH 001/276] =?UTF-8?q?#6=20feat(ContractService):=20=ED=8A=B9?= =?UTF-8?q?=EC=A0=95=20=EC=95=8C=EB=B0=94=EC=83=9D=EC=97=90=20=EC=97=B0?= =?UTF-8?q?=EA=B4=80=EB=90=9C=20=EC=95=8C=EB=B0=94=20=EC=A0=9C=EC=95=88=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20=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 --- .../api/contracts/ContractService.java | 19 +++++++++++++ .../api/contracts/OfferRepository.java | 15 ++++++++++ .../controller/ContractController.java | 28 +++++++++++++++++++ .../dto/QueryAllSuggestsForMeCommand.java | 6 ++++ .../api/contracts/dto/SuggestedBusiness.java | 14 ++++++++++ 5 files changed, 82 insertions(+) create mode 100644 src/main/java/com/example/api/contracts/ContractService.java create mode 100644 src/main/java/com/example/api/contracts/OfferRepository.java create mode 100644 src/main/java/com/example/api/contracts/controller/ContractController.java create mode 100644 src/main/java/com/example/api/contracts/dto/QueryAllSuggestsForMeCommand.java create mode 100644 src/main/java/com/example/api/contracts/dto/SuggestedBusiness.java diff --git a/src/main/java/com/example/api/contracts/ContractService.java b/src/main/java/com/example/api/contracts/ContractService.java new file mode 100644 index 00000000..5b7c0319 --- /dev/null +++ b/src/main/java/com/example/api/contracts/ContractService.java @@ -0,0 +1,19 @@ +package com.example.api.contracts; + +import com.example.api.contracts.dto.QueryAllSuggestsForMeCommand; +import com.example.api.contracts.dto.SuggestedBusiness; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +public class ContractService { + private final OfferRepository offerRepository; + + @Transactional(readOnly = true) + public List getAllRelatedSuggests(final QueryAllSuggestsForMeCommand allSuggestsForMeCommand) { + return offerRepository.queryEmployersSuggests(allSuggestsForMeCommand.employeeId()); + } +} diff --git a/src/main/java/com/example/api/contracts/OfferRepository.java b/src/main/java/com/example/api/contracts/OfferRepository.java new file mode 100644 index 00000000..a02b30b5 --- /dev/null +++ b/src/main/java/com/example/api/contracts/OfferRepository.java @@ -0,0 +1,15 @@ +package com.example.api.contracts; + +import com.example.api.contracts.dto.SuggestedBusiness; +import com.example.api.domain.OfferEmployment; +import java.util.List; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +public interface OfferRepository extends JpaRepository { + @Query("SELECT new com.example.api.contracts.dto.SuggestedBusiness(offer.business.businessId, offer.suggestStartTime, offer.suggestEndTime, offer.suggestHourlyPay, offer.suggestReaded, offer.suggestSucceeded) " + + "FROM OfferEmployment offer " + + "WHERE offer.employee.employeeId = :employeeId") + List queryEmployersSuggests(@Param("employeeId") final Long employeeId); +} diff --git a/src/main/java/com/example/api/contracts/controller/ContractController.java b/src/main/java/com/example/api/contracts/controller/ContractController.java new file mode 100644 index 00000000..d7eb2135 --- /dev/null +++ b/src/main/java/com/example/api/contracts/controller/ContractController.java @@ -0,0 +1,28 @@ +package com.example.api.contracts.controller; + +import com.example.api.contracts.ContractService; +import com.example.api.contracts.dto.QueryAllSuggestsForMeCommand; +import com.example.api.contracts.dto.SuggestedBusiness; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +class ContractController { + private final ContractService contractService; + + @GetMapping("/api/v1/contracts/employment-suggests") + public ResponseEntity> getAllSuggest( + @RequestParam(required = true) final Long employeeId + ) { + final QueryAllSuggestsForMeCommand queryAllSuggestsForMeCommand = new QueryAllSuggestsForMeCommand(employeeId); + final List suggestedBusinesses = contractService.getAllRelatedSuggests( + queryAllSuggestsForMeCommand); + return ResponseEntity.ok(suggestedBusinesses); + } +} diff --git a/src/main/java/com/example/api/contracts/dto/QueryAllSuggestsForMeCommand.java b/src/main/java/com/example/api/contracts/dto/QueryAllSuggestsForMeCommand.java new file mode 100644 index 00000000..9a330d89 --- /dev/null +++ b/src/main/java/com/example/api/contracts/dto/QueryAllSuggestsForMeCommand.java @@ -0,0 +1,6 @@ +package com.example.api.contracts.dto; + +public record QueryAllSuggestsForMeCommand( + Long employeeId +) { +} diff --git a/src/main/java/com/example/api/contracts/dto/SuggestedBusiness.java b/src/main/java/com/example/api/contracts/dto/SuggestedBusiness.java new file mode 100644 index 00000000..acba584c --- /dev/null +++ b/src/main/java/com/example/api/contracts/dto/SuggestedBusiness.java @@ -0,0 +1,14 @@ +package com.example.api.contracts.dto; + +import java.time.LocalDateTime; + +public record SuggestedBusiness( + Long businessId, + LocalDateTime suggestStartDateTime, + LocalDateTime suggestEndDateTime, + Integer suggestPartTimePayment, + Boolean suggestChecked, + Boolean suggestAccepted + +) { +} \ No newline at end of file From 5105178c5b6f1641ebe01a5b7707dc6fb836fe70 Mon Sep 17 00:00:00 2001 From: huhdy32 Date: Tue, 12 Nov 2024 16:55:15 +0900 Subject: [PATCH 002/276] =?UTF-8?q?#7=20test(JpaTestWithInitData):=20jpa?= =?UTF-8?q?=20=ED=85=8C=EC=8A=A4=ED=8A=B8=EC=9A=A9=20=EC=B4=88=EA=B8=B0?= =?UTF-8?q?=ED=99=94=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EC=96=B4=EB=85=B8?= =?UTF-8?q?=ED=85=8C=EC=9D=B4=EC=85=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/api/ApiApplicationTests.java | 3 +- .../com/example/api/JpaTestWithInitData.java | 17 ++ .../resources/application-test.properties | 2 + src/test/resources/data.sql | 102 +++++++ src/test/resources/schema.sql | 285 ++++++++++++++++++ 5 files changed, 408 insertions(+), 1 deletion(-) create mode 100644 src/test/java/com/example/api/JpaTestWithInitData.java create mode 100644 src/test/resources/application-test.properties create mode 100644 src/test/resources/data.sql create mode 100644 src/test/resources/schema.sql diff --git a/src/test/java/com/example/api/ApiApplicationTests.java b/src/test/java/com/example/api/ApiApplicationTests.java index 315b8dc6..8a039658 100644 --- a/src/test/java/com/example/api/ApiApplicationTests.java +++ b/src/test/java/com/example/api/ApiApplicationTests.java @@ -2,12 +2,13 @@ import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; @SpringBootTest +@ActiveProfiles("test") class ApiApplicationTests { @Test void contextLoads() { } - } diff --git a/src/test/java/com/example/api/JpaTestWithInitData.java b/src/test/java/com/example/api/JpaTestWithInitData.java new file mode 100644 index 00000000..c4aa17da --- /dev/null +++ b/src/test/java/com/example/api/JpaTestWithInitData.java @@ -0,0 +1,17 @@ +package com.example.api; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.test.context.jdbc.Sql; +import org.springframework.transaction.annotation.Transactional; + +@Transactional +@Sql("/data.sql") +@DataJpaTest +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +public @interface JpaTestWithInitData { +} diff --git a/src/test/resources/application-test.properties b/src/test/resources/application-test.properties new file mode 100644 index 00000000..76657fc4 --- /dev/null +++ b/src/test/resources/application-test.properties @@ -0,0 +1,2 @@ +spring.jpa.hibernate.ddl-auto=create +spring.sql.init.mode=always \ No newline at end of file diff --git a/src/test/resources/data.sql b/src/test/resources/data.sql new file mode 100644 index 00000000..f17124a6 --- /dev/null +++ b/src/test/resources/data.sql @@ -0,0 +1,102 @@ +-- ACCOUNT 테이블 초기화 데이터 +INSERT INTO account ( + account_unique_id, account_id, account_password, account_name, account_sex, + account_age, account_phone_number, account_registered_datetime, account_profile_image, + account_email, account_deleted, created_at, updated_at +) VALUES + (1, 'user01', 'pass01', 'Alice', 'F', 25, '010-1234-5678', CURRENT_TIMESTAMP, 'profile1.jpg', 'alice@example.com', false, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP), + (2, 'user02', 'pass02', 'Bob', 'M', 30, '010-2345-6789', CURRENT_TIMESTAMP, 'profile2.jpg', 'bob@example.com', false, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); + +-- EMPLOYER 테이블 초기화 데이터 +INSERT INTO employer ( + employer_id, account_id, employer_nickname, created_at, updated_at +) VALUES + (1, 1, 'TopEmployer', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); + +-- EMPLOYEE 테이블 초기화 데이터 +INSERT INTO employee ( + employee_id, account_id, employee_star_rating, employee_work_count, employee_nickname, created_at, updated_at +) VALUES + (1, 2, 4.5, 100, 'ReliableEmployee', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); + +-- CATEGORY 테이블 초기화 데이터 +INSERT INTO category ( + category_id, category_name, created_at, updated_at +) VALUES + (1, 'Technology', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP), + (2, 'Healthcare', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); + +-- BUSINESS 테이블 초기화 데이터 +INSERT INTO business ( + business_id, business_employer_id, business_name, business_location, representation_name, + business_open_date, business_registration_number, created_at, updated_at +) VALUES + (1, 1, 'Tech Solutions', 'Seoul', 'Alice Kim', '2020-01-15', '123-45-67890', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); + +-- BUSINESS_CATEGORY 테이블 초기화 데이터 +INSERT INTO business_category ( + business_category_id, business_id, categorey_id, created_at, updated_at +) VALUES + (1, 1, 1, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP), + (2, 1, 2, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); + +-- ANNOUNCEMENT 테이블 초기화 데이터 +INSERT INTO announcement ( + announcement_id, announcement_title, announcement_type, announcement_content, view_count, created_at, updated_at +) VALUES + (1, 'New Policy', 'HR', 'Please review the new company policy.', 0, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); + +-- OFFER_EMPLOYMENT 테이블 초기화 데이터 +INSERT INTO offer_employment ( + suggest_id, suggest_hourly_pay, suggest_readed, suggest_succeded, business_id, employee_id, + suggest_register_time, suggest_start_time, suggest_end_time +) VALUES + (1, 20000, false, false, 1, 1, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); + +-- CHAT_ROOM 테이블 초기화 데이터 +INSERT INTO chat_room ( + chat_room_id, suggest_generated_date, suggest_id +) VALUES + (1, CURRENT_TIMESTAMP, 1); + +-- CHAT 테이블 초기화 데이터 +INSERT INTO chat ( + chat_id, account_unique_id, chat_register_date, chat_room_id, chat_content, chat_deleted +) VALUES + (1, 1, CURRENT_TIMESTAMP, 1, 'Hello, welcome to the chat room!', false); + +-- CONTRACT 테이블 초기화 데이터 +INSERT INTO contract ( + contract_id, contract_hourly_pay, contract_succeded, contract_start_time, contract_end_time, suggest_id, created_at, updated_at +) VALUES + (1, 25000, true, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, 1, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); + +-- EXTERNAL_CAREER 테이블 초기화 데이터 +INSERT INTO exteranl_carrer ( + id, employee_id, business_name, part_time_period, created_at, updated_at +) VALUES + (1, 1, 'Part-time Developer', '2019-2020', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); + +-- FLAVORED 테이블 초기화 데이터 +INSERT INTO flavored ( + flavored_id, category_id, employee_id, created_at, updated_at +) VALUES + (1, 1, 1, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); + +-- POSSIBLE_BOARD 테이블 초기화 데이터 +INSERT INTO possible_board ( + possible_id, employee_id, possible_start_time, possible_end_time, created_at, updated_at +) VALUES + (1, 1, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); + +-- REVIEW 테이블 초기화 데이터 +INSERT INTO review ( + suggest_id, review_star_point, review_content, created_at, updated_at +) VALUES + (1, 5, 'Excellent service!', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); + +-- SCRAP 테이블 초기화 데이터 +INSERT INTO scrap ( + scrap_id, employee_employee_id, employer_employer_id, created_at, updated_at +) VALUES + (1, 1, 1, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); diff --git a/src/test/resources/schema.sql b/src/test/resources/schema.sql new file mode 100644 index 00000000..98f078e6 --- /dev/null +++ b/src/test/resources/schema.sql @@ -0,0 +1,285 @@ +drop table if exists account cascade; +drop table if exists announcement cascade; +drop table if exists business cascade; +drop table if exists business_category cascade; +drop table if exists category cascade; +drop table if exists chat cascade; +drop table if exists chat_room cascade; +drop table if exists contract cascade; +drop table if exists employee cascade; +drop table if exists employer cascade; +drop table if exists exteranl_carrer cascade; +drop table if exists flavored cascade; +drop table if exists offer_employment cascade; +drop table if exists possible_board cascade ; +drop table if exists review cascade; +drop table if exists scrap cascade; + +create table account +( + account_age integer, + account_deleted BOOLEAN DEFAULT false, + account_registered_datetime timestamp(6), + account_unique_id bigint generated by default as identity, + created_at timestamp(6), + updated_at timestamp(6), + account_email varchar(255), + account_id varchar(255), + account_name varchar(255), + account_password varchar(255), + account_phone_number varchar(255), + account_profile_image varchar(255), + account_sex varchar(255), + primary key (account_unique_id) +); +create table announcement +( + view_count int DEFAULT 0, + announcement_id bigint generated by default as identity, + created_at timestamp(6), + updated_at timestamp(6), + announcement_content varchar(255), + announcement_title varchar(255), + announcement_type varchar(255), + primary key (announcement_id) +); + +create table business +( + business_open_date date, + business_employer_id bigint, + business_id bigint generated by default as identity, + created_at timestamp(6), + updated_at timestamp(6), + business_location varchar(255), + business_name varchar(255), + business_registration_number varchar(255), + representation_name varchar(255), + primary key (business_id) +); + +create table business_category +( + business_category_id bigint generated by default as identity, + business_id bigint, + categorey_id bigint, + created_at timestamp(6), + updated_at timestamp(6), + primary key (business_category_id) +); +create table category +( + category_id bigint generated by default as identity, + created_at timestamp(6), + updated_at timestamp(6), + category_name varchar(255), + primary key (category_id) +); +create table chat +( + chat_deleted BOOLEAN DEFAULT false, + account_unique_id bigint, + chat_id bigint generated by default as identity, + chat_register_date timestamp(6), + chat_room_id bigint, + chat_content varchar(255), + primary key (chat_id) +); + +create table chat_room +( + chat_room_id bigint generated by default as identity, + suggest_generated_date timestamp(6), + suggest_id bigint unique, + primary key (chat_room_id) +); + +create table contract +( + contract_hourly_pay integer, + contract_succeded boolean DEFAULT false, + contract_end_time timestamp(6), + contract_id bigint generated by default as identity, + contract_start_time timestamp(6), + created_at timestamp(6), + suggest_id bigint unique, + updated_at timestamp(6), + primary key (contract_id) +); + + +create table employee +( + employee_star_rating float(24), + employee_work_count integer, + account_id bigint unique, + created_at timestamp(6), + employee_id bigint generated by default as identity, + updated_at timestamp(6), + employee_nickname varchar(255), + primary key (employee_id) +); + +create table employer +( + account_id bigint unique, + created_at timestamp(6), + employer_id bigint generated by default as identity, + updated_at timestamp(6), + employer_nickname varchar(255), + primary key (employer_id) +); + +create table exteranl_carrer +( + created_at timestamp(6), + employee_id bigint, + id bigint generated by default as identity, + updated_at timestamp(6), + business_name varchar(255), + part_time_period varchar(255), + primary key (id) +); + +create table flavored +( + category_id bigint, + created_at timestamp(6), + employee_id bigint, + flavored_id bigint generated by default as identity, + updated_at timestamp(6), + primary key (flavored_id), + unique (employee_id, category_id) +); + +create table offer_employment +( + suggest_hourly_pay integer, + suggest_readed boolean DEFAULT false, + suggest_succeded boolean DEFAULT false, + business_id bigint unique, + employee_id bigint unique, + suggest_end_time timestamp(6), + suggest_id bigint generated by default as identity, + suggest_register_time timestamp(6), + suggest_start_time timestamp(6), + primary key (suggest_id) +); + +create table possible_board +( + created_at timestamp(6), + employee_id bigint, + possible_end_time timestamp(6), + possible_id bigint generated by default as identity, + possible_start_time timestamp(6), + updated_at timestamp(6), + primary key (possible_id) +); + +create table review +( + review_star_point integer, + created_at timestamp(6), + suggest_id bigint generated by default as identity, + updated_at timestamp(6), + review_content varchar(255), + primary key (suggest_id) +); + + +create table scrap +( + created_at timestamp(6), + employee_employee_id bigint, + employer_employer_id bigint, + scrap_id bigint generated by default as identity, + updated_at timestamp(6), + primary key (scrap_id) +); + +alter table if exists business + add constraint FKrmvi7a8hp1gvo4fs2vifp1u8s + foreign key (business_employer_id) + references employer; + + +alter table if exists business_category + add constraint FKpphxqd3m7af7xsylvpb26gqp8 + foreign key (business_id) + references business; + +alter table if exists business_category + add constraint FKh2g43n4c0mukqvpami4x0st36 + foreign key (categorey_id) + references category; + +alter table if exists chat + add constraint FKijoxkthso6n3r8bian3xu8dau + foreign key (account_unique_id) + references account; + +alter table if exists chat + add constraint FK44b6elhh512d2722l09i6qdku + foreign key (chat_room_id) + references chat_room; + +alter table if exists chat_room + add constraint FKs40aoy58klwk8k66k90vpvxek + foreign key (suggest_id) + references offer_employment; + +alter table if exists contract + add constraint FKcvp9vmfpl0bm6b6c63l2ormj6 + foreign key (suggest_id) + references offer_employment; + +alter table if exists employee + add constraint FKcfg6ajo8oske94exynxpf7tf9 + foreign key (account_id) + references account; + +alter table if exists employer + add constraint FKj4pj26t1ecnkh85f5dehhvj95 + foreign key (account_id) + references account; + +alter table if exists exteranl_carrer + add constraint FK47yjhdvwno2buwixnbbiipuvs + foreign key (employee_id) + references employee; + +alter table if exists flavored + add constraint FK5fko12aoyvyiogwi3bxr7p5pf + foreign key (category_id) + references category; + +alter table if exists flavored + add constraint FKgp8oorhip9jq4ulnlj3qo6tqj + foreign key (employee_id) + references employee; + +alter table if exists offer_employment + add constraint FK8xi6px87at3h94jr4434dxt6h + foreign key (business_id) + references business; + +alter table if exists offer_employment + add constraint FK8d521thyf88sosfv3kdni94cc + foreign key (employee_id) + references employee; + +alter table if exists possible_board + add constraint FKpo0s6j32cqd4dqtregricmak0 + foreign key (employee_id) + references employee; + +alter table if exists scrap + add constraint FKqml51wgiigjp3arbctk13hk1x + foreign key (employee_employee_id) + references employee; + +alter table if exists scrap + add constraint FK7atea93v4sptxh64isjnikhgm + foreign key (employer_employer_id) + references employer; \ No newline at end of file From e0b2ca57cdeeb0f72f2c128b966ca2ed2aeaad90 Mon Sep 17 00:00:00 2001 From: huhdy32 Date: Tue, 12 Nov 2024 18:07:49 +0900 Subject: [PATCH 003/276] =?UTF-8?q?#9=20feat(ApiExceptionHandler):=20?= =?UTF-8?q?=EC=96=B4=ED=94=8C=EB=A6=AC=EC=BC=80=EC=9D=B4=EC=85=98=20?= =?UTF-8?q?=EB=B9=84=EC=A6=88=EB=8B=88=EC=8A=A4=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EC=8B=A4=ED=96=89=20=EC=A4=91=20=EB=B0=9C=EC=83=9D=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EC=98=88=EC=99=B8=EC=97=90=20=EB=8C=80=ED=95=B4=20?= =?UTF-8?q?=EC=B4=9D=EA=B4=84=EC=A0=81=EC=9C=BC=EB=A1=9C=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=ED=95=98=EB=8A=94=20=EB=A1=9C=EC=A7=81=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/exception/ApiExceptionHandler.java | 21 ++++++++++ .../api/exception/BusinessException.java | 18 ++++++++ .../com/example/api/exception/ErrorCode.java | 19 +++++++++ .../api/exception/ExceptionResponseBody.java | 41 +++++++++++++++++++ 4 files changed, 99 insertions(+) create mode 100644 src/main/java/com/example/api/exception/ApiExceptionHandler.java create mode 100644 src/main/java/com/example/api/exception/BusinessException.java create mode 100644 src/main/java/com/example/api/exception/ErrorCode.java create mode 100644 src/main/java/com/example/api/exception/ExceptionResponseBody.java diff --git a/src/main/java/com/example/api/exception/ApiExceptionHandler.java b/src/main/java/com/example/api/exception/ApiExceptionHandler.java new file mode 100644 index 00000000..e9c30a83 --- /dev/null +++ b/src/main/java/com/example/api/exception/ApiExceptionHandler.java @@ -0,0 +1,21 @@ +package com.example.api.exception; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +@RestControllerAdvice +public class ApiExceptionHandler { + @ExceptionHandler(BusinessException.class) + public ResponseEntity businessExceptionHandler(final BusinessException businessException) { + final ErrorCode errorCode = businessException.getErrorCode(); + final String details = businessException.getMessage(); + + return createExceptionResponse(errorCode, ExceptionResponseBody.of(errorCode, details)); + } + + private ResponseEntity createExceptionResponse(ErrorCode errorCode, ExceptionResponseBody exceptionResponseBody) { + return ResponseEntity.status(errorCode.getHttpStatus()) + .body(exceptionResponseBody); + } +} diff --git a/src/main/java/com/example/api/exception/BusinessException.java b/src/main/java/com/example/api/exception/BusinessException.java new file mode 100644 index 00000000..c765788e --- /dev/null +++ b/src/main/java/com/example/api/exception/BusinessException.java @@ -0,0 +1,18 @@ +package com.example.api.exception; + +public class BusinessException extends RuntimeException{ + private final ErrorCode errorCode; + + public BusinessException(ErrorCode errorCode) { + this.errorCode = errorCode; + } + + public BusinessException(final String detailMessage, final ErrorCode errorCode) { + super(detailMessage); + this.errorCode = errorCode; + } + + public ErrorCode getErrorCode() { + return errorCode; + } +} diff --git a/src/main/java/com/example/api/exception/ErrorCode.java b/src/main/java/com/example/api/exception/ErrorCode.java new file mode 100644 index 00000000..e69e52ff --- /dev/null +++ b/src/main/java/com/example/api/exception/ErrorCode.java @@ -0,0 +1,19 @@ +package com.example.api.exception; + +import lombok.Getter; +import org.springframework.http.HttpStatus; + +@Getter +public enum ErrorCode { + SERVER_EXCEPTION(HttpStatus.INTERNAL_SERVER_ERROR, "-000", "서버 에러"); + + private final HttpStatus httpStatus; + private final String errorCode; + private final String errorDescription; + + ErrorCode(HttpStatus httpStatus, String errorCodeResponse, String errorDescription) { + this.httpStatus = httpStatus; + this.errorCode = errorCodeResponse; + this.errorDescription = errorDescription; + } +} diff --git a/src/main/java/com/example/api/exception/ExceptionResponseBody.java b/src/main/java/com/example/api/exception/ExceptionResponseBody.java new file mode 100644 index 00000000..ae905606 --- /dev/null +++ b/src/main/java/com/example/api/exception/ExceptionResponseBody.java @@ -0,0 +1,41 @@ +package com.example.api.exception; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import java.util.List; +import lombok.Getter; + +@Getter +@JsonPropertyOrder(value = {"errorCode"}) +public class ExceptionResponseBody { + private final String errorCode; + private final String errorDescription; + @JsonProperty("details") + private final String detailMessages; + @JsonInclude(JsonInclude.Include.NON_NULL) + private final List errors; + + private ExceptionResponseBody(String errorCode, String errorDescription, String detailMessages, List errors) { + this.errorCode = errorCode; + this.errorDescription = errorDescription; + this.detailMessages = detailMessages; + this.errors = errors; + } + + public static ExceptionResponseBody of(ErrorCode errorCode) { + return new ExceptionResponseBody(errorCode.getErrorCode(), errorCode.getErrorDescription(), null, null); + } + + public static ExceptionResponseBody of(ErrorCode errorCode, String detailMessages) { + return new ExceptionResponseBody(errorCode.getErrorCode(), errorCode.getErrorDescription(), detailMessages, null); + } + + public static ExceptionResponseBody of(ErrorCode errorCode, List errors) { + return new ExceptionResponseBody(errorCode.getErrorCode(), errorCode.getErrorDescription(), null, errors); + } + + public static ExceptionResponseBody of(ErrorCode errorCode, String detailMessages, List errors) { + return new ExceptionResponseBody(errorCode.getErrorCode(), errorCode.getErrorDescription(), detailMessages, errors); + } +} \ No newline at end of file From 9fd56a2a168b19e087dadb1f7a79389196626578 Mon Sep 17 00:00:00 2001 From: huhdy32 Date: Wed, 13 Nov 2024 13:23:27 +0900 Subject: [PATCH 004/276] =?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 --- .../example/api/contracts/ContractMapper.java | 21 +++++++++++++++++++ .../api/contracts/ContractRepository.java | 7 +++++++ .../api/contracts/ContractService.java | 15 +++++++++++++ .../controller/ContractController.java | 11 ++++++++++ .../contracts/dto/AcceptSuggestCommand.java | 6 ++++++ .../java/com/example/api/domain/Contract.java | 20 +++++++++++++----- .../example/api/domain/OfferEmployment.java | 6 ++++-- 7 files changed, 79 insertions(+), 7 deletions(-) create mode 100644 src/main/java/com/example/api/contracts/ContractMapper.java create mode 100644 src/main/java/com/example/api/contracts/ContractRepository.java create mode 100644 src/main/java/com/example/api/contracts/dto/AcceptSuggestCommand.java diff --git a/src/main/java/com/example/api/contracts/ContractMapper.java b/src/main/java/com/example/api/contracts/ContractMapper.java new file mode 100644 index 00000000..17c2b95c --- /dev/null +++ b/src/main/java/com/example/api/contracts/ContractMapper.java @@ -0,0 +1,21 @@ +package com.example.api.contracts; + +import com.example.api.domain.Contract; +import com.example.api.domain.OfferEmployment; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +@Service +@Transactional(propagation = Propagation.MANDATORY) +class ContractMapper { + public Contract notYetSucceeded(final OfferEmployment offerEmployment) { + return new Contract( + offerEmployment, + offerEmployment.getSuggestStartTime(), + offerEmployment.getSuggestEndTime(), + offerEmployment.getSuggestHourlyPay(), + false + ); + } +} diff --git a/src/main/java/com/example/api/contracts/ContractRepository.java b/src/main/java/com/example/api/contracts/ContractRepository.java new file mode 100644 index 00000000..cc42c543 --- /dev/null +++ b/src/main/java/com/example/api/contracts/ContractRepository.java @@ -0,0 +1,7 @@ +package com.example.api.contracts; + +import com.example.api.domain.Contract; +import org.springframework.data.jpa.repository.JpaRepository; + +interface ContractRepository extends JpaRepository { +} diff --git a/src/main/java/com/example/api/contracts/ContractService.java b/src/main/java/com/example/api/contracts/ContractService.java index 5b7c0319..1de9f595 100644 --- a/src/main/java/com/example/api/contracts/ContractService.java +++ b/src/main/java/com/example/api/contracts/ContractService.java @@ -1,7 +1,10 @@ package com.example.api.contracts; +import com.example.api.contracts.dto.AcceptSuggestCommand; import com.example.api.contracts.dto.QueryAllSuggestsForMeCommand; import com.example.api.contracts.dto.SuggestedBusiness; +import com.example.api.domain.Contract; +import com.example.api.domain.OfferEmployment; import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -11,9 +14,21 @@ @RequiredArgsConstructor public class ContractService { private final OfferRepository offerRepository; + private final ContractRepository contractRepository; + private final ContractMapper contractMapper; @Transactional(readOnly = true) public List getAllRelatedSuggests(final QueryAllSuggestsForMeCommand allSuggestsForMeCommand) { return offerRepository.queryEmployersSuggests(allSuggestsForMeCommand.employeeId()); } + + @Transactional + public void acceptSuggest(final AcceptSuggestCommand acceptSuggestCommand) { + final OfferEmployment offerEmployment = offerRepository.findById(acceptSuggestCommand.suggestId()) + .orElseThrow(); + offerEmployment.succeeded(); + + final Contract contract = contractMapper.notYetSucceeded(offerEmployment); + contractRepository.save(contract); + } } 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 d7eb2135..fdcb3186 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,14 @@ 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.QueryAllSuggestsForMeCommand; import com.example.api.contracts.dto.SuggestedBusiness; import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; 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; @@ -25,4 +27,13 @@ public ResponseEntity> getAllSuggest( queryAllSuggestsForMeCommand); return ResponseEntity.ok(suggestedBusinesses); } + + @PostMapping("/api/v1/contracts/suggests/{suggestId}/accept") + public ResponseEntity acceptContractContact( + @PathVariable(required = true) final Long suggestId + ) { + final AcceptSuggestCommand acceptSuggestCommand = new AcceptSuggestCommand(suggestId); + contractService.acceptSuggest(acceptSuggestCommand); + return ResponseEntity.ok(null); + } } diff --git a/src/main/java/com/example/api/contracts/dto/AcceptSuggestCommand.java b/src/main/java/com/example/api/contracts/dto/AcceptSuggestCommand.java new file mode 100644 index 00000000..7ca6f73c --- /dev/null +++ b/src/main/java/com/example/api/contracts/dto/AcceptSuggestCommand.java @@ -0,0 +1,6 @@ +package com.example.api.contracts.dto; + +public record AcceptSuggestCommand( + Long suggestId +) { +} diff --git a/src/main/java/com/example/api/domain/Contract.java b/src/main/java/com/example/api/domain/Contract.java index 4c58a491..e07e93db 100644 --- a/src/main/java/com/example/api/domain/Contract.java +++ b/src/main/java/com/example/api/domain/Contract.java @@ -2,23 +2,21 @@ import jakarta.persistence.*; import lombok.Getter; -import lombok.Setter; +import lombok.NoArgsConstructor; import java.time.LocalDateTime; @Entity @Getter -@Setter @Table(name = "CONTRACT") +@NoArgsConstructor public class Contract extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long contractId; - @OneToOne(fetch = FetchType.LAZY) @JoinColumn(name = "SUGGEST_ID") private OfferEmployment offerEmployment; - @Column(name = "CONTRACT_START_TIME") private LocalDateTime contractStartTime; @Column(name = "CONTRACT_END_TIME") @@ -28,6 +26,18 @@ public class Contract extends BaseEntity { @Column(name = "CONTRACT_SUCCEDED", columnDefinition = "boolean DEFAULT false") private boolean contractSucceeded; - + public Contract( + final OfferEmployment offerEmployment, + final LocalDateTime contractStartTime, + final LocalDateTime contractEndTime, + final int contractHourlyPay, + final boolean contractSucceeded + ) { + this.offerEmployment = offerEmployment; + this.contractStartTime = contractStartTime; + this.contractEndTime = contractEndTime; + this.contractHourlyPay = contractHourlyPay; + this.contractSucceeded = contractSucceeded; + } } diff --git a/src/main/java/com/example/api/domain/OfferEmployment.java b/src/main/java/com/example/api/domain/OfferEmployment.java index d9b906e9..315208f1 100644 --- a/src/main/java/com/example/api/domain/OfferEmployment.java +++ b/src/main/java/com/example/api/domain/OfferEmployment.java @@ -3,7 +3,6 @@ import jakarta.persistence.*; import lombok.EqualsAndHashCode; import lombok.Getter; -import lombok.Setter; import java.time.LocalDateTime; @@ -11,7 +10,6 @@ @Entity @Getter -@Setter @EqualsAndHashCode @Table(name = "OFFER_EMPLOYMENT") public class OfferEmployment { @@ -44,4 +42,8 @@ public class OfferEmployment { protected void onCreate() { this.suggestRegisterTime = LocalDateTime.now(); } + + public void succeeded() { + this.suggestSucceeded = true; + } } From c604212d6199d900bcfe02e9d2e2a5a41d04f839 Mon Sep 17 00:00:00 2001 From: huhdy32 Date: Wed, 13 Nov 2024 14:43:14 +0900 Subject: [PATCH 005/276] =?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 | 13 +++++++++- .../controller/ContractController.java | 24 +++++++++++++++++++ .../contracts/dto/AcceptSuggestCommand.java | 3 +++ .../dto/UpdateContractConditionCommand.java | 13 ++++++++++ .../UpdateContractConditionHandler.java | 8 +++++++ .../UpdateContractConditionManager.java | 21 ++++++++++++++++ .../UpdateContractHourlyPaymentHandler.java | 17 +++++++++++++ .../update/UpdateContractRangeHandler.java | 23 ++++++++++++++++++ .../java/com/example/api/domain/Contract.java | 16 +++++++++++++ 9 files changed, 137 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/example/api/contracts/dto/UpdateContractConditionCommand.java create mode 100644 src/main/java/com/example/api/contracts/update/UpdateContractConditionHandler.java create mode 100644 src/main/java/com/example/api/contracts/update/UpdateContractConditionManager.java create mode 100644 src/main/java/com/example/api/contracts/update/UpdateContractHourlyPaymentHandler.java create mode 100644 src/main/java/com/example/api/contracts/update/UpdateContractRangeHandler.java diff --git a/src/main/java/com/example/api/contracts/ContractService.java b/src/main/java/com/example/api/contracts/ContractService.java index 1de9f595..e5a2160b 100644 --- a/src/main/java/com/example/api/contracts/ContractService.java +++ b/src/main/java/com/example/api/contracts/ContractService.java @@ -1,14 +1,17 @@ package com.example.api.contracts; 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.SuggestedBusiness; +import com.example.api.contracts.update.UpdateContractConditionManager; import com.example.api.domain.Contract; import com.example.api.domain.OfferEmployment; import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; @Service @RequiredArgsConstructor @@ -16,6 +19,7 @@ public class ContractService { private final OfferRepository offerRepository; private final ContractRepository contractRepository; private final ContractMapper contractMapper; + private final UpdateContractConditionManager updateContractConditionManager; @Transactional(readOnly = true) public List getAllRelatedSuggests(final QueryAllSuggestsForMeCommand allSuggestsForMeCommand) { @@ -23,7 +27,7 @@ public List getAllRelatedSuggests(final QueryAllSuggestsForMe } @Transactional - public void acceptSuggest(final AcceptSuggestCommand acceptSuggestCommand) { + public void acceptSuggest(@Validated final AcceptSuggestCommand acceptSuggestCommand) { final OfferEmployment offerEmployment = offerRepository.findById(acceptSuggestCommand.suggestId()) .orElseThrow(); offerEmployment.succeeded(); @@ -31,4 +35,11 @@ public void acceptSuggest(final AcceptSuggestCommand acceptSuggestCommand) { final Contract contract = contractMapper.notYetSucceeded(offerEmployment); contractRepository.save(contract); } + + @Transactional + public void updateContract(@Validated final UpdateContractConditionCommand updateContractConditionCommand) { + final Contract contract = contractRepository.findById(updateContractConditionCommand.contractId()) + .orElseThrow(); + updateContractConditionManager.updateContract(contract, updateContractConditionCommand); + } } 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 fdcb3186..a98a4e57 100644 --- a/src/main/java/com/example/api/contracts/controller/ContractController.java +++ b/src/main/java/com/example/api/contracts/controller/ContractController.java @@ -2,14 +2,18 @@ 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.SuggestedBusiness; +import java.time.LocalDateTime; import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; 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; @@ -36,4 +40,24 @@ 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); + } + } } diff --git a/src/main/java/com/example/api/contracts/dto/AcceptSuggestCommand.java b/src/main/java/com/example/api/contracts/dto/AcceptSuggestCommand.java index 7ca6f73c..1578b90c 100644 --- a/src/main/java/com/example/api/contracts/dto/AcceptSuggestCommand.java +++ b/src/main/java/com/example/api/contracts/dto/AcceptSuggestCommand.java @@ -1,6 +1,9 @@ package com.example.api.contracts.dto; +import org.springframework.lang.NonNull; + public record AcceptSuggestCommand( + @NonNull Long suggestId ) { } diff --git a/src/main/java/com/example/api/contracts/dto/UpdateContractConditionCommand.java b/src/main/java/com/example/api/contracts/dto/UpdateContractConditionCommand.java new file mode 100644 index 00000000..b661bcb1 --- /dev/null +++ b/src/main/java/com/example/api/contracts/dto/UpdateContractConditionCommand.java @@ -0,0 +1,13 @@ +package com.example.api.contracts.dto; + +import java.time.LocalDateTime; +import org.springframework.lang.NonNull; + +public record UpdateContractConditionCommand( + @NonNull + Long contractId, + LocalDateTime suggestStartDateTime, + LocalDateTime suggestEndDateTime, + Integer suggestHourlyPayment +) { +} diff --git a/src/main/java/com/example/api/contracts/update/UpdateContractConditionHandler.java b/src/main/java/com/example/api/contracts/update/UpdateContractConditionHandler.java new file mode 100644 index 00000000..db337ba7 --- /dev/null +++ b/src/main/java/com/example/api/contracts/update/UpdateContractConditionHandler.java @@ -0,0 +1,8 @@ +package com.example.api.contracts.update; + +import com.example.api.contracts.dto.UpdateContractConditionCommand; +import com.example.api.domain.Contract; + +interface UpdateContractConditionHandler { + void update(final Contract contract, final UpdateContractConditionCommand updateContractConditionCommand); +} diff --git a/src/main/java/com/example/api/contracts/update/UpdateContractConditionManager.java b/src/main/java/com/example/api/contracts/update/UpdateContractConditionManager.java new file mode 100644 index 00000000..1109f72d --- /dev/null +++ b/src/main/java/com/example/api/contracts/update/UpdateContractConditionManager.java @@ -0,0 +1,21 @@ +package com.example.api.contracts.update; + +import com.example.api.contracts.dto.UpdateContractConditionCommand; +import com.example.api.domain.Contract; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +public class UpdateContractConditionManager { + private final List updateContractConditionHandlers; + + @Transactional(propagation = Propagation.MANDATORY) + public void updateContract(final Contract contract, final UpdateContractConditionCommand updateContractConditionCommand) { + updateContractConditionHandlers.stream() + .forEach(updateContractHandler -> updateContractHandler.update(contract, updateContractConditionCommand)); + } +} diff --git a/src/main/java/com/example/api/contracts/update/UpdateContractHourlyPaymentHandler.java b/src/main/java/com/example/api/contracts/update/UpdateContractHourlyPaymentHandler.java new file mode 100644 index 00000000..d68457e5 --- /dev/null +++ b/src/main/java/com/example/api/contracts/update/UpdateContractHourlyPaymentHandler.java @@ -0,0 +1,17 @@ +package com.example.api.contracts.update; + +import com.example.api.contracts.dto.UpdateContractConditionCommand; +import com.example.api.domain.Contract; +import java.util.Objects; +import org.springframework.stereotype.Service; + +@Service +class UpdateContractHourlyPaymentHandler implements UpdateContractConditionHandler { + @Override + public void update(final Contract contract, final UpdateContractConditionCommand updateContractConditionCommand) { + final Integer payment = updateContractConditionCommand.suggestHourlyPayment(); + if (Objects.nonNull(payment)) { + contract.updateHourlyPayment(payment); + } + } +} diff --git a/src/main/java/com/example/api/contracts/update/UpdateContractRangeHandler.java b/src/main/java/com/example/api/contracts/update/UpdateContractRangeHandler.java new file mode 100644 index 00000000..cd7caabb --- /dev/null +++ b/src/main/java/com/example/api/contracts/update/UpdateContractRangeHandler.java @@ -0,0 +1,23 @@ +package com.example.api.contracts.update; + +import com.example.api.contracts.dto.UpdateContractConditionCommand; +import com.example.api.domain.Contract; +import java.util.Objects; +import org.springframework.stereotype.Service; + +@Service +class UpdateContractRangeHandler implements UpdateContractConditionHandler { + @Override + public void update(final Contract contract, final UpdateContractConditionCommand updateCommand) { + if (Objects.nonNull(updateCommand.suggestStartDateTime())) { + contract.updateStartDateTime(updateCommand.suggestStartDateTime()); + } + if (Objects.nonNull(updateCommand.suggestEndDateTime())) { + contract.updateEndDateTime(updateCommand.suggestEndDateTime()); + } + + if (contract.isValidContractRangeTime()) { + throw new IllegalArgumentException(); + } + } +} diff --git a/src/main/java/com/example/api/domain/Contract.java b/src/main/java/com/example/api/domain/Contract.java index e07e93db..bb51ea02 100644 --- a/src/main/java/com/example/api/domain/Contract.java +++ b/src/main/java/com/example/api/domain/Contract.java @@ -39,5 +39,21 @@ public Contract( this.contractHourlyPay = contractHourlyPay; this.contractSucceeded = contractSucceeded; } + + public void updateHourlyPayment(final Integer hourlyPay) { + this.contractHourlyPay = hourlyPay; + } + + public void updateStartDateTime(final LocalDateTime contractStartTime) { + this.contractStartTime = contractStartTime; + } + + public void updateEndDateTime(final LocalDateTime contractEndTime) { + this.contractEndTime = contractEndTime; + } + + public boolean isValidContractRangeTime() { + return this.contractStartTime.isBefore(this.contractEndTime); + } } From 2901d9e476a0323e343efb734c4522f32d34c709 Mon Sep 17 00:00:00 2001 From: huhdy32 Date: Wed, 13 Nov 2024 14:54:56 +0900 Subject: [PATCH 006/276] =?UTF-8?q?#6=20refactor(UpdateContractConditionRe?= =?UTF-8?q?quest):=20dto=20=ED=8C=A8=ED=82=A4=EC=A7=80=EB=A1=9C=20?= =?UTF-8?q?=EC=9C=84=EC=B9=98=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ContractController.java | 11 +---------- .../dto/UpdateContractConditionRequest.java | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 10 deletions(-) create mode 100644 src/main/java/com/example/api/contracts/dto/UpdateContractConditionRequest.java 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 a98a4e57..1c5d0fc1 100644 --- a/src/main/java/com/example/api/contracts/controller/ContractController.java +++ b/src/main/java/com/example/api/contracts/controller/ContractController.java @@ -5,6 +5,7 @@ import com.example.api.contracts.dto.UpdateContractConditionCommand; import com.example.api.contracts.dto.QueryAllSuggestsForMeCommand; import com.example.api.contracts.dto.SuggestedBusiness; +import com.example.api.contracts.dto.UpdateContractConditionRequest; import java.time.LocalDateTime; import java.util.List; import lombok.RequiredArgsConstructor; @@ -50,14 +51,4 @@ public ResponseEntity updateContractCondition( 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); - } - } } diff --git a/src/main/java/com/example/api/contracts/dto/UpdateContractConditionRequest.java b/src/main/java/com/example/api/contracts/dto/UpdateContractConditionRequest.java new file mode 100644 index 00000000..d08bdeab --- /dev/null +++ b/src/main/java/com/example/api/contracts/dto/UpdateContractConditionRequest.java @@ -0,0 +1,18 @@ +package com.example.api.contracts.dto; + +import java.time.LocalDateTime; + +public record UpdateContractConditionRequest( + LocalDateTime suggestStartDateTime, + LocalDateTime suggestEndDateTime, + Integer suggestHourlyPayment +) { + public UpdateContractConditionCommand toCommand(final Long contractId) { + return new UpdateContractConditionCommand( + contractId, + this.suggestStartDateTime, + this.suggestEndDateTime, + this.suggestHourlyPayment + ); + } +} From 9bc32ef302223bac36b859f9b431705de3c970a9 Mon Sep 17 00:00:00 2001 From: huhdy32 Date: Wed, 13 Nov 2024 14:56:11 +0900 Subject: [PATCH 007/276] =?UTF-8?q?#6=20refactor(SuggestedBusinessResponse?= =?UTF-8?q?):=20=ED=81=B4=EB=9E=98=EC=8A=A4=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 --- .../java/com/example/api/contracts/ContractService.java | 4 ++-- .../java/com/example/api/contracts/OfferRepository.java | 6 +++--- .../api/contracts/controller/ContractController.java | 7 +++---- ...ggestedBusiness.java => SuggestedBusinessResponse.java} | 2 +- 4 files changed, 9 insertions(+), 10 deletions(-) rename src/main/java/com/example/api/contracts/dto/{SuggestedBusiness.java => SuggestedBusinessResponse.java} (87%) diff --git a/src/main/java/com/example/api/contracts/ContractService.java b/src/main/java/com/example/api/contracts/ContractService.java index e5a2160b..c53f58f6 100644 --- a/src/main/java/com/example/api/contracts/ContractService.java +++ b/src/main/java/com/example/api/contracts/ContractService.java @@ -3,7 +3,7 @@ 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.SuggestedBusiness; +import com.example.api.contracts.dto.SuggestedBusinessResponse; import com.example.api.contracts.update.UpdateContractConditionManager; import com.example.api.domain.Contract; import com.example.api.domain.OfferEmployment; @@ -22,7 +22,7 @@ public class ContractService { private final UpdateContractConditionManager updateContractConditionManager; @Transactional(readOnly = true) - public List getAllRelatedSuggests(final QueryAllSuggestsForMeCommand allSuggestsForMeCommand) { + public List getAllRelatedSuggests(final QueryAllSuggestsForMeCommand allSuggestsForMeCommand) { return offerRepository.queryEmployersSuggests(allSuggestsForMeCommand.employeeId()); } diff --git a/src/main/java/com/example/api/contracts/OfferRepository.java b/src/main/java/com/example/api/contracts/OfferRepository.java index a02b30b5..8baa393d 100644 --- a/src/main/java/com/example/api/contracts/OfferRepository.java +++ b/src/main/java/com/example/api/contracts/OfferRepository.java @@ -1,6 +1,6 @@ package com.example.api.contracts; -import com.example.api.contracts.dto.SuggestedBusiness; +import com.example.api.contracts.dto.SuggestedBusinessResponse; import com.example.api.domain.OfferEmployment; import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; @@ -8,8 +8,8 @@ import org.springframework.data.repository.query.Param; public interface OfferRepository extends JpaRepository { - @Query("SELECT new com.example.api.contracts.dto.SuggestedBusiness(offer.business.businessId, offer.suggestStartTime, offer.suggestEndTime, offer.suggestHourlyPay, offer.suggestReaded, offer.suggestSucceeded) " + @Query("SELECT new com.example.api.contracts.dto.SuggestedBusinessResponse(offer.business.businessId, offer.suggestStartTime, offer.suggestEndTime, offer.suggestHourlyPay, offer.suggestReaded, offer.suggestSucceeded) " + "FROM OfferEmployment offer " + "WHERE offer.employee.employeeId = :employeeId") - List queryEmployersSuggests(@Param("employeeId") final Long employeeId); + List queryEmployersSuggests(@Param("employeeId") final Long employeeId); } 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 1c5d0fc1..b1f2b78b 100644 --- a/src/main/java/com/example/api/contracts/controller/ContractController.java +++ b/src/main/java/com/example/api/contracts/controller/ContractController.java @@ -4,9 +4,8 @@ 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.SuggestedBusiness; +import com.example.api.contracts.dto.SuggestedBusinessResponse; import com.example.api.contracts.dto.UpdateContractConditionRequest; -import java.time.LocalDateTime; import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; @@ -24,11 +23,11 @@ class ContractController { private final ContractService contractService; @GetMapping("/api/v1/contracts/employment-suggests") - public ResponseEntity> getAllSuggest( + public ResponseEntity> getAllSuggest( @RequestParam(required = true) final Long employeeId ) { final QueryAllSuggestsForMeCommand queryAllSuggestsForMeCommand = new QueryAllSuggestsForMeCommand(employeeId); - final List suggestedBusinesses = contractService.getAllRelatedSuggests( + final List suggestedBusinesses = contractService.getAllRelatedSuggests( queryAllSuggestsForMeCommand); return ResponseEntity.ok(suggestedBusinesses); } diff --git a/src/main/java/com/example/api/contracts/dto/SuggestedBusiness.java b/src/main/java/com/example/api/contracts/dto/SuggestedBusinessResponse.java similarity index 87% rename from src/main/java/com/example/api/contracts/dto/SuggestedBusiness.java rename to src/main/java/com/example/api/contracts/dto/SuggestedBusinessResponse.java index acba584c..8f1dacd8 100644 --- a/src/main/java/com/example/api/contracts/dto/SuggestedBusiness.java +++ b/src/main/java/com/example/api/contracts/dto/SuggestedBusinessResponse.java @@ -2,7 +2,7 @@ import java.time.LocalDateTime; -public record SuggestedBusiness( +public record SuggestedBusinessResponse( Long businessId, LocalDateTime suggestStartDateTime, LocalDateTime suggestEndDateTime, From eef65d084a1050a4a6e39ac58035df437bd353f5 Mon Sep 17 00:00:00 2001 From: huhdy32 Date: Wed, 13 Nov 2024 15:33:41 +0900 Subject: [PATCH 008/276] =?UTF-8?q?#6=20feat(ContractService):=20=EA=B3=84?= =?UTF-8?q?=EC=95=BD=20=EC=B2=B4=EA=B2=B0=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/contracts/ContractService.java | 23 +++++++++++++++---- .../controller/ContractController.java | 12 +++++++++- .../contracts/dto/AcceptContractCommand.java | 9 ++++++++ .../java/com/example/api/domain/Contract.java | 4 ++++ 4 files changed, 43 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/example/api/contracts/dto/AcceptContractCommand.java diff --git a/src/main/java/com/example/api/contracts/ContractService.java b/src/main/java/com/example/api/contracts/ContractService.java index c53f58f6..44aacf57 100644 --- a/src/main/java/com/example/api/contracts/ContractService.java +++ b/src/main/java/com/example/api/contracts/ContractService.java @@ -1,5 +1,6 @@ package com.example.api.contracts; +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; @@ -28,8 +29,7 @@ public List getAllRelatedSuggests(final QueryAllSugge @Transactional public void acceptSuggest(@Validated final AcceptSuggestCommand acceptSuggestCommand) { - final OfferEmployment offerEmployment = offerRepository.findById(acceptSuggestCommand.suggestId()) - .orElseThrow(); + final OfferEmployment offerEmployment = loadOffer(acceptSuggestCommand.suggestId()); offerEmployment.succeeded(); final Contract contract = contractMapper.notYetSucceeded(offerEmployment); @@ -38,8 +38,23 @@ public void acceptSuggest(@Validated final AcceptSuggestCommand acceptSuggestCom @Transactional public void updateContract(@Validated final UpdateContractConditionCommand updateContractConditionCommand) { - final Contract contract = contractRepository.findById(updateContractConditionCommand.contractId()) - .orElseThrow(); + final Contract contract = loadContract(updateContractConditionCommand.contractId()); updateContractConditionManager.updateContract(contract, updateContractConditionCommand); } + + @Transactional + public void acceptContract(@Validated final AcceptContractCommand acceptContractCommand) { + final Contract contract = loadContract(acceptContractCommand.contractId()); + contract.succeed(); + } + + private Contract loadContract(final Long contractId) { + return contractRepository.findById(contractId) + .orElseThrow(); + } + + private OfferEmployment loadOffer(final Long offerId) { + return offerRepository.findById(offerId) + .orElseThrow(); + } } 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 b1f2b78b..bf87451e 100644 --- a/src/main/java/com/example/api/contracts/controller/ContractController.java +++ b/src/main/java/com/example/api/contracts/controller/ContractController.java @@ -1,10 +1,11 @@ package com.example.api.contracts.controller; 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 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; @@ -50,4 +51,13 @@ public ResponseEntity updateContractCondition( contractService.updateContract(updateCommand); return ResponseEntity.ok(null); } + + @PostMapping("/api/v1/contracts/{contractId}/accepts") + public ResponseEntity acceptContract( + @PathVariable(required = true) final Long contractId + ) { + final AcceptContractCommand acceptContractCommand = new AcceptContractCommand(contractId); + contractService.acceptContract(acceptContractCommand); + return ResponseEntity.ok(null); + } } diff --git a/src/main/java/com/example/api/contracts/dto/AcceptContractCommand.java b/src/main/java/com/example/api/contracts/dto/AcceptContractCommand.java new file mode 100644 index 00000000..19f53692 --- /dev/null +++ b/src/main/java/com/example/api/contracts/dto/AcceptContractCommand.java @@ -0,0 +1,9 @@ +package com.example.api.contracts.dto; + +import org.springframework.lang.NonNull; + +public record AcceptContractCommand( + @NonNull + Long contractId +) { +} diff --git a/src/main/java/com/example/api/domain/Contract.java b/src/main/java/com/example/api/domain/Contract.java index bb51ea02..c6dc116c 100644 --- a/src/main/java/com/example/api/domain/Contract.java +++ b/src/main/java/com/example/api/domain/Contract.java @@ -55,5 +55,9 @@ public void updateEndDateTime(final LocalDateTime contractEndTime) { public boolean isValidContractRangeTime() { return this.contractStartTime.isBefore(this.contractEndTime); } + + public void succeed() { + this.contractSucceeded = true; + } } From 0e6e0dd332108f542fdeec188dac504aa21455fc Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 14:25:28 +0900 Subject: [PATCH 009/276] =?UTF-8?q?#20=20EMPLOYEE,=20EMPLOYER=20=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EB=B8=94=20=EC=82=AD=EC=A0=9C=20=EB=B0=8F=20ACCOUNT?= =?UTF-8?q?=20=ED=85=8C=EC=9D=B4=EB=B8=94=EB=A1=9C=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/example/api/domain/Account.java | 8 ++++- .../java/com/example/api/domain/Business.java | 4 +-- .../java/com/example/api/domain/Employee.java | 31 ------------------- .../java/com/example/api/domain/Employer.java | 28 ----------------- .../example/api/domain/ExternalCareer.java | 6 ++-- .../java/com/example/api/domain/Flavored.java | 6 ++-- .../example/api/domain/OfferEmployment.java | 4 +-- .../com/example/api/domain/PossibleBoard.java | 6 ++-- .../java/com/example/api/domain/Scrap.java | 4 +-- 9 files changed, 22 insertions(+), 75 deletions(-) delete mode 100644 src/main/java/com/example/api/domain/Employee.java delete mode 100644 src/main/java/com/example/api/domain/Employer.java diff --git a/src/main/java/com/example/api/domain/Account.java b/src/main/java/com/example/api/domain/Account.java index f137b74d..64297d2c 100644 --- a/src/main/java/com/example/api/domain/Account.java +++ b/src/main/java/com/example/api/domain/Account.java @@ -14,7 +14,7 @@ public class Account extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "ACCOUNT_UNIQUE_ID") - private Long id; + private Long accountId; @Column(name = "ACCOUNT_ID") private String loginId; @@ -22,6 +22,8 @@ public class Account extends BaseEntity { private String password; @Column(name = "ACCOUNT_NAME") private String name; + @Column(name = "ACCOUNT_NICKNAME") + private String nickname; @Column(name = "ACCOUNT_SEX") private String sex; @Column(name = "ACCOUNT_AGE") @@ -34,6 +36,10 @@ public class Account extends BaseEntity { private String profileImage; @Column(name = "ACCOUNT_EMAIL") private String email; + @Column(name = "ACCOUNT_STAR_RATING") + private float starPoint; + @Column(name = "ACCOUNT_WORK_COUNT") + private int workCount; @Column(name = "ACCOUNT_DELETED", columnDefinition = "BOOLEAN DEFAULT false") private boolean deleted = false; } diff --git a/src/main/java/com/example/api/domain/Business.java b/src/main/java/com/example/api/domain/Business.java index 6226dfb3..aee103ff 100644 --- a/src/main/java/com/example/api/domain/Business.java +++ b/src/main/java/com/example/api/domain/Business.java @@ -21,8 +21,8 @@ public class Business extends BaseEntity { private Long businessId; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "BUSINESS_EMPLOYER_ID", referencedColumnName = "EMPLOYER_ID") - private Employer employer; + @JoinColumn(name = "BUSINESS_EMPLOYER_ID", referencedColumnName = "ACCOUNT_ID") + private Account employer; @OneToMany(mappedBy = "business") private List businessCategories = new ArrayList<>(); diff --git a/src/main/java/com/example/api/domain/Employee.java b/src/main/java/com/example/api/domain/Employee.java deleted file mode 100644 index 0aee7d9d..00000000 --- a/src/main/java/com/example/api/domain/Employee.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.example.api.domain; - - -import jakarta.persistence.*; -import lombok.Getter; -import lombok.Setter; - -import static jakarta.persistence.FetchType.*; - -@Entity -@Getter -@Setter -@Table(name = "EMPLOYEE") -public class Employee extends BaseEntity{ - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "EMPLOYEE_ID") - private Long employeeId; - - @OneToOne(fetch = LAZY, cascade = CascadeType.ALL) - @JoinColumn(name = "account_id") - private Account account; - @Column(name = "EMPLOYEE_STAR_RATING") - private float starPoint; - @Column(name = "EMPLOYEE_WORK_COUNT") - private int workCount; - @Column(name = "EMPLOYEE_NICKNAME") - private String nickname; - -} - diff --git a/src/main/java/com/example/api/domain/Employer.java b/src/main/java/com/example/api/domain/Employer.java deleted file mode 100644 index d78416ea..00000000 --- a/src/main/java/com/example/api/domain/Employer.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.example.api.domain; - -import jakarta.persistence.*; -import lombok.Getter; -import lombok.Setter; - -import java.util.List; - -import static jakarta.persistence.FetchType.LAZY; - -@Entity -@Getter -@Setter -@Table(name = "EMPLOYER") -public class Employer extends BaseEntity{ - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "EMPLOYER_ID") - private Long employerId; - - @OneToOne(fetch = LAZY, cascade = CascadeType.ALL) - @JoinColumn(name = "account_id") - private Account account; - - @Column(name = "EMPLOYER_NICKNAME") - private String nickname; -} - diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index fbe54614..6e0ef7f0 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,16 +19,16 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "employee_id") + @JoinColumn(name = "account_id") @JsonIgnore - private Employee employee; + private Account employee; @Column(name = "BUSINESS_NAME") private String Name; @Column(name = "PART_TIME_PERIOD") private String period; - public ExternalCareer(Employee employee, String name, String period) { + public ExternalCareer(Account employee, String name, String period) { this.employee = employee; Name = name; this.period = period; diff --git a/src/main/java/com/example/api/domain/Flavored.java b/src/main/java/com/example/api/domain/Flavored.java index e7049493..78d9c59d 100644 --- a/src/main/java/com/example/api/domain/Flavored.java +++ b/src/main/java/com/example/api/domain/Flavored.java @@ -10,7 +10,7 @@ @Getter @Setter @Table(name = "flavored", uniqueConstraints = { - @UniqueConstraint(columnNames = {"employee_id", "category_id"}) + @UniqueConstraint(columnNames = {"account_id", "category_id"}) }) public class Flavored extends BaseEntity{ @Id @@ -23,7 +23,7 @@ public class Flavored extends BaseEntity{ private Category category; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "employee_id") - private Employee employee; + @JoinColumn(name = "account_id") + private Account employee; } diff --git a/src/main/java/com/example/api/domain/OfferEmployment.java b/src/main/java/com/example/api/domain/OfferEmployment.java index 315208f1..a58d2552 100644 --- a/src/main/java/com/example/api/domain/OfferEmployment.java +++ b/src/main/java/com/example/api/domain/OfferEmployment.java @@ -21,8 +21,8 @@ public class OfferEmployment { @JoinColumn(name = "BUSINESS_ID") private Business business; @OneToOne(fetch = LAZY) - @JoinColumn(name = "EMPLOYEE_ID") - private Employee employee; + @JoinColumn(name = "ACCOUNT_ID") + private Account employee; @OneToOne(mappedBy = "offerEmployment", cascade = CascadeType.ALL) private Contract contract; @Column(name = "SUGGEST_START_TIME") diff --git a/src/main/java/com/example/api/domain/PossibleBoard.java b/src/main/java/com/example/api/domain/PossibleBoard.java index 202d1dad..62745483 100644 --- a/src/main/java/com/example/api/domain/PossibleBoard.java +++ b/src/main/java/com/example/api/domain/PossibleBoard.java @@ -21,8 +21,8 @@ public class PossibleBoard extends BaseEntity{ private Long possibleId; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "employee_id") - private Employee employee; + @JoinColumn(name = "account_id") + private Account employee; @Column(name = "POSSIBLE_START_TIME") private LocalDateTime startTime; @@ -30,7 +30,7 @@ public class PossibleBoard extends BaseEntity{ @Column(name = "POSSIBLE_END_TIME") private LocalDateTime endTime; - public PossibleBoard(Employee employee, LocalDateTime startTime, LocalDateTime endTime) { + public PossibleBoard(Account employee, LocalDateTime startTime, LocalDateTime endTime) { this.employee = employee; this.startTime = startTime; this.endTime = endTime; diff --git a/src/main/java/com/example/api/domain/Scrap.java b/src/main/java/com/example/api/domain/Scrap.java index 701ca8e0..20f7ebc6 100644 --- a/src/main/java/com/example/api/domain/Scrap.java +++ b/src/main/java/com/example/api/domain/Scrap.java @@ -17,7 +17,7 @@ public class Scrap extends BaseEntity { private Long scrapId; @ManyToOne(fetch = FetchType.LAZY) - private Employer employer; + private Account employer; @ManyToOne(fetch = FetchType.LAZY) - private Employee employee; + private Account employee; } From cfdc6fca2b81e030dcca6be80d6839740c1e15b7 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 15:07:39 +0900 Subject: [PATCH 010/276] =?UTF-8?q?#20=20=EB=8D=B0=EC=9D=B4=ED=84=B0?= =?UTF-8?q?=EB=B2=A0=EC=9D=B4=EC=8A=A4=20=EC=86=8D=EC=84=B1=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=EC=9D=84=20employee,=20employer=EC=97=90=20=EB=A7=9E?= =?UTF-8?q?=EA=B2=8C=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/Account.java | 2 +- src/main/java/com/example/api/domain/Business.java | 2 +- src/main/java/com/example/api/domain/Contract.java | 2 ++ src/main/java/com/example/api/domain/ExternalCareer.java | 2 +- src/main/java/com/example/api/domain/Flavored.java | 2 +- src/main/java/com/example/api/domain/OfferEmployment.java | 2 +- src/main/java/com/example/api/domain/PossibleBoard.java | 2 +- src/main/java/com/example/api/domain/Scrap.java | 3 ++- 8 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/example/api/domain/Account.java b/src/main/java/com/example/api/domain/Account.java index 64297d2c..5d4369ba 100644 --- a/src/main/java/com/example/api/domain/Account.java +++ b/src/main/java/com/example/api/domain/Account.java @@ -42,4 +42,4 @@ public class Account extends BaseEntity { private int workCount; @Column(name = "ACCOUNT_DELETED", columnDefinition = "BOOLEAN DEFAULT false") private boolean deleted = false; -} +} \ No newline at end of file diff --git a/src/main/java/com/example/api/domain/Business.java b/src/main/java/com/example/api/domain/Business.java index aee103ff..e83fc075 100644 --- a/src/main/java/com/example/api/domain/Business.java +++ b/src/main/java/com/example/api/domain/Business.java @@ -21,7 +21,7 @@ public class Business extends BaseEntity { private Long businessId; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "BUSINESS_EMPLOYER_ID", referencedColumnName = "ACCOUNT_ID") + @JoinColumn(name = "BUSINESS_EMPLOYER_ID") private Account employer; @OneToMany(mappedBy = "business") diff --git a/src/main/java/com/example/api/domain/Contract.java b/src/main/java/com/example/api/domain/Contract.java index c6dc116c..2a63f38d 100644 --- a/src/main/java/com/example/api/domain/Contract.java +++ b/src/main/java/com/example/api/domain/Contract.java @@ -14,9 +14,11 @@ public class Contract extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long contractId; + @OneToOne(fetch = FetchType.LAZY) @JoinColumn(name = "SUGGEST_ID") 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/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 6e0ef7f0..547ffaef 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "account_id") + @JoinColumn(name = "employee_id") @JsonIgnore private Account employee; diff --git a/src/main/java/com/example/api/domain/Flavored.java b/src/main/java/com/example/api/domain/Flavored.java index 78d9c59d..9311f014 100644 --- a/src/main/java/com/example/api/domain/Flavored.java +++ b/src/main/java/com/example/api/domain/Flavored.java @@ -23,7 +23,7 @@ public class Flavored extends BaseEntity{ private Category category; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "account_id") + @JoinColumn(name = "employee_id") private Account employee; } diff --git a/src/main/java/com/example/api/domain/OfferEmployment.java b/src/main/java/com/example/api/domain/OfferEmployment.java index a58d2552..05b7003e 100644 --- a/src/main/java/com/example/api/domain/OfferEmployment.java +++ b/src/main/java/com/example/api/domain/OfferEmployment.java @@ -21,7 +21,7 @@ public class OfferEmployment { @JoinColumn(name = "BUSINESS_ID") private Business business; @OneToOne(fetch = LAZY) - @JoinColumn(name = "ACCOUNT_ID") + @JoinColumn(name = "EMPLOYEE_ID") private Account employee; @OneToOne(mappedBy = "offerEmployment", cascade = CascadeType.ALL) private Contract contract; diff --git a/src/main/java/com/example/api/domain/PossibleBoard.java b/src/main/java/com/example/api/domain/PossibleBoard.java index 62745483..520d0586 100644 --- a/src/main/java/com/example/api/domain/PossibleBoard.java +++ b/src/main/java/com/example/api/domain/PossibleBoard.java @@ -21,7 +21,7 @@ public class PossibleBoard extends BaseEntity{ private Long possibleId; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "account_id") + @JoinColumn(name = "EMPLOYEE_ID") private Account employee; @Column(name = "POSSIBLE_START_TIME") diff --git a/src/main/java/com/example/api/domain/Scrap.java b/src/main/java/com/example/api/domain/Scrap.java index 20f7ebc6..a8d20e1a 100644 --- a/src/main/java/com/example/api/domain/Scrap.java +++ b/src/main/java/com/example/api/domain/Scrap.java @@ -11,13 +11,14 @@ @Setter @Table(name = "SCRAP") public class Scrap extends BaseEntity { - @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long scrapId; @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "EMPLOYER_ID") private Account employer; @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "EMPLOYEE_ID") private Account employee; } From aeae73b0126b52cd3367f1a57cfdaa4c68aa3c39 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 14:25:28 +0900 Subject: [PATCH 011/276] =?UTF-8?q?#20=20EMPLOYEE,=20EMPLOYER=20=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EB=B8=94=20=EC=82=AD=EC=A0=9C=20=EB=B0=8F=20ACCOUNT?= =?UTF-8?q?=20=ED=85=8C=EC=9D=B4=EB=B8=94=EB=A1=9C=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/api/domain/Business.java | 3 +-- src/main/java/com/example/api/domain/ExternalCareer.java | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/example/api/domain/Business.java b/src/main/java/com/example/api/domain/Business.java index e83fc075..e4452648 100644 --- a/src/main/java/com/example/api/domain/Business.java +++ b/src/main/java/com/example/api/domain/Business.java @@ -6,7 +6,6 @@ import java.time.LocalDate; import java.util.ArrayList; -import java.util.Date; import java.util.List; import static jakarta.persistence.FetchType.*; @@ -21,7 +20,7 @@ public class Business extends BaseEntity { private Long businessId; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "BUSINESS_EMPLOYER_ID") + @JoinColumn(name = "BUSINESS_EMPLOYER_ID", referencedColumnName = "ACCOUNT_ID") private Account employer; @OneToMany(mappedBy = "business") diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 547ffaef..6e0ef7f0 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "employee_id") + @JoinColumn(name = "account_id") @JsonIgnore private Account employee; From 84669c96bf3e600bb9d5bd29f76afa86c54cdbab Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 15:07:39 +0900 Subject: [PATCH 012/276] =?UTF-8?q?#20=20=EB=8D=B0=EC=9D=B4=ED=84=B0?= =?UTF-8?q?=EB=B2=A0=EC=9D=B4=EC=8A=A4=20=EC=86=8D=EC=84=B1=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=EC=9D=84=20employee,=20employer=EC=97=90=20=EB=A7=9E?= =?UTF-8?q?=EA=B2=8C=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/Business.java | 2 +- src/main/java/com/example/api/domain/ExternalCareer.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/example/api/domain/Business.java b/src/main/java/com/example/api/domain/Business.java index e4452648..c3ef0be9 100644 --- a/src/main/java/com/example/api/domain/Business.java +++ b/src/main/java/com/example/api/domain/Business.java @@ -20,7 +20,7 @@ public class Business extends BaseEntity { private Long businessId; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "BUSINESS_EMPLOYER_ID", referencedColumnName = "ACCOUNT_ID") + @JoinColumn(name = "BUSINESS_EMPLOYER_ID") private Account employer; @OneToMany(mappedBy = "business") diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 6e0ef7f0..547ffaef 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "account_id") + @JoinColumn(name = "employee_id") @JsonIgnore private Account employee; From d41f6207415d9ee1f25d89ad37c160c59b1d2e14 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 14:25:28 +0900 Subject: [PATCH 013/276] =?UTF-8?q?#20=20EMPLOYEE,=20EMPLOYER=20=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EB=B8=94=20=EC=82=AD=EC=A0=9C=20=EB=B0=8F=20ACCOUNT?= =?UTF-8?q?=20=ED=85=8C=EC=9D=B4=EB=B8=94=EB=A1=9C=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/api/domain/Business.java | 1 + src/main/java/com/example/api/domain/ExternalCareer.java | 2 +- src/main/java/com/example/api/domain/Flavored.java | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/example/api/domain/Business.java b/src/main/java/com/example/api/domain/Business.java index c3ef0be9..e83fc075 100644 --- a/src/main/java/com/example/api/domain/Business.java +++ b/src/main/java/com/example/api/domain/Business.java @@ -6,6 +6,7 @@ import java.time.LocalDate; import java.util.ArrayList; +import java.util.Date; import java.util.List; import static jakarta.persistence.FetchType.*; diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 547ffaef..6e0ef7f0 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "employee_id") + @JoinColumn(name = "account_id") @JsonIgnore private Account employee; diff --git a/src/main/java/com/example/api/domain/Flavored.java b/src/main/java/com/example/api/domain/Flavored.java index 9311f014..78136bcc 100644 --- a/src/main/java/com/example/api/domain/Flavored.java +++ b/src/main/java/com/example/api/domain/Flavored.java @@ -10,7 +10,7 @@ @Getter @Setter @Table(name = "flavored", uniqueConstraints = { - @UniqueConstraint(columnNames = {"account_id", "category_id"}) + @UniqueConstraint(columnNames = {"employee_id", "category_id"}) }) public class Flavored extends BaseEntity{ @Id From 5a5b99dba7e693bb37e9cdc4da3320419171cf02 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 15:07:39 +0900 Subject: [PATCH 014/276] =?UTF-8?q?#20=20=EB=8D=B0=EC=9D=B4=ED=84=B0?= =?UTF-8?q?=EB=B2=A0=EC=9D=B4=EC=8A=A4=20=EC=86=8D=EC=84=B1=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=EC=9D=84=20employee,=20employer=EC=97=90=20=EB=A7=9E?= =?UTF-8?q?=EA=B2=8C=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/ExternalCareer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 6e0ef7f0..547ffaef 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "account_id") + @JoinColumn(name = "employee_id") @JsonIgnore private Account employee; From 17fe6266d47763f48e9221c8fd44a211266a36a6 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 14:25:28 +0900 Subject: [PATCH 015/276] =?UTF-8?q?#20=20EMPLOYEE,=20EMPLOYER=20=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EB=B8=94=20=EC=82=AD=EC=A0=9C=20=EB=B0=8F=20ACCOUNT?= =?UTF-8?q?=20=ED=85=8C=EC=9D=B4=EB=B8=94=EB=A1=9C=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/api/domain/ExternalCareer.java | 2 +- src/main/java/com/example/api/domain/OfferEmployment.java | 2 ++ src/main/java/com/example/api/domain/Scrap.java | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 547ffaef..6e0ef7f0 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "employee_id") + @JoinColumn(name = "account_id") @JsonIgnore private Account employee; diff --git a/src/main/java/com/example/api/domain/OfferEmployment.java b/src/main/java/com/example/api/domain/OfferEmployment.java index 05b7003e..dcec29bb 100644 --- a/src/main/java/com/example/api/domain/OfferEmployment.java +++ b/src/main/java/com/example/api/domain/OfferEmployment.java @@ -3,6 +3,7 @@ import jakarta.persistence.*; import lombok.EqualsAndHashCode; import lombok.Getter; +import lombok.Setter; import java.time.LocalDateTime; @@ -10,6 +11,7 @@ @Entity @Getter +@Setter @EqualsAndHashCode @Table(name = "OFFER_EMPLOYMENT") public class OfferEmployment { diff --git a/src/main/java/com/example/api/domain/Scrap.java b/src/main/java/com/example/api/domain/Scrap.java index a8d20e1a..7d8446d1 100644 --- a/src/main/java/com/example/api/domain/Scrap.java +++ b/src/main/java/com/example/api/domain/Scrap.java @@ -11,6 +11,7 @@ @Setter @Table(name = "SCRAP") public class Scrap extends BaseEntity { + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long scrapId; From 8f4c88be5fcf5da3554f483d07df60c288f2103d Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 15:07:39 +0900 Subject: [PATCH 016/276] =?UTF-8?q?#20=20=EB=8D=B0=EC=9D=B4=ED=84=B0?= =?UTF-8?q?=EB=B2=A0=EC=9D=B4=EC=8A=A4=20=EC=86=8D=EC=84=B1=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=EC=9D=84=20employee,=20employer=EC=97=90=20=EB=A7=9E?= =?UTF-8?q?=EA=B2=8C=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/ExternalCareer.java | 2 +- src/main/java/com/example/api/domain/Scrap.java | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 6e0ef7f0..547ffaef 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "account_id") + @JoinColumn(name = "employee_id") @JsonIgnore private Account employee; diff --git a/src/main/java/com/example/api/domain/Scrap.java b/src/main/java/com/example/api/domain/Scrap.java index 7d8446d1..a8d20e1a 100644 --- a/src/main/java/com/example/api/domain/Scrap.java +++ b/src/main/java/com/example/api/domain/Scrap.java @@ -11,7 +11,6 @@ @Setter @Table(name = "SCRAP") public class Scrap extends BaseEntity { - @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long scrapId; From f6280a17c5a7432c1aa039a1d99900e9c7af10b2 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Tue, 19 Nov 2024 14:23:34 +0900 Subject: [PATCH 017/276] =?UTF-8?q?#23=20rebase=20=EA=B3=BC=EC=A0=95?= =?UTF-8?q?=EC=97=90=EC=84=9C=20Account=EB=8F=84=EB=A9=94=EC=9D=B8=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=EC=9C=BC=EB=A1=9C=20=EC=9D=B8=ED=95=9C=20Off?= =?UTF-8?q?erRepository=20Query=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/contracts/OfferRepository.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/contracts/OfferRepository.java b/src/main/java/com/example/api/contracts/OfferRepository.java index 8baa393d..f1d1236c 100644 --- a/src/main/java/com/example/api/contracts/OfferRepository.java +++ b/src/main/java/com/example/api/contracts/OfferRepository.java @@ -10,6 +10,6 @@ public interface OfferRepository extends JpaRepository { @Query("SELECT new com.example.api.contracts.dto.SuggestedBusinessResponse(offer.business.businessId, offer.suggestStartTime, offer.suggestEndTime, offer.suggestHourlyPay, offer.suggestReaded, offer.suggestSucceeded) " + "FROM OfferEmployment offer " - + "WHERE offer.employee.employeeId = :employeeId") + + "WHERE offer.employee.accountId = :employeeId") List queryEmployersSuggests(@Param("employeeId") final Long employeeId); } From 89b4ac648e2d2ee47fc583a40ccf68c8f5a9e785 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 14:25:28 +0900 Subject: [PATCH 018/276] =?UTF-8?q?#20=20EMPLOYEE,=20EMPLOYER=20=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EB=B8=94=20=EC=82=AD=EC=A0=9C=20=EB=B0=8F=20ACCOUNT?= =?UTF-8?q?=20=ED=85=8C=EC=9D=B4=EB=B8=94=EB=A1=9C=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/api/domain/ExternalCareer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 547ffaef..6e0ef7f0 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "employee_id") + @JoinColumn(name = "account_id") @JsonIgnore private Account employee; From d6e5377cf2a90ed153e197d4a69c51aa2059d593 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 15:07:39 +0900 Subject: [PATCH 019/276] =?UTF-8?q?#20=20=EB=8D=B0=EC=9D=B4=ED=84=B0?= =?UTF-8?q?=EB=B2=A0=EC=9D=B4=EC=8A=A4=20=EC=86=8D=EC=84=B1=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=EC=9D=84=20employee,=20employer=EC=97=90=20=EB=A7=9E?= =?UTF-8?q?=EA=B2=8C=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/ExternalCareer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 6e0ef7f0..547ffaef 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "account_id") + @JoinColumn(name = "employee_id") @JsonIgnore private Account employee; From d2b7bb75285fde57edefdaf9932c5924a36591f7 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 14:25:28 +0900 Subject: [PATCH 020/276] =?UTF-8?q?#20=20EMPLOYEE,=20EMPLOYER=20=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EB=B8=94=20=EC=82=AD=EC=A0=9C=20=EB=B0=8F=20ACCOUNT?= =?UTF-8?q?=20=ED=85=8C=EC=9D=B4=EB=B8=94=EB=A1=9C=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/api/domain/Business.java | 3 +-- src/main/java/com/example/api/domain/ExternalCareer.java | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/example/api/domain/Business.java b/src/main/java/com/example/api/domain/Business.java index e83fc075..e4452648 100644 --- a/src/main/java/com/example/api/domain/Business.java +++ b/src/main/java/com/example/api/domain/Business.java @@ -6,7 +6,6 @@ import java.time.LocalDate; import java.util.ArrayList; -import java.util.Date; import java.util.List; import static jakarta.persistence.FetchType.*; @@ -21,7 +20,7 @@ public class Business extends BaseEntity { private Long businessId; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "BUSINESS_EMPLOYER_ID") + @JoinColumn(name = "BUSINESS_EMPLOYER_ID", referencedColumnName = "ACCOUNT_ID") private Account employer; @OneToMany(mappedBy = "business") diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 547ffaef..6e0ef7f0 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "employee_id") + @JoinColumn(name = "account_id") @JsonIgnore private Account employee; From 43c334c0d2e161cf87efe846eb8d632e7fad16a3 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 15:07:39 +0900 Subject: [PATCH 021/276] =?UTF-8?q?#20=20=EB=8D=B0=EC=9D=B4=ED=84=B0?= =?UTF-8?q?=EB=B2=A0=EC=9D=B4=EC=8A=A4=20=EC=86=8D=EC=84=B1=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=EC=9D=84=20employee,=20employer=EC=97=90=20=EB=A7=9E?= =?UTF-8?q?=EA=B2=8C=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/Business.java | 2 +- src/main/java/com/example/api/domain/ExternalCareer.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/example/api/domain/Business.java b/src/main/java/com/example/api/domain/Business.java index e4452648..c3ef0be9 100644 --- a/src/main/java/com/example/api/domain/Business.java +++ b/src/main/java/com/example/api/domain/Business.java @@ -20,7 +20,7 @@ public class Business extends BaseEntity { private Long businessId; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "BUSINESS_EMPLOYER_ID", referencedColumnName = "ACCOUNT_ID") + @JoinColumn(name = "BUSINESS_EMPLOYER_ID") private Account employer; @OneToMany(mappedBy = "business") diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 6e0ef7f0..547ffaef 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "account_id") + @JoinColumn(name = "employee_id") @JsonIgnore private Account employee; From 1bcaf8e964fb468d74051c1668c49ccf8e9e08a3 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 14:25:28 +0900 Subject: [PATCH 022/276] =?UTF-8?q?#20=20EMPLOYEE,=20EMPLOYER=20=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EB=B8=94=20=EC=82=AD=EC=A0=9C=20=EB=B0=8F=20ACCOUNT?= =?UTF-8?q?=20=ED=85=8C=EC=9D=B4=EB=B8=94=EB=A1=9C=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/api/domain/ExternalCareer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 547ffaef..6e0ef7f0 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "employee_id") + @JoinColumn(name = "account_id") @JsonIgnore private Account employee; From 1ce2a42a1cf1baa57a4c4afeb2cda35e9b2e322f Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 15:07:39 +0900 Subject: [PATCH 023/276] =?UTF-8?q?#20=20=EB=8D=B0=EC=9D=B4=ED=84=B0?= =?UTF-8?q?=EB=B2=A0=EC=9D=B4=EC=8A=A4=20=EC=86=8D=EC=84=B1=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=EC=9D=84=20employee,=20employer=EC=97=90=20=EB=A7=9E?= =?UTF-8?q?=EA=B2=8C=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/ExternalCareer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 6e0ef7f0..547ffaef 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "account_id") + @JoinColumn(name = "employee_id") @JsonIgnore private Account employee; From fc9be3002d3b84f4550bca8b52dee5bce9cfd839 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 14:25:28 +0900 Subject: [PATCH 024/276] =?UTF-8?q?#20=20EMPLOYEE,=20EMPLOYER=20=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EB=B8=94=20=EC=82=AD=EC=A0=9C=20=EB=B0=8F=20ACCOUNT?= =?UTF-8?q?=20=ED=85=8C=EC=9D=B4=EB=B8=94=EB=A1=9C=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/api/domain/ExternalCareer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 547ffaef..6e0ef7f0 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "employee_id") + @JoinColumn(name = "account_id") @JsonIgnore private Account employee; From 932ae2847c40e319ac0f3ed4f588f23bbf6c048e Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 15:07:39 +0900 Subject: [PATCH 025/276] =?UTF-8?q?#20=20=EB=8D=B0=EC=9D=B4=ED=84=B0?= =?UTF-8?q?=EB=B2=A0=EC=9D=B4=EC=8A=A4=20=EC=86=8D=EC=84=B1=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=EC=9D=84=20employee,=20employer=EC=97=90=20=EB=A7=9E?= =?UTF-8?q?=EA=B2=8C=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/ExternalCareer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 6e0ef7f0..547ffaef 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "account_id") + @JoinColumn(name = "employee_id") @JsonIgnore private Account employee; From 69f282d66d42bc2bb9957a375e81879bccfc4632 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 14:25:28 +0900 Subject: [PATCH 026/276] =?UTF-8?q?#20=20EMPLOYEE,=20EMPLOYER=20=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EB=B8=94=20=EC=82=AD=EC=A0=9C=20=EB=B0=8F=20ACCOUNT?= =?UTF-8?q?=20=ED=85=8C=EC=9D=B4=EB=B8=94=EB=A1=9C=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/api/domain/ExternalCareer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 547ffaef..6e0ef7f0 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "employee_id") + @JoinColumn(name = "account_id") @JsonIgnore private Account employee; From 504f96b64064dde4611d0db836b5dddc35964e7c Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 15:07:39 +0900 Subject: [PATCH 027/276] =?UTF-8?q?#20=20=EB=8D=B0=EC=9D=B4=ED=84=B0?= =?UTF-8?q?=EB=B2=A0=EC=9D=B4=EC=8A=A4=20=EC=86=8D=EC=84=B1=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=EC=9D=84=20employee,=20employer=EC=97=90=20=EB=A7=9E?= =?UTF-8?q?=EA=B2=8C=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/ExternalCareer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 6e0ef7f0..547ffaef 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "account_id") + @JoinColumn(name = "employee_id") @JsonIgnore private Account employee; From 267de058e6d7763eec51eaa1e598b22ea6f16981 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 14:25:28 +0900 Subject: [PATCH 028/276] =?UTF-8?q?#20=20EMPLOYEE,=20EMPLOYER=20=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EB=B8=94=20=EC=82=AD=EC=A0=9C=20=EB=B0=8F=20ACCOUNT?= =?UTF-8?q?=20=ED=85=8C=EC=9D=B4=EB=B8=94=EB=A1=9C=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/api/domain/Business.java | 2 +- src/main/java/com/example/api/domain/ExternalCareer.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/example/api/domain/Business.java b/src/main/java/com/example/api/domain/Business.java index c3ef0be9..e4452648 100644 --- a/src/main/java/com/example/api/domain/Business.java +++ b/src/main/java/com/example/api/domain/Business.java @@ -20,7 +20,7 @@ public class Business extends BaseEntity { private Long businessId; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "BUSINESS_EMPLOYER_ID") + @JoinColumn(name = "BUSINESS_EMPLOYER_ID", referencedColumnName = "ACCOUNT_ID") private Account employer; @OneToMany(mappedBy = "business") diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 547ffaef..6e0ef7f0 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "employee_id") + @JoinColumn(name = "account_id") @JsonIgnore private Account employee; From b28bbaefc8b951a3c8110845c5d2dc01b75fe247 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 15:07:39 +0900 Subject: [PATCH 029/276] =?UTF-8?q?#20=20=EB=8D=B0=EC=9D=B4=ED=84=B0?= =?UTF-8?q?=EB=B2=A0=EC=9D=B4=EC=8A=A4=20=EC=86=8D=EC=84=B1=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=EC=9D=84=20employee,=20employer=EC=97=90=20=EB=A7=9E?= =?UTF-8?q?=EA=B2=8C=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/Business.java | 2 +- src/main/java/com/example/api/domain/ExternalCareer.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/example/api/domain/Business.java b/src/main/java/com/example/api/domain/Business.java index e4452648..c3ef0be9 100644 --- a/src/main/java/com/example/api/domain/Business.java +++ b/src/main/java/com/example/api/domain/Business.java @@ -20,7 +20,7 @@ public class Business extends BaseEntity { private Long businessId; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "BUSINESS_EMPLOYER_ID", referencedColumnName = "ACCOUNT_ID") + @JoinColumn(name = "BUSINESS_EMPLOYER_ID") private Account employer; @OneToMany(mappedBy = "business") diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 6e0ef7f0..547ffaef 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "account_id") + @JoinColumn(name = "employee_id") @JsonIgnore private Account employee; From e7c850f15b3f5bbfe3cbdc5dd244b8be55f072e5 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 14:25:28 +0900 Subject: [PATCH 030/276] =?UTF-8?q?#20=20EMPLOYEE,=20EMPLOYER=20=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EB=B8=94=20=EC=82=AD=EC=A0=9C=20=EB=B0=8F=20ACCOUNT?= =?UTF-8?q?=20=ED=85=8C=EC=9D=B4=EB=B8=94=EB=A1=9C=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/api/domain/Business.java | 1 + src/main/java/com/example/api/domain/ExternalCareer.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/domain/Business.java b/src/main/java/com/example/api/domain/Business.java index c3ef0be9..e83fc075 100644 --- a/src/main/java/com/example/api/domain/Business.java +++ b/src/main/java/com/example/api/domain/Business.java @@ -6,6 +6,7 @@ import java.time.LocalDate; import java.util.ArrayList; +import java.util.Date; import java.util.List; import static jakarta.persistence.FetchType.*; diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 547ffaef..6e0ef7f0 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "employee_id") + @JoinColumn(name = "account_id") @JsonIgnore private Account employee; From da4ab480251818cc4ead5ff144eb1e25d9472ce2 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 15:07:39 +0900 Subject: [PATCH 031/276] =?UTF-8?q?#20=20=EB=8D=B0=EC=9D=B4=ED=84=B0?= =?UTF-8?q?=EB=B2=A0=EC=9D=B4=EC=8A=A4=20=EC=86=8D=EC=84=B1=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=EC=9D=84=20employee,=20employer=EC=97=90=20=EB=A7=9E?= =?UTF-8?q?=EA=B2=8C=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/ExternalCareer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 6e0ef7f0..547ffaef 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "account_id") + @JoinColumn(name = "employee_id") @JsonIgnore private Account employee; From 9bea29f4481130cf3e0b0355ab2b18245f1b669c Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 14:25:28 +0900 Subject: [PATCH 032/276] =?UTF-8?q?#20=20EMPLOYEE,=20EMPLOYER=20=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EB=B8=94=20=EC=82=AD=EC=A0=9C=20=EB=B0=8F=20ACCOUNT?= =?UTF-8?q?=20=ED=85=8C=EC=9D=B4=EB=B8=94=EB=A1=9C=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/api/domain/ExternalCareer.java | 2 +- src/main/java/com/example/api/domain/Scrap.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 547ffaef..6e0ef7f0 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "employee_id") + @JoinColumn(name = "account_id") @JsonIgnore private Account employee; diff --git a/src/main/java/com/example/api/domain/Scrap.java b/src/main/java/com/example/api/domain/Scrap.java index a8d20e1a..7d8446d1 100644 --- a/src/main/java/com/example/api/domain/Scrap.java +++ b/src/main/java/com/example/api/domain/Scrap.java @@ -11,6 +11,7 @@ @Setter @Table(name = "SCRAP") public class Scrap extends BaseEntity { + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long scrapId; From ecc8d33adbe9e14ab7fb31fff57e8843a3206b8d Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 15:07:39 +0900 Subject: [PATCH 033/276] =?UTF-8?q?#20=20=EB=8D=B0=EC=9D=B4=ED=84=B0?= =?UTF-8?q?=EB=B2=A0=EC=9D=B4=EC=8A=A4=20=EC=86=8D=EC=84=B1=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=EC=9D=84=20employee,=20employer=EC=97=90=20=EB=A7=9E?= =?UTF-8?q?=EA=B2=8C=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/ExternalCareer.java | 2 +- src/main/java/com/example/api/domain/Scrap.java | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 6e0ef7f0..547ffaef 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "account_id") + @JoinColumn(name = "employee_id") @JsonIgnore private Account employee; diff --git a/src/main/java/com/example/api/domain/Scrap.java b/src/main/java/com/example/api/domain/Scrap.java index 7d8446d1..a8d20e1a 100644 --- a/src/main/java/com/example/api/domain/Scrap.java +++ b/src/main/java/com/example/api/domain/Scrap.java @@ -11,7 +11,6 @@ @Setter @Table(name = "SCRAP") public class Scrap extends BaseEntity { - @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long scrapId; From 230f7d87c26fca9e9755bb0f6597bc9254bfe500 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 14:25:28 +0900 Subject: [PATCH 034/276] =?UTF-8?q?#20=20EMPLOYEE,=20EMPLOYER=20=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EB=B8=94=20=EC=82=AD=EC=A0=9C=20=EB=B0=8F=20ACCOUNT?= =?UTF-8?q?=20=ED=85=8C=EC=9D=B4=EB=B8=94=EB=A1=9C=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/api/domain/ExternalCareer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 547ffaef..6e0ef7f0 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "employee_id") + @JoinColumn(name = "account_id") @JsonIgnore private Account employee; From d67f4f82dde8ff5f1d247ccb03de123735797731 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 15:07:39 +0900 Subject: [PATCH 035/276] =?UTF-8?q?#20=20=EB=8D=B0=EC=9D=B4=ED=84=B0?= =?UTF-8?q?=EB=B2=A0=EC=9D=B4=EC=8A=A4=20=EC=86=8D=EC=84=B1=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=EC=9D=84=20employee,=20employer=EC=97=90=20=EB=A7=9E?= =?UTF-8?q?=EA=B2=8C=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/ExternalCareer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 6e0ef7f0..547ffaef 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "account_id") + @JoinColumn(name = "employee_id") @JsonIgnore private Account employee; From b906a76d3158bf8d2bcf79a3a7f60cad03897c7d Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 14:25:28 +0900 Subject: [PATCH 036/276] =?UTF-8?q?#20=20EMPLOYEE,=20EMPLOYER=20=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EB=B8=94=20=EC=82=AD=EC=A0=9C=20=EB=B0=8F=20ACCOUNT?= =?UTF-8?q?=20=ED=85=8C=EC=9D=B4=EB=B8=94=EB=A1=9C=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/api/domain/Business.java | 3 +-- src/main/java/com/example/api/domain/ExternalCareer.java | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/example/api/domain/Business.java b/src/main/java/com/example/api/domain/Business.java index e83fc075..e4452648 100644 --- a/src/main/java/com/example/api/domain/Business.java +++ b/src/main/java/com/example/api/domain/Business.java @@ -6,7 +6,6 @@ import java.time.LocalDate; import java.util.ArrayList; -import java.util.Date; import java.util.List; import static jakarta.persistence.FetchType.*; @@ -21,7 +20,7 @@ public class Business extends BaseEntity { private Long businessId; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "BUSINESS_EMPLOYER_ID") + @JoinColumn(name = "BUSINESS_EMPLOYER_ID", referencedColumnName = "ACCOUNT_ID") private Account employer; @OneToMany(mappedBy = "business") diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 547ffaef..6e0ef7f0 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "employee_id") + @JoinColumn(name = "account_id") @JsonIgnore private Account employee; From 6720a2581cbb495cf3caf6ea32484b45a26f538f Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 15:07:39 +0900 Subject: [PATCH 037/276] =?UTF-8?q?#20=20=EB=8D=B0=EC=9D=B4=ED=84=B0?= =?UTF-8?q?=EB=B2=A0=EC=9D=B4=EC=8A=A4=20=EC=86=8D=EC=84=B1=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=EC=9D=84=20employee,=20employer=EC=97=90=20=EB=A7=9E?= =?UTF-8?q?=EA=B2=8C=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/Business.java | 2 +- src/main/java/com/example/api/domain/ExternalCareer.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/example/api/domain/Business.java b/src/main/java/com/example/api/domain/Business.java index e4452648..c3ef0be9 100644 --- a/src/main/java/com/example/api/domain/Business.java +++ b/src/main/java/com/example/api/domain/Business.java @@ -20,7 +20,7 @@ public class Business extends BaseEntity { private Long businessId; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "BUSINESS_EMPLOYER_ID", referencedColumnName = "ACCOUNT_ID") + @JoinColumn(name = "BUSINESS_EMPLOYER_ID") private Account employer; @OneToMany(mappedBy = "business") diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 6e0ef7f0..547ffaef 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "account_id") + @JoinColumn(name = "employee_id") @JsonIgnore private Account employee; From 51452c4b757666dd9f68ddf3182b36ad8be28805 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 14:25:28 +0900 Subject: [PATCH 038/276] =?UTF-8?q?#20=20EMPLOYEE,=20EMPLOYER=20=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EB=B8=94=20=EC=82=AD=EC=A0=9C=20=EB=B0=8F=20ACCOUNT?= =?UTF-8?q?=20=ED=85=8C=EC=9D=B4=EB=B8=94=EB=A1=9C=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/api/domain/ExternalCareer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 547ffaef..6e0ef7f0 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "employee_id") + @JoinColumn(name = "account_id") @JsonIgnore private Account employee; From 816a17393e72561aea2641c572668ce429e6196e Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 15:07:39 +0900 Subject: [PATCH 039/276] =?UTF-8?q?#20=20=EB=8D=B0=EC=9D=B4=ED=84=B0?= =?UTF-8?q?=EB=B2=A0=EC=9D=B4=EC=8A=A4=20=EC=86=8D=EC=84=B1=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=EC=9D=84=20employee,=20employer=EC=97=90=20=EB=A7=9E?= =?UTF-8?q?=EA=B2=8C=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/ExternalCareer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 6e0ef7f0..547ffaef 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "account_id") + @JoinColumn(name = "employee_id") @JsonIgnore private Account employee; From ec71d283154fe349f3790bf41c62164cd73f746b Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 14:25:28 +0900 Subject: [PATCH 040/276] =?UTF-8?q?#20=20EMPLOYEE,=20EMPLOYER=20=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EB=B8=94=20=EC=82=AD=EC=A0=9C=20=EB=B0=8F=20ACCOUNT?= =?UTF-8?q?=20=ED=85=8C=EC=9D=B4=EB=B8=94=EB=A1=9C=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/api/domain/ExternalCareer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 547ffaef..6e0ef7f0 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "employee_id") + @JoinColumn(name = "account_id") @JsonIgnore private Account employee; From 9902ea812a4c64fb3d299643a853f22c4d1dbfe4 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 15:07:39 +0900 Subject: [PATCH 041/276] =?UTF-8?q?#20=20=EB=8D=B0=EC=9D=B4=ED=84=B0?= =?UTF-8?q?=EB=B2=A0=EC=9D=B4=EC=8A=A4=20=EC=86=8D=EC=84=B1=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=EC=9D=84=20employee,=20employer=EC=97=90=20=EB=A7=9E?= =?UTF-8?q?=EA=B2=8C=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/ExternalCareer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 6e0ef7f0..547ffaef 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "account_id") + @JoinColumn(name = "employee_id") @JsonIgnore private Account employee; From da46276b398b61aa356431f973f73f4debae2142 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 14:25:28 +0900 Subject: [PATCH 042/276] =?UTF-8?q?#20=20EMPLOYEE,=20EMPLOYER=20=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EB=B8=94=20=EC=82=AD=EC=A0=9C=20=EB=B0=8F=20ACCOUNT?= =?UTF-8?q?=20=ED=85=8C=EC=9D=B4=EB=B8=94=EB=A1=9C=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/api/domain/ExternalCareer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 547ffaef..6e0ef7f0 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "employee_id") + @JoinColumn(name = "account_id") @JsonIgnore private Account employee; From 818b7953be434135bc661aa537e1c7aeeb7dbb9f Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 15:07:39 +0900 Subject: [PATCH 043/276] =?UTF-8?q?#20=20=EB=8D=B0=EC=9D=B4=ED=84=B0?= =?UTF-8?q?=EB=B2=A0=EC=9D=B4=EC=8A=A4=20=EC=86=8D=EC=84=B1=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=EC=9D=84=20employee,=20employer=EC=97=90=20=EB=A7=9E?= =?UTF-8?q?=EA=B2=8C=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/ExternalCareer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 6e0ef7f0..547ffaef 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "account_id") + @JoinColumn(name = "employee_id") @JsonIgnore private Account employee; From 3546856b31854c77994e4aae0ddbb29adb519f3c Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 14:25:28 +0900 Subject: [PATCH 044/276] =?UTF-8?q?#20=20EMPLOYEE,=20EMPLOYER=20=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EB=B8=94=20=EC=82=AD=EC=A0=9C=20=EB=B0=8F=20ACCOUNT?= =?UTF-8?q?=20=ED=85=8C=EC=9D=B4=EB=B8=94=EB=A1=9C=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/api/domain/Business.java | 2 +- src/main/java/com/example/api/domain/ExternalCareer.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/example/api/domain/Business.java b/src/main/java/com/example/api/domain/Business.java index c3ef0be9..e4452648 100644 --- a/src/main/java/com/example/api/domain/Business.java +++ b/src/main/java/com/example/api/domain/Business.java @@ -20,7 +20,7 @@ public class Business extends BaseEntity { private Long businessId; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "BUSINESS_EMPLOYER_ID") + @JoinColumn(name = "BUSINESS_EMPLOYER_ID", referencedColumnName = "ACCOUNT_ID") private Account employer; @OneToMany(mappedBy = "business") diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 547ffaef..6e0ef7f0 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "employee_id") + @JoinColumn(name = "account_id") @JsonIgnore private Account employee; From c5ebd386b46e2d7f0ca6706184aded61aa016b34 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 15:07:39 +0900 Subject: [PATCH 045/276] =?UTF-8?q?#20=20=EB=8D=B0=EC=9D=B4=ED=84=B0?= =?UTF-8?q?=EB=B2=A0=EC=9D=B4=EC=8A=A4=20=EC=86=8D=EC=84=B1=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=EC=9D=84=20employee,=20employer=EC=97=90=20=EB=A7=9E?= =?UTF-8?q?=EA=B2=8C=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/Business.java | 2 +- src/main/java/com/example/api/domain/ExternalCareer.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/example/api/domain/Business.java b/src/main/java/com/example/api/domain/Business.java index e4452648..c3ef0be9 100644 --- a/src/main/java/com/example/api/domain/Business.java +++ b/src/main/java/com/example/api/domain/Business.java @@ -20,7 +20,7 @@ public class Business extends BaseEntity { private Long businessId; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "BUSINESS_EMPLOYER_ID", referencedColumnName = "ACCOUNT_ID") + @JoinColumn(name = "BUSINESS_EMPLOYER_ID") private Account employer; @OneToMany(mappedBy = "business") diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 6e0ef7f0..547ffaef 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "account_id") + @JoinColumn(name = "employee_id") @JsonIgnore private Account employee; From e0bc60e5f69d56bfb04410fe5a147963811f060a Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 14:25:28 +0900 Subject: [PATCH 046/276] =?UTF-8?q?#20=20EMPLOYEE,=20EMPLOYER=20=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EB=B8=94=20=EC=82=AD=EC=A0=9C=20=EB=B0=8F=20ACCOUNT?= =?UTF-8?q?=20=ED=85=8C=EC=9D=B4=EB=B8=94=EB=A1=9C=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/api/domain/Business.java | 1 + src/main/java/com/example/api/domain/ExternalCareer.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/domain/Business.java b/src/main/java/com/example/api/domain/Business.java index c3ef0be9..e83fc075 100644 --- a/src/main/java/com/example/api/domain/Business.java +++ b/src/main/java/com/example/api/domain/Business.java @@ -6,6 +6,7 @@ import java.time.LocalDate; import java.util.ArrayList; +import java.util.Date; import java.util.List; import static jakarta.persistence.FetchType.*; diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 547ffaef..6e0ef7f0 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "employee_id") + @JoinColumn(name = "account_id") @JsonIgnore private Account employee; From bd5dfb0dd55a0b6d430fc4090aaebe72b817b2fe Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 15:07:39 +0900 Subject: [PATCH 047/276] =?UTF-8?q?#20=20=EB=8D=B0=EC=9D=B4=ED=84=B0?= =?UTF-8?q?=EB=B2=A0=EC=9D=B4=EC=8A=A4=20=EC=86=8D=EC=84=B1=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=EC=9D=84=20employee,=20employer=EC=97=90=20=EB=A7=9E?= =?UTF-8?q?=EA=B2=8C=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/ExternalCareer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 6e0ef7f0..547ffaef 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "account_id") + @JoinColumn(name = "employee_id") @JsonIgnore private Account employee; From f9beaae2964423e6d62da9d015bb88edc827d795 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 14:25:28 +0900 Subject: [PATCH 048/276] =?UTF-8?q?#20=20EMPLOYEE,=20EMPLOYER=20=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EB=B8=94=20=EC=82=AD=EC=A0=9C=20=EB=B0=8F=20ACCOUNT?= =?UTF-8?q?=20=ED=85=8C=EC=9D=B4=EB=B8=94=EB=A1=9C=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/api/domain/ExternalCareer.java | 2 +- src/main/java/com/example/api/domain/Scrap.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 547ffaef..6e0ef7f0 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "employee_id") + @JoinColumn(name = "account_id") @JsonIgnore private Account employee; diff --git a/src/main/java/com/example/api/domain/Scrap.java b/src/main/java/com/example/api/domain/Scrap.java index a8d20e1a..7d8446d1 100644 --- a/src/main/java/com/example/api/domain/Scrap.java +++ b/src/main/java/com/example/api/domain/Scrap.java @@ -11,6 +11,7 @@ @Setter @Table(name = "SCRAP") public class Scrap extends BaseEntity { + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long scrapId; From 0c0aa8f5ef81848afc8a45460b6b6c0ba050079b Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 15:07:39 +0900 Subject: [PATCH 049/276] =?UTF-8?q?#20=20=EB=8D=B0=EC=9D=B4=ED=84=B0?= =?UTF-8?q?=EB=B2=A0=EC=9D=B4=EC=8A=A4=20=EC=86=8D=EC=84=B1=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=EC=9D=84=20employee,=20employer=EC=97=90=20=EB=A7=9E?= =?UTF-8?q?=EA=B2=8C=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/ExternalCareer.java | 2 +- src/main/java/com/example/api/domain/Scrap.java | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 6e0ef7f0..547ffaef 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "account_id") + @JoinColumn(name = "employee_id") @JsonIgnore private Account employee; diff --git a/src/main/java/com/example/api/domain/Scrap.java b/src/main/java/com/example/api/domain/Scrap.java index 7d8446d1..a8d20e1a 100644 --- a/src/main/java/com/example/api/domain/Scrap.java +++ b/src/main/java/com/example/api/domain/Scrap.java @@ -11,7 +11,6 @@ @Setter @Table(name = "SCRAP") public class Scrap extends BaseEntity { - @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long scrapId; From 40484eeaccb5a0fa4d9820185a6d7337fb68613a Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 14:25:28 +0900 Subject: [PATCH 050/276] =?UTF-8?q?#20=20EMPLOYEE,=20EMPLOYER=20=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EB=B8=94=20=EC=82=AD=EC=A0=9C=20=EB=B0=8F=20ACCOUNT?= =?UTF-8?q?=20=ED=85=8C=EC=9D=B4=EB=B8=94=EB=A1=9C=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/api/domain/ExternalCareer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 547ffaef..6e0ef7f0 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "employee_id") + @JoinColumn(name = "account_id") @JsonIgnore private Account employee; From 92e9f2869ef9ba888849821ac04e9c8afc5f603a Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 15:07:39 +0900 Subject: [PATCH 051/276] =?UTF-8?q?#20=20=EB=8D=B0=EC=9D=B4=ED=84=B0?= =?UTF-8?q?=EB=B2=A0=EC=9D=B4=EC=8A=A4=20=EC=86=8D=EC=84=B1=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=EC=9D=84=20employee,=20employer=EC=97=90=20=EB=A7=9E?= =?UTF-8?q?=EA=B2=8C=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/ExternalCareer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 6e0ef7f0..547ffaef 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "account_id") + @JoinColumn(name = "employee_id") @JsonIgnore private Account employee; From 19a6d477a7108c1c75a44ec5f364c6bca0c271db Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 14:25:28 +0900 Subject: [PATCH 052/276] =?UTF-8?q?#20=20EMPLOYEE,=20EMPLOYER=20=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EB=B8=94=20=EC=82=AD=EC=A0=9C=20=EB=B0=8F=20ACCOUNT?= =?UTF-8?q?=20=ED=85=8C=EC=9D=B4=EB=B8=94=EB=A1=9C=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/api/domain/Business.java | 3 +-- src/main/java/com/example/api/domain/ExternalCareer.java | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/example/api/domain/Business.java b/src/main/java/com/example/api/domain/Business.java index e83fc075..e4452648 100644 --- a/src/main/java/com/example/api/domain/Business.java +++ b/src/main/java/com/example/api/domain/Business.java @@ -6,7 +6,6 @@ import java.time.LocalDate; import java.util.ArrayList; -import java.util.Date; import java.util.List; import static jakarta.persistence.FetchType.*; @@ -21,7 +20,7 @@ public class Business extends BaseEntity { private Long businessId; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "BUSINESS_EMPLOYER_ID") + @JoinColumn(name = "BUSINESS_EMPLOYER_ID", referencedColumnName = "ACCOUNT_ID") private Account employer; @OneToMany(mappedBy = "business") diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 547ffaef..6e0ef7f0 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "employee_id") + @JoinColumn(name = "account_id") @JsonIgnore private Account employee; From 3a91f7eb6669d1ea3298f64900253f984bbdf6dc Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 15:07:39 +0900 Subject: [PATCH 053/276] =?UTF-8?q?#20=20=EB=8D=B0=EC=9D=B4=ED=84=B0?= =?UTF-8?q?=EB=B2=A0=EC=9D=B4=EC=8A=A4=20=EC=86=8D=EC=84=B1=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=EC=9D=84=20employee,=20employer=EC=97=90=20=EB=A7=9E?= =?UTF-8?q?=EA=B2=8C=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/Business.java | 2 +- src/main/java/com/example/api/domain/ExternalCareer.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/example/api/domain/Business.java b/src/main/java/com/example/api/domain/Business.java index e4452648..c3ef0be9 100644 --- a/src/main/java/com/example/api/domain/Business.java +++ b/src/main/java/com/example/api/domain/Business.java @@ -20,7 +20,7 @@ public class Business extends BaseEntity { private Long businessId; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "BUSINESS_EMPLOYER_ID", referencedColumnName = "ACCOUNT_ID") + @JoinColumn(name = "BUSINESS_EMPLOYER_ID") private Account employer; @OneToMany(mappedBy = "business") diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 6e0ef7f0..547ffaef 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "account_id") + @JoinColumn(name = "employee_id") @JsonIgnore private Account employee; From 9aef6a44f2cef76409af58de919ad058467d0255 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 14:25:28 +0900 Subject: [PATCH 054/276] =?UTF-8?q?#20=20EMPLOYEE,=20EMPLOYER=20=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EB=B8=94=20=EC=82=AD=EC=A0=9C=20=EB=B0=8F=20ACCOUNT?= =?UTF-8?q?=20=ED=85=8C=EC=9D=B4=EB=B8=94=EB=A1=9C=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/api/domain/ExternalCareer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 547ffaef..6e0ef7f0 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "employee_id") + @JoinColumn(name = "account_id") @JsonIgnore private Account employee; From 55151c265e4b04541a6c358dfd217b6b68ec2d47 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 15:07:39 +0900 Subject: [PATCH 055/276] =?UTF-8?q?#20=20=EB=8D=B0=EC=9D=B4=ED=84=B0?= =?UTF-8?q?=EB=B2=A0=EC=9D=B4=EC=8A=A4=20=EC=86=8D=EC=84=B1=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=EC=9D=84=20employee,=20employer=EC=97=90=20=EB=A7=9E?= =?UTF-8?q?=EA=B2=8C=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/ExternalCareer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 6e0ef7f0..547ffaef 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "account_id") + @JoinColumn(name = "employee_id") @JsonIgnore private Account employee; From 6f54a8646e9f8db5705e720caa2d53cf8cdefb66 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 14:25:28 +0900 Subject: [PATCH 056/276] =?UTF-8?q?#20=20EMPLOYEE,=20EMPLOYER=20=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EB=B8=94=20=EC=82=AD=EC=A0=9C=20=EB=B0=8F=20ACCOUNT?= =?UTF-8?q?=20=ED=85=8C=EC=9D=B4=EB=B8=94=EB=A1=9C=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/api/domain/ExternalCareer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 547ffaef..6e0ef7f0 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "employee_id") + @JoinColumn(name = "account_id") @JsonIgnore private Account employee; From b63d73d7684a48bcf6c4adffd7601c3df7b0de48 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 15:07:39 +0900 Subject: [PATCH 057/276] =?UTF-8?q?#20=20=EB=8D=B0=EC=9D=B4=ED=84=B0?= =?UTF-8?q?=EB=B2=A0=EC=9D=B4=EC=8A=A4=20=EC=86=8D=EC=84=B1=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=EC=9D=84=20employee,=20employer=EC=97=90=20=EB=A7=9E?= =?UTF-8?q?=EA=B2=8C=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/ExternalCareer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 6e0ef7f0..547ffaef 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "account_id") + @JoinColumn(name = "employee_id") @JsonIgnore private Account employee; From 5d32e62722eaacf68cabc863b3d457553bcb14b5 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 14:25:28 +0900 Subject: [PATCH 058/276] =?UTF-8?q?#20=20EMPLOYEE,=20EMPLOYER=20=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EB=B8=94=20=EC=82=AD=EC=A0=9C=20=EB=B0=8F=20ACCOUNT?= =?UTF-8?q?=20=ED=85=8C=EC=9D=B4=EB=B8=94=EB=A1=9C=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/api/domain/ExternalCareer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 547ffaef..6e0ef7f0 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "employee_id") + @JoinColumn(name = "account_id") @JsonIgnore private Account employee; From c61d34bcb37fcf421b9a2afcaf90e3c770b51a77 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 15:07:39 +0900 Subject: [PATCH 059/276] =?UTF-8?q?#20=20=EB=8D=B0=EC=9D=B4=ED=84=B0?= =?UTF-8?q?=EB=B2=A0=EC=9D=B4=EC=8A=A4=20=EC=86=8D=EC=84=B1=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=EC=9D=84=20employee,=20employer=EC=97=90=20=EB=A7=9E?= =?UTF-8?q?=EA=B2=8C=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/ExternalCareer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 6e0ef7f0..547ffaef 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "account_id") + @JoinColumn(name = "employee_id") @JsonIgnore private Account employee; From e82af2d5625abfbf621dbc4905f361ce2ab1327a Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 14:25:28 +0900 Subject: [PATCH 060/276] =?UTF-8?q?#20=20EMPLOYEE,=20EMPLOYER=20=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EB=B8=94=20=EC=82=AD=EC=A0=9C=20=EB=B0=8F=20ACCOUNT?= =?UTF-8?q?=20=ED=85=8C=EC=9D=B4=EB=B8=94=EB=A1=9C=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/api/domain/Business.java | 2 +- src/main/java/com/example/api/domain/ExternalCareer.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/example/api/domain/Business.java b/src/main/java/com/example/api/domain/Business.java index c3ef0be9..e4452648 100644 --- a/src/main/java/com/example/api/domain/Business.java +++ b/src/main/java/com/example/api/domain/Business.java @@ -20,7 +20,7 @@ public class Business extends BaseEntity { private Long businessId; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "BUSINESS_EMPLOYER_ID") + @JoinColumn(name = "BUSINESS_EMPLOYER_ID", referencedColumnName = "ACCOUNT_ID") private Account employer; @OneToMany(mappedBy = "business") diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 547ffaef..6e0ef7f0 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "employee_id") + @JoinColumn(name = "account_id") @JsonIgnore private Account employee; From 75245bcab1b04eae4df121f0680b1958105d3fbd Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 15:07:39 +0900 Subject: [PATCH 061/276] =?UTF-8?q?#20=20=EB=8D=B0=EC=9D=B4=ED=84=B0?= =?UTF-8?q?=EB=B2=A0=EC=9D=B4=EC=8A=A4=20=EC=86=8D=EC=84=B1=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=EC=9D=84=20employee,=20employer=EC=97=90=20=EB=A7=9E?= =?UTF-8?q?=EA=B2=8C=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/Business.java | 2 +- src/main/java/com/example/api/domain/ExternalCareer.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/example/api/domain/Business.java b/src/main/java/com/example/api/domain/Business.java index e4452648..c3ef0be9 100644 --- a/src/main/java/com/example/api/domain/Business.java +++ b/src/main/java/com/example/api/domain/Business.java @@ -20,7 +20,7 @@ public class Business extends BaseEntity { private Long businessId; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "BUSINESS_EMPLOYER_ID", referencedColumnName = "ACCOUNT_ID") + @JoinColumn(name = "BUSINESS_EMPLOYER_ID") private Account employer; @OneToMany(mappedBy = "business") diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 6e0ef7f0..547ffaef 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "account_id") + @JoinColumn(name = "employee_id") @JsonIgnore private Account employee; From f317c35707dc34c9ee3e3c0f09629d784b2fc771 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 14:25:28 +0900 Subject: [PATCH 062/276] =?UTF-8?q?#20=20EMPLOYEE,=20EMPLOYER=20=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EB=B8=94=20=EC=82=AD=EC=A0=9C=20=EB=B0=8F=20ACCOUNT?= =?UTF-8?q?=20=ED=85=8C=EC=9D=B4=EB=B8=94=EB=A1=9C=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/api/domain/Business.java | 1 + src/main/java/com/example/api/domain/ExternalCareer.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/domain/Business.java b/src/main/java/com/example/api/domain/Business.java index c3ef0be9..e83fc075 100644 --- a/src/main/java/com/example/api/domain/Business.java +++ b/src/main/java/com/example/api/domain/Business.java @@ -6,6 +6,7 @@ import java.time.LocalDate; import java.util.ArrayList; +import java.util.Date; import java.util.List; import static jakarta.persistence.FetchType.*; diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 547ffaef..6e0ef7f0 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "employee_id") + @JoinColumn(name = "account_id") @JsonIgnore private Account employee; From db9a273d6309fe7d994d5957d2559d5991188b28 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 15:07:39 +0900 Subject: [PATCH 063/276] =?UTF-8?q?#20=20=EB=8D=B0=EC=9D=B4=ED=84=B0?= =?UTF-8?q?=EB=B2=A0=EC=9D=B4=EC=8A=A4=20=EC=86=8D=EC=84=B1=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=EC=9D=84=20employee,=20employer=EC=97=90=20=EB=A7=9E?= =?UTF-8?q?=EA=B2=8C=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/ExternalCareer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 6e0ef7f0..547ffaef 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "account_id") + @JoinColumn(name = "employee_id") @JsonIgnore private Account employee; From 2df671bf49d7f9e7507b26c465b6001c789e317b Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 14:25:28 +0900 Subject: [PATCH 064/276] =?UTF-8?q?#20=20EMPLOYEE,=20EMPLOYER=20=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EB=B8=94=20=EC=82=AD=EC=A0=9C=20=EB=B0=8F=20ACCOUNT?= =?UTF-8?q?=20=ED=85=8C=EC=9D=B4=EB=B8=94=EB=A1=9C=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/api/domain/ExternalCareer.java | 2 +- src/main/java/com/example/api/domain/Scrap.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 547ffaef..6e0ef7f0 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "employee_id") + @JoinColumn(name = "account_id") @JsonIgnore private Account employee; diff --git a/src/main/java/com/example/api/domain/Scrap.java b/src/main/java/com/example/api/domain/Scrap.java index a8d20e1a..7d8446d1 100644 --- a/src/main/java/com/example/api/domain/Scrap.java +++ b/src/main/java/com/example/api/domain/Scrap.java @@ -11,6 +11,7 @@ @Setter @Table(name = "SCRAP") public class Scrap extends BaseEntity { + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long scrapId; From 2c8f5432d2b8f9d89541f38a1b3ecf04c4ad2adc Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 15:07:39 +0900 Subject: [PATCH 065/276] =?UTF-8?q?#20=20=EB=8D=B0=EC=9D=B4=ED=84=B0?= =?UTF-8?q?=EB=B2=A0=EC=9D=B4=EC=8A=A4=20=EC=86=8D=EC=84=B1=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=EC=9D=84=20employee,=20employer=EC=97=90=20=EB=A7=9E?= =?UTF-8?q?=EA=B2=8C=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/ExternalCareer.java | 2 +- src/main/java/com/example/api/domain/Scrap.java | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 6e0ef7f0..547ffaef 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "account_id") + @JoinColumn(name = "employee_id") @JsonIgnore private Account employee; diff --git a/src/main/java/com/example/api/domain/Scrap.java b/src/main/java/com/example/api/domain/Scrap.java index 7d8446d1..a8d20e1a 100644 --- a/src/main/java/com/example/api/domain/Scrap.java +++ b/src/main/java/com/example/api/domain/Scrap.java @@ -11,7 +11,6 @@ @Setter @Table(name = "SCRAP") public class Scrap extends BaseEntity { - @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long scrapId; From 032603fc507a227c3f7c0a24b2592c871557cc77 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 14:25:28 +0900 Subject: [PATCH 066/276] =?UTF-8?q?#20=20EMPLOYEE,=20EMPLOYER=20=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EB=B8=94=20=EC=82=AD=EC=A0=9C=20=EB=B0=8F=20ACCOUNT?= =?UTF-8?q?=20=ED=85=8C=EC=9D=B4=EB=B8=94=EB=A1=9C=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/api/domain/ExternalCareer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 547ffaef..6e0ef7f0 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "employee_id") + @JoinColumn(name = "account_id") @JsonIgnore private Account employee; From da67bd0b2dd3becf93964e71f08596b8dad5d579 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 15:07:39 +0900 Subject: [PATCH 067/276] =?UTF-8?q?#20=20=EB=8D=B0=EC=9D=B4=ED=84=B0?= =?UTF-8?q?=EB=B2=A0=EC=9D=B4=EC=8A=A4=20=EC=86=8D=EC=84=B1=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=EC=9D=84=20employee,=20employer=EC=97=90=20=EB=A7=9E?= =?UTF-8?q?=EA=B2=8C=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/ExternalCareer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 6e0ef7f0..547ffaef 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "account_id") + @JoinColumn(name = "employee_id") @JsonIgnore private Account employee; From 6a2fbd4af9d10d2aa7d0f6e12def0a6550b34cb2 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 14:25:28 +0900 Subject: [PATCH 068/276] =?UTF-8?q?#20=20EMPLOYEE,=20EMPLOYER=20=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EB=B8=94=20=EC=82=AD=EC=A0=9C=20=EB=B0=8F=20ACCOUNT?= =?UTF-8?q?=20=ED=85=8C=EC=9D=B4=EB=B8=94=EB=A1=9C=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/api/domain/Business.java | 3 +-- src/main/java/com/example/api/domain/ExternalCareer.java | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/example/api/domain/Business.java b/src/main/java/com/example/api/domain/Business.java index e83fc075..e4452648 100644 --- a/src/main/java/com/example/api/domain/Business.java +++ b/src/main/java/com/example/api/domain/Business.java @@ -6,7 +6,6 @@ import java.time.LocalDate; import java.util.ArrayList; -import java.util.Date; import java.util.List; import static jakarta.persistence.FetchType.*; @@ -21,7 +20,7 @@ public class Business extends BaseEntity { private Long businessId; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "BUSINESS_EMPLOYER_ID") + @JoinColumn(name = "BUSINESS_EMPLOYER_ID", referencedColumnName = "ACCOUNT_ID") private Account employer; @OneToMany(mappedBy = "business") diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 547ffaef..6e0ef7f0 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "employee_id") + @JoinColumn(name = "account_id") @JsonIgnore private Account employee; From c35a28ed12b56ecc1012d852296acefb3c67e9bf Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 15:07:39 +0900 Subject: [PATCH 069/276] =?UTF-8?q?#20=20=EB=8D=B0=EC=9D=B4=ED=84=B0?= =?UTF-8?q?=EB=B2=A0=EC=9D=B4=EC=8A=A4=20=EC=86=8D=EC=84=B1=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=EC=9D=84=20employee,=20employer=EC=97=90=20=EB=A7=9E?= =?UTF-8?q?=EA=B2=8C=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/Business.java | 2 +- src/main/java/com/example/api/domain/ExternalCareer.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/example/api/domain/Business.java b/src/main/java/com/example/api/domain/Business.java index e4452648..c3ef0be9 100644 --- a/src/main/java/com/example/api/domain/Business.java +++ b/src/main/java/com/example/api/domain/Business.java @@ -20,7 +20,7 @@ public class Business extends BaseEntity { private Long businessId; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "BUSINESS_EMPLOYER_ID", referencedColumnName = "ACCOUNT_ID") + @JoinColumn(name = "BUSINESS_EMPLOYER_ID") private Account employer; @OneToMany(mappedBy = "business") diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 6e0ef7f0..547ffaef 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "account_id") + @JoinColumn(name = "employee_id") @JsonIgnore private Account employee; From 834792b46f9d883b452fa22719ed99061b8c65d2 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 14:25:28 +0900 Subject: [PATCH 070/276] =?UTF-8?q?#20=20EMPLOYEE,=20EMPLOYER=20=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EB=B8=94=20=EC=82=AD=EC=A0=9C=20=EB=B0=8F=20ACCOUNT?= =?UTF-8?q?=20=ED=85=8C=EC=9D=B4=EB=B8=94=EB=A1=9C=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/api/domain/ExternalCareer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 547ffaef..6e0ef7f0 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "employee_id") + @JoinColumn(name = "account_id") @JsonIgnore private Account employee; From d579a42e5688994568d8e6fbe2a5656b3b1920c0 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 15:07:39 +0900 Subject: [PATCH 071/276] =?UTF-8?q?#20=20=EB=8D=B0=EC=9D=B4=ED=84=B0?= =?UTF-8?q?=EB=B2=A0=EC=9D=B4=EC=8A=A4=20=EC=86=8D=EC=84=B1=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=EC=9D=84=20employee,=20employer=EC=97=90=20=EB=A7=9E?= =?UTF-8?q?=EA=B2=8C=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/ExternalCareer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 6e0ef7f0..547ffaef 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "account_id") + @JoinColumn(name = "employee_id") @JsonIgnore private Account employee; From a9b4e189aa9e836cda301e4ec400d78733ea364f Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 14:25:28 +0900 Subject: [PATCH 072/276] =?UTF-8?q?#20=20EMPLOYEE,=20EMPLOYER=20=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EB=B8=94=20=EC=82=AD=EC=A0=9C=20=EB=B0=8F=20ACCOUNT?= =?UTF-8?q?=20=ED=85=8C=EC=9D=B4=EB=B8=94=EB=A1=9C=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/api/domain/ExternalCareer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 547ffaef..6e0ef7f0 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "employee_id") + @JoinColumn(name = "account_id") @JsonIgnore private Account employee; From 3529252535337327ded2703c9834af168a95a2c2 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 15:07:39 +0900 Subject: [PATCH 073/276] =?UTF-8?q?#20=20=EB=8D=B0=EC=9D=B4=ED=84=B0?= =?UTF-8?q?=EB=B2=A0=EC=9D=B4=EC=8A=A4=20=EC=86=8D=EC=84=B1=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=EC=9D=84=20employee,=20employer=EC=97=90=20=EB=A7=9E?= =?UTF-8?q?=EA=B2=8C=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/ExternalCareer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 6e0ef7f0..547ffaef 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "account_id") + @JoinColumn(name = "employee_id") @JsonIgnore private Account employee; From e2386098e86f5d7637c15ab981cbd9f6e31ab932 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 14:25:28 +0900 Subject: [PATCH 074/276] =?UTF-8?q?#20=20EMPLOYEE,=20EMPLOYER=20=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EB=B8=94=20=EC=82=AD=EC=A0=9C=20=EB=B0=8F=20ACCOUNT?= =?UTF-8?q?=20=ED=85=8C=EC=9D=B4=EB=B8=94=EB=A1=9C=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/api/domain/ExternalCareer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 547ffaef..6e0ef7f0 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "employee_id") + @JoinColumn(name = "account_id") @JsonIgnore private Account employee; From 0e300e47c8d332e6fae5687d9a8e998b15e72c61 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 15:07:39 +0900 Subject: [PATCH 075/276] =?UTF-8?q?#20=20=EB=8D=B0=EC=9D=B4=ED=84=B0?= =?UTF-8?q?=EB=B2=A0=EC=9D=B4=EC=8A=A4=20=EC=86=8D=EC=84=B1=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=EC=9D=84=20employee,=20employer=EC=97=90=20=EB=A7=9E?= =?UTF-8?q?=EA=B2=8C=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/ExternalCareer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 6e0ef7f0..547ffaef 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "account_id") + @JoinColumn(name = "employee_id") @JsonIgnore private Account employee; From f0d029e69c558bc8a82d3e9aeda57f1ded193548 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 14:25:28 +0900 Subject: [PATCH 076/276] =?UTF-8?q?#20=20EMPLOYEE,=20EMPLOYER=20=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EB=B8=94=20=EC=82=AD=EC=A0=9C=20=EB=B0=8F=20ACCOUNT?= =?UTF-8?q?=20=ED=85=8C=EC=9D=B4=EB=B8=94=EB=A1=9C=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/api/domain/Business.java | 2 +- src/main/java/com/example/api/domain/ExternalCareer.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/example/api/domain/Business.java b/src/main/java/com/example/api/domain/Business.java index c3ef0be9..e4452648 100644 --- a/src/main/java/com/example/api/domain/Business.java +++ b/src/main/java/com/example/api/domain/Business.java @@ -20,7 +20,7 @@ public class Business extends BaseEntity { private Long businessId; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "BUSINESS_EMPLOYER_ID") + @JoinColumn(name = "BUSINESS_EMPLOYER_ID", referencedColumnName = "ACCOUNT_ID") private Account employer; @OneToMany(mappedBy = "business") diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 547ffaef..6e0ef7f0 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "employee_id") + @JoinColumn(name = "account_id") @JsonIgnore private Account employee; From 4771deb4ebd23d4b6a958ff342208c04d260f346 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 15:07:39 +0900 Subject: [PATCH 077/276] =?UTF-8?q?#20=20=EB=8D=B0=EC=9D=B4=ED=84=B0?= =?UTF-8?q?=EB=B2=A0=EC=9D=B4=EC=8A=A4=20=EC=86=8D=EC=84=B1=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=EC=9D=84=20employee,=20employer=EC=97=90=20=EB=A7=9E?= =?UTF-8?q?=EA=B2=8C=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/Business.java | 2 +- src/main/java/com/example/api/domain/ExternalCareer.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/example/api/domain/Business.java b/src/main/java/com/example/api/domain/Business.java index e4452648..c3ef0be9 100644 --- a/src/main/java/com/example/api/domain/Business.java +++ b/src/main/java/com/example/api/domain/Business.java @@ -20,7 +20,7 @@ public class Business extends BaseEntity { private Long businessId; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "BUSINESS_EMPLOYER_ID", referencedColumnName = "ACCOUNT_ID") + @JoinColumn(name = "BUSINESS_EMPLOYER_ID") private Account employer; @OneToMany(mappedBy = "business") diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 6e0ef7f0..547ffaef 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "account_id") + @JoinColumn(name = "employee_id") @JsonIgnore private Account employee; From 47705617236f0dde703e75d5555d650df1e88698 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 14:25:28 +0900 Subject: [PATCH 078/276] =?UTF-8?q?#20=20EMPLOYEE,=20EMPLOYER=20=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EB=B8=94=20=EC=82=AD=EC=A0=9C=20=EB=B0=8F=20ACCOUNT?= =?UTF-8?q?=20=ED=85=8C=EC=9D=B4=EB=B8=94=EB=A1=9C=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/api/domain/Business.java | 1 + src/main/java/com/example/api/domain/ExternalCareer.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/domain/Business.java b/src/main/java/com/example/api/domain/Business.java index c3ef0be9..e83fc075 100644 --- a/src/main/java/com/example/api/domain/Business.java +++ b/src/main/java/com/example/api/domain/Business.java @@ -6,6 +6,7 @@ import java.time.LocalDate; import java.util.ArrayList; +import java.util.Date; import java.util.List; import static jakarta.persistence.FetchType.*; diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 547ffaef..6e0ef7f0 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "employee_id") + @JoinColumn(name = "account_id") @JsonIgnore private Account employee; From 47f8341201170090d76d2040546f39efbcfb422f Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 15:07:39 +0900 Subject: [PATCH 079/276] =?UTF-8?q?#20=20=EB=8D=B0=EC=9D=B4=ED=84=B0?= =?UTF-8?q?=EB=B2=A0=EC=9D=B4=EC=8A=A4=20=EC=86=8D=EC=84=B1=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=EC=9D=84=20employee,=20employer=EC=97=90=20=EB=A7=9E?= =?UTF-8?q?=EA=B2=8C=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/ExternalCareer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 6e0ef7f0..547ffaef 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "account_id") + @JoinColumn(name = "employee_id") @JsonIgnore private Account employee; From a00e1fc6ff63d04710c92b226dd0be210b9584f3 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 14:25:28 +0900 Subject: [PATCH 080/276] =?UTF-8?q?#20=20EMPLOYEE,=20EMPLOYER=20=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EB=B8=94=20=EC=82=AD=EC=A0=9C=20=EB=B0=8F=20ACCOUNT?= =?UTF-8?q?=20=ED=85=8C=EC=9D=B4=EB=B8=94=EB=A1=9C=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/api/domain/ExternalCareer.java | 2 +- src/main/java/com/example/api/domain/Scrap.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 547ffaef..6e0ef7f0 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "employee_id") + @JoinColumn(name = "account_id") @JsonIgnore private Account employee; diff --git a/src/main/java/com/example/api/domain/Scrap.java b/src/main/java/com/example/api/domain/Scrap.java index a8d20e1a..7d8446d1 100644 --- a/src/main/java/com/example/api/domain/Scrap.java +++ b/src/main/java/com/example/api/domain/Scrap.java @@ -11,6 +11,7 @@ @Setter @Table(name = "SCRAP") public class Scrap extends BaseEntity { + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long scrapId; From 641d6c6be07ac277d550a53cdbfe27aa6f83f0e6 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 15:07:39 +0900 Subject: [PATCH 081/276] =?UTF-8?q?#20=20=EB=8D=B0=EC=9D=B4=ED=84=B0?= =?UTF-8?q?=EB=B2=A0=EC=9D=B4=EC=8A=A4=20=EC=86=8D=EC=84=B1=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=EC=9D=84=20employee,=20employer=EC=97=90=20=EB=A7=9E?= =?UTF-8?q?=EA=B2=8C=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/ExternalCareer.java | 2 +- src/main/java/com/example/api/domain/Scrap.java | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 6e0ef7f0..547ffaef 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "account_id") + @JoinColumn(name = "employee_id") @JsonIgnore private Account employee; diff --git a/src/main/java/com/example/api/domain/Scrap.java b/src/main/java/com/example/api/domain/Scrap.java index 7d8446d1..a8d20e1a 100644 --- a/src/main/java/com/example/api/domain/Scrap.java +++ b/src/main/java/com/example/api/domain/Scrap.java @@ -11,7 +11,6 @@ @Setter @Table(name = "SCRAP") public class Scrap extends BaseEntity { - @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long scrapId; From f2b999b14c6dace64a3747486545464420c0bf2f Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 14:25:28 +0900 Subject: [PATCH 082/276] =?UTF-8?q?#20=20EMPLOYEE,=20EMPLOYER=20=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EB=B8=94=20=EC=82=AD=EC=A0=9C=20=EB=B0=8F=20ACCOUNT?= =?UTF-8?q?=20=ED=85=8C=EC=9D=B4=EB=B8=94=EB=A1=9C=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/api/domain/ExternalCareer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 547ffaef..6e0ef7f0 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "employee_id") + @JoinColumn(name = "account_id") @JsonIgnore private Account employee; From d2af8e9dee16071729d71aa140dc9cc20cc11628 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 15:07:39 +0900 Subject: [PATCH 083/276] =?UTF-8?q?#20=20=EB=8D=B0=EC=9D=B4=ED=84=B0?= =?UTF-8?q?=EB=B2=A0=EC=9D=B4=EC=8A=A4=20=EC=86=8D=EC=84=B1=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=EC=9D=84=20employee,=20employer=EC=97=90=20=EB=A7=9E?= =?UTF-8?q?=EA=B2=8C=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/ExternalCareer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 6e0ef7f0..547ffaef 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "account_id") + @JoinColumn(name = "employee_id") @JsonIgnore private Account employee; From 4e8cb30b2989ee3a913aefde9d38b00128ee77f5 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 14:25:28 +0900 Subject: [PATCH 084/276] =?UTF-8?q?#20=20EMPLOYEE,=20EMPLOYER=20=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EB=B8=94=20=EC=82=AD=EC=A0=9C=20=EB=B0=8F=20ACCOUNT?= =?UTF-8?q?=20=ED=85=8C=EC=9D=B4=EB=B8=94=EB=A1=9C=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/api/domain/Business.java | 3 +-- src/main/java/com/example/api/domain/ExternalCareer.java | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/example/api/domain/Business.java b/src/main/java/com/example/api/domain/Business.java index e83fc075..e4452648 100644 --- a/src/main/java/com/example/api/domain/Business.java +++ b/src/main/java/com/example/api/domain/Business.java @@ -6,7 +6,6 @@ import java.time.LocalDate; import java.util.ArrayList; -import java.util.Date; import java.util.List; import static jakarta.persistence.FetchType.*; @@ -21,7 +20,7 @@ public class Business extends BaseEntity { private Long businessId; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "BUSINESS_EMPLOYER_ID") + @JoinColumn(name = "BUSINESS_EMPLOYER_ID", referencedColumnName = "ACCOUNT_ID") private Account employer; @OneToMany(mappedBy = "business") diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 547ffaef..6e0ef7f0 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "employee_id") + @JoinColumn(name = "account_id") @JsonIgnore private Account employee; From 2e02747d44ce44c8ea3d7e20cc97bdf6ee00f90c Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 15:07:39 +0900 Subject: [PATCH 085/276] =?UTF-8?q?#20=20=EB=8D=B0=EC=9D=B4=ED=84=B0?= =?UTF-8?q?=EB=B2=A0=EC=9D=B4=EC=8A=A4=20=EC=86=8D=EC=84=B1=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=EC=9D=84=20employee,=20employer=EC=97=90=20=EB=A7=9E?= =?UTF-8?q?=EA=B2=8C=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/Business.java | 2 +- src/main/java/com/example/api/domain/ExternalCareer.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/example/api/domain/Business.java b/src/main/java/com/example/api/domain/Business.java index e4452648..c3ef0be9 100644 --- a/src/main/java/com/example/api/domain/Business.java +++ b/src/main/java/com/example/api/domain/Business.java @@ -20,7 +20,7 @@ public class Business extends BaseEntity { private Long businessId; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "BUSINESS_EMPLOYER_ID", referencedColumnName = "ACCOUNT_ID") + @JoinColumn(name = "BUSINESS_EMPLOYER_ID") private Account employer; @OneToMany(mappedBy = "business") diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 6e0ef7f0..547ffaef 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "account_id") + @JoinColumn(name = "employee_id") @JsonIgnore private Account employee; From 2b7c3fdeb64481cb8d5121e85f9298b186ee8078 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 14:25:28 +0900 Subject: [PATCH 086/276] =?UTF-8?q?#20=20EMPLOYEE,=20EMPLOYER=20=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EB=B8=94=20=EC=82=AD=EC=A0=9C=20=EB=B0=8F=20ACCOUNT?= =?UTF-8?q?=20=ED=85=8C=EC=9D=B4=EB=B8=94=EB=A1=9C=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/api/domain/ExternalCareer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 547ffaef..6e0ef7f0 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "employee_id") + @JoinColumn(name = "account_id") @JsonIgnore private Account employee; From 7d360131c7ebe71c332ab6c1a493235922ca908b Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 15:07:39 +0900 Subject: [PATCH 087/276] =?UTF-8?q?#20=20=EB=8D=B0=EC=9D=B4=ED=84=B0?= =?UTF-8?q?=EB=B2=A0=EC=9D=B4=EC=8A=A4=20=EC=86=8D=EC=84=B1=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=EC=9D=84=20employee,=20employer=EC=97=90=20=EB=A7=9E?= =?UTF-8?q?=EA=B2=8C=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/ExternalCareer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 6e0ef7f0..547ffaef 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "account_id") + @JoinColumn(name = "employee_id") @JsonIgnore private Account employee; From b25e48a2f175559d8b31817d6206a72a990ed02d Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 14:25:28 +0900 Subject: [PATCH 088/276] =?UTF-8?q?#20=20EMPLOYEE,=20EMPLOYER=20=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EB=B8=94=20=EC=82=AD=EC=A0=9C=20=EB=B0=8F=20ACCOUNT?= =?UTF-8?q?=20=ED=85=8C=EC=9D=B4=EB=B8=94=EB=A1=9C=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/api/domain/ExternalCareer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 547ffaef..6e0ef7f0 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "employee_id") + @JoinColumn(name = "account_id") @JsonIgnore private Account employee; From 1f81454218207ea927634ad13c5c0208c435e40f Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 15:07:39 +0900 Subject: [PATCH 089/276] =?UTF-8?q?#20=20=EB=8D=B0=EC=9D=B4=ED=84=B0?= =?UTF-8?q?=EB=B2=A0=EC=9D=B4=EC=8A=A4=20=EC=86=8D=EC=84=B1=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=EC=9D=84=20employee,=20employer=EC=97=90=20=EB=A7=9E?= =?UTF-8?q?=EA=B2=8C=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/ExternalCareer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 6e0ef7f0..547ffaef 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -19,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "account_id") + @JoinColumn(name = "employee_id") @JsonIgnore private Account employee; From efc632173dedcc84ada18695515fb720b9495a56 Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Mon, 4 Nov 2024 00:43:04 +0900 Subject: [PATCH 090/276] =?UTF-8?q?=EC=95=8C=EB=B0=94=20=EA=B3=B5=EA=B3=A0?= =?UTF-8?q?=20=EC=88=98=EC=A0=95,=20=EC=9E=91=EC=84=B1=20=EC=8B=9C=20?= =?UTF-8?q?=ED=95=84=EC=9A=94=ED=95=9C=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20?= =?UTF-8?q?=EB=B6=88=EB=9F=AC=EC=98=A4=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/board/controller/BoardController.java | 24 +++++++++++++++++++ .../board/controller/domain/CategoryDTO.java | 13 ++++++++++ .../api/board/controller/domain/FormDTO.java | 17 +++++++++++++ .../board/controller/domain/InnerCarrer.java | 18 ++++++++++++++ .../board/controller/domain/MyInfoDTO.java | 22 +++++++++++++++++ .../api/board/repository/BoardRepository.java | 13 ++++++++++ .../board/repository/CategoryRepository.java | 14 +++++++++++ .../api/board/service/BoardService.java | 19 +++++++++++++++ .../api/board/service/CategoryService.java | 22 +++++++++++++++++ 9 files changed, 162 insertions(+) create mode 100644 src/main/java/com/example/api/board/controller/BoardController.java create mode 100644 src/main/java/com/example/api/board/controller/domain/CategoryDTO.java create mode 100644 src/main/java/com/example/api/board/controller/domain/FormDTO.java create mode 100644 src/main/java/com/example/api/board/controller/domain/InnerCarrer.java create mode 100644 src/main/java/com/example/api/board/controller/domain/MyInfoDTO.java create mode 100644 src/main/java/com/example/api/board/repository/BoardRepository.java create mode 100644 src/main/java/com/example/api/board/repository/CategoryRepository.java create mode 100644 src/main/java/com/example/api/board/service/BoardService.java create mode 100644 src/main/java/com/example/api/board/service/CategoryService.java diff --git a/src/main/java/com/example/api/board/controller/BoardController.java b/src/main/java/com/example/api/board/controller/BoardController.java new file mode 100644 index 00000000..a868dab5 --- /dev/null +++ b/src/main/java/com/example/api/board/controller/BoardController.java @@ -0,0 +1,24 @@ +package com.example.api.board.controller; + +import com.example.api.board.controller.domain.CategoryDTO; +import com.example.api.board.controller.domain.FormDTO; +import com.example.api.board.controller.domain.MyInfoDTO; +import com.example.api.board.service.BoardService; +import com.example.api.board.service.CategoryService; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequiredArgsConstructor +public class BoardController { + private final BoardService boardService; + private final CategoryService categoryService; + + public FormDTO findById(long id) { + MyInfoDTO myInfoById = boardService.findMyInfoById(id); + List categoryList = categoryService.findAll(); + return new FormDTO(myInfoById, categoryList); + } +} diff --git a/src/main/java/com/example/api/board/controller/domain/CategoryDTO.java b/src/main/java/com/example/api/board/controller/domain/CategoryDTO.java new file mode 100644 index 00000000..8fcdaf8f --- /dev/null +++ b/src/main/java/com/example/api/board/controller/domain/CategoryDTO.java @@ -0,0 +1,13 @@ +package com.example.api.board.controller.domain; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@AllArgsConstructor +public class CategoryDTO { + private Long categoryId; + private String categoryName; +} diff --git a/src/main/java/com/example/api/board/controller/domain/FormDTO.java b/src/main/java/com/example/api/board/controller/domain/FormDTO.java new file mode 100644 index 00000000..dbe18479 --- /dev/null +++ b/src/main/java/com/example/api/board/controller/domain/FormDTO.java @@ -0,0 +1,17 @@ +package com.example.api.board.controller.domain; + +import com.example.api.domain.Category; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +@Getter +@Setter +@AllArgsConstructor +public class FormDTO { + private MyInfoDTO myInfo; + private List categoryList; +} diff --git a/src/main/java/com/example/api/board/controller/domain/InnerCarrer.java b/src/main/java/com/example/api/board/controller/domain/InnerCarrer.java new file mode 100644 index 00000000..13c755de --- /dev/null +++ b/src/main/java/com/example/api/board/controller/domain/InnerCarrer.java @@ -0,0 +1,18 @@ +package com.example.api.board.controller.domain; + +import com.example.api.domain.Review; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; + +import java.util.Date; + +@Getter +@Setter +@AllArgsConstructor +public class InnerCarrer { + private String businessName; + private Date workDate; + private String representationName; + private Review review; +} diff --git a/src/main/java/com/example/api/board/controller/domain/MyInfoDTO.java b/src/main/java/com/example/api/board/controller/domain/MyInfoDTO.java new file mode 100644 index 00000000..cd8c088b --- /dev/null +++ b/src/main/java/com/example/api/board/controller/domain/MyInfoDTO.java @@ -0,0 +1,22 @@ +package com.example.api.board.controller.domain; + +import com.example.api.domain.Category; +import com.example.api.domain.ExternalCareer; +import com.example.api.domain.PossibleBoard; + +import java.util.List; + +public class MyInfoDTO { + private String name; + private String nickname; + private int age; + private String sex; + private String email; + private String phone; + private List innerCarrerList; + private List externalCareerList; + private List possibleBoardList; + private List flavoredCategoryList; + private float starPoint; + private int workCount; +} \ No newline at end of file diff --git a/src/main/java/com/example/api/board/repository/BoardRepository.java b/src/main/java/com/example/api/board/repository/BoardRepository.java new file mode 100644 index 00000000..82b68e98 --- /dev/null +++ b/src/main/java/com/example/api/board/repository/BoardRepository.java @@ -0,0 +1,13 @@ +package com.example.api.board.repository; + +import com.example.api.board.controller.domain.MyInfoDTO; +import com.example.api.domain.Employee; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; + +@Repository +public interface BoardRepository extends JpaRepository { + @Query("select e from Employee e join e.account a on e.employeeId = a.id") + MyInfoDTO findMyInfoDTOById(Long id); +} diff --git a/src/main/java/com/example/api/board/repository/CategoryRepository.java b/src/main/java/com/example/api/board/repository/CategoryRepository.java new file mode 100644 index 00000000..02d9df12 --- /dev/null +++ b/src/main/java/com/example/api/board/repository/CategoryRepository.java @@ -0,0 +1,14 @@ +package com.example.api.board.repository; + +import com.example.api.board.controller.domain.CategoryDTO; +import com.example.api.domain.Category; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; + +import java.util.List; + +public interface CategoryRepository extends JpaRepository { + + @Query("SELECT (c.categoryId, c.categoryName) FROM Category c") + List findAllCategories(); +} diff --git a/src/main/java/com/example/api/board/service/BoardService.java b/src/main/java/com/example/api/board/service/BoardService.java new file mode 100644 index 00000000..0bb5817c --- /dev/null +++ b/src/main/java/com/example/api/board/service/BoardService.java @@ -0,0 +1,19 @@ +package com.example.api.board.service; + +import com.example.api.board.controller.domain.MyInfoDTO; +import com.example.api.board.repository.BoardRepository; +import jakarta.transaction.Transactional; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + + +@Service +@Transactional +@RequiredArgsConstructor +public class BoardService { + private final BoardRepository boardRepository; + + public MyInfoDTO findMyInfoById(long id) { + return boardRepository.findMyInfoDTOById(id); + } +} diff --git a/src/main/java/com/example/api/board/service/CategoryService.java b/src/main/java/com/example/api/board/service/CategoryService.java new file mode 100644 index 00000000..4487fbd3 --- /dev/null +++ b/src/main/java/com/example/api/board/service/CategoryService.java @@ -0,0 +1,22 @@ +package com.example.api.board.service; + +import com.example.api.board.controller.domain.CategoryDTO; +import com.example.api.board.repository.CategoryRepository; +import com.example.api.domain.Category; +import jakarta.transaction.Transactional; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@Transactional +@RequiredArgsConstructor +public class CategoryService { + private final CategoryRepository categoryRepository; + + public List findAll(){ + return categoryRepository.findAll(); + } +} From ef5454788ab919959dd2e00b141dea4f402108b9 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 4 Nov 2024 13:21:41 +0900 Subject: [PATCH 091/276] use h2 database --- src/main/resources/application.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 6e9b53b2..0f92c714 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -9,7 +9,7 @@ spring.datasource.username=sa spring.datasource.password= # JPA and Hibernate Configuration -spring.jpa.hibernate.ddl-auto=create +spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true spring.jpa.properties.hibernate.format_sql=true spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect From ced98201a3afbd2dc5de0717f497cd06e6bd1577 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Tue, 5 Nov 2024 15:17:30 +0900 Subject: [PATCH 092/276] =?UTF-8?q?hibernate.ddl-auto=20create=EB=A1=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 0f92c714..6e9b53b2 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -9,7 +9,7 @@ spring.datasource.username=sa spring.datasource.password= # JPA and Hibernate Configuration -spring.jpa.hibernate.ddl-auto=update +spring.jpa.hibernate.ddl-auto=create spring.jpa.show-sql=true spring.jpa.properties.hibernate.format_sql=true spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect From 4ff7e1bd05b0fc260045e9ad81b9291eb823fc35 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Thu, 7 Nov 2024 22:02:18 +0900 Subject: [PATCH 093/276] =?UTF-8?q?domain=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/domain/{FormDTO.java => Board.java} | 2 -- .../api/board/controller/domain/ExternalCareerDTO.java | 10 ++++++++++ .../domain/{InnerCarrer.java => InnerCareerDTO.java} | 5 +++-- .../api/board/controller/domain/PossibleBoardDTO.java | 4 ++++ .../board/repository/BusinessCategoryRepository.java | 9 +++++++++ .../api/board/repository/BusinessRepository.java | 4 ++++ .../api/board/repository/ContractRepository.java | 4 ++++ .../api/board/repository/EmployeeRepository.java | 4 ++++ .../api/board/repository/EmployerRepository.java | 4 ++++ .../api/board/repository/ExternalCareerRepository.java | 4 ++++ .../api/board/repository/FlavoredRepository.java | 4 ++++ .../{BoardRepository.java => MyInfoRepository.java} | 0 .../board/repository/OfferEmploymentRepository.java | 4 ++++ .../api/board/repository/PossibleBoardRepository.java | 4 ++++ .../example/api/board/repository/ReviewRepository.java | 4 ++++ .../java/com/example/api/global/DataInitializer.java | 4 ++++ .../api/board/controller/BoardControllerTest.java | 4 ++++ .../example/api/board/service/BoardServiceTest.java | 4 ++++ .../example/api/board/service/CategoryServiceTest.java | 4 ++++ .../com/example/api/global/BaseIntegrationTest.java | 4 ++++ 20 files changed, 82 insertions(+), 4 deletions(-) rename src/main/java/com/example/api/board/controller/domain/{FormDTO.java => Board.java} (87%) create mode 100644 src/main/java/com/example/api/board/controller/domain/ExternalCareerDTO.java rename src/main/java/com/example/api/board/controller/domain/{InnerCarrer.java => InnerCareerDTO.java} (84%) create mode 100644 src/main/java/com/example/api/board/controller/domain/PossibleBoardDTO.java create mode 100644 src/main/java/com/example/api/board/repository/BusinessCategoryRepository.java create mode 100644 src/main/java/com/example/api/board/repository/BusinessRepository.java create mode 100644 src/main/java/com/example/api/board/repository/ContractRepository.java create mode 100644 src/main/java/com/example/api/board/repository/EmployeeRepository.java create mode 100644 src/main/java/com/example/api/board/repository/EmployerRepository.java create mode 100644 src/main/java/com/example/api/board/repository/ExternalCareerRepository.java create mode 100644 src/main/java/com/example/api/board/repository/FlavoredRepository.java rename src/main/java/com/example/api/board/repository/{BoardRepository.java => MyInfoRepository.java} (100%) create mode 100644 src/main/java/com/example/api/board/repository/OfferEmploymentRepository.java create mode 100644 src/main/java/com/example/api/board/repository/PossibleBoardRepository.java create mode 100644 src/main/java/com/example/api/board/repository/ReviewRepository.java create mode 100644 src/main/java/com/example/api/global/DataInitializer.java create mode 100644 src/test/java/com/example/api/board/controller/BoardControllerTest.java create mode 100644 src/test/java/com/example/api/board/service/BoardServiceTest.java create mode 100644 src/test/java/com/example/api/board/service/CategoryServiceTest.java create mode 100644 src/test/java/com/example/api/global/BaseIntegrationTest.java diff --git a/src/main/java/com/example/api/board/controller/domain/FormDTO.java b/src/main/java/com/example/api/board/controller/domain/Board.java similarity index 87% rename from src/main/java/com/example/api/board/controller/domain/FormDTO.java rename to src/main/java/com/example/api/board/controller/domain/Board.java index dbe18479..7d677fa8 100644 --- a/src/main/java/com/example/api/board/controller/domain/FormDTO.java +++ b/src/main/java/com/example/api/board/controller/domain/Board.java @@ -1,7 +1,5 @@ package com.example.api.board.controller.domain; -import com.example.api.domain.Category; - import lombok.AllArgsConstructor; import lombok.Getter; import lombok.Setter; diff --git a/src/main/java/com/example/api/board/controller/domain/ExternalCareerDTO.java b/src/main/java/com/example/api/board/controller/domain/ExternalCareerDTO.java new file mode 100644 index 00000000..06e4e89a --- /dev/null +++ b/src/main/java/com/example/api/board/controller/domain/ExternalCareerDTO.java @@ -0,0 +1,10 @@ +package com.example.api.board.controller.domain; + + +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode +public class ExternalCareerDTO { + private String Name; + private String period; +} diff --git a/src/main/java/com/example/api/board/controller/domain/InnerCarrer.java b/src/main/java/com/example/api/board/controller/domain/InnerCareerDTO.java similarity index 84% rename from src/main/java/com/example/api/board/controller/domain/InnerCarrer.java rename to src/main/java/com/example/api/board/controller/domain/InnerCareerDTO.java index 13c755de..5e33cde5 100644 --- a/src/main/java/com/example/api/board/controller/domain/InnerCarrer.java +++ b/src/main/java/com/example/api/board/controller/domain/InnerCareerDTO.java @@ -1,18 +1,19 @@ package com.example.api.board.controller.domain; import com.example.api.domain.Review; + import lombok.AllArgsConstructor; import lombok.Getter; import lombok.Setter; -import java.util.Date; +import java.time.LocalDate; @Getter @Setter @AllArgsConstructor public class InnerCarrer { private String businessName; - private Date workDate; + private LocalDate workDate; private String representationName; private Review review; } diff --git a/src/main/java/com/example/api/board/controller/domain/PossibleBoardDTO.java b/src/main/java/com/example/api/board/controller/domain/PossibleBoardDTO.java new file mode 100644 index 00000000..420f5ca9 --- /dev/null +++ b/src/main/java/com/example/api/board/controller/domain/PossibleBoardDTO.java @@ -0,0 +1,4 @@ +package com.example.api.board.controller.domain; + +public class PossibleBoardDTO { +} diff --git a/src/main/java/com/example/api/board/repository/BusinessCategoryRepository.java b/src/main/java/com/example/api/board/repository/BusinessCategoryRepository.java new file mode 100644 index 00000000..7b03163c --- /dev/null +++ b/src/main/java/com/example/api/board/repository/BusinessCategoryRepository.java @@ -0,0 +1,9 @@ +package com.example.api.board.repository; + +import com.example.api.domain.BusinessCategory; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface BusinessCategoryRepository extends JpaRepository { +} diff --git a/src/main/java/com/example/api/board/repository/BusinessRepository.java b/src/main/java/com/example/api/board/repository/BusinessRepository.java new file mode 100644 index 00000000..a1dc3e8e --- /dev/null +++ b/src/main/java/com/example/api/board/repository/BusinessRepository.java @@ -0,0 +1,4 @@ +package com.example.api.board.repository; + +public interface BusinessRepository { +} diff --git a/src/main/java/com/example/api/board/repository/ContractRepository.java b/src/main/java/com/example/api/board/repository/ContractRepository.java new file mode 100644 index 00000000..9dfe6d32 --- /dev/null +++ b/src/main/java/com/example/api/board/repository/ContractRepository.java @@ -0,0 +1,4 @@ +package com.example.api.board.repository; + +public interface ContractRepository { +} diff --git a/src/main/java/com/example/api/board/repository/EmployeeRepository.java b/src/main/java/com/example/api/board/repository/EmployeeRepository.java new file mode 100644 index 00000000..a45beecd --- /dev/null +++ b/src/main/java/com/example/api/board/repository/EmployeeRepository.java @@ -0,0 +1,4 @@ +package com.example.api.board.repository; + +public interface EmployeeRepository { +} diff --git a/src/main/java/com/example/api/board/repository/EmployerRepository.java b/src/main/java/com/example/api/board/repository/EmployerRepository.java new file mode 100644 index 00000000..5f4470ce --- /dev/null +++ b/src/main/java/com/example/api/board/repository/EmployerRepository.java @@ -0,0 +1,4 @@ +package com.example.api.board.repository; + +public interface EmployerRepository { +} diff --git a/src/main/java/com/example/api/board/repository/ExternalCareerRepository.java b/src/main/java/com/example/api/board/repository/ExternalCareerRepository.java new file mode 100644 index 00000000..8c1b5c5a --- /dev/null +++ b/src/main/java/com/example/api/board/repository/ExternalCareerRepository.java @@ -0,0 +1,4 @@ +package com.example.api.board.repository; + +public interface InnerCareerRepository { +} diff --git a/src/main/java/com/example/api/board/repository/FlavoredRepository.java b/src/main/java/com/example/api/board/repository/FlavoredRepository.java new file mode 100644 index 00000000..aaf1c728 --- /dev/null +++ b/src/main/java/com/example/api/board/repository/FlavoredRepository.java @@ -0,0 +1,4 @@ +package com.example.api.board.repository; + +public interface FlovoredRepository { +} diff --git a/src/main/java/com/example/api/board/repository/BoardRepository.java b/src/main/java/com/example/api/board/repository/MyInfoRepository.java similarity index 100% rename from src/main/java/com/example/api/board/repository/BoardRepository.java rename to src/main/java/com/example/api/board/repository/MyInfoRepository.java diff --git a/src/main/java/com/example/api/board/repository/OfferEmploymentRepository.java b/src/main/java/com/example/api/board/repository/OfferEmploymentRepository.java new file mode 100644 index 00000000..104fdab3 --- /dev/null +++ b/src/main/java/com/example/api/board/repository/OfferEmploymentRepository.java @@ -0,0 +1,4 @@ +package com.example.api.board.repository; + +public interface OfferEmploymentRepository { +} diff --git a/src/main/java/com/example/api/board/repository/PossibleBoardRepository.java b/src/main/java/com/example/api/board/repository/PossibleBoardRepository.java new file mode 100644 index 00000000..1d4e28f4 --- /dev/null +++ b/src/main/java/com/example/api/board/repository/PossibleBoardRepository.java @@ -0,0 +1,4 @@ +package com.example.api.board.repository; + +public interface PossibleBoardRepository { +} diff --git a/src/main/java/com/example/api/board/repository/ReviewRepository.java b/src/main/java/com/example/api/board/repository/ReviewRepository.java new file mode 100644 index 00000000..3fd50c76 --- /dev/null +++ b/src/main/java/com/example/api/board/repository/ReviewRepository.java @@ -0,0 +1,4 @@ +package com.example.api.board.repository; + +public interface ReviewRepository { +} diff --git a/src/main/java/com/example/api/global/DataInitializer.java b/src/main/java/com/example/api/global/DataInitializer.java new file mode 100644 index 00000000..2dc88ff4 --- /dev/null +++ b/src/main/java/com/example/api/global/DataInitializer.java @@ -0,0 +1,4 @@ +package com.example.api.global; + +public class InitDataConfig { +} diff --git a/src/test/java/com/example/api/board/controller/BoardControllerTest.java b/src/test/java/com/example/api/board/controller/BoardControllerTest.java new file mode 100644 index 00000000..5a5a5e6f --- /dev/null +++ b/src/test/java/com/example/api/board/controller/BoardControllerTest.java @@ -0,0 +1,4 @@ +import static org.junit.jupiter.api.Assertions.*; +class BoardControllerTest { + +} \ No newline at end of file diff --git a/src/test/java/com/example/api/board/service/BoardServiceTest.java b/src/test/java/com/example/api/board/service/BoardServiceTest.java new file mode 100644 index 00000000..fe2a6ed5 --- /dev/null +++ b/src/test/java/com/example/api/board/service/BoardServiceTest.java @@ -0,0 +1,4 @@ +import static org.junit.jupiter.api.Assertions.*; +class BoardServiceTest { + +} \ No newline at end of file diff --git a/src/test/java/com/example/api/board/service/CategoryServiceTest.java b/src/test/java/com/example/api/board/service/CategoryServiceTest.java new file mode 100644 index 00000000..2036410f --- /dev/null +++ b/src/test/java/com/example/api/board/service/CategoryServiceTest.java @@ -0,0 +1,4 @@ +import static org.junit.jupiter.api.Assertions.*; +class CategoryServiceTest { + +} \ No newline at end of file diff --git a/src/test/java/com/example/api/global/BaseIntegrationTest.java b/src/test/java/com/example/api/global/BaseIntegrationTest.java new file mode 100644 index 00000000..edbfaa00 --- /dev/null +++ b/src/test/java/com/example/api/global/BaseIntegrationTest.java @@ -0,0 +1,4 @@ +package com.example.api.global; + +public class BaseIntegrationTest { +} From 5505cb603f3918d8369c11559e7cf4032cad2e5f Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Thu, 7 Nov 2024 22:04:27 +0900 Subject: [PATCH 094/276] =?UTF-8?q?controller=20=EC=A0=84=EC=9A=A9=C3=A3?= =?UTF-8?q?=20DTO,=20BoardController=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/board/controller/BoardController.java | 13 +++++---- .../api/board/controller/domain/Board.java | 4 ++- .../board/controller/domain/CategoryDTO.java | 2 ++ .../controller/domain/ExternalCareerDTO.java | 6 +++++ .../controller/domain/InnerCareerDTO.java | 14 +++++++--- .../board/controller/domain/MyInfoDTO.java | 27 ++++++++++++++++--- .../controller/domain/PossibleBoardDTO.java | 13 +++++++++ 7 files changed, 66 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/example/api/board/controller/BoardController.java b/src/main/java/com/example/api/board/controller/BoardController.java index a868dab5..74b1469f 100644 --- a/src/main/java/com/example/api/board/controller/BoardController.java +++ b/src/main/java/com/example/api/board/controller/BoardController.java @@ -1,11 +1,13 @@ package com.example.api.board.controller; import com.example.api.board.controller.domain.CategoryDTO; -import com.example.api.board.controller.domain.FormDTO; +import com.example.api.board.controller.domain.Board; import com.example.api.board.controller.domain.MyInfoDTO; import com.example.api.board.service.BoardService; import com.example.api.board.service.CategoryService; import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; import java.util.List; @@ -16,9 +18,10 @@ public class BoardController { private final BoardService boardService; private final CategoryService categoryService; - public FormDTO findById(long id) { - MyInfoDTO myInfoById = boardService.findMyInfoById(id); - List categoryList = categoryService.findAll(); - return new FormDTO(myInfoById, categoryList); + @GetMapping("/api/v1/possible-board/form/{employeeId}") + public Board findBoardByEmployeeId(@PathVariable("employeeId") Long employeeId) { + MyInfoDTO myInfoById = boardService.findMyInfoById(employeeId); + List categoryList = categoryService.getAllCategories(); + return new Board(myInfoById, categoryList); } } diff --git a/src/main/java/com/example/api/board/controller/domain/Board.java b/src/main/java/com/example/api/board/controller/domain/Board.java index 7d677fa8..56e9eed9 100644 --- a/src/main/java/com/example/api/board/controller/domain/Board.java +++ b/src/main/java/com/example/api/board/controller/domain/Board.java @@ -1,6 +1,7 @@ package com.example.api.board.controller.domain; import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; @@ -9,7 +10,8 @@ @Getter @Setter @AllArgsConstructor -public class FormDTO { +@EqualsAndHashCode +public class Board { private MyInfoDTO myInfo; private List categoryList; } diff --git a/src/main/java/com/example/api/board/controller/domain/CategoryDTO.java b/src/main/java/com/example/api/board/controller/domain/CategoryDTO.java index 8fcdaf8f..ae3e9a25 100644 --- a/src/main/java/com/example/api/board/controller/domain/CategoryDTO.java +++ b/src/main/java/com/example/api/board/controller/domain/CategoryDTO.java @@ -1,12 +1,14 @@ package com.example.api.board.controller.domain; import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; @Getter @Setter @AllArgsConstructor +@EqualsAndHashCode public class CategoryDTO { private Long categoryId; private String categoryName; diff --git a/src/main/java/com/example/api/board/controller/domain/ExternalCareerDTO.java b/src/main/java/com/example/api/board/controller/domain/ExternalCareerDTO.java index 06e4e89a..95796653 100644 --- a/src/main/java/com/example/api/board/controller/domain/ExternalCareerDTO.java +++ b/src/main/java/com/example/api/board/controller/domain/ExternalCareerDTO.java @@ -1,8 +1,14 @@ package com.example.api.board.controller.domain; +import lombok.AllArgsConstructor; import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; +@Getter +@Setter +@AllArgsConstructor @EqualsAndHashCode public class ExternalCareerDTO { private String Name; diff --git a/src/main/java/com/example/api/board/controller/domain/InnerCareerDTO.java b/src/main/java/com/example/api/board/controller/domain/InnerCareerDTO.java index 5e33cde5..631a7ae4 100644 --- a/src/main/java/com/example/api/board/controller/domain/InnerCareerDTO.java +++ b/src/main/java/com/example/api/board/controller/domain/InnerCareerDTO.java @@ -2,18 +2,26 @@ import com.example.api.domain.Review; -import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; import java.time.LocalDate; +import java.time.LocalDateTime; @Getter @Setter -@AllArgsConstructor -public class InnerCarrer { +@EqualsAndHashCode +public class InnerCareerDTO { private String businessName; private LocalDate workDate; private String representationName; private Review review; + + public InnerCareerDTO(String businessName, LocalDateTime startTime, String representationName, Review review) { + this.businessName = businessName; + this.workDate = startTime.toLocalDate(); + this.representationName = representationName; + this.review = review; + } } diff --git a/src/main/java/com/example/api/board/controller/domain/MyInfoDTO.java b/src/main/java/com/example/api/board/controller/domain/MyInfoDTO.java index cd8c088b..84d5c531 100644 --- a/src/main/java/com/example/api/board/controller/domain/MyInfoDTO.java +++ b/src/main/java/com/example/api/board/controller/domain/MyInfoDTO.java @@ -3,9 +3,17 @@ import com.example.api.domain.Category; import com.example.api.domain.ExternalCareer; import com.example.api.domain.PossibleBoard; +import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; import java.util.List; +@EqualsAndHashCode +@AllArgsConstructor +@Getter +@Setter public class MyInfoDTO { private String name; private String nickname; @@ -13,10 +21,21 @@ public class MyInfoDTO { private String sex; private String email; private String phone; - private List innerCarrerList; - private List externalCareerList; - private List possibleBoardList; - private List flavoredCategoryList; + private List innerCarrerList; + private List externalCareerList; + private List possibleBoardList; + private List flavoredCategoryList; private float starPoint; private int workCount; + + public MyInfoDTO(String name, String nickname, int age, String sex, String email, String phone, float starPoint, int workCount) { + this.name = name; + this.nickname = nickname; + this.age = age; + this.sex = sex; + this.email = email; + this.phone = phone; + this.starPoint = starPoint; + this.workCount = workCount; + } } \ No newline at end of file diff --git a/src/main/java/com/example/api/board/controller/domain/PossibleBoardDTO.java b/src/main/java/com/example/api/board/controller/domain/PossibleBoardDTO.java index 420f5ca9..a9ecb43c 100644 --- a/src/main/java/com/example/api/board/controller/domain/PossibleBoardDTO.java +++ b/src/main/java/com/example/api/board/controller/domain/PossibleBoardDTO.java @@ -1,4 +1,17 @@ package com.example.api.board.controller.domain; +import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; + +import java.time.LocalDateTime; + +@Getter +@Setter +@AllArgsConstructor +@EqualsAndHashCode public class PossibleBoardDTO { + private LocalDateTime startTime; + private LocalDateTime endTime; } From 81f7cbb2e8f614959bba245ec768d4efca7f642f Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Thu, 7 Nov 2024 22:04:58 +0900 Subject: [PATCH 095/276] =?UTF-8?q?board=20=EA=B4=80=EB=A0=A8=20repository?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../board/repository/BusinessRepository.java | 7 ++++++- .../board/repository/CategoryRepository.java | 10 +++------- .../board/repository/ContractRepository.java | 7 ++++++- .../board/repository/EmployeeRepository.java | 7 ++++++- .../board/repository/EmployerRepository.java | 7 ++++++- .../repository/ExternalCareerRepository.java | 15 ++++++++++++++- .../board/repository/FlavoredRepository.java | 15 ++++++++++++++- .../api/board/repository/MyInfoRepository.java | 10 +++++++--- .../repository/OfferEmploymentRepository.java | 18 +++++++++++++++++- .../repository/PossibleBoardRepository.java | 15 ++++++++++++++- .../api/board/repository/ReviewRepository.java | 7 ++++++- 11 files changed, 99 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/example/api/board/repository/BusinessRepository.java b/src/main/java/com/example/api/board/repository/BusinessRepository.java index a1dc3e8e..2eef619a 100644 --- a/src/main/java/com/example/api/board/repository/BusinessRepository.java +++ b/src/main/java/com/example/api/board/repository/BusinessRepository.java @@ -1,4 +1,9 @@ package com.example.api.board.repository; -public interface BusinessRepository { +import com.example.api.domain.Business; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface BusinessRepository extends JpaRepository { } diff --git a/src/main/java/com/example/api/board/repository/CategoryRepository.java b/src/main/java/com/example/api/board/repository/CategoryRepository.java index 02d9df12..ad44c56f 100644 --- a/src/main/java/com/example/api/board/repository/CategoryRepository.java +++ b/src/main/java/com/example/api/board/repository/CategoryRepository.java @@ -1,14 +1,10 @@ package com.example.api.board.repository; -import com.example.api.board.controller.domain.CategoryDTO; import com.example.api.domain.Category; import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; -import java.util.List; -public interface CategoryRepository extends JpaRepository { - - @Query("SELECT (c.categoryId, c.categoryName) FROM Category c") - List findAllCategories(); +@Repository +public interface CategoryRepository extends JpaRepository { } diff --git a/src/main/java/com/example/api/board/repository/ContractRepository.java b/src/main/java/com/example/api/board/repository/ContractRepository.java index 9dfe6d32..a84be61d 100644 --- a/src/main/java/com/example/api/board/repository/ContractRepository.java +++ b/src/main/java/com/example/api/board/repository/ContractRepository.java @@ -1,4 +1,9 @@ package com.example.api.board.repository; -public interface ContractRepository { +import com.example.api.domain.Contract; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface ContractRepository extends JpaRepository { } diff --git a/src/main/java/com/example/api/board/repository/EmployeeRepository.java b/src/main/java/com/example/api/board/repository/EmployeeRepository.java index a45beecd..02af61cd 100644 --- a/src/main/java/com/example/api/board/repository/EmployeeRepository.java +++ b/src/main/java/com/example/api/board/repository/EmployeeRepository.java @@ -1,4 +1,9 @@ package com.example.api.board.repository; -public interface EmployeeRepository { +import com.example.api.domain.Employee; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface EmployeeRepository extends JpaRepository { } diff --git a/src/main/java/com/example/api/board/repository/EmployerRepository.java b/src/main/java/com/example/api/board/repository/EmployerRepository.java index 5f4470ce..9b7bb591 100644 --- a/src/main/java/com/example/api/board/repository/EmployerRepository.java +++ b/src/main/java/com/example/api/board/repository/EmployerRepository.java @@ -1,4 +1,9 @@ package com.example.api.board.repository; -public interface EmployerRepository { +import com.example.api.domain.Employer; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface EmployerRepository extends JpaRepository { } diff --git a/src/main/java/com/example/api/board/repository/ExternalCareerRepository.java b/src/main/java/com/example/api/board/repository/ExternalCareerRepository.java index 8c1b5c5a..91a05d3f 100644 --- a/src/main/java/com/example/api/board/repository/ExternalCareerRepository.java +++ b/src/main/java/com/example/api/board/repository/ExternalCareerRepository.java @@ -1,4 +1,17 @@ package com.example.api.board.repository; -public interface InnerCareerRepository { +import com.example.api.board.controller.domain.ExternalCareerDTO; +import com.example.api.domain.ExternalCareer; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface ExternalCareerRepository extends JpaRepository { + @Query("select new com.example.api.board.controller.domain.ExternalCareerDTO(e.Name, e.period) " + + "from ExternalCareer e where e.employee.employeeId = :employeeId") + List findAllByEmployeeEmployeeId(@Param("employeeId") Long employeeId); } diff --git a/src/main/java/com/example/api/board/repository/FlavoredRepository.java b/src/main/java/com/example/api/board/repository/FlavoredRepository.java index aaf1c728..7057c85c 100644 --- a/src/main/java/com/example/api/board/repository/FlavoredRepository.java +++ b/src/main/java/com/example/api/board/repository/FlavoredRepository.java @@ -1,4 +1,17 @@ package com.example.api.board.repository; -public interface FlovoredRepository { +import com.example.api.board.controller.domain.CategoryDTO; +import com.example.api.domain.Flavored; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface FlavoredRepository extends JpaRepository { + @Query("select distinct new com.example.api.board.controller.domain.CategoryDTO(c.categoryId, c.categoryName) " + + "from Flavored f join Category c on f.category.categoryId = c.categoryId where f.employee.employeeId = :employeeId") + List findAllFlavoredByEmployeeId(@Param("employeeId") long employeeId); } diff --git a/src/main/java/com/example/api/board/repository/MyInfoRepository.java b/src/main/java/com/example/api/board/repository/MyInfoRepository.java index 82b68e98..3cfaf8c1 100644 --- a/src/main/java/com/example/api/board/repository/MyInfoRepository.java +++ b/src/main/java/com/example/api/board/repository/MyInfoRepository.java @@ -4,10 +4,14 @@ import com.example.api.domain.Employee; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; @Repository -public interface BoardRepository extends JpaRepository { - @Query("select e from Employee e join e.account a on e.employeeId = a.id") - MyInfoDTO findMyInfoDTOById(Long id); +public interface MyInfoRepository extends JpaRepository { + @Query("select new com.example.api.board.controller.domain." + + "MyInfoDTO(e.account.name, e.nickname, a.age, a.sex, a.email, a.phoneNumber, e.starPoint, e.workCount) " + + "from Employee e join e.account a on e.employeeId = a.id " + + "where e.employeeId = :EmployeeId") + MyInfoDTO findMyInfoDTOById(@Param("EmployeeId") Long EmployeeId); } diff --git a/src/main/java/com/example/api/board/repository/OfferEmploymentRepository.java b/src/main/java/com/example/api/board/repository/OfferEmploymentRepository.java index 104fdab3..8d91737d 100644 --- a/src/main/java/com/example/api/board/repository/OfferEmploymentRepository.java +++ b/src/main/java/com/example/api/board/repository/OfferEmploymentRepository.java @@ -1,4 +1,20 @@ package com.example.api.board.repository; -public interface OfferEmploymentRepository { +import com.example.api.board.controller.domain.InnerCareerDTO; +import com.example.api.domain.OfferEmployment; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface OfferEmploymentRepository extends JpaRepository { + @Query("select new com.example.api.board.controller.domain.InnerCareerDTO(b.businessName, c.contractStartTime, b.representationName, r) from OfferEmployment o " + + "join Contract c on o.suggestId = c.contractId " + + "join Business b on o.business.businessId = b.businessId "+ + "join Review r on o.suggestId = r.suggestId " + + "where o.employee.employeeId = :employeeId") + List findAllInnerCareerDTOByEmployeeId(@Param("employeeId") long employeeId); } diff --git a/src/main/java/com/example/api/board/repository/PossibleBoardRepository.java b/src/main/java/com/example/api/board/repository/PossibleBoardRepository.java index 1d4e28f4..0e5477b0 100644 --- a/src/main/java/com/example/api/board/repository/PossibleBoardRepository.java +++ b/src/main/java/com/example/api/board/repository/PossibleBoardRepository.java @@ -1,4 +1,17 @@ package com.example.api.board.repository; -public interface PossibleBoardRepository { +import com.example.api.board.controller.domain.PossibleBoardDTO; +import com.example.api.domain.PossibleBoard; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface PossibleBoardRepository extends JpaRepository { + @Query("select new com.example.api.board.controller.domain.PossibleBoardDTO(p.startTime, p.endTime) " + + "from PossibleBoard p where p.employee.employeeId = :employeeId") + List findAllPossibleBoardByEmployeeEmployeeId(@Param("employeeId")Long employeeId); } diff --git a/src/main/java/com/example/api/board/repository/ReviewRepository.java b/src/main/java/com/example/api/board/repository/ReviewRepository.java index 3fd50c76..dcc4c3cc 100644 --- a/src/main/java/com/example/api/board/repository/ReviewRepository.java +++ b/src/main/java/com/example/api/board/repository/ReviewRepository.java @@ -1,4 +1,9 @@ package com.example.api.board.repository; -public interface ReviewRepository { +import com.example.api.domain.Review; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface ReviewRepository extends JpaRepository { } From edb1e0bd2fae105c04fea1e48be61a734a181693 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Thu, 7 Nov 2024 22:05:25 +0900 Subject: [PATCH 096/276] =?UTF-8?q?BoardService,=20CategoryService=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/board/service/BoardService.java | 22 +++++++++++++++---- .../api/board/service/CategoryService.java | 8 +++++-- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/example/api/board/service/BoardService.java b/src/main/java/com/example/api/board/service/BoardService.java index 0bb5817c..23646f7a 100644 --- a/src/main/java/com/example/api/board/service/BoardService.java +++ b/src/main/java/com/example/api/board/service/BoardService.java @@ -1,7 +1,8 @@ package com.example.api.board.service; + import com.example.api.board.controller.domain.MyInfoDTO; -import com.example.api.board.repository.BoardRepository; +import com.example.api.board.repository.*; import jakarta.transaction.Transactional; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -11,9 +12,22 @@ @Transactional @RequiredArgsConstructor public class BoardService { - private final BoardRepository boardRepository; + private final MyInfoRepository myInfoRepository; + private final OfferEmploymentRepository offerEmploymentRepository; + private final ExternalCareerRepository externalCareerRepository; + private final PossibleBoardRepository possibleBoardRepository; + private final FlavoredRepository flavoredRepository; + + public MyInfoDTO findMyInfoById(long employeeId) { + MyInfoDTO myInfoDTOById = myInfoRepository.findMyInfoDTOById(employeeId); + myInfoDTOById.setInnerCarrerList(offerEmploymentRepository.findAllInnerCareerDTOByEmployeeId(employeeId)); + myInfoDTOById.setExternalCareerList(externalCareerRepository.findAllByEmployeeEmployeeId(employeeId)); + myInfoDTOById.setPossibleBoardList(possibleBoardRepository.findAllPossibleBoardByEmployeeEmployeeId(employeeId)); + myInfoDTOById.setFlavoredCategoryList(flavoredRepository.findAllFlavoredByEmployeeId(employeeId)); - public MyInfoDTO findMyInfoById(long id) { - return boardRepository.findMyInfoDTOById(id); + return myInfoDTOById; } + + } + diff --git a/src/main/java/com/example/api/board/service/CategoryService.java b/src/main/java/com/example/api/board/service/CategoryService.java index 4487fbd3..8fdd37f4 100644 --- a/src/main/java/com/example/api/board/service/CategoryService.java +++ b/src/main/java/com/example/api/board/service/CategoryService.java @@ -9,6 +9,7 @@ import org.springframework.stereotype.Service; import java.util.List; +import java.util.stream.Collectors; @Service @Transactional @@ -16,7 +17,10 @@ public class CategoryService { private final CategoryRepository categoryRepository; - public List findAll(){ - return categoryRepository.findAll(); + public List getAllCategories() { + List categories = categoryRepository.findAll(); + return categories.stream() + .map(category -> new CategoryDTO(category.getCategoryId(), category.getCategoryName())) + .collect(Collectors.toList()); } } From 0653f9dd7cb21db8c8a1434bb661115b584c966f Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Thu, 7 Nov 2024 22:05:53 +0900 Subject: [PATCH 097/276] =?UTF-8?q?test=20data=20=EC=83=9D=EC=84=B1=20clas?= =?UTF-8?q?s=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/api/global/DataInitializer.java | 113 +++++++++++++++++- 1 file changed, 111 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/example/api/global/DataInitializer.java b/src/main/java/com/example/api/global/DataInitializer.java index 2dc88ff4..b54391d7 100644 --- a/src/main/java/com/example/api/global/DataInitializer.java +++ b/src/main/java/com/example/api/global/DataInitializer.java @@ -1,4 +1,113 @@ package com.example.api.global; -public class InitDataConfig { -} +import com.example.api.board.repository.*; +import com.example.api.domain.*; +import jakarta.annotation.PostConstruct; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.List; + +@Component +public class DataInitializer { + @Autowired private BusinessRepository businessRepository; + @Autowired private CategoryRepository categoryRepository; + @Autowired private BusinessCategoryRepository businessCategoryRepository; + @Autowired private FlavoredRepository flavoredRepository; + @Autowired private ContractRepository contractRepository; + @Autowired private EmployeeRepository employeeRepository; + @Autowired private EmployerRepository employerRepository; + @Autowired private MyInfoRepository myInfoRepository; + @Autowired private OfferEmploymentRepository offerEmploymentRepository; + @Autowired private PossibleBoardRepository possibleBoardRepository; + @Autowired private ReviewRepository reviewRepository; + @Autowired private ExternalCareerRepository externalCareerRepository; + + @PostConstruct + void setUpData() { + Account account = new Account(); + account.setAge(30); + account.setEmail("johndoe@example.com"); + account.setName("John Doe"); + account.setSex("Male"); + account.setPhoneNumber("123-456-7890"); + + Employee employee = new Employee(); + employee.setAccount(account); + employee.setNickname("Johnny"); + employee.setStarPoint(3.5f); + employee.setWorkCount(3); + employeeRepository.save(employee); + + Employer employer = new Employer(); + employer.setNickname("EmployerOne"); + employerRepository.save(employer); + + + Category category1 = new Category(); + category1.setCategoryName("IT Services"); + categoryRepository.save(category1); + + Category category2 = new Category(); + category2.setCategoryName("Consulting"); + categoryRepository.save(category2); + + Business business = new Business(); + business.setBusinessName("Tech Solutions Inc."); + business.setLocation("Seoul, South Korea"); + business.setRepresentationName("James"); + business.setOpenDate(LocalDate.now()); + business.setRegistrationNumber("123-456-789"); + business.setEmployer(employer); + businessRepository.save(business); + + BusinessCategory businessCategory1 = new BusinessCategory(); + businessCategory1.setBusiness(business); + businessCategory1.setCategory(category1); + + BusinessCategory businessCategory2 = new BusinessCategory(); + businessCategory2.setBusiness(business); + businessCategory2.setCategory(category2); + + business.setBusinessCategories(List.of(businessCategory1, businessCategory2)); + businessCategoryRepository.save(businessCategory1); + businessCategoryRepository.save(businessCategory2); + + OfferEmployment offerEmployment = new OfferEmployment(); + offerEmployment.setBusiness(business); + offerEmployment.setEmployee(employee); + offerEmployment.setSuggestStartTime(LocalDateTime.of(2024, 11, 5, 9, 0)); + offerEmployment.setSuggestEndTime(LocalDateTime.of(2024, 11, 5, 17, 0)); + offerEmployment.setSuggestHourlyPay(20000); + offerEmployment.setSuggestSucceeded(false); + offerEmploymentRepository.save(offerEmployment); + + Contract contract = new Contract(); + contract.setOfferEmployment(offerEmployment); // 일대일 관계 설정 + contract.setContractStartTime(LocalDateTime.of(2024, 11, 10, 9, 0)); + contract.setContractEndTime(LocalDateTime.of(2024, 11, 10, 18, 0)); + contract.setContractHourlyPay(22000); + contract.setContractSucceeded(true); + contractRepository.save(contract); + + ExternalCareer externalCareer1 = new ExternalCareer(employee, "Consultant", "24-10-01"); + ExternalCareer externalCareer2 = new ExternalCareer(employee, "Architect", "24-10-08"); + externalCareerRepository.save(externalCareer1); + externalCareerRepository.save(externalCareer2); + + Review review1 = new Review(1L, 4, "Good work experience"); + reviewRepository.save(review1); + + PossibleBoard possibleBoard1 = new PossibleBoard(employee, LocalDateTime.of(2024, 11, 5, 12, 0), LocalDateTime.of(2024, 11, 5, 18, 0)); + PossibleBoard possibleBoard2 = new PossibleBoard(employee, LocalDateTime.of(2024, 11, 6, 12, 0), LocalDateTime.of(2024, 11, 6, 18, 0)); + possibleBoardRepository.save(possibleBoard1); + possibleBoardRepository.save(possibleBoard2); + + Flavored flavored = new Flavored(); + flavored.setCategory(categoryRepository.findById(1L).get()); + flavored.setEmployee(employeeRepository.findById(1L).get()); + flavoredRepository.save(flavored); + } +} \ No newline at end of file From ca37394b1c66822a426377d72ea4cccd766d55e6 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Thu, 7 Nov 2024 22:07:06 +0900 Subject: [PATCH 098/276] =?UTF-8?q?EnableJpaAuditing=20annotation=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/api/ApiApplication.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/example/api/ApiApplication.java b/src/main/java/com/example/api/ApiApplication.java index de1cf4b2..7235c2f0 100644 --- a/src/main/java/com/example/api/ApiApplication.java +++ b/src/main/java/com/example/api/ApiApplication.java @@ -3,8 +3,10 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.data.jpa.repository.config.EnableJpaAuditing; @SpringBootApplication +@EnableJpaAuditing public class ApiApplication { public static void main(String[] args) { From 958f10caa52ce737044bba5e93225c19a0818c90 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Thu, 7 Nov 2024 22:08:37 +0900 Subject: [PATCH 099/276] =?UTF-8?q?=EC=9D=B4=EB=A0=A5=EC=84=9C=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20=EA=B4=80=EB=A0=A8=20test=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../board/controller/BoardControllerTest.java | 47 +++++- .../api/board/service/BoardServiceTest.java | 37 ++++- .../board/service/CategoryServiceTest.java | 32 +++- .../api/global/BaseIntegrationTest.java | 151 +++++++++++++++++- 4 files changed, 257 insertions(+), 10 deletions(-) diff --git a/src/test/java/com/example/api/board/controller/BoardControllerTest.java b/src/test/java/com/example/api/board/controller/BoardControllerTest.java index 5a5a5e6f..dee42532 100644 --- a/src/test/java/com/example/api/board/controller/BoardControllerTest.java +++ b/src/test/java/com/example/api/board/controller/BoardControllerTest.java @@ -1,4 +1,45 @@ -import static org.junit.jupiter.api.Assertions.*; -class BoardControllerTest { - +package com.example.api.board.controller; + +import com.example.api.board.controller.domain.Board; +import com.example.api.board.controller.domain.CategoryDTO; +import com.example.api.board.controller.domain.MyInfoDTO; +import com.example.api.global.BaseIntegrationTest; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.ArrayList; +import java.util.List; + +class BoardControllerTest extends BaseIntegrationTest { + @Autowired BoardController boardController; + + @Test + void getBoard(){ + List expectedCategoryDTOList = new ArrayList<>(); + expectedCategoryDTOList.add(new CategoryDTO(category1.getCategoryId(), category1.getCategoryName())); + expectedCategoryDTOList.add(new CategoryDTO(category2.getCategoryId(), category2.getCategoryName())); + + Board expectedBoard = new Board( + new MyInfoDTO( + "John Doe", + "Johnny", + 30, + "Male", + "johndoe@example.com", + "123-456-7890", + innerCareerList, + externalCareerList, + possibleBoardList, + flavoredCategoryList, + 3.5f, + 3 + ), + expectedCategoryDTOList + ); + + Board boardByEmployeeId = boardController.findBoardByEmployeeId(1L); + + Assertions.assertEquals(expectedBoard, boardByEmployeeId); + } } \ No newline at end of file diff --git a/src/test/java/com/example/api/board/service/BoardServiceTest.java b/src/test/java/com/example/api/board/service/BoardServiceTest.java index fe2a6ed5..5784a491 100644 --- a/src/test/java/com/example/api/board/service/BoardServiceTest.java +++ b/src/test/java/com/example/api/board/service/BoardServiceTest.java @@ -1,4 +1,35 @@ -import static org.junit.jupiter.api.Assertions.*; -class BoardServiceTest { - +package com.example.api.board.service; + +import com.example.api.board.controller.domain.MyInfoDTO; +import com.example.api.global.BaseIntegrationTest; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + + +class BoardServiceTest extends BaseIntegrationTest { + @Autowired BoardService boardService; + + @Test + @DisplayName("나의 이력서 정보 조회") + void MyInfoCheck(){ + MyInfoDTO expectedMyInfoDTO = new MyInfoDTO( + "John Doe", + "Johnny", + 30, + "Male", + "johndoe@example.com", + "123-456-7890", + innerCareerList, + externalCareerList, + possibleBoardList, + flavoredCategoryList, + 3.5f, + 3 + ); + + MyInfoDTO findEmployeeInfo = boardService.findMyInfoById(1L); + Assertions.assertEquals(expectedMyInfoDTO, findEmployeeInfo); + } } \ No newline at end of file diff --git a/src/test/java/com/example/api/board/service/CategoryServiceTest.java b/src/test/java/com/example/api/board/service/CategoryServiceTest.java index 2036410f..f8d64aad 100644 --- a/src/test/java/com/example/api/board/service/CategoryServiceTest.java +++ b/src/test/java/com/example/api/board/service/CategoryServiceTest.java @@ -1,4 +1,30 @@ -import static org.junit.jupiter.api.Assertions.*; -class CategoryServiceTest { - +package com.example.api.board.service; + +import com.example.api.board.controller.domain.CategoryDTO; +import com.example.api.global.BaseIntegrationTest; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.ArrayList; +import java.util.List; + + +@SpringBootTest +class CategoryServiceTest extends BaseIntegrationTest { + @Autowired CategoryService categoryService; + + @Test + @DisplayName("모든 카테고리 조회") + void CategoryCheck(){ + List expectedCategoryDTO = new ArrayList<>(); + expectedCategoryDTO.add(new CategoryDTO(category1.getCategoryId(), category1.getCategoryName())); + expectedCategoryDTO.add(new CategoryDTO(category2.getCategoryId(), category2.getCategoryName())); + + List allCategories = categoryService.getAllCategories(); + Assertions.assertEquals(expectedCategoryDTO, allCategories); + } + } \ No newline at end of file diff --git a/src/test/java/com/example/api/global/BaseIntegrationTest.java b/src/test/java/com/example/api/global/BaseIntegrationTest.java index edbfaa00..d04d8bc9 100644 --- a/src/test/java/com/example/api/global/BaseIntegrationTest.java +++ b/src/test/java/com/example/api/global/BaseIntegrationTest.java @@ -1,4 +1,153 @@ package com.example.api.global; +import com.example.api.board.controller.domain.CategoryDTO; +import com.example.api.board.controller.domain.ExternalCareerDTO; +import com.example.api.board.controller.domain.InnerCareerDTO; +import com.example.api.board.controller.domain.PossibleBoardDTO; +import com.example.api.board.repository.*; +import com.example.api.domain.*; +import jakarta.transaction.Transactional; +import org.junit.jupiter.api.BeforeEach; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.annotation.Rollback; +import org.springframework.test.context.ActiveProfiles; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +@SpringBootTest +@ActiveProfiles("test") +@Rollback(false) public class BaseIntegrationTest { -} + + @Autowired + private BusinessRepository businessRepository; + @Autowired + private CategoryRepository categoryRepository; + @Autowired + private FlavoredRepository flavoredRepository; + @Autowired + private ContractRepository contractRepository; + @Autowired + private EmployeeRepository employeeRepository; + @Autowired + private EmployerRepository employerRepository; + @Autowired + private MyInfoRepository myInfoRepository; + @Autowired + private OfferEmploymentRepository offerEmploymentRepository; + @Autowired + private PossibleBoardRepository possibleBoardRepository; + @Autowired + private ReviewRepository reviewRepository; + @Autowired + private ExternalCareerRepository externalCareerRepository; + + protected List externalCareerList; + protected List possibleBoardList; + protected List innerCareerList; + protected List flavoredCategoryList; + + protected Category category1, category2; + + + @BeforeEach + void setUpData() { + Account account = new Account(); + account.setAge(30); + account.setEmail("johndoe@example.com"); + account.setName("John Doe"); + account.setSex("Male"); + account.setPhoneNumber("123-456-7890"); + + Employee employee = new Employee(); + employee.setAccount(account); + employee.setNickname("Johnny"); + employee.setStarPoint(3.5f); + employee.setWorkCount(3); + employeeRepository.save(employee); + + Employer employer = new Employer(); + employer.setNickname("EmployerOne"); + employerRepository.save(employer); + + category1 = new Category(); + category1.setCategoryName("IT Services"); + categoryRepository.save(category1); + + category2 = new Category(); + category2.setCategoryName("Consulting"); + categoryRepository.save(category2); + + Business business = new Business(); + business.setBusinessName("Tech Solutions Inc."); + business.setLocation("Seoul, South Korea"); + business.setRepresentationName("James"); + business.setOpenDate(LocalDate.now()); + business.setRegistrationNumber("123-456-789"); + business.setEmployer(employer); // 다대일 관계 설정 + + BusinessCategory businessCategory1 = new BusinessCategory(); + businessCategory1.setBusiness(business); + businessCategory1.setCategory(category1); + + BusinessCategory businessCategory2 = new BusinessCategory(); + businessCategory2.setBusiness(business); + businessCategory2.setCategory(category2); + + business.setBusinessCategories(List.of(businessCategory1, businessCategory2)); + businessRepository.save(business); + + OfferEmployment offerEmployment = new OfferEmployment(); + offerEmployment.setBusiness(business); + offerEmployment.setEmployee(employee); + offerEmployment.setSuggestStartTime(LocalDateTime.of(2024, 11, 5, 9, 0)); + offerEmployment.setSuggestEndTime(LocalDateTime.of(2024, 11, 5, 17, 0)); + offerEmployment.setSuggestHourlyPay(20000); + offerEmployment.setSuggestSucceeded(false); + offerEmploymentRepository.save(offerEmployment); + + Contract contract = new Contract(); + contract.setOfferEmployment(offerEmployment); // 일대일 관계 설정 + contract.setContractStartTime(LocalDateTime.of(2024, 11, 10, 9, 0)); + contract.setContractEndTime(LocalDateTime.of(2024, 11, 10, 18, 0)); + contract.setContractHourlyPay(22000); + contract.setContractSucceeded(true); + contractRepository.save(contract); + + ExternalCareer externalCareer1 = new ExternalCareer(employee, "Consultant", "24-10-01"); + ExternalCareer externalCareer2 = new ExternalCareer(employee, "Architect", "24-10-08"); + externalCareerRepository.save(externalCareer1); + externalCareerRepository.save(externalCareer2); + + externalCareerList = new ArrayList<>(); + externalCareerList.add(new ExternalCareerDTO(externalCareer1.getName(), externalCareer1.getPeriod())); + externalCareerList.add(new ExternalCareerDTO(externalCareer2.getName(), externalCareer2.getPeriod())); + + Review review1 = new Review(1L, 4, "Good work experience"); + reviewRepository.save(review1); + + innerCareerList = new ArrayList<>(); + innerCareerList.add(new InnerCareerDTO(business.getBusinessName(), contract.getContractStartTime(), business.getRepresentationName(), review1)); + + PossibleBoard possibleBoard1 = new PossibleBoard(employee, LocalDateTime.of(2024, 11, 5, 12, 0), LocalDateTime.of(2024, 11, 5, 18, 0)); + PossibleBoard possibleBoard2 = new PossibleBoard(employee, LocalDateTime.of(2024, 11, 6, 12, 0), LocalDateTime.of(2024, 11, 6, 18, 0)); + possibleBoardRepository.save(possibleBoard1); + possibleBoardRepository.save(possibleBoard2); + + possibleBoardList = new ArrayList<>(); + possibleBoardList.add(new PossibleBoardDTO(possibleBoard1.getStartTime(), possibleBoard1.getEndTime())); + possibleBoardList.add(new PossibleBoardDTO(possibleBoard2.getStartTime(), possibleBoard2.getEndTime())); + +// Flavored flavored = new Flavored(); +// flavored.setCategory(categoryRepository.findById(1L).get()); +// flavored.setEmployee(employeeRepository.findById(1L).get()); +// flavoredRepository.save(flavored); + + flavoredCategoryList = new ArrayList<>(); + flavoredCategoryList.addAll(flavoredRepository.findAllFlavoredByEmployeeId(1L)); + } +} \ No newline at end of file From d33e574ab1a245dc22ab3799ebc101a09ac0b8f2 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Fri, 8 Nov 2024 23:26:47 +0900 Subject: [PATCH 100/276] =?UTF-8?q?=EA=B3=B5=EA=B3=A0=20=EA=B8=B0=EC=9E=85?= =?UTF-8?q?=20=ED=9B=84=20=EC=A0=84=EC=86=A1=20api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/board/controller/BoardController.java | 30 ++++- .../board/controller/domain/CategoryDTO.java | 6 +- .../controller/domain/ExternalCareerDTO.java | 7 +- .../controller/domain/InnerCareerDTO.java | 2 + .../board/controller/domain/MyInfoDTO.java | 6 +- .../controller/domain/PossibleBoardDTO.java | 14 ++- .../board/repository/EmployeeRepository.java | 4 + .../repository/ExternalCareerRepository.java | 6 +- .../board/repository/FlavoredRepository.java | 4 +- .../repository/OfferEmploymentRepository.java | 2 +- .../repository/PossibleBoardRepository.java | 6 +- .../api/board/service/BoardService.java | 8 +- .../api/board/service/EmployeeService.java | 113 ++++++++++++++++++ .../java/com/example/api/domain/Category.java | 11 ++ .../example/api/domain/ExternalCareer.java | 4 + .../java/com/example/api/domain/Flavored.java | 9 ++ .../com/example/api/domain/PossibleBoard.java | 8 +- .../board/service/CategoryServiceTest.java | 1 - .../board/service/EmployeeServiceTest.java | 19 +++ .../api/global/BaseIntegrationTest.java | 2 +- 20 files changed, 225 insertions(+), 37 deletions(-) create mode 100644 src/main/java/com/example/api/board/service/EmployeeService.java create mode 100644 src/test/java/com/example/api/board/service/EmployeeServiceTest.java diff --git a/src/main/java/com/example/api/board/controller/BoardController.java b/src/main/java/com/example/api/board/controller/BoardController.java index 74b1469f..ff495b23 100644 --- a/src/main/java/com/example/api/board/controller/BoardController.java +++ b/src/main/java/com/example/api/board/controller/BoardController.java @@ -5,10 +5,11 @@ import com.example.api.board.controller.domain.MyInfoDTO; import com.example.api.board.service.BoardService; import com.example.api.board.service.CategoryService; +import com.example.api.board.service.EmployeeService; import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; import java.util.List; @@ -17,6 +18,7 @@ public class BoardController { private final BoardService boardService; private final CategoryService categoryService; + private final EmployeeService employeeService; @GetMapping("/api/v1/possible-board/form/{employeeId}") public Board findBoardByEmployeeId(@PathVariable("employeeId") Long employeeId) { @@ -24,4 +26,26 @@ public Board findBoardByEmployeeId(@PathVariable("employeeId") Long employeeId) List categoryList = categoryService.getAllCategories(); return new Board(myInfoById, categoryList); } + + @PostMapping("/api/v1/{employeeId}") + public ResponseEntity changeOpenStatus(@PathVariable("employeeId") Long employeeId, @RequestParam ("openStatus") Boolean openStatus) { + boolean updated = employeeService.changeOpenStatus(employeeId, openStatus); + if (updated) { + return ResponseEntity.ok("사용자 정보가 성공적으로 업데이트되었습니다."); + } else { + return ResponseEntity.status(HttpStatus.NOT_FOUND).body("사용자를 찾을 수 없습니다."); + } + } + + @PostMapping("/api/v1/possible-board/submit/{employeeId}") + public ResponseEntity submitBoard(@PathVariable("employeeId") Long employeeId, @RequestBody MyInfoDTO myInfo) { + boolean updated = employeeService.updateUserInfo(employeeId, myInfo); + if (updated) { + MyInfoDTO myInfoById = boardService.findMyInfoById(employeeId); + List categoryList = categoryService.getAllCategories(); + return ResponseEntity.ok(new Board(myInfoById, categoryList)); + } else { + return ResponseEntity.status(HttpStatus.NOT_FOUND).body("사용자를 찾을 수 없습니다."); + } + } } diff --git a/src/main/java/com/example/api/board/controller/domain/CategoryDTO.java b/src/main/java/com/example/api/board/controller/domain/CategoryDTO.java index ae3e9a25..2b10429d 100644 --- a/src/main/java/com/example/api/board/controller/domain/CategoryDTO.java +++ b/src/main/java/com/example/api/board/controller/domain/CategoryDTO.java @@ -1,14 +1,12 @@ package com.example.api.board.controller.domain; -import lombok.AllArgsConstructor; -import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.Setter; +import lombok.*; @Getter @Setter @AllArgsConstructor @EqualsAndHashCode +@NoArgsConstructor public class CategoryDTO { private Long categoryId; private String categoryName; diff --git a/src/main/java/com/example/api/board/controller/domain/ExternalCareerDTO.java b/src/main/java/com/example/api/board/controller/domain/ExternalCareerDTO.java index 95796653..5afb613c 100644 --- a/src/main/java/com/example/api/board/controller/domain/ExternalCareerDTO.java +++ b/src/main/java/com/example/api/board/controller/domain/ExternalCareerDTO.java @@ -1,16 +1,15 @@ package com.example.api.board.controller.domain; -import lombok.AllArgsConstructor; -import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.Setter; +import lombok.*; @Getter @Setter @AllArgsConstructor @EqualsAndHashCode +@NoArgsConstructor public class ExternalCareerDTO { + private long id; private String Name; private String period; } diff --git a/src/main/java/com/example/api/board/controller/domain/InnerCareerDTO.java b/src/main/java/com/example/api/board/controller/domain/InnerCareerDTO.java index 631a7ae4..de763578 100644 --- a/src/main/java/com/example/api/board/controller/domain/InnerCareerDTO.java +++ b/src/main/java/com/example/api/board/controller/domain/InnerCareerDTO.java @@ -4,6 +4,7 @@ import lombok.EqualsAndHashCode; import lombok.Getter; +import lombok.NoArgsConstructor; import lombok.Setter; import java.time.LocalDate; @@ -12,6 +13,7 @@ @Getter @Setter @EqualsAndHashCode +@NoArgsConstructor public class InnerCareerDTO { private String businessName; private LocalDate workDate; diff --git a/src/main/java/com/example/api/board/controller/domain/MyInfoDTO.java b/src/main/java/com/example/api/board/controller/domain/MyInfoDTO.java index 84d5c531..dc2b09b1 100644 --- a/src/main/java/com/example/api/board/controller/domain/MyInfoDTO.java +++ b/src/main/java/com/example/api/board/controller/domain/MyInfoDTO.java @@ -3,15 +3,13 @@ import com.example.api.domain.Category; import com.example.api.domain.ExternalCareer; import com.example.api.domain.PossibleBoard; -import lombok.AllArgsConstructor; -import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.Setter; +import lombok.*; import java.util.List; @EqualsAndHashCode @AllArgsConstructor +@NoArgsConstructor @Getter @Setter public class MyInfoDTO { diff --git a/src/main/java/com/example/api/board/controller/domain/PossibleBoardDTO.java b/src/main/java/com/example/api/board/controller/domain/PossibleBoardDTO.java index a9ecb43c..5ca358a1 100644 --- a/src/main/java/com/example/api/board/controller/domain/PossibleBoardDTO.java +++ b/src/main/java/com/example/api/board/controller/domain/PossibleBoardDTO.java @@ -1,17 +1,19 @@ package com.example.api.board.controller.domain; -import lombok.AllArgsConstructor; -import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.Setter; - +import lombok.*; import java.time.LocalDateTime; @Getter @Setter @AllArgsConstructor -@EqualsAndHashCode +@NoArgsConstructor +@EqualsAndHashCode(onlyExplicitlyIncluded = true) public class PossibleBoardDTO { + private long id; + + @EqualsAndHashCode.Include private LocalDateTime startTime; + + @EqualsAndHashCode.Include private LocalDateTime endTime; } diff --git a/src/main/java/com/example/api/board/repository/EmployeeRepository.java b/src/main/java/com/example/api/board/repository/EmployeeRepository.java index 02af61cd..a82c08c0 100644 --- a/src/main/java/com/example/api/board/repository/EmployeeRepository.java +++ b/src/main/java/com/example/api/board/repository/EmployeeRepository.java @@ -2,8 +2,12 @@ import com.example.api.domain.Employee; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; +import java.util.Optional; + @Repository public interface EmployeeRepository extends JpaRepository { + Optional findByEmployeeId(@Param("employeeId") Long employeeId); } diff --git a/src/main/java/com/example/api/board/repository/ExternalCareerRepository.java b/src/main/java/com/example/api/board/repository/ExternalCareerRepository.java index 91a05d3f..6ddc3bf3 100644 --- a/src/main/java/com/example/api/board/repository/ExternalCareerRepository.java +++ b/src/main/java/com/example/api/board/repository/ExternalCareerRepository.java @@ -11,7 +11,9 @@ @Repository public interface ExternalCareerRepository extends JpaRepository { - @Query("select new com.example.api.board.controller.domain.ExternalCareerDTO(e.Name, e.period) " + + @Query("select new com.example.api.board.controller.domain.ExternalCareerDTO(e.id, e.Name, e.period) " + "from ExternalCareer e where e.employee.employeeId = :employeeId") - List findAllByEmployeeEmployeeId(@Param("employeeId") Long employeeId); + List findAllDTOByEmployeeEmployeeId(@Param("employeeId") Long employeeId); + + List findAllByEmployeeEmployeeId(Long employeeId); } diff --git a/src/main/java/com/example/api/board/repository/FlavoredRepository.java b/src/main/java/com/example/api/board/repository/FlavoredRepository.java index 7057c85c..186cdf98 100644 --- a/src/main/java/com/example/api/board/repository/FlavoredRepository.java +++ b/src/main/java/com/example/api/board/repository/FlavoredRepository.java @@ -13,5 +13,7 @@ public interface FlavoredRepository extends JpaRepository { @Query("select distinct new com.example.api.board.controller.domain.CategoryDTO(c.categoryId, c.categoryName) " + "from Flavored f join Category c on f.category.categoryId = c.categoryId where f.employee.employeeId = :employeeId") - List findAllFlavoredByEmployeeId(@Param("employeeId") long employeeId); + List findAllCategoryDTOByEmployeeId(@Param("employeeId") long employeeId); + + List findAllByEmployeeEmployeeId(@Param("employeeId")Long employeeId); } diff --git a/src/main/java/com/example/api/board/repository/OfferEmploymentRepository.java b/src/main/java/com/example/api/board/repository/OfferEmploymentRepository.java index 8d91737d..d6c1a11d 100644 --- a/src/main/java/com/example/api/board/repository/OfferEmploymentRepository.java +++ b/src/main/java/com/example/api/board/repository/OfferEmploymentRepository.java @@ -16,5 +16,5 @@ public interface OfferEmploymentRepository extends JpaRepository findAllInnerCareerDTOByEmployeeId(@Param("employeeId") long employeeId); + List findAllDTOByEmployeeId(@Param("employeeId") long employeeId); } diff --git a/src/main/java/com/example/api/board/repository/PossibleBoardRepository.java b/src/main/java/com/example/api/board/repository/PossibleBoardRepository.java index 0e5477b0..504b136b 100644 --- a/src/main/java/com/example/api/board/repository/PossibleBoardRepository.java +++ b/src/main/java/com/example/api/board/repository/PossibleBoardRepository.java @@ -11,7 +11,9 @@ @Repository public interface PossibleBoardRepository extends JpaRepository { - @Query("select new com.example.api.board.controller.domain.PossibleBoardDTO(p.startTime, p.endTime) " + + List findAllByEmployeeEmployeeId(Long employeeId); + + @Query("select new com.example.api.board.controller.domain.PossibleBoardDTO(p.possibleId, p.startTime, p.endTime) " + "from PossibleBoard p where p.employee.employeeId = :employeeId") - List findAllPossibleBoardByEmployeeEmployeeId(@Param("employeeId")Long employeeId); + List findAllDTOByEmployeeEmployeeId(@Param("employeeId")Long employeeId); } diff --git a/src/main/java/com/example/api/board/service/BoardService.java b/src/main/java/com/example/api/board/service/BoardService.java index 23646f7a..087c6f55 100644 --- a/src/main/java/com/example/api/board/service/BoardService.java +++ b/src/main/java/com/example/api/board/service/BoardService.java @@ -20,10 +20,10 @@ public class BoardService { public MyInfoDTO findMyInfoById(long employeeId) { MyInfoDTO myInfoDTOById = myInfoRepository.findMyInfoDTOById(employeeId); - myInfoDTOById.setInnerCarrerList(offerEmploymentRepository.findAllInnerCareerDTOByEmployeeId(employeeId)); - myInfoDTOById.setExternalCareerList(externalCareerRepository.findAllByEmployeeEmployeeId(employeeId)); - myInfoDTOById.setPossibleBoardList(possibleBoardRepository.findAllPossibleBoardByEmployeeEmployeeId(employeeId)); - myInfoDTOById.setFlavoredCategoryList(flavoredRepository.findAllFlavoredByEmployeeId(employeeId)); + myInfoDTOById.setInnerCarrerList(offerEmploymentRepository.findAllDTOByEmployeeId(employeeId)); + myInfoDTOById.setExternalCareerList(externalCareerRepository.findAllDTOByEmployeeEmployeeId(employeeId)); + myInfoDTOById.setPossibleBoardList(possibleBoardRepository.findAllDTOByEmployeeEmployeeId(employeeId)); + myInfoDTOById.setFlavoredCategoryList(flavoredRepository.findAllCategoryDTOByEmployeeId(employeeId)); return myInfoDTOById; } diff --git a/src/main/java/com/example/api/board/service/EmployeeService.java b/src/main/java/com/example/api/board/service/EmployeeService.java new file mode 100644 index 00000000..cb946a6c --- /dev/null +++ b/src/main/java/com/example/api/board/service/EmployeeService.java @@ -0,0 +1,113 @@ +package com.example.api.board.service; + +import com.example.api.board.controller.domain.*; +import com.example.api.board.repository.*; +import com.example.api.domain.*; +import jakarta.transaction.Transactional; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +@Repository +@Transactional +@RequiredArgsConstructor +public class EmployeeService { + private final EmployeeRepository employeeRepository; + private final ExternalCareerRepository externalCareerRepository; + private final FlavoredRepository flavoredRepository; + private final PossibleBoardRepository possibleBoardRepository; + private final CategoryRepository categoryRepository; + + public Boolean changeOpenStatus(Long employeeId, boolean openStatus) { + return employeeRepository.findByEmployeeId(employeeId).map(employee -> { + employee.setOpenStatus(openStatus); + employeeRepository.save(employee); + return true; + }).orElse(false); + } + + public boolean updateUserInfo(Long employeeId, MyInfoDTO myInfo) { + return employeeRepository.findByEmployeeId(employeeId).map(employee -> { + setUserInfo(employee, myInfo); + employeeRepository.save(employee); + + updateExternalCareer(employee, myInfo.getExternalCareerList()); + updateFlavored(employee, myInfo.getFlavoredCategoryList()); + updatePossibleBoard(employee, myInfo.getPossibleBoardList()); + return true; + }).orElse(false); + } + + void setUserInfo(Employee employee, MyInfoDTO myInfo) { + Account account = employee.getAccount(); + + account.setName(myInfo.getName()); + account.setSex(myInfo.getSex()); + account.setAge(myInfo.getAge()); + account.setPhoneNumber(myInfo.getPhone()); + account.setEmail(myInfo.getEmail()); + employee.setNickname(myInfo.getNickname()); + } + public void updateExternalCareer(Employee employee, List newExternalCareerList) { + List existList = externalCareerRepository.findAllByEmployeeEmployeeId(employee.getEmployeeId()); + Set newSet = new HashSet<>(newExternalCareerList); + + Set toDelete = existList.stream() + .filter(exist -> newSet.stream() + .noneMatch(newDto -> newDto.getName().equals(exist.getName()) && newDto.getPeriod().equals(exist.getPeriod()))) + .collect(Collectors.toSet()); + + Set toAdd = newExternalCareerList.stream() + .filter(dto -> existList.stream() + .noneMatch(exist -> exist.getName().equals(dto.getName()) && exist.getPeriod().equals(dto.getPeriod()))) + .map(dto -> new ExternalCareer(employee, dto.getName(), dto.getPeriod())) + .collect(Collectors.toSet()); + + externalCareerRepository.deleteAll(toDelete); + externalCareerRepository.saveAll(toAdd); + } + public void updateFlavored(Employee employee, List newCategoryList) { + List existFlavored = flavoredRepository.findAllByEmployeeEmployeeId(employee.getEmployeeId()); + + Set newCategoryIds = newCategoryList.stream() + .map(CategoryDTO::getCategoryId) + .collect(Collectors.toSet()); + + Set toDelete = existFlavored.stream() + .filter(exist -> !newCategoryIds.contains(exist.getCategory().getCategoryId())) + .collect(Collectors.toSet()); + + Set toAdd = newCategoryList.stream() + .filter(dto -> existFlavored.stream() + .noneMatch(flavored -> flavored.getCategory().getCategoryId().equals(dto.getCategoryId()))) + .map(dto -> new Flavored(new Category(dto.getCategoryId(), dto.getCategoryName()), employee)) + .collect(Collectors.toSet()); + + flavoredRepository.deleteAll(toDelete); + flavoredRepository.saveAll(toAdd); + } + public void updatePossibleBoard(Employee employee, List newPossibleBoard) { + List existPossibleBoard = possibleBoardRepository.findAllByEmployeeEmployeeId(employee.getEmployeeId()); + Set newSet = new HashSet<>(newPossibleBoard); + + Set toDelete = existPossibleBoard.stream() + .filter(exist -> newSet.stream() + .noneMatch(newDto -> newDto.getStartTime().equals(exist.getStartTime()) + && newDto.getEndTime().equals(exist.getEndTime()))) + .collect(Collectors.toSet()); + + Set ToAdd = newSet.stream() + .filter(newDto -> existPossibleBoard.stream() + .noneMatch(exist -> newDto.getStartTime().equals(exist.getStartTime()) + && newDto.getEndTime().equals(exist.getEndTime()))) + .map(dto -> new PossibleBoard(employee, dto.getStartTime(), dto.getEndTime())) + .collect(Collectors.toSet()); + + possibleBoardRepository.deleteAll(toDelete); + possibleBoardRepository.saveAll(ToAdd); + } +} diff --git a/src/main/java/com/example/api/domain/Category.java b/src/main/java/com/example/api/domain/Category.java index 0fa2957a..1d681ceb 100644 --- a/src/main/java/com/example/api/domain/Category.java +++ b/src/main/java/com/example/api/domain/Category.java @@ -1,6 +1,7 @@ package com.example.api.domain; import jakarta.persistence.*; +import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; @@ -10,13 +11,23 @@ @Entity @Getter @Setter +@EqualsAndHashCode @Table(name = "CATEGORY") public class Category extends BaseEntity{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "CATEGORY_ID") private Long categoryId; + @Column(name = "CATEGORY_NAME") private String categoryName; + + public Category() { + } + + public Category(Long categoryId, String categoryName) { + this.categoryId = categoryId; + this.categoryName = categoryName; + } } diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 547ffaef..b92949e8 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -4,6 +4,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import jakarta.persistence.*; import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; @@ -13,6 +14,7 @@ @Getter @Setter @Table(name = "EXTERANL_CARRER") +@EqualsAndHashCode(onlyExplicitlyIncluded = true) public class ExternalCareer extends BaseEntity{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -23,8 +25,10 @@ public class ExternalCareer extends BaseEntity{ @JsonIgnore private Account employee; + @EqualsAndHashCode.Include @Column(name = "BUSINESS_NAME") private String Name; + @EqualsAndHashCode.Include @Column(name = "PART_TIME_PERIOD") private String period; diff --git a/src/main/java/com/example/api/domain/Flavored.java b/src/main/java/com/example/api/domain/Flavored.java index 78136bcc..7d2468c7 100644 --- a/src/main/java/com/example/api/domain/Flavored.java +++ b/src/main/java/com/example/api/domain/Flavored.java @@ -1,6 +1,7 @@ package com.example.api.domain; import jakarta.persistence.*; +import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; @@ -12,6 +13,7 @@ @Table(name = "flavored", uniqueConstraints = { @UniqueConstraint(columnNames = {"employee_id", "category_id"}) }) +@EqualsAndHashCode(callSuper = false) public class Flavored extends BaseEntity{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -26,4 +28,11 @@ public class Flavored extends BaseEntity{ @JoinColumn(name = "employee_id") private Account employee; + public Flavored() { + } + + public Flavored(Category category, Employee employee) { + this.category = category; + this.employee = employee; + } } diff --git a/src/main/java/com/example/api/domain/PossibleBoard.java b/src/main/java/com/example/api/domain/PossibleBoard.java index 520d0586..54e36139 100644 --- a/src/main/java/com/example/api/domain/PossibleBoard.java +++ b/src/main/java/com/example/api/domain/PossibleBoard.java @@ -1,10 +1,7 @@ package com.example.api.domain; import jakarta.persistence.*; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; +import lombok.*; import java.time.LocalDateTime; @@ -15,6 +12,7 @@ @Setter @AllArgsConstructor @NoArgsConstructor +@EqualsAndHashCode public class PossibleBoard extends BaseEntity{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -25,9 +23,11 @@ public class PossibleBoard extends BaseEntity{ private Account employee; @Column(name = "POSSIBLE_START_TIME") + @EqualsAndHashCode.Include private LocalDateTime startTime; @Column(name = "POSSIBLE_END_TIME") + @EqualsAndHashCode.Include private LocalDateTime endTime; public PossibleBoard(Account employee, LocalDateTime startTime, LocalDateTime endTime) { diff --git a/src/test/java/com/example/api/board/service/CategoryServiceTest.java b/src/test/java/com/example/api/board/service/CategoryServiceTest.java index f8d64aad..7bafcdb1 100644 --- a/src/test/java/com/example/api/board/service/CategoryServiceTest.java +++ b/src/test/java/com/example/api/board/service/CategoryServiceTest.java @@ -12,7 +12,6 @@ import java.util.List; -@SpringBootTest class CategoryServiceTest extends BaseIntegrationTest { @Autowired CategoryService categoryService; diff --git a/src/test/java/com/example/api/board/service/EmployeeServiceTest.java b/src/test/java/com/example/api/board/service/EmployeeServiceTest.java new file mode 100644 index 00000000..f2f37885 --- /dev/null +++ b/src/test/java/com/example/api/board/service/EmployeeServiceTest.java @@ -0,0 +1,19 @@ +package com.example.api.board.service; + +import com.example.api.global.BaseIntegrationTest; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +import static org.junit.jupiter.api.Assertions.*; + +class EmployeeServiceTest extends BaseIntegrationTest { + @Autowired EmployeeService employeeService; + + @Test + @DisplayName("공고 공개 여부 변경") + void changeOpenStatus(){ + Boolean result = employeeService.changeOpenStatus(1L, false); + assertTrue(result); + } +} \ No newline at end of file diff --git a/src/test/java/com/example/api/global/BaseIntegrationTest.java b/src/test/java/com/example/api/global/BaseIntegrationTest.java index d04d8bc9..a93e8908 100644 --- a/src/test/java/com/example/api/global/BaseIntegrationTest.java +++ b/src/test/java/com/example/api/global/BaseIntegrationTest.java @@ -148,6 +148,6 @@ void setUpData() { // flavoredRepository.save(flavored); flavoredCategoryList = new ArrayList<>(); - flavoredCategoryList.addAll(flavoredRepository.findAllFlavoredByEmployeeId(1L)); + flavoredCategoryList.addAll(flavoredRepository.findAllCategoryDTOByEmployeeId(1L)); } } \ No newline at end of file From 1ec077c818dc45404c3a6e02481a3218ed330f60 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Sun, 10 Nov 2024 18:05:54 +0900 Subject: [PATCH 101/276] =?UTF-8?q?=EC=95=8C=EB=B0=94=20=EC=B2=B4=EA=B2=B0?= =?UTF-8?q?=20=EA=B1=B4=20=EC=83=81=EC=84=B8=20=EB=B3=B4=EA=B8=B0=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../board/repository/ContractRepository.java | 22 +++++++++ .../board/repository/EmployeeRepository.java | 2 + .../board/repository/EmployerRepository.java | 5 +++ .../api/board/service/EmployeeService.java | 2 - .../controller/ContractController.java | 21 +++++++++ .../controller/domain/BusinessInfoDTO.java | 20 +++++++++ .../controller/domain/ContractDTO.java | 15 +++++++ .../controller/domain/EmployeeInfoDTO.java | 15 +++++++ .../api/contract/service/ContractService.java | 22 +++++++++ .../controller/EmployerController.java | 23 ++++++++++ .../controller/domain/LikeEmployeeDTO.java | 26 +++++++++++ .../employer/repository/ScrapRepository.java | 15 +++++++ .../api/employer/service/EmployerService.java | 45 +++++++++++++++++++ .../example/api/global/DataInitializer.java | 7 +++ .../suggest/controller/SuggestController.java | 20 +++++++++ .../api/suggest/service/SuggestService.java | 13 ++++++ 16 files changed, 271 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/example/api/contract/controller/ContractController.java create mode 100644 src/main/java/com/example/api/contract/controller/domain/BusinessInfoDTO.java create mode 100644 src/main/java/com/example/api/contract/controller/domain/ContractDTO.java create mode 100644 src/main/java/com/example/api/contract/controller/domain/EmployeeInfoDTO.java create mode 100644 src/main/java/com/example/api/contract/service/ContractService.java create mode 100644 src/main/java/com/example/api/employer/controller/EmployerController.java create mode 100644 src/main/java/com/example/api/employer/controller/domain/LikeEmployeeDTO.java create mode 100644 src/main/java/com/example/api/employer/repository/ScrapRepository.java create mode 100644 src/main/java/com/example/api/employer/service/EmployerService.java create mode 100644 src/main/java/com/example/api/suggest/controller/SuggestController.java create mode 100644 src/main/java/com/example/api/suggest/service/SuggestService.java diff --git a/src/main/java/com/example/api/board/repository/ContractRepository.java b/src/main/java/com/example/api/board/repository/ContractRepository.java index a84be61d..044e6a28 100644 --- a/src/main/java/com/example/api/board/repository/ContractRepository.java +++ b/src/main/java/com/example/api/board/repository/ContractRepository.java @@ -1,9 +1,31 @@ package com.example.api.board.repository; +import com.example.api.contract.controller.domain.BusinessInfoDTO; +import com.example.api.contract.controller.domain.ContractDTO; +import com.example.api.contract.controller.domain.EmployeeInfoDTO; import com.example.api.domain.Contract; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; @Repository public interface ContractRepository extends JpaRepository { + @Query("select new com.example.api.contract.controller.domain." + + "BusinessInfoDTO(b.businessName, b.representationName, c.contractStartTime, c.contractEndTime, b.location, a.phoneNumber, c.updatedDate) " + + "from Contract c " + + "join c.offerEmployment oe " + + "join oe.business b " + + "join Account a on a.id = b.employer.employerId " + + "where c.contractId = :contractId") + BusinessInfoDTO findBusinessDTOByContractId(@Param("contractId") long contractId); + + @Query("select new com.example.api.contract.controller.domain." + + "EmployeeInfoDTO(a.name, a.phoneNumber, e.starPoint, e.workCount) " + + "from Contract c " + + "join c.offerEmployment oe " + + "join oe.employee e " + + "join e.account a " + + "where c.contractId = :contractId") + EmployeeInfoDTO findEmployeeDTOByContractId(@Param("contractId") long contractId); } diff --git a/src/main/java/com/example/api/board/repository/EmployeeRepository.java b/src/main/java/com/example/api/board/repository/EmployeeRepository.java index a82c08c0..344cff96 100644 --- a/src/main/java/com/example/api/board/repository/EmployeeRepository.java +++ b/src/main/java/com/example/api/board/repository/EmployeeRepository.java @@ -2,9 +2,11 @@ import com.example.api.domain.Employee; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; +import java.util.List; import java.util.Optional; @Repository diff --git a/src/main/java/com/example/api/board/repository/EmployerRepository.java b/src/main/java/com/example/api/board/repository/EmployerRepository.java index 9b7bb591..88a36f4a 100644 --- a/src/main/java/com/example/api/board/repository/EmployerRepository.java +++ b/src/main/java/com/example/api/board/repository/EmployerRepository.java @@ -1,9 +1,14 @@ package com.example.api.board.repository; +import com.example.api.domain.Employee; import com.example.api.domain.Employer; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; +import java.util.List; + @Repository public interface EmployerRepository extends JpaRepository { } diff --git a/src/main/java/com/example/api/board/service/EmployeeService.java b/src/main/java/com/example/api/board/service/EmployeeService.java index cb946a6c..e74b80c2 100644 --- a/src/main/java/com/example/api/board/service/EmployeeService.java +++ b/src/main/java/com/example/api/board/service/EmployeeService.java @@ -29,7 +29,6 @@ public Boolean changeOpenStatus(Long employeeId, boolean openStatus) { return true; }).orElse(false); } - public boolean updateUserInfo(Long employeeId, MyInfoDTO myInfo) { return employeeRepository.findByEmployeeId(employeeId).map(employee -> { setUserInfo(employee, myInfo); @@ -41,7 +40,6 @@ public boolean updateUserInfo(Long employeeId, MyInfoDTO myInfo) { return true; }).orElse(false); } - void setUserInfo(Employee employee, MyInfoDTO myInfo) { Account account = employee.getAccount(); diff --git a/src/main/java/com/example/api/contract/controller/ContractController.java b/src/main/java/com/example/api/contract/controller/ContractController.java new file mode 100644 index 00000000..d6446280 --- /dev/null +++ b/src/main/java/com/example/api/contract/controller/ContractController.java @@ -0,0 +1,21 @@ +package com.example.api.contract.controller; + +import com.example.api.contract.controller.domain.ContractDTO; +import com.example.api.contract.service.ContractService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +public class ContractController { + private final ContractService contractService; + + @GetMapping("/api/v1/contract/{contractId}/status") + public ResponseEntity getContractInfo(@PathVariable("contractId") long contractId) { + ContractDTO contractDTO = contractService.getContractInfo(contractId); + return ResponseEntity.ok(contractDTO); + } +} diff --git a/src/main/java/com/example/api/contract/controller/domain/BusinessInfoDTO.java b/src/main/java/com/example/api/contract/controller/domain/BusinessInfoDTO.java new file mode 100644 index 00000000..2c166909 --- /dev/null +++ b/src/main/java/com/example/api/contract/controller/domain/BusinessInfoDTO.java @@ -0,0 +1,20 @@ +package com.example.api.contract.controller.domain; + +import lombok.*; + +import java.time.LocalDateTime; + +@EqualsAndHashCode +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +public class BusinessInfoDTO { + private String businessName; + private String representationName; + private LocalDateTime startTime; + private LocalDateTime endTime; + private String location; + private String businessPhone; + private LocalDateTime signedDate; +} diff --git a/src/main/java/com/example/api/contract/controller/domain/ContractDTO.java b/src/main/java/com/example/api/contract/controller/domain/ContractDTO.java new file mode 100644 index 00000000..fcb282f9 --- /dev/null +++ b/src/main/java/com/example/api/contract/controller/domain/ContractDTO.java @@ -0,0 +1,15 @@ +package com.example.api.contract.controller.domain; + +import lombok.*; + +import java.time.LocalDateTime; + +@EqualsAndHashCode +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +public class ContractDTO { + private BusinessInfoDTO businessInfo; + private EmployeeInfoDTO employeeInfo; +} diff --git a/src/main/java/com/example/api/contract/controller/domain/EmployeeInfoDTO.java b/src/main/java/com/example/api/contract/controller/domain/EmployeeInfoDTO.java new file mode 100644 index 00000000..a4988809 --- /dev/null +++ b/src/main/java/com/example/api/contract/controller/domain/EmployeeInfoDTO.java @@ -0,0 +1,15 @@ +package com.example.api.contract.controller.domain; + +import lombok.*; + +@EqualsAndHashCode +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +public class EmployeeInfoDTO { + private String employeeName; + private String employeePhone; + private float starPoint; + private int workCount; +} diff --git a/src/main/java/com/example/api/contract/service/ContractService.java b/src/main/java/com/example/api/contract/service/ContractService.java new file mode 100644 index 00000000..1dd167c4 --- /dev/null +++ b/src/main/java/com/example/api/contract/service/ContractService.java @@ -0,0 +1,22 @@ +package com.example.api.contract.service; + +import com.example.api.board.repository.ContractRepository; +import com.example.api.contract.controller.domain.BusinessInfoDTO; +import com.example.api.contract.controller.domain.ContractDTO; +import com.example.api.contract.controller.domain.EmployeeInfoDTO; +import jakarta.transaction.Transactional; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@Transactional +@RequiredArgsConstructor +public class ContractService { + private final ContractRepository contractRepository; + + public ContractDTO getContractInfo(long contractId) { + BusinessInfoDTO businessDTO = contractRepository.findBusinessDTOByContractId(contractId); + EmployeeInfoDTO employeeDTO = contractRepository.findEmployeeDTOByContractId(contractId); + return new ContractDTO(businessDTO, employeeDTO); + } +} diff --git a/src/main/java/com/example/api/employer/controller/EmployerController.java b/src/main/java/com/example/api/employer/controller/EmployerController.java new file mode 100644 index 00000000..838d3190 --- /dev/null +++ b/src/main/java/com/example/api/employer/controller/EmployerController.java @@ -0,0 +1,23 @@ +package com.example.api.employer.controller; + +import com.example.api.employer.controller.domain.LikeEmployeeDTO; +import com.example.api.employer.service.EmployerService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequiredArgsConstructor +public class EmployerController { + private final EmployerService employerService; + + @GetMapping("/api/v1/employees/favorites/{employerId}") + public ResponseEntity getLikeEmployee(@PathVariable("employerId") Long employerId) { + List result = employerService.getLikeEmployee(employerId); + return ResponseEntity.ok(result); + } +} diff --git a/src/main/java/com/example/api/employer/controller/domain/LikeEmployeeDTO.java b/src/main/java/com/example/api/employer/controller/domain/LikeEmployeeDTO.java new file mode 100644 index 00000000..73941ed9 --- /dev/null +++ b/src/main/java/com/example/api/employer/controller/domain/LikeEmployeeDTO.java @@ -0,0 +1,26 @@ +package com.example.api.employer.controller.domain; + +import com.example.api.board.controller.domain.CategoryDTO; +import com.example.api.board.controller.domain.ExternalCareerDTO; +import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +@Getter +@Setter +@AllArgsConstructor +@EqualsAndHashCode +public class LikeEmployeeDTO { + private long employeeId; + private String name; + private String nickname; + private String sex; + private int age; + private float starPoint; + private long workCount; + private List externalCareerList; + private List flavoredCategoryList; +} diff --git a/src/main/java/com/example/api/employer/repository/ScrapRepository.java b/src/main/java/com/example/api/employer/repository/ScrapRepository.java new file mode 100644 index 00000000..1c9a2ddb --- /dev/null +++ b/src/main/java/com/example/api/employer/repository/ScrapRepository.java @@ -0,0 +1,15 @@ +package com.example.api.employer.repository; + +import com.example.api.domain.Scrap; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface ScrapRepository extends JpaRepository { + @Query("select s from Scrap s where s.employer.employerId = :employerId") + List findAllByEmployerId(@Param("employerId") long employerId); +} diff --git a/src/main/java/com/example/api/employer/service/EmployerService.java b/src/main/java/com/example/api/employer/service/EmployerService.java new file mode 100644 index 00000000..e75445b0 --- /dev/null +++ b/src/main/java/com/example/api/employer/service/EmployerService.java @@ -0,0 +1,45 @@ +package com.example.api.employer.service; + +import com.example.api.board.repository.EmployeeRepository; +import com.example.api.board.repository.ExternalCareerRepository; +import com.example.api.board.repository.FlavoredRepository; +import com.example.api.domain.Employee; +import com.example.api.domain.Scrap; +import com.example.api.employer.controller.domain.LikeEmployeeDTO; +import com.example.api.employer.repository.ScrapRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +@Service +@RequiredArgsConstructor +public class EmployerService { + private final ScrapRepository scrapRepository; + private final EmployeeRepository employeeRepository; + private final ExternalCareerRepository externalCareerRepository; + private final FlavoredRepository flavoredRepository; + + + public List getLikeEmployee(Long employerId) { + Set employeeIds = scrapRepository.findAllByEmployerId(employerId).stream() + .map(scrap -> scrap.getEmployee().getEmployeeId()) + .collect(Collectors.toSet()); + List likeEmployeeList = employeeRepository.findAllById(employeeIds); + return likeEmployeeList.stream().map( + employee -> new LikeEmployeeDTO( + employee.getEmployeeId(), + employee.getAccount().getName(), + employee.getNickname(), + employee.getAccount().getSex(), + employee.getAccount().getAge(), + employee.getStarPoint(), + employee.getWorkCount(), + externalCareerRepository.findAllDTOByEmployeeEmployeeId(employee.getEmployeeId()), + flavoredRepository.findAllCategoryDTOByEmployeeId(employee.getEmployeeId()) + ) + ).collect(Collectors.toList()); + } +} diff --git a/src/main/java/com/example/api/global/DataInitializer.java b/src/main/java/com/example/api/global/DataInitializer.java index b54391d7..ae7e93b9 100644 --- a/src/main/java/com/example/api/global/DataInitializer.java +++ b/src/main/java/com/example/api/global/DataInitializer.java @@ -2,6 +2,7 @@ import com.example.api.board.repository.*; import com.example.api.domain.*; +import com.example.api.employer.repository.ScrapRepository; import jakarta.annotation.PostConstruct; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -24,6 +25,7 @@ public class DataInitializer { @Autowired private PossibleBoardRepository possibleBoardRepository; @Autowired private ReviewRepository reviewRepository; @Autowired private ExternalCareerRepository externalCareerRepository; + @Autowired private ScrapRepository scrapRepository; @PostConstruct void setUpData() { @@ -109,5 +111,10 @@ void setUpData() { flavored.setCategory(categoryRepository.findById(1L).get()); flavored.setEmployee(employeeRepository.findById(1L).get()); flavoredRepository.save(flavored); + + Scrap scrap = new Scrap(); + scrap.setEmployee(employee); + scrap.setEmployer(employer); + scrapRepository.save(scrap); } } \ No newline at end of file diff --git a/src/main/java/com/example/api/suggest/controller/SuggestController.java b/src/main/java/com/example/api/suggest/controller/SuggestController.java new file mode 100644 index 00000000..d1ae57fe --- /dev/null +++ b/src/main/java/com/example/api/suggest/controller/SuggestController.java @@ -0,0 +1,20 @@ +package com.example.api.suggest.controller; + +import com.example.api.suggest.service.SuggestService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +public class SuggestController { + private final SuggestService suggestService; + + @GetMapping("/api/v1/employment-suggests/status/{employeeId}") + public ResponseEntity getSuggestStatus(@PathVariable("employeeId") long employeeId) { + suggestService.getSuggestStatus(employeeId); + return ResponseEntity.ok("good"); + } +} diff --git a/src/main/java/com/example/api/suggest/service/SuggestService.java b/src/main/java/com/example/api/suggest/service/SuggestService.java new file mode 100644 index 00000000..240f6d28 --- /dev/null +++ b/src/main/java/com/example/api/suggest/service/SuggestService.java @@ -0,0 +1,13 @@ +package com.example.api.suggest.service; + +import jakarta.transaction.Transactional; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@Transactional +@RequiredArgsConstructor +public class SuggestService { + public void getSuggestStatus(long employeeId) { + } +} From cdce5e4ea98f6ab9f2028243f225fe9347ab7894 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Sun, 10 Nov 2024 21:43:07 +0900 Subject: [PATCH 102/276] =?UTF-8?q?=EC=95=8C=EB=B0=94=20=EC=9A=94=EC=B2=AD?= =?UTF-8?q?=20=EB=B0=8F=20=EC=B2=B4=EA=B2=B0=20=ED=98=84=ED=99=A9(?= =?UTF-8?q?=EC=82=AC=EC=9E=A5=20=EB=A7=88=EC=9D=B4=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80)=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/OfferEmploymentRepository.java | 14 +++- .../java/com/example/api/domain/Contract.java | 3 +- .../example/api/domain/OfferEmployment.java | 1 + .../suggest/controller/SuggestController.java | 11 ++-- .../controller/domain/SuggestStatusDTO.java | 17 +++++ .../api/suggest/service/SuggestService.java | 65 ++++++++++++++++++- 6 files changed, 103 insertions(+), 8 deletions(-) create mode 100644 src/main/java/com/example/api/suggest/controller/domain/SuggestStatusDTO.java diff --git a/src/main/java/com/example/api/board/repository/OfferEmploymentRepository.java b/src/main/java/com/example/api/board/repository/OfferEmploymentRepository.java index d6c1a11d..bbc71dc9 100644 --- a/src/main/java/com/example/api/board/repository/OfferEmploymentRepository.java +++ b/src/main/java/com/example/api/board/repository/OfferEmploymentRepository.java @@ -11,10 +11,22 @@ @Repository public interface OfferEmploymentRepository extends JpaRepository { - @Query("select new com.example.api.board.controller.domain.InnerCareerDTO(b.businessName, c.contractStartTime, b.representationName, r) from OfferEmployment o " + + @Query("select new com.example.api.board.controller.domain.InnerCareerDTO(b.businessName, c.contractStartTime, b.representationName, r) " + + "from OfferEmployment o " + "join Contract c on o.suggestId = c.contractId " + "join Business b on o.business.businessId = b.businessId "+ "join Review r on o.suggestId = r.suggestId " + "where o.employee.employeeId = :employeeId") List findAllDTOByEmployeeId(@Param("employeeId") long employeeId); + + List findAllByBusinessBusinessId(long businessId); + + @Query("select a.name, b.businessName, c.contractStartTime, c.contractEndTime " + + "from OfferEmployment oe " + + "join oe.contract c " + + "join oe.employee e " + + "join e.account a " + + "join oe.business b " + + "where oe.suggestId = :OfferEmploymentId") + List findSuggestByOfferEmploymentId(@Param("OfferEmploymentId")long OfferEmploymentId); } diff --git a/src/main/java/com/example/api/domain/Contract.java b/src/main/java/com/example/api/domain/Contract.java index 2a63f38d..52d776af 100644 --- a/src/main/java/com/example/api/domain/Contract.java +++ b/src/main/java/com/example/api/domain/Contract.java @@ -13,10 +13,11 @@ public class Contract extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name ="CONTRACT_ID") private Long contractId; @OneToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "SUGGEST_ID") + @PrimaryKeyJoinColumn(name = "CONTRACT_ID", referencedColumnName = "SUGGEST_ID") private OfferEmployment offerEmployment; @Column(name = "CONTRACT_START_TIME") diff --git a/src/main/java/com/example/api/domain/OfferEmployment.java b/src/main/java/com/example/api/domain/OfferEmployment.java index dcec29bb..3ea6162e 100644 --- a/src/main/java/com/example/api/domain/OfferEmployment.java +++ b/src/main/java/com/example/api/domain/OfferEmployment.java @@ -49,3 +49,4 @@ public void succeeded() { this.suggestSucceeded = true; } } + diff --git a/src/main/java/com/example/api/suggest/controller/SuggestController.java b/src/main/java/com/example/api/suggest/controller/SuggestController.java index d1ae57fe..24e91df0 100644 --- a/src/main/java/com/example/api/suggest/controller/SuggestController.java +++ b/src/main/java/com/example/api/suggest/controller/SuggestController.java @@ -1,5 +1,6 @@ package com.example.api.suggest.controller; +import com.example.api.suggest.controller.domain.SuggestStatusDTO; import com.example.api.suggest.service.SuggestService; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; @@ -7,14 +8,16 @@ import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; +import java.util.List; + @RestController @RequiredArgsConstructor public class SuggestController { private final SuggestService suggestService; - @GetMapping("/api/v1/employment-suggests/status/{employeeId}") - public ResponseEntity getSuggestStatus(@PathVariable("employeeId") long employeeId) { - suggestService.getSuggestStatus(employeeId); - return ResponseEntity.ok("good"); + @GetMapping("/api/v1/employment-suggests/status/{businessId}") + public ResponseEntity getSuggestStatus(@PathVariable("businessId") long businessId) { + List suggestStatus = suggestService.getSuggestStatus(businessId); + return ResponseEntity.ok(suggestStatus); } } diff --git a/src/main/java/com/example/api/suggest/controller/domain/SuggestStatusDTO.java b/src/main/java/com/example/api/suggest/controller/domain/SuggestStatusDTO.java new file mode 100644 index 00000000..4b8f1d8a --- /dev/null +++ b/src/main/java/com/example/api/suggest/controller/domain/SuggestStatusDTO.java @@ -0,0 +1,17 @@ +package com.example.api.suggest.controller.domain; + +import lombok.*; + + +@Getter +@Setter +@EqualsAndHashCode +@AllArgsConstructor +@NoArgsConstructor +public class SuggestStatusDTO { + private String status; + private String name; + private String businessName; + private String workTime; + // 채팅 방 번호 추가 +} diff --git a/src/main/java/com/example/api/suggest/service/SuggestService.java b/src/main/java/com/example/api/suggest/service/SuggestService.java index 240f6d28..178b3505 100644 --- a/src/main/java/com/example/api/suggest/service/SuggestService.java +++ b/src/main/java/com/example/api/suggest/service/SuggestService.java @@ -1,13 +1,74 @@ package com.example.api.suggest.service; +import com.example.api.board.repository.OfferEmploymentRepository; +import com.example.api.domain.OfferEmployment; +import com.example.api.suggest.controller.domain.SuggestStatusDTO; import jakarta.transaction.Transactional; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; + @Service @Transactional @RequiredArgsConstructor public class SuggestService { - public void getSuggestStatus(long employeeId) { + private final OfferEmploymentRepository offerEmploymentRepository; + private final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.MM.dd"); + + public List getSuggestStatus(long businessId) { + List offerList = offerEmploymentRepository.findAllByBusinessBusinessId(businessId); + List suggestStatusDTOList = new ArrayList<>(); + + String status; + for (OfferEmployment offer : offerList) { + if (offer.isSuggestReaded() == false) { + status = "대기 중"; + } else if (offer.isSuggestReaded() == true && offer.isSuggestSucceeded() == false) { + status = "거절"; + } else if (offer.isSuggestReaded() && offer.isSuggestSucceeded() == true) { + if(offer.getContract().isContractSucceeded() == false) + status = "체결 중"; + else + status = "체결 완료"; + } else { + status = "알 수 없는 상태"; + } + List suggestList = offerEmploymentRepository.findSuggestByOfferEmploymentId(offer.getSuggestId()); + Object[] suggest = suggestList.get(0); + suggestStatusDTOList.add(makeSuggestStatusDTO(suggest, status)); + } + return suggestStatusDTOList; + } + + public SuggestStatusDTO makeSuggestStatusDTO(Object[] suggest, String status) { + String name = (String) suggest[0]; + String businessName = suggest[1].toString(); + LocalDateTime startTime = (LocalDateTime) suggest[2]; + LocalDateTime endTime = (LocalDateTime) suggest[3]; + + String formattedDate = startTime.format(formatter); + + StringBuilder workTime = new StringBuilder(); + workTime.append(formattedDate) + .append(" ") + .append(String.format("%02d", startTime.getHour())) + .append(":") + .append(String.format("%02d", startTime.getMinute())) + .append("~") + .append(String.format("%02d", endTime.getHour())) + .append(":") + .append(String.format("%02d", endTime.getMinute())); + String workTimeStr = workTime.toString(); + + return new SuggestStatusDTO( + status, + name, + businessName, + workTimeStr + ); } -} +} \ No newline at end of file From 05326fc7dfe626c0387186b299008b41881d382f Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 16:38:12 +0900 Subject: [PATCH 103/276] =?UTF-8?q?#1=20=EC=99=B8=EB=B6=80=20=EA=B2=BD?= =?UTF-8?q?=EB=A0=A5=20=EB=8F=84=EB=A9=94=EC=9D=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/api/domain/ExternalCareer.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index b92949e8..78319ded 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -3,7 +3,6 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import jakarta.persistence.*; -import lombok.AllArgsConstructor; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; @@ -39,7 +38,6 @@ public ExternalCareer(Account employee, String name, String period) { } public ExternalCareer() { - } } From dfe928d5d9105e5dd1e1e51094a0bab5247c2cf6 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 14:25:28 +0900 Subject: [PATCH 104/276] =?UTF-8?q?#20=20EMPLOYEE,=20EMPLOYER=20=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EB=B8=94=20=EC=82=AD=EC=A0=9C=20=EB=B0=8F=20ACCOUNT?= =?UTF-8?q?=20=ED=85=8C=EC=9D=B4=EB=B8=94=EB=A1=9C=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/api/domain/ExternalCareer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 78319ded..c5e5b390 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -20,7 +20,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "employee_id") + @JoinColumn(name = "account_id") @JsonIgnore private Account employee; From ca323b8f161489fbfd7994a8908ea3f2074a0aac Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 15:07:39 +0900 Subject: [PATCH 105/276] =?UTF-8?q?#20=20=EB=8D=B0=EC=9D=B4=ED=84=B0?= =?UTF-8?q?=EB=B2=A0=EC=9D=B4=EC=8A=A4=20=EC=86=8D=EC=84=B1=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=EC=9D=84=20employee,=20employer=EC=97=90=20=EB=A7=9E?= =?UTF-8?q?=EA=B2=8C=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/ExternalCareer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index c5e5b390..78319ded 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -20,7 +20,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "account_id") + @JoinColumn(name = "employee_id") @JsonIgnore private Account employee; From 3ae1e3231e0b1ddcc0f35baccf7291302b19d58e Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 17:23:44 +0900 Subject: [PATCH 106/276] =?UTF-8?q?#1=20=EB=8F=84=EB=A9=94=EC=9D=B8=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=20=EC=82=AC=ED=95=AD=EC=97=90=20=EB=94=B0?= =?UTF-8?q?=EB=A5=B8=20=EC=BD=94=EB=93=9C=20=EB=A1=9C=EC=A7=81=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../board/repository/ContractRepository.java | 7 +- .../board/repository/EmployeeRepository.java | 8 +- .../board/repository/EmployerRepository.java | 9 +- .../repository/ExternalCareerRepository.java | 6 +- .../board/repository/FlavoredRepository.java | 4 +- .../board/repository/MyInfoRepository.java | 10 +- .../repository/OfferEmploymentRepository.java | 5 +- .../repository/PossibleBoardRepository.java | 6 +- .../api/board/service/BoardService.java | 4 +- .../api/board/service/EmployeeService.java | 31 ++--- .../java/com/example/api/domain/Account.java | 2 + .../java/com/example/api/domain/Flavored.java | 2 +- .../employer/repository/ScrapRepository.java | 2 +- .../api/employer/service/EmployerService.java | 19 ++- .../example/api/global/DataInitializer.java | 120 ------------------ 15 files changed, 52 insertions(+), 183 deletions(-) delete mode 100644 src/main/java/com/example/api/global/DataInitializer.java diff --git a/src/main/java/com/example/api/board/repository/ContractRepository.java b/src/main/java/com/example/api/board/repository/ContractRepository.java index 044e6a28..6ffd2c96 100644 --- a/src/main/java/com/example/api/board/repository/ContractRepository.java +++ b/src/main/java/com/example/api/board/repository/ContractRepository.java @@ -12,20 +12,19 @@ @Repository public interface ContractRepository extends JpaRepository { @Query("select new com.example.api.contract.controller.domain." + - "BusinessInfoDTO(b.businessName, b.representationName, c.contractStartTime, c.contractEndTime, b.location, a.phoneNumber, c.updatedDate) " + + "BusinessInfoDTO(b.businessName, b.representationName, c.contractStartTime, c.contractEndTime, b.location, e.phoneNumber, c.updatedDate) " + "from Contract c " + "join c.offerEmployment oe " + "join oe.business b " + - "join Account a on a.id = b.employer.employerId " + + "join oe.employee e on e.accountId = b.employer.accountId " + "where c.contractId = :contractId") BusinessInfoDTO findBusinessDTOByContractId(@Param("contractId") long contractId); @Query("select new com.example.api.contract.controller.domain." + - "EmployeeInfoDTO(a.name, a.phoneNumber, e.starPoint, e.workCount) " + + "EmployeeInfoDTO(e.name, e.phoneNumber, e.starPoint, e.workCount) " + "from Contract c " + "join c.offerEmployment oe " + "join oe.employee e " + - "join e.account a " + "where c.contractId = :contractId") EmployeeInfoDTO findEmployeeDTOByContractId(@Param("contractId") long contractId); } diff --git a/src/main/java/com/example/api/board/repository/EmployeeRepository.java b/src/main/java/com/example/api/board/repository/EmployeeRepository.java index 344cff96..cf172595 100644 --- a/src/main/java/com/example/api/board/repository/EmployeeRepository.java +++ b/src/main/java/com/example/api/board/repository/EmployeeRepository.java @@ -1,15 +1,13 @@ package com.example.api.board.repository; -import com.example.api.domain.Employee; +import com.example.api.domain.Account; import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; -import java.util.List; import java.util.Optional; @Repository -public interface EmployeeRepository extends JpaRepository { - Optional findByEmployeeId(@Param("employeeId") Long employeeId); +public interface EmployeeRepository extends JpaRepository { + Optional findByAccountId(@Param("employeeId") Long employeeId); } diff --git a/src/main/java/com/example/api/board/repository/EmployerRepository.java b/src/main/java/com/example/api/board/repository/EmployerRepository.java index 88a36f4a..f23828aa 100644 --- a/src/main/java/com/example/api/board/repository/EmployerRepository.java +++ b/src/main/java/com/example/api/board/repository/EmployerRepository.java @@ -1,14 +1,9 @@ package com.example.api.board.repository; -import com.example.api.domain.Employee; -import com.example.api.domain.Employer; +import com.example.api.domain.Account; import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; -import java.util.List; - @Repository -public interface EmployerRepository extends JpaRepository { +public interface EmployerRepository extends JpaRepository { } diff --git a/src/main/java/com/example/api/board/repository/ExternalCareerRepository.java b/src/main/java/com/example/api/board/repository/ExternalCareerRepository.java index 6ddc3bf3..4f1b03dc 100644 --- a/src/main/java/com/example/api/board/repository/ExternalCareerRepository.java +++ b/src/main/java/com/example/api/board/repository/ExternalCareerRepository.java @@ -12,8 +12,8 @@ @Repository public interface ExternalCareerRepository extends JpaRepository { @Query("select new com.example.api.board.controller.domain.ExternalCareerDTO(e.id, e.Name, e.period) " + - "from ExternalCareer e where e.employee.employeeId = :employeeId") - List findAllDTOByEmployeeEmployeeId(@Param("employeeId") Long employeeId); + "from ExternalCareer e where e.employee.accountId = :employeeId") + List findAllDTOByEmployeeAccountId(@Param("employeeId") Long employeeId); - List findAllByEmployeeEmployeeId(Long employeeId); + List findAllByEmployeeAccountId(@Param("employeeId")Long employeeId); } diff --git a/src/main/java/com/example/api/board/repository/FlavoredRepository.java b/src/main/java/com/example/api/board/repository/FlavoredRepository.java index 186cdf98..1044b2bb 100644 --- a/src/main/java/com/example/api/board/repository/FlavoredRepository.java +++ b/src/main/java/com/example/api/board/repository/FlavoredRepository.java @@ -12,8 +12,8 @@ @Repository public interface FlavoredRepository extends JpaRepository { @Query("select distinct new com.example.api.board.controller.domain.CategoryDTO(c.categoryId, c.categoryName) " + - "from Flavored f join Category c on f.category.categoryId = c.categoryId where f.employee.employeeId = :employeeId") + "from Flavored f join Category c on f.category.categoryId = c.categoryId where f.employee.accountId = :employeeId") List findAllCategoryDTOByEmployeeId(@Param("employeeId") long employeeId); - List findAllByEmployeeEmployeeId(@Param("employeeId")Long employeeId); + List findAllByEmployeeAccountId(@Param("employeeId")Long employeeId); } diff --git a/src/main/java/com/example/api/board/repository/MyInfoRepository.java b/src/main/java/com/example/api/board/repository/MyInfoRepository.java index 3cfaf8c1..c13abb94 100644 --- a/src/main/java/com/example/api/board/repository/MyInfoRepository.java +++ b/src/main/java/com/example/api/board/repository/MyInfoRepository.java @@ -1,17 +1,17 @@ package com.example.api.board.repository; import com.example.api.board.controller.domain.MyInfoDTO; -import com.example.api.domain.Employee; +import com.example.api.domain.Account; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; @Repository -public interface MyInfoRepository extends JpaRepository { +public interface MyInfoRepository extends JpaRepository { @Query("select new com.example.api.board.controller.domain." + - "MyInfoDTO(e.account.name, e.nickname, a.age, a.sex, a.email, a.phoneNumber, e.starPoint, e.workCount) " + - "from Employee e join e.account a on e.employeeId = a.id " + - "where e.employeeId = :EmployeeId") + "MyInfoDTO(a.name, a.nickname, a.age, a.sex, a.email, a.phoneNumber, a.starPoint, a.workCount) " + + "from Account a " + + "where a.accountId = :EmployeeId") MyInfoDTO findMyInfoDTOById(@Param("EmployeeId") Long EmployeeId); } diff --git a/src/main/java/com/example/api/board/repository/OfferEmploymentRepository.java b/src/main/java/com/example/api/board/repository/OfferEmploymentRepository.java index bbc71dc9..6b160c2b 100644 --- a/src/main/java/com/example/api/board/repository/OfferEmploymentRepository.java +++ b/src/main/java/com/example/api/board/repository/OfferEmploymentRepository.java @@ -16,16 +16,15 @@ public interface OfferEmploymentRepository extends JpaRepository findAllDTOByEmployeeId(@Param("employeeId") long employeeId); List findAllByBusinessBusinessId(long businessId); - @Query("select a.name, b.businessName, c.contractStartTime, c.contractEndTime " + + @Query("select e.name, b.businessName, c.contractStartTime, c.contractEndTime " + "from OfferEmployment oe " + "join oe.contract c " + "join oe.employee e " + - "join e.account a " + "join oe.business b " + "where oe.suggestId = :OfferEmploymentId") List findSuggestByOfferEmploymentId(@Param("OfferEmploymentId")long OfferEmploymentId); diff --git a/src/main/java/com/example/api/board/repository/PossibleBoardRepository.java b/src/main/java/com/example/api/board/repository/PossibleBoardRepository.java index 504b136b..a1d09639 100644 --- a/src/main/java/com/example/api/board/repository/PossibleBoardRepository.java +++ b/src/main/java/com/example/api/board/repository/PossibleBoardRepository.java @@ -11,9 +11,9 @@ @Repository public interface PossibleBoardRepository extends JpaRepository { - List findAllByEmployeeEmployeeId(Long employeeId); + List findAllByEmployeeAccountId(Long employeeId); @Query("select new com.example.api.board.controller.domain.PossibleBoardDTO(p.possibleId, p.startTime, p.endTime) " + - "from PossibleBoard p where p.employee.employeeId = :employeeId") - List findAllDTOByEmployeeEmployeeId(@Param("employeeId")Long employeeId); + "from PossibleBoard p where p.employee.accountId = :employeeId") + List findAllDTOByEmployeeAccountId(@Param("employeeId")Long employeeId); } diff --git a/src/main/java/com/example/api/board/service/BoardService.java b/src/main/java/com/example/api/board/service/BoardService.java index 087c6f55..5d2f8c2a 100644 --- a/src/main/java/com/example/api/board/service/BoardService.java +++ b/src/main/java/com/example/api/board/service/BoardService.java @@ -21,8 +21,8 @@ public class BoardService { public MyInfoDTO findMyInfoById(long employeeId) { MyInfoDTO myInfoDTOById = myInfoRepository.findMyInfoDTOById(employeeId); myInfoDTOById.setInnerCarrerList(offerEmploymentRepository.findAllDTOByEmployeeId(employeeId)); - myInfoDTOById.setExternalCareerList(externalCareerRepository.findAllDTOByEmployeeEmployeeId(employeeId)); - myInfoDTOById.setPossibleBoardList(possibleBoardRepository.findAllDTOByEmployeeEmployeeId(employeeId)); + myInfoDTOById.setExternalCareerList(externalCareerRepository.findAllDTOByEmployeeAccountId(employeeId)); + myInfoDTOById.setPossibleBoardList(possibleBoardRepository.findAllDTOByEmployeeAccountId(employeeId)); myInfoDTOById.setFlavoredCategoryList(flavoredRepository.findAllCategoryDTOByEmployeeId(employeeId)); return myInfoDTOById; diff --git a/src/main/java/com/example/api/board/service/EmployeeService.java b/src/main/java/com/example/api/board/service/EmployeeService.java index e74b80c2..4b5e1234 100644 --- a/src/main/java/com/example/api/board/service/EmployeeService.java +++ b/src/main/java/com/example/api/board/service/EmployeeService.java @@ -20,17 +20,16 @@ public class EmployeeService { private final ExternalCareerRepository externalCareerRepository; private final FlavoredRepository flavoredRepository; private final PossibleBoardRepository possibleBoardRepository; - private final CategoryRepository categoryRepository; public Boolean changeOpenStatus(Long employeeId, boolean openStatus) { - return employeeRepository.findByEmployeeId(employeeId).map(employee -> { + return employeeRepository.findByAccountId(employeeId).map(employee -> { employee.setOpenStatus(openStatus); employeeRepository.save(employee); return true; }).orElse(false); } public boolean updateUserInfo(Long employeeId, MyInfoDTO myInfo) { - return employeeRepository.findByEmployeeId(employeeId).map(employee -> { + return employeeRepository.findByAccountId(employeeId).map(employee -> { setUserInfo(employee, myInfo); employeeRepository.save(employee); @@ -40,18 +39,16 @@ public boolean updateUserInfo(Long employeeId, MyInfoDTO myInfo) { return true; }).orElse(false); } - void setUserInfo(Employee employee, MyInfoDTO myInfo) { - Account account = employee.getAccount(); - - account.setName(myInfo.getName()); - account.setSex(myInfo.getSex()); - account.setAge(myInfo.getAge()); - account.setPhoneNumber(myInfo.getPhone()); - account.setEmail(myInfo.getEmail()); + void setUserInfo(Account employee, MyInfoDTO myInfo) { + employee.setName(myInfo.getName()); + employee.setSex(myInfo.getSex()); + employee.setAge(myInfo.getAge()); + employee.setPhoneNumber(myInfo.getPhone()); + employee.setEmail(myInfo.getEmail()); employee.setNickname(myInfo.getNickname()); } - public void updateExternalCareer(Employee employee, List newExternalCareerList) { - List existList = externalCareerRepository.findAllByEmployeeEmployeeId(employee.getEmployeeId()); + public void updateExternalCareer(Account employee, List newExternalCareerList) { + List existList = externalCareerRepository.findAllByEmployeeAccountId(employee.getAccountId()); Set newSet = new HashSet<>(newExternalCareerList); Set toDelete = existList.stream() @@ -68,8 +65,8 @@ public void updateExternalCareer(Employee employee, List newE externalCareerRepository.deleteAll(toDelete); externalCareerRepository.saveAll(toAdd); } - public void updateFlavored(Employee employee, List newCategoryList) { - List existFlavored = flavoredRepository.findAllByEmployeeEmployeeId(employee.getEmployeeId()); + public void updateFlavored(Account employee, List newCategoryList) { + List existFlavored = flavoredRepository.findAllByEmployeeAccountId(employee.getAccountId()); Set newCategoryIds = newCategoryList.stream() .map(CategoryDTO::getCategoryId) @@ -88,8 +85,8 @@ public void updateFlavored(Employee employee, List newCategoryList) flavoredRepository.deleteAll(toDelete); flavoredRepository.saveAll(toAdd); } - public void updatePossibleBoard(Employee employee, List newPossibleBoard) { - List existPossibleBoard = possibleBoardRepository.findAllByEmployeeEmployeeId(employee.getEmployeeId()); + public void updatePossibleBoard(Account employee, List newPossibleBoard) { + List existPossibleBoard = possibleBoardRepository.findAllByEmployeeAccountId(employee.getAccountId()); Set newSet = new HashSet<>(newPossibleBoard); Set toDelete = existPossibleBoard.stream() diff --git a/src/main/java/com/example/api/domain/Account.java b/src/main/java/com/example/api/domain/Account.java index 5d4369ba..8451291e 100644 --- a/src/main/java/com/example/api/domain/Account.java +++ b/src/main/java/com/example/api/domain/Account.java @@ -40,6 +40,8 @@ public class Account extends BaseEntity { private float starPoint; @Column(name = "ACCOUNT_WORK_COUNT") private int workCount; + @Column(name = "ACCOUNT_OPEN_STATUS") + private boolean openStatus; @Column(name = "ACCOUNT_DELETED", columnDefinition = "BOOLEAN DEFAULT false") private boolean deleted = false; } \ No newline at end of file diff --git a/src/main/java/com/example/api/domain/Flavored.java b/src/main/java/com/example/api/domain/Flavored.java index 7d2468c7..c10e721b 100644 --- a/src/main/java/com/example/api/domain/Flavored.java +++ b/src/main/java/com/example/api/domain/Flavored.java @@ -31,7 +31,7 @@ public class Flavored extends BaseEntity{ public Flavored() { } - public Flavored(Category category, Employee employee) { + public Flavored(Category category, Account employee) { this.category = category; this.employee = employee; } diff --git a/src/main/java/com/example/api/employer/repository/ScrapRepository.java b/src/main/java/com/example/api/employer/repository/ScrapRepository.java index 1c9a2ddb..ad0bc503 100644 --- a/src/main/java/com/example/api/employer/repository/ScrapRepository.java +++ b/src/main/java/com/example/api/employer/repository/ScrapRepository.java @@ -10,6 +10,6 @@ @Repository public interface ScrapRepository extends JpaRepository { - @Query("select s from Scrap s where s.employer.employerId = :employerId") + @Query("select s from Scrap s where s.employer.accountId = :employerId") List findAllByEmployerId(@Param("employerId") long employerId); } diff --git a/src/main/java/com/example/api/employer/service/EmployerService.java b/src/main/java/com/example/api/employer/service/EmployerService.java index e75445b0..412debb6 100644 --- a/src/main/java/com/example/api/employer/service/EmployerService.java +++ b/src/main/java/com/example/api/employer/service/EmployerService.java @@ -3,8 +3,7 @@ import com.example.api.board.repository.EmployeeRepository; import com.example.api.board.repository.ExternalCareerRepository; import com.example.api.board.repository.FlavoredRepository; -import com.example.api.domain.Employee; -import com.example.api.domain.Scrap; +import com.example.api.domain.Account; import com.example.api.employer.controller.domain.LikeEmployeeDTO; import com.example.api.employer.repository.ScrapRepository; import lombok.RequiredArgsConstructor; @@ -25,20 +24,20 @@ public class EmployerService { public List getLikeEmployee(Long employerId) { Set employeeIds = scrapRepository.findAllByEmployerId(employerId).stream() - .map(scrap -> scrap.getEmployee().getEmployeeId()) + .map(scrap -> scrap.getEmployee().getAccountId()) .collect(Collectors.toSet()); - List likeEmployeeList = employeeRepository.findAllById(employeeIds); + List likeEmployeeList = employeeRepository.findAllById(employeeIds); return likeEmployeeList.stream().map( employee -> new LikeEmployeeDTO( - employee.getEmployeeId(), - employee.getAccount().getName(), + employee.getAccountId(), + employee.getName(), employee.getNickname(), - employee.getAccount().getSex(), - employee.getAccount().getAge(), + employee.getSex(), + employee.getAge(), employee.getStarPoint(), employee.getWorkCount(), - externalCareerRepository.findAllDTOByEmployeeEmployeeId(employee.getEmployeeId()), - flavoredRepository.findAllCategoryDTOByEmployeeId(employee.getEmployeeId()) + externalCareerRepository.findAllDTOByEmployeeAccountId(employee.getAccountId()), + flavoredRepository.findAllCategoryDTOByEmployeeId(employee.getAccountId()) ) ).collect(Collectors.toList()); } diff --git a/src/main/java/com/example/api/global/DataInitializer.java b/src/main/java/com/example/api/global/DataInitializer.java deleted file mode 100644 index ae7e93b9..00000000 --- a/src/main/java/com/example/api/global/DataInitializer.java +++ /dev/null @@ -1,120 +0,0 @@ -package com.example.api.global; - -import com.example.api.board.repository.*; -import com.example.api.domain.*; -import com.example.api.employer.repository.ScrapRepository; -import jakarta.annotation.PostConstruct; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.util.List; - -@Component -public class DataInitializer { - @Autowired private BusinessRepository businessRepository; - @Autowired private CategoryRepository categoryRepository; - @Autowired private BusinessCategoryRepository businessCategoryRepository; - @Autowired private FlavoredRepository flavoredRepository; - @Autowired private ContractRepository contractRepository; - @Autowired private EmployeeRepository employeeRepository; - @Autowired private EmployerRepository employerRepository; - @Autowired private MyInfoRepository myInfoRepository; - @Autowired private OfferEmploymentRepository offerEmploymentRepository; - @Autowired private PossibleBoardRepository possibleBoardRepository; - @Autowired private ReviewRepository reviewRepository; - @Autowired private ExternalCareerRepository externalCareerRepository; - @Autowired private ScrapRepository scrapRepository; - - @PostConstruct - void setUpData() { - Account account = new Account(); - account.setAge(30); - account.setEmail("johndoe@example.com"); - account.setName("John Doe"); - account.setSex("Male"); - account.setPhoneNumber("123-456-7890"); - - Employee employee = new Employee(); - employee.setAccount(account); - employee.setNickname("Johnny"); - employee.setStarPoint(3.5f); - employee.setWorkCount(3); - employeeRepository.save(employee); - - Employer employer = new Employer(); - employer.setNickname("EmployerOne"); - employerRepository.save(employer); - - - Category category1 = new Category(); - category1.setCategoryName("IT Services"); - categoryRepository.save(category1); - - Category category2 = new Category(); - category2.setCategoryName("Consulting"); - categoryRepository.save(category2); - - Business business = new Business(); - business.setBusinessName("Tech Solutions Inc."); - business.setLocation("Seoul, South Korea"); - business.setRepresentationName("James"); - business.setOpenDate(LocalDate.now()); - business.setRegistrationNumber("123-456-789"); - business.setEmployer(employer); - businessRepository.save(business); - - BusinessCategory businessCategory1 = new BusinessCategory(); - businessCategory1.setBusiness(business); - businessCategory1.setCategory(category1); - - BusinessCategory businessCategory2 = new BusinessCategory(); - businessCategory2.setBusiness(business); - businessCategory2.setCategory(category2); - - business.setBusinessCategories(List.of(businessCategory1, businessCategory2)); - businessCategoryRepository.save(businessCategory1); - businessCategoryRepository.save(businessCategory2); - - OfferEmployment offerEmployment = new OfferEmployment(); - offerEmployment.setBusiness(business); - offerEmployment.setEmployee(employee); - offerEmployment.setSuggestStartTime(LocalDateTime.of(2024, 11, 5, 9, 0)); - offerEmployment.setSuggestEndTime(LocalDateTime.of(2024, 11, 5, 17, 0)); - offerEmployment.setSuggestHourlyPay(20000); - offerEmployment.setSuggestSucceeded(false); - offerEmploymentRepository.save(offerEmployment); - - Contract contract = new Contract(); - contract.setOfferEmployment(offerEmployment); // 일대일 관계 설정 - contract.setContractStartTime(LocalDateTime.of(2024, 11, 10, 9, 0)); - contract.setContractEndTime(LocalDateTime.of(2024, 11, 10, 18, 0)); - contract.setContractHourlyPay(22000); - contract.setContractSucceeded(true); - contractRepository.save(contract); - - ExternalCareer externalCareer1 = new ExternalCareer(employee, "Consultant", "24-10-01"); - ExternalCareer externalCareer2 = new ExternalCareer(employee, "Architect", "24-10-08"); - externalCareerRepository.save(externalCareer1); - externalCareerRepository.save(externalCareer2); - - Review review1 = new Review(1L, 4, "Good work experience"); - reviewRepository.save(review1); - - PossibleBoard possibleBoard1 = new PossibleBoard(employee, LocalDateTime.of(2024, 11, 5, 12, 0), LocalDateTime.of(2024, 11, 5, 18, 0)); - PossibleBoard possibleBoard2 = new PossibleBoard(employee, LocalDateTime.of(2024, 11, 6, 12, 0), LocalDateTime.of(2024, 11, 6, 18, 0)); - possibleBoardRepository.save(possibleBoard1); - possibleBoardRepository.save(possibleBoard2); - - Flavored flavored = new Flavored(); - flavored.setCategory(categoryRepository.findById(1L).get()); - flavored.setEmployee(employeeRepository.findById(1L).get()); - flavoredRepository.save(flavored); - - Scrap scrap = new Scrap(); - scrap.setEmployee(employee); - scrap.setEmployer(employer); - scrapRepository.save(scrap); - } -} \ No newline at end of file From 1e9acd4125506f77208f5e57cf0a8c2f001c9572 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 17:48:12 +0900 Subject: [PATCH 107/276] =?UTF-8?q?#1=20=EB=8F=84=EB=A9=94=EC=9D=B8=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=20=EC=82=AC=ED=95=AD=20=EC=88=98=EC=A0=95?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EC=9D=B8=ED=95=9C=20test=20code=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/global/BaseIntegrationTest.java | 25 ++++++++----------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/src/test/java/com/example/api/global/BaseIntegrationTest.java b/src/test/java/com/example/api/global/BaseIntegrationTest.java index a93e8908..8c0fc136 100644 --- a/src/test/java/com/example/api/global/BaseIntegrationTest.java +++ b/src/test/java/com/example/api/global/BaseIntegrationTest.java @@ -56,21 +56,18 @@ public class BaseIntegrationTest { @BeforeEach void setUpData() { - Account account = new Account(); - account.setAge(30); - account.setEmail("johndoe@example.com"); - account.setName("John Doe"); - account.setSex("Male"); - account.setPhoneNumber("123-456-7890"); - - Employee employee = new Employee(); - employee.setAccount(account); + Account employee = new Account(); + employee.setAge(30); + employee.setEmail("johndoe@example.com"); + employee.setName("John Doe"); + employee.setSex("Male"); + employee.setPhoneNumber("123-456-7890"); employee.setNickname("Johnny"); employee.setStarPoint(3.5f); employee.setWorkCount(3); employeeRepository.save(employee); - Employer employer = new Employer(); + Account employer = new Account(); employer.setNickname("EmployerOne"); employerRepository.save(employer); @@ -124,8 +121,8 @@ void setUpData() { externalCareerRepository.save(externalCareer2); externalCareerList = new ArrayList<>(); - externalCareerList.add(new ExternalCareerDTO(externalCareer1.getName(), externalCareer1.getPeriod())); - externalCareerList.add(new ExternalCareerDTO(externalCareer2.getName(), externalCareer2.getPeriod())); + externalCareerList.add(new ExternalCareerDTO(employee.getAccountId(), externalCareer1.getName(), externalCareer1.getPeriod())); + externalCareerList.add(new ExternalCareerDTO(employee.getAccountId(), externalCareer2.getName(), externalCareer2.getPeriod())); Review review1 = new Review(1L, 4, "Good work experience"); reviewRepository.save(review1); @@ -139,8 +136,8 @@ void setUpData() { possibleBoardRepository.save(possibleBoard2); possibleBoardList = new ArrayList<>(); - possibleBoardList.add(new PossibleBoardDTO(possibleBoard1.getStartTime(), possibleBoard1.getEndTime())); - possibleBoardList.add(new PossibleBoardDTO(possibleBoard2.getStartTime(), possibleBoard2.getEndTime())); + possibleBoardList.add(new PossibleBoardDTO(employee.getAccountId(), possibleBoard1.getStartTime(), possibleBoard1.getEndTime())); + possibleBoardList.add(new PossibleBoardDTO(employee.getAccountId(), possibleBoard2.getStartTime(), possibleBoard2.getEndTime())); // Flavored flavored = new Flavored(); // flavored.setCategory(categoryRepository.findById(1L).get()); From a860bf8c8d7abf4a09b057f39851ef408ad3e10b Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 19:11:35 +0900 Subject: [PATCH 108/276] =?UTF-8?q?#1=20=EC=A4=91=EB=B3=B5=20contract=20?= =?UTF-8?q?=EB=94=94=EB=A0=89=ED=86=A0=EB=A6=AC=20=ED=95=98=EB=82=98?= =?UTF-8?q?=EB=A1=9C=20=ED=86=B5=EC=9D=BC,=20=EA=B8=B0=EB=B3=B8=20?= =?UTF-8?q?=EB=8F=84=EB=A9=94=EC=9D=B8=20repository=EB=93=A4=20domain=20?= =?UTF-8?q?=ED=95=98=EC=9C=84=20repository=EB=A1=9C=20=ED=8C=8C=EC=9D=BC?= =?UTF-8?q?=20=EC=9C=84=EC=B9=98=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/board/service/BoardService.java | 2 +- .../api/board/service/CategoryService.java | 3 +-- .../api/board/service/EmployeeService.java | 5 ++++- .../controller/ContractController.java | 21 ------------------ .../api/contract/service/ContractService.java | 22 ------------------- .../api/contracts/ContractRepository.java | 20 +++++++++++++++++ .../api/contracts/ContractService.java | 12 +++++----- .../controller/ContractController.java | 7 ++++++ .../dto}/BusinessInfoDTO.java | 2 +- .../domain => contracts/dto}/ContractDTO.java | 4 +--- .../dto}/EmployeeInfoDTO.java | 2 +- .../BusinessCategoryRepository.java | 2 +- .../repository/BusinessRepository.java | 2 +- .../repository/CategoryRepository.java | 2 +- .../repository/ContractRepository.java | 7 +++--- .../repository/EmployeeRepository.java | 2 +- .../repository/EmployerRepository.java | 2 +- .../repository/ExternalCareerRepository.java | 2 +- .../repository/FlavoredRepository.java | 2 +- .../repository/MyInfoRepository.java | 2 +- .../repository/OfferEmploymentRepository.java | 2 +- .../repository/PossibleBoardRepository.java | 2 +- .../repository/ReviewRepository.java | 2 +- .../api/employer/service/EmployerService.java | 6 ++--- .../api/suggest/service/SuggestService.java | 2 +- .../api/global/BaseIntegrationTest.java | 3 +-- 26 files changed, 62 insertions(+), 78 deletions(-) delete mode 100644 src/main/java/com/example/api/contract/controller/ContractController.java delete mode 100644 src/main/java/com/example/api/contract/service/ContractService.java rename src/main/java/com/example/api/{contract/controller/domain => contracts/dto}/BusinessInfoDTO.java (88%) rename src/main/java/com/example/api/{contract/controller/domain => contracts/dto}/ContractDTO.java (70%) rename src/main/java/com/example/api/{contract/controller/domain => contracts/dto}/EmployeeInfoDTO.java (82%) rename src/main/java/com/example/api/{board => domain}/repository/BusinessCategoryRepository.java (86%) rename src/main/java/com/example/api/{board => domain}/repository/BusinessRepository.java (85%) rename src/main/java/com/example/api/{board => domain}/repository/CategoryRepository.java (85%) rename src/main/java/com/example/api/{board => domain}/repository/ContractRepository.java (84%) rename src/main/java/com/example/api/{board => domain}/repository/EmployeeRepository.java (90%) rename src/main/java/com/example/api/{board => domain}/repository/EmployerRepository.java (84%) rename src/main/java/com/example/api/{board => domain}/repository/ExternalCareerRepository.java (95%) rename src/main/java/com/example/api/{board => domain}/repository/FlavoredRepository.java (95%) rename src/main/java/com/example/api/{board => domain}/repository/MyInfoRepository.java (94%) rename src/main/java/com/example/api/{board => domain}/repository/OfferEmploymentRepository.java (97%) rename src/main/java/com/example/api/{board => domain}/repository/PossibleBoardRepository.java (95%) rename src/main/java/com/example/api/{board => domain}/repository/ReviewRepository.java (84%) diff --git a/src/main/java/com/example/api/board/service/BoardService.java b/src/main/java/com/example/api/board/service/BoardService.java index 5d2f8c2a..30cde321 100644 --- a/src/main/java/com/example/api/board/service/BoardService.java +++ b/src/main/java/com/example/api/board/service/BoardService.java @@ -2,7 +2,7 @@ import com.example.api.board.controller.domain.MyInfoDTO; -import com.example.api.board.repository.*; +import com.example.api.domain.repository.*; import jakarta.transaction.Transactional; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; diff --git a/src/main/java/com/example/api/board/service/CategoryService.java b/src/main/java/com/example/api/board/service/CategoryService.java index 8fdd37f4..4c6193ec 100644 --- a/src/main/java/com/example/api/board/service/CategoryService.java +++ b/src/main/java/com/example/api/board/service/CategoryService.java @@ -1,11 +1,10 @@ package com.example.api.board.service; import com.example.api.board.controller.domain.CategoryDTO; -import com.example.api.board.repository.CategoryRepository; +import com.example.api.domain.repository.CategoryRepository; import com.example.api.domain.Category; import jakarta.transaction.Transactional; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; diff --git a/src/main/java/com/example/api/board/service/EmployeeService.java b/src/main/java/com/example/api/board/service/EmployeeService.java index 4b5e1234..4f15faf1 100644 --- a/src/main/java/com/example/api/board/service/EmployeeService.java +++ b/src/main/java/com/example/api/board/service/EmployeeService.java @@ -1,8 +1,11 @@ package com.example.api.board.service; import com.example.api.board.controller.domain.*; -import com.example.api.board.repository.*; import com.example.api.domain.*; +import com.example.api.domain.repository.EmployeeRepository; +import com.example.api.domain.repository.ExternalCareerRepository; +import com.example.api.domain.repository.FlavoredRepository; +import com.example.api.domain.repository.PossibleBoardRepository; import jakarta.transaction.Transactional; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; diff --git a/src/main/java/com/example/api/contract/controller/ContractController.java b/src/main/java/com/example/api/contract/controller/ContractController.java deleted file mode 100644 index d6446280..00000000 --- a/src/main/java/com/example/api/contract/controller/ContractController.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.example.api.contract.controller; - -import com.example.api.contract.controller.domain.ContractDTO; -import com.example.api.contract.service.ContractService; -import lombok.RequiredArgsConstructor; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RestController; - -@RestController -@RequiredArgsConstructor -public class ContractController { - private final ContractService contractService; - - @GetMapping("/api/v1/contract/{contractId}/status") - public ResponseEntity getContractInfo(@PathVariable("contractId") long contractId) { - ContractDTO contractDTO = contractService.getContractInfo(contractId); - return ResponseEntity.ok(contractDTO); - } -} diff --git a/src/main/java/com/example/api/contract/service/ContractService.java b/src/main/java/com/example/api/contract/service/ContractService.java deleted file mode 100644 index 1dd167c4..00000000 --- a/src/main/java/com/example/api/contract/service/ContractService.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.example.api.contract.service; - -import com.example.api.board.repository.ContractRepository; -import com.example.api.contract.controller.domain.BusinessInfoDTO; -import com.example.api.contract.controller.domain.ContractDTO; -import com.example.api.contract.controller.domain.EmployeeInfoDTO; -import jakarta.transaction.Transactional; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; - -@Service -@Transactional -@RequiredArgsConstructor -public class ContractService { - private final ContractRepository contractRepository; - - public ContractDTO getContractInfo(long contractId) { - BusinessInfoDTO businessDTO = contractRepository.findBusinessDTOByContractId(contractId); - EmployeeInfoDTO employeeDTO = contractRepository.findEmployeeDTOByContractId(contractId); - return new ContractDTO(businessDTO, employeeDTO); - } -} diff --git a/src/main/java/com/example/api/contracts/ContractRepository.java b/src/main/java/com/example/api/contracts/ContractRepository.java index cc42c543..be394ffd 100644 --- a/src/main/java/com/example/api/contracts/ContractRepository.java +++ b/src/main/java/com/example/api/contracts/ContractRepository.java @@ -1,7 +1,27 @@ package com.example.api.contracts; +import com.example.api.contracts.dto.BusinessInfoDTO; +import com.example.api.contracts.dto.EmployeeInfoDTO; import com.example.api.domain.Contract; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; interface ContractRepository extends JpaRepository { + @Query("select new com.example.api.contracts.dto." + + "BusinessInfoDTO(b.businessName, b.representationName, c.contractStartTime, c.contractEndTime, b.location, e.phoneNumber, c.updatedDate) " + + "from Contract c " + + "join c.offerEmployment oe " + + "join oe.business b " + + "join oe.employee e on e.accountId = b.employer.accountId " + + "where c.contractId = :contractId") + BusinessInfoDTO findBusinessDTOByContractId(@Param("contractId") long contractId); + + @Query("select new com.example.api.contracts.dto." + + "EmployeeInfoDTO(e.name, e.phoneNumber, e.starPoint, e.workCount) " + + "from Contract c " + + "join c.offerEmployment oe " + + "join oe.employee e " + + "where c.contractId = :contractId") + EmployeeInfoDTO findEmployeeDTOByContractId(@Param("contractId") long contractId); } diff --git a/src/main/java/com/example/api/contracts/ContractService.java b/src/main/java/com/example/api/contracts/ContractService.java index 44aacf57..b8520d7b 100644 --- a/src/main/java/com/example/api/contracts/ContractService.java +++ b/src/main/java/com/example/api/contracts/ContractService.java @@ -1,10 +1,6 @@ package com.example.api.contracts; -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 com.example.api.contracts.dto.SuggestedBusinessResponse; +import com.example.api.contracts.dto.*; import com.example.api.contracts.update.UpdateContractConditionManager; import com.example.api.domain.Contract; import com.example.api.domain.OfferEmployment; @@ -57,4 +53,10 @@ private OfferEmployment loadOffer(final Long offerId) { return offerRepository.findById(offerId) .orElseThrow(); } + + public ContractDTO getContractInfo(long contractId) { + BusinessInfoDTO businessDTO = contractRepository.findBusinessDTOByContractId(contractId); + EmployeeInfoDTO employeeDTO = contractRepository.findEmployeeDTOByContractId(contractId); + return new ContractDTO(businessDTO, employeeDTO); + } } 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 bf87451e..1d5fec69 100644 --- a/src/main/java/com/example/api/contracts/controller/ContractController.java +++ b/src/main/java/com/example/api/contracts/controller/ContractController.java @@ -1,5 +1,6 @@ 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; @@ -60,4 +61,10 @@ public ResponseEntity acceptContract( contractService.acceptContract(acceptContractCommand); return ResponseEntity.ok(null); } + + @GetMapping("/api/v1/contract/{contractId}/status") + public ResponseEntity getContractInfo(@PathVariable("contractId") long contractId) { + ContractDTO contractDTO = contractService.getContractInfo(contractId); + return ResponseEntity.ok(contractDTO); + } } diff --git a/src/main/java/com/example/api/contract/controller/domain/BusinessInfoDTO.java b/src/main/java/com/example/api/contracts/dto/BusinessInfoDTO.java similarity index 88% rename from src/main/java/com/example/api/contract/controller/domain/BusinessInfoDTO.java rename to src/main/java/com/example/api/contracts/dto/BusinessInfoDTO.java index 2c166909..96c46da4 100644 --- a/src/main/java/com/example/api/contract/controller/domain/BusinessInfoDTO.java +++ b/src/main/java/com/example/api/contracts/dto/BusinessInfoDTO.java @@ -1,4 +1,4 @@ -package com.example.api.contract.controller.domain; +package com.example.api.contracts.dto; import lombok.*; diff --git a/src/main/java/com/example/api/contract/controller/domain/ContractDTO.java b/src/main/java/com/example/api/contracts/dto/ContractDTO.java similarity index 70% rename from src/main/java/com/example/api/contract/controller/domain/ContractDTO.java rename to src/main/java/com/example/api/contracts/dto/ContractDTO.java index fcb282f9..a72fa9a7 100644 --- a/src/main/java/com/example/api/contract/controller/domain/ContractDTO.java +++ b/src/main/java/com/example/api/contracts/dto/ContractDTO.java @@ -1,9 +1,7 @@ -package com.example.api.contract.controller.domain; +package com.example.api.contracts.dto; import lombok.*; -import java.time.LocalDateTime; - @EqualsAndHashCode @Getter @Setter diff --git a/src/main/java/com/example/api/contract/controller/domain/EmployeeInfoDTO.java b/src/main/java/com/example/api/contracts/dto/EmployeeInfoDTO.java similarity index 82% rename from src/main/java/com/example/api/contract/controller/domain/EmployeeInfoDTO.java rename to src/main/java/com/example/api/contracts/dto/EmployeeInfoDTO.java index a4988809..dc59675c 100644 --- a/src/main/java/com/example/api/contract/controller/domain/EmployeeInfoDTO.java +++ b/src/main/java/com/example/api/contracts/dto/EmployeeInfoDTO.java @@ -1,4 +1,4 @@ -package com.example.api.contract.controller.domain; +package com.example.api.contracts.dto; import lombok.*; diff --git a/src/main/java/com/example/api/board/repository/BusinessCategoryRepository.java b/src/main/java/com/example/api/domain/repository/BusinessCategoryRepository.java similarity index 86% rename from src/main/java/com/example/api/board/repository/BusinessCategoryRepository.java rename to src/main/java/com/example/api/domain/repository/BusinessCategoryRepository.java index 7b03163c..51cf31d8 100644 --- a/src/main/java/com/example/api/board/repository/BusinessCategoryRepository.java +++ b/src/main/java/com/example/api/domain/repository/BusinessCategoryRepository.java @@ -1,4 +1,4 @@ -package com.example.api.board.repository; +package com.example.api.domain.repository; import com.example.api.domain.BusinessCategory; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/src/main/java/com/example/api/board/repository/BusinessRepository.java b/src/main/java/com/example/api/domain/repository/BusinessRepository.java similarity index 85% rename from src/main/java/com/example/api/board/repository/BusinessRepository.java rename to src/main/java/com/example/api/domain/repository/BusinessRepository.java index 2eef619a..e5258856 100644 --- a/src/main/java/com/example/api/board/repository/BusinessRepository.java +++ b/src/main/java/com/example/api/domain/repository/BusinessRepository.java @@ -1,4 +1,4 @@ -package com.example.api.board.repository; +package com.example.api.domain.repository; import com.example.api.domain.Business; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/src/main/java/com/example/api/board/repository/CategoryRepository.java b/src/main/java/com/example/api/domain/repository/CategoryRepository.java similarity index 85% rename from src/main/java/com/example/api/board/repository/CategoryRepository.java rename to src/main/java/com/example/api/domain/repository/CategoryRepository.java index ad44c56f..128775ff 100644 --- a/src/main/java/com/example/api/board/repository/CategoryRepository.java +++ b/src/main/java/com/example/api/domain/repository/CategoryRepository.java @@ -1,4 +1,4 @@ -package com.example.api.board.repository; +package com.example.api.domain.repository; import com.example.api.domain.Category; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/src/main/java/com/example/api/board/repository/ContractRepository.java b/src/main/java/com/example/api/domain/repository/ContractRepository.java similarity index 84% rename from src/main/java/com/example/api/board/repository/ContractRepository.java rename to src/main/java/com/example/api/domain/repository/ContractRepository.java index 6ffd2c96..dcee4970 100644 --- a/src/main/java/com/example/api/board/repository/ContractRepository.java +++ b/src/main/java/com/example/api/domain/repository/ContractRepository.java @@ -1,8 +1,7 @@ -package com.example.api.board.repository; +package com.example.api.domain.repository; -import com.example.api.contract.controller.domain.BusinessInfoDTO; -import com.example.api.contract.controller.domain.ContractDTO; -import com.example.api.contract.controller.domain.EmployeeInfoDTO; +import com.example.api.contracts.dto.BusinessInfoDTO; +import com.example.api.contracts.dto.EmployeeInfoDTO; import com.example.api.domain.Contract; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; diff --git a/src/main/java/com/example/api/board/repository/EmployeeRepository.java b/src/main/java/com/example/api/domain/repository/EmployeeRepository.java similarity index 90% rename from src/main/java/com/example/api/board/repository/EmployeeRepository.java rename to src/main/java/com/example/api/domain/repository/EmployeeRepository.java index cf172595..f8639357 100644 --- a/src/main/java/com/example/api/board/repository/EmployeeRepository.java +++ b/src/main/java/com/example/api/domain/repository/EmployeeRepository.java @@ -1,4 +1,4 @@ -package com.example.api.board.repository; +package com.example.api.domain.repository; import com.example.api.domain.Account; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/src/main/java/com/example/api/board/repository/EmployerRepository.java b/src/main/java/com/example/api/domain/repository/EmployerRepository.java similarity index 84% rename from src/main/java/com/example/api/board/repository/EmployerRepository.java rename to src/main/java/com/example/api/domain/repository/EmployerRepository.java index f23828aa..08b5d3f2 100644 --- a/src/main/java/com/example/api/board/repository/EmployerRepository.java +++ b/src/main/java/com/example/api/domain/repository/EmployerRepository.java @@ -1,4 +1,4 @@ -package com.example.api.board.repository; +package com.example.api.domain.repository; import com.example.api.domain.Account; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/src/main/java/com/example/api/board/repository/ExternalCareerRepository.java b/src/main/java/com/example/api/domain/repository/ExternalCareerRepository.java similarity index 95% rename from src/main/java/com/example/api/board/repository/ExternalCareerRepository.java rename to src/main/java/com/example/api/domain/repository/ExternalCareerRepository.java index 4f1b03dc..cb1ea163 100644 --- a/src/main/java/com/example/api/board/repository/ExternalCareerRepository.java +++ b/src/main/java/com/example/api/domain/repository/ExternalCareerRepository.java @@ -1,4 +1,4 @@ -package com.example.api.board.repository; +package com.example.api.domain.repository; import com.example.api.board.controller.domain.ExternalCareerDTO; import com.example.api.domain.ExternalCareer; diff --git a/src/main/java/com/example/api/board/repository/FlavoredRepository.java b/src/main/java/com/example/api/domain/repository/FlavoredRepository.java similarity index 95% rename from src/main/java/com/example/api/board/repository/FlavoredRepository.java rename to src/main/java/com/example/api/domain/repository/FlavoredRepository.java index 1044b2bb..8062ee20 100644 --- a/src/main/java/com/example/api/board/repository/FlavoredRepository.java +++ b/src/main/java/com/example/api/domain/repository/FlavoredRepository.java @@ -1,4 +1,4 @@ -package com.example.api.board.repository; +package com.example.api.domain.repository; import com.example.api.board.controller.domain.CategoryDTO; import com.example.api.domain.Flavored; diff --git a/src/main/java/com/example/api/board/repository/MyInfoRepository.java b/src/main/java/com/example/api/domain/repository/MyInfoRepository.java similarity index 94% rename from src/main/java/com/example/api/board/repository/MyInfoRepository.java rename to src/main/java/com/example/api/domain/repository/MyInfoRepository.java index c13abb94..784bc1fd 100644 --- a/src/main/java/com/example/api/board/repository/MyInfoRepository.java +++ b/src/main/java/com/example/api/domain/repository/MyInfoRepository.java @@ -1,4 +1,4 @@ -package com.example.api.board.repository; +package com.example.api.domain.repository; import com.example.api.board.controller.domain.MyInfoDTO; import com.example.api.domain.Account; diff --git a/src/main/java/com/example/api/board/repository/OfferEmploymentRepository.java b/src/main/java/com/example/api/domain/repository/OfferEmploymentRepository.java similarity index 97% rename from src/main/java/com/example/api/board/repository/OfferEmploymentRepository.java rename to src/main/java/com/example/api/domain/repository/OfferEmploymentRepository.java index 6b160c2b..be0abc91 100644 --- a/src/main/java/com/example/api/board/repository/OfferEmploymentRepository.java +++ b/src/main/java/com/example/api/domain/repository/OfferEmploymentRepository.java @@ -1,4 +1,4 @@ -package com.example.api.board.repository; +package com.example.api.domain.repository; import com.example.api.board.controller.domain.InnerCareerDTO; import com.example.api.domain.OfferEmployment; diff --git a/src/main/java/com/example/api/board/repository/PossibleBoardRepository.java b/src/main/java/com/example/api/domain/repository/PossibleBoardRepository.java similarity index 95% rename from src/main/java/com/example/api/board/repository/PossibleBoardRepository.java rename to src/main/java/com/example/api/domain/repository/PossibleBoardRepository.java index a1d09639..c76ade9c 100644 --- a/src/main/java/com/example/api/board/repository/PossibleBoardRepository.java +++ b/src/main/java/com/example/api/domain/repository/PossibleBoardRepository.java @@ -1,4 +1,4 @@ -package com.example.api.board.repository; +package com.example.api.domain.repository; import com.example.api.board.controller.domain.PossibleBoardDTO; import com.example.api.domain.PossibleBoard; diff --git a/src/main/java/com/example/api/board/repository/ReviewRepository.java b/src/main/java/com/example/api/domain/repository/ReviewRepository.java similarity index 84% rename from src/main/java/com/example/api/board/repository/ReviewRepository.java rename to src/main/java/com/example/api/domain/repository/ReviewRepository.java index dcc4c3cc..43004aca 100644 --- a/src/main/java/com/example/api/board/repository/ReviewRepository.java +++ b/src/main/java/com/example/api/domain/repository/ReviewRepository.java @@ -1,4 +1,4 @@ -package com.example.api.board.repository; +package com.example.api.domain.repository; import com.example.api.domain.Review; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/src/main/java/com/example/api/employer/service/EmployerService.java b/src/main/java/com/example/api/employer/service/EmployerService.java index 412debb6..483a8e43 100644 --- a/src/main/java/com/example/api/employer/service/EmployerService.java +++ b/src/main/java/com/example/api/employer/service/EmployerService.java @@ -1,8 +1,8 @@ package com.example.api.employer.service; -import com.example.api.board.repository.EmployeeRepository; -import com.example.api.board.repository.ExternalCareerRepository; -import com.example.api.board.repository.FlavoredRepository; +import com.example.api.domain.repository.EmployeeRepository; +import com.example.api.domain.repository.ExternalCareerRepository; +import com.example.api.domain.repository.FlavoredRepository; import com.example.api.domain.Account; import com.example.api.employer.controller.domain.LikeEmployeeDTO; import com.example.api.employer.repository.ScrapRepository; diff --git a/src/main/java/com/example/api/suggest/service/SuggestService.java b/src/main/java/com/example/api/suggest/service/SuggestService.java index 178b3505..813d49ce 100644 --- a/src/main/java/com/example/api/suggest/service/SuggestService.java +++ b/src/main/java/com/example/api/suggest/service/SuggestService.java @@ -1,6 +1,6 @@ package com.example.api.suggest.service; -import com.example.api.board.repository.OfferEmploymentRepository; +import com.example.api.domain.repository.OfferEmploymentRepository; import com.example.api.domain.OfferEmployment; import com.example.api.suggest.controller.domain.SuggestStatusDTO; import jakarta.transaction.Transactional; diff --git a/src/test/java/com/example/api/global/BaseIntegrationTest.java b/src/test/java/com/example/api/global/BaseIntegrationTest.java index 8c0fc136..2e70deee 100644 --- a/src/test/java/com/example/api/global/BaseIntegrationTest.java +++ b/src/test/java/com/example/api/global/BaseIntegrationTest.java @@ -4,9 +4,8 @@ import com.example.api.board.controller.domain.ExternalCareerDTO; import com.example.api.board.controller.domain.InnerCareerDTO; import com.example.api.board.controller.domain.PossibleBoardDTO; -import com.example.api.board.repository.*; import com.example.api.domain.*; -import jakarta.transaction.Transactional; +import com.example.api.domain.repository.*; import org.junit.jupiter.api.BeforeEach; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; From 2687ef2b21895fef09a5d525531c0a6d4201e4dc Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 19:15:00 +0900 Subject: [PATCH 109/276] =?UTF-8?q?#1=20Account=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20=EB=B3=80=EA=B2=BD=EC=9C=BC=EB=A1=9C=20=EC=9D=B8?= =?UTF-8?q?=ED=95=9C=20offerRepository=20=EC=BD=94=EB=93=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/repository/ContractRepository.java | 29 ------------------- 1 file changed, 29 deletions(-) delete mode 100644 src/main/java/com/example/api/domain/repository/ContractRepository.java diff --git a/src/main/java/com/example/api/domain/repository/ContractRepository.java b/src/main/java/com/example/api/domain/repository/ContractRepository.java deleted file mode 100644 index dcee4970..00000000 --- a/src/main/java/com/example/api/domain/repository/ContractRepository.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.example.api.domain.repository; - -import com.example.api.contracts.dto.BusinessInfoDTO; -import com.example.api.contracts.dto.EmployeeInfoDTO; -import com.example.api.domain.Contract; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; -import org.springframework.stereotype.Repository; - -@Repository -public interface ContractRepository extends JpaRepository { - @Query("select new com.example.api.contract.controller.domain." + - "BusinessInfoDTO(b.businessName, b.representationName, c.contractStartTime, c.contractEndTime, b.location, e.phoneNumber, c.updatedDate) " + - "from Contract c " + - "join c.offerEmployment oe " + - "join oe.business b " + - "join oe.employee e on e.accountId = b.employer.accountId " + - "where c.contractId = :contractId") - BusinessInfoDTO findBusinessDTOByContractId(@Param("contractId") long contractId); - - @Query("select new com.example.api.contract.controller.domain." + - "EmployeeInfoDTO(e.name, e.phoneNumber, e.starPoint, e.workCount) " + - "from Contract c " + - "join c.offerEmployment oe " + - "join oe.employee e " + - "where c.contractId = :contractId") - EmployeeInfoDTO findEmployeeDTOByContractId(@Param("contractId") long contractId); -} From b3349c8edc934203cf0a14410ee7caaf0d51e98b Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 19:39:59 +0900 Subject: [PATCH 110/276] =?UTF-8?q?#1=20BoardController,=20=20BoardService?= =?UTF-8?q?=EC=97=90=EC=84=9C=20employeeId=EB=A5=BC=20=EA=B0=9D=EC=B2=B4?= =?UTF-8?q?=EB=A1=9C=20=EB=84=98=EA=B8=B0=EB=8A=94=20=EA=B2=83=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/board/controller/BoardController.java | 18 +++++++++++------- .../domain/request/EmployeeIdRequest.java | 4 ++++ .../domain/{ => response}/Board.java | 2 +- .../domain/{ => response}/CategoryDTO.java | 2 +- .../{ => response}/ExternalCareerDTO.java | 2 +- .../domain/{ => response}/InnerCareerDTO.java | 2 +- .../domain/{ => response}/MyInfoDTO.java | 5 +---- .../{ => response}/PossibleBoardDTO.java | 2 +- .../api/board/service/BoardService.java | 15 ++++++++------- .../api/board/service/CategoryService.java | 2 +- .../api/board/service/EmployeeService.java | 14 +++++++++----- .../example/api/contracts/ContractService.java | 6 +++--- .../controller/ContractController.java | 5 +++-- .../repository/ExternalCareerRepository.java | 2 +- .../domain/repository/FlavoredRepository.java | 2 +- .../domain/repository/MyInfoRepository.java | 2 +- .../repository/OfferEmploymentRepository.java | 2 +- .../repository/PossibleBoardRepository.java | 2 +- .../controller/domain/LikeEmployeeDTO.java | 4 ++-- .../board/controller/BoardControllerTest.java | 6 +++--- .../api/board/service/BoardServiceTest.java | 2 +- .../api/board/service/CategoryServiceTest.java | 3 +-- .../api/board/service/EmployeeServiceTest.java | 4 +++- .../api/global/BaseIntegrationTest.java | 8 ++++---- 24 files changed, 64 insertions(+), 52 deletions(-) create mode 100644 src/main/java/com/example/api/board/controller/domain/request/EmployeeIdRequest.java rename src/main/java/com/example/api/board/controller/domain/{ => response}/Board.java (83%) rename src/main/java/com/example/api/board/controller/domain/{ => response}/CategoryDTO.java (76%) rename src/main/java/com/example/api/board/controller/domain/{ => response}/ExternalCareerDTO.java (77%) rename src/main/java/com/example/api/board/controller/domain/{ => response}/InnerCareerDTO.java (92%) rename src/main/java/com/example/api/board/controller/domain/{ => response}/MyInfoDTO.java (83%) rename src/main/java/com/example/api/board/controller/domain/{ => response}/PossibleBoardDTO.java (85%) diff --git a/src/main/java/com/example/api/board/controller/BoardController.java b/src/main/java/com/example/api/board/controller/BoardController.java index ff495b23..04f13916 100644 --- a/src/main/java/com/example/api/board/controller/BoardController.java +++ b/src/main/java/com/example/api/board/controller/BoardController.java @@ -1,8 +1,9 @@ package com.example.api.board.controller; -import com.example.api.board.controller.domain.CategoryDTO; -import com.example.api.board.controller.domain.Board; -import com.example.api.board.controller.domain.MyInfoDTO; +import com.example.api.board.controller.domain.request.EmployeeIdRequest; +import com.example.api.board.controller.domain.response.CategoryDTO; +import com.example.api.board.controller.domain.response.Board; +import com.example.api.board.controller.domain.response.MyInfoDTO; import com.example.api.board.service.BoardService; import com.example.api.board.service.CategoryService; import com.example.api.board.service.EmployeeService; @@ -21,15 +22,17 @@ public class BoardController { private final EmployeeService employeeService; @GetMapping("/api/v1/possible-board/form/{employeeId}") - public Board findBoardByEmployeeId(@PathVariable("employeeId") Long employeeId) { - MyInfoDTO myInfoById = boardService.findMyInfoById(employeeId); + public Board findBoardByEmployeeId(@PathVariable() final Long employeeId) { + EmployeeIdRequest employeeIdRequest = new EmployeeIdRequest(employeeId); + MyInfoDTO myInfoById = boardService.findMyInfoById(employeeIdRequest); List categoryList = categoryService.getAllCategories(); return new Board(myInfoById, categoryList); } @PostMapping("/api/v1/{employeeId}") public ResponseEntity changeOpenStatus(@PathVariable("employeeId") Long employeeId, @RequestParam ("openStatus") Boolean openStatus) { - boolean updated = employeeService.changeOpenStatus(employeeId, openStatus); + EmployeeIdRequest employeeIdRequest = new EmployeeIdRequest(employeeId); + boolean updated = employeeService.changeOpenStatus(employeeIdRequest, openStatus); if (updated) { return ResponseEntity.ok("사용자 정보가 성공적으로 업데이트되었습니다."); } else { @@ -39,7 +42,8 @@ public ResponseEntity changeOpenStatus(@PathVariable("employeeId") Long employee @PostMapping("/api/v1/possible-board/submit/{employeeId}") public ResponseEntity submitBoard(@PathVariable("employeeId") Long employeeId, @RequestBody MyInfoDTO myInfo) { - boolean updated = employeeService.updateUserInfo(employeeId, myInfo); + EmployeeIdRequest employeeIdRequest = new EmployeeIdRequest(employeeId); + boolean updated = employeeService.updateUserInfo(employeeIdRequest, myInfo); if (updated) { MyInfoDTO myInfoById = boardService.findMyInfoById(employeeId); List categoryList = categoryService.getAllCategories(); diff --git a/src/main/java/com/example/api/board/controller/domain/request/EmployeeIdRequest.java b/src/main/java/com/example/api/board/controller/domain/request/EmployeeIdRequest.java new file mode 100644 index 00000000..b4dad1de --- /dev/null +++ b/src/main/java/com/example/api/board/controller/domain/request/EmployeeIdRequest.java @@ -0,0 +1,4 @@ +package com.example.api.board.controller.domain.request; + +public record EmployeeIdRequest(Long employeeId) { +} diff --git a/src/main/java/com/example/api/board/controller/domain/Board.java b/src/main/java/com/example/api/board/controller/domain/response/Board.java similarity index 83% rename from src/main/java/com/example/api/board/controller/domain/Board.java rename to src/main/java/com/example/api/board/controller/domain/response/Board.java index 56e9eed9..5b7514d6 100644 --- a/src/main/java/com/example/api/board/controller/domain/Board.java +++ b/src/main/java/com/example/api/board/controller/domain/response/Board.java @@ -1,4 +1,4 @@ -package com.example.api.board.controller.domain; +package com.example.api.board.controller.domain.response; import lombok.AllArgsConstructor; import lombok.EqualsAndHashCode; diff --git a/src/main/java/com/example/api/board/controller/domain/CategoryDTO.java b/src/main/java/com/example/api/board/controller/domain/response/CategoryDTO.java similarity index 76% rename from src/main/java/com/example/api/board/controller/domain/CategoryDTO.java rename to src/main/java/com/example/api/board/controller/domain/response/CategoryDTO.java index 2b10429d..9ab150df 100644 --- a/src/main/java/com/example/api/board/controller/domain/CategoryDTO.java +++ b/src/main/java/com/example/api/board/controller/domain/response/CategoryDTO.java @@ -1,4 +1,4 @@ -package com.example.api.board.controller.domain; +package com.example.api.board.controller.domain.response; import lombok.*; diff --git a/src/main/java/com/example/api/board/controller/domain/ExternalCareerDTO.java b/src/main/java/com/example/api/board/controller/domain/response/ExternalCareerDTO.java similarity index 77% rename from src/main/java/com/example/api/board/controller/domain/ExternalCareerDTO.java rename to src/main/java/com/example/api/board/controller/domain/response/ExternalCareerDTO.java index 5afb613c..917de039 100644 --- a/src/main/java/com/example/api/board/controller/domain/ExternalCareerDTO.java +++ b/src/main/java/com/example/api/board/controller/domain/response/ExternalCareerDTO.java @@ -1,4 +1,4 @@ -package com.example.api.board.controller.domain; +package com.example.api.board.controller.domain.response; import lombok.*; diff --git a/src/main/java/com/example/api/board/controller/domain/InnerCareerDTO.java b/src/main/java/com/example/api/board/controller/domain/response/InnerCareerDTO.java similarity index 92% rename from src/main/java/com/example/api/board/controller/domain/InnerCareerDTO.java rename to src/main/java/com/example/api/board/controller/domain/response/InnerCareerDTO.java index de763578..c183e11a 100644 --- a/src/main/java/com/example/api/board/controller/domain/InnerCareerDTO.java +++ b/src/main/java/com/example/api/board/controller/domain/response/InnerCareerDTO.java @@ -1,4 +1,4 @@ -package com.example.api.board.controller.domain; +package com.example.api.board.controller.domain.response; import com.example.api.domain.Review; diff --git a/src/main/java/com/example/api/board/controller/domain/MyInfoDTO.java b/src/main/java/com/example/api/board/controller/domain/response/MyInfoDTO.java similarity index 83% rename from src/main/java/com/example/api/board/controller/domain/MyInfoDTO.java rename to src/main/java/com/example/api/board/controller/domain/response/MyInfoDTO.java index dc2b09b1..dfbff862 100644 --- a/src/main/java/com/example/api/board/controller/domain/MyInfoDTO.java +++ b/src/main/java/com/example/api/board/controller/domain/response/MyInfoDTO.java @@ -1,8 +1,5 @@ -package com.example.api.board.controller.domain; +package com.example.api.board.controller.domain.response; -import com.example.api.domain.Category; -import com.example.api.domain.ExternalCareer; -import com.example.api.domain.PossibleBoard; import lombok.*; import java.util.List; diff --git a/src/main/java/com/example/api/board/controller/domain/PossibleBoardDTO.java b/src/main/java/com/example/api/board/controller/domain/response/PossibleBoardDTO.java similarity index 85% rename from src/main/java/com/example/api/board/controller/domain/PossibleBoardDTO.java rename to src/main/java/com/example/api/board/controller/domain/response/PossibleBoardDTO.java index 5ca358a1..dad2a7fa 100644 --- a/src/main/java/com/example/api/board/controller/domain/PossibleBoardDTO.java +++ b/src/main/java/com/example/api/board/controller/domain/response/PossibleBoardDTO.java @@ -1,4 +1,4 @@ -package com.example.api.board.controller.domain; +package com.example.api.board.controller.domain.response; import lombok.*; import java.time.LocalDateTime; diff --git a/src/main/java/com/example/api/board/service/BoardService.java b/src/main/java/com/example/api/board/service/BoardService.java index 30cde321..37997daa 100644 --- a/src/main/java/com/example/api/board/service/BoardService.java +++ b/src/main/java/com/example/api/board/service/BoardService.java @@ -1,7 +1,8 @@ package com.example.api.board.service; -import com.example.api.board.controller.domain.MyInfoDTO; +import com.example.api.board.controller.domain.request.EmployeeIdRequest; +import com.example.api.board.controller.domain.response.MyInfoDTO; import com.example.api.domain.repository.*; import jakarta.transaction.Transactional; import lombok.RequiredArgsConstructor; @@ -18,12 +19,12 @@ public class BoardService { private final PossibleBoardRepository possibleBoardRepository; private final FlavoredRepository flavoredRepository; - public MyInfoDTO findMyInfoById(long employeeId) { - MyInfoDTO myInfoDTOById = myInfoRepository.findMyInfoDTOById(employeeId); - myInfoDTOById.setInnerCarrerList(offerEmploymentRepository.findAllDTOByEmployeeId(employeeId)); - myInfoDTOById.setExternalCareerList(externalCareerRepository.findAllDTOByEmployeeAccountId(employeeId)); - myInfoDTOById.setPossibleBoardList(possibleBoardRepository.findAllDTOByEmployeeAccountId(employeeId)); - myInfoDTOById.setFlavoredCategoryList(flavoredRepository.findAllCategoryDTOByEmployeeId(employeeId)); + public MyInfoDTO findMyInfoById(final EmployeeIdRequest employeeIdRequest) { + MyInfoDTO myInfoDTOById = myInfoRepository.findMyInfoDTOById(employeeIdRequest.employeeId()); + myInfoDTOById.setInnerCarrerList(offerEmploymentRepository.findAllDTOByEmployeeId(employeeIdRequest.employeeId())); + myInfoDTOById.setExternalCareerList(externalCareerRepository.findAllDTOByEmployeeAccountId(employeeIdRequest.employeeId())); + myInfoDTOById.setPossibleBoardList(possibleBoardRepository.findAllDTOByEmployeeAccountId(employeeIdRequest.employeeId())); + myInfoDTOById.setFlavoredCategoryList(flavoredRepository.findAllCategoryDTOByEmployeeId(employeeIdRequest.employeeId())); return myInfoDTOById; } diff --git a/src/main/java/com/example/api/board/service/CategoryService.java b/src/main/java/com/example/api/board/service/CategoryService.java index 4c6193ec..83c0cdca 100644 --- a/src/main/java/com/example/api/board/service/CategoryService.java +++ b/src/main/java/com/example/api/board/service/CategoryService.java @@ -1,6 +1,6 @@ package com.example.api.board.service; -import com.example.api.board.controller.domain.CategoryDTO; +import com.example.api.board.controller.domain.response.CategoryDTO; import com.example.api.domain.repository.CategoryRepository; import com.example.api.domain.Category; import jakarta.transaction.Transactional; diff --git a/src/main/java/com/example/api/board/service/EmployeeService.java b/src/main/java/com/example/api/board/service/EmployeeService.java index 4f15faf1..2ec9c055 100644 --- a/src/main/java/com/example/api/board/service/EmployeeService.java +++ b/src/main/java/com/example/api/board/service/EmployeeService.java @@ -1,6 +1,10 @@ package com.example.api.board.service; -import com.example.api.board.controller.domain.*; +import com.example.api.board.controller.domain.request.EmployeeIdRequest; +import com.example.api.board.controller.domain.response.CategoryDTO; +import com.example.api.board.controller.domain.response.ExternalCareerDTO; +import com.example.api.board.controller.domain.response.MyInfoDTO; +import com.example.api.board.controller.domain.response.PossibleBoardDTO; import com.example.api.domain.*; import com.example.api.domain.repository.EmployeeRepository; import com.example.api.domain.repository.ExternalCareerRepository; @@ -24,15 +28,15 @@ public class EmployeeService { private final FlavoredRepository flavoredRepository; private final PossibleBoardRepository possibleBoardRepository; - public Boolean changeOpenStatus(Long employeeId, boolean openStatus) { - return employeeRepository.findByAccountId(employeeId).map(employee -> { + public Boolean changeOpenStatus(final EmployeeIdRequest employeeIdRequest, boolean openStatus) { + return employeeRepository.findByAccountId(employeeIdRequest.employeeId()).map(employee -> { employee.setOpenStatus(openStatus); employeeRepository.save(employee); return true; }).orElse(false); } - public boolean updateUserInfo(Long employeeId, MyInfoDTO myInfo) { - return employeeRepository.findByAccountId(employeeId).map(employee -> { + public boolean updateUserInfo(final EmployeeIdRequest employeeIdRequest, MyInfoDTO myInfo) { + return employeeRepository.findByAccountId(employeeIdRequest.employeeId()).map(employee -> { setUserInfo(employee, myInfo); employeeRepository.save(employee); diff --git a/src/main/java/com/example/api/contracts/ContractService.java b/src/main/java/com/example/api/contracts/ContractService.java index b8520d7b..4be902ad 100644 --- a/src/main/java/com/example/api/contracts/ContractService.java +++ b/src/main/java/com/example/api/contracts/ContractService.java @@ -54,9 +54,9 @@ private OfferEmployment loadOffer(final Long offerId) { .orElseThrow(); } - public ContractDTO getContractInfo(long contractId) { - BusinessInfoDTO businessDTO = contractRepository.findBusinessDTOByContractId(contractId); - EmployeeInfoDTO employeeDTO = contractRepository.findEmployeeDTOByContractId(contractId); + public ContractDTO getContractInfo(final AcceptContractCommand contractStatusCommand) { + BusinessInfoDTO businessDTO = contractRepository.findBusinessDTOByContractId(contractStatusCommand.contractId()); + EmployeeInfoDTO employeeDTO = contractRepository.findEmployeeDTOByContractId(contractStatusCommand.contractId()); return new ContractDTO(businessDTO, employeeDTO); } } 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 1d5fec69..0f2a4548 100644 --- a/src/main/java/com/example/api/contracts/controller/ContractController.java +++ b/src/main/java/com/example/api/contracts/controller/ContractController.java @@ -63,8 +63,9 @@ public ResponseEntity acceptContract( } @GetMapping("/api/v1/contract/{contractId}/status") - public ResponseEntity getContractInfo(@PathVariable("contractId") long contractId) { - ContractDTO contractDTO = contractService.getContractInfo(contractId); + public ResponseEntity getContractInfo(@PathVariable(required = true) final Long contractId) { + final AcceptContractCommand contractStatusCommand = new AcceptContractCommand(contractId); + ContractDTO contractDTO = contractService.getContractInfo(contractStatusCommand); return ResponseEntity.ok(contractDTO); } } diff --git a/src/main/java/com/example/api/domain/repository/ExternalCareerRepository.java b/src/main/java/com/example/api/domain/repository/ExternalCareerRepository.java index cb1ea163..e70246dd 100644 --- a/src/main/java/com/example/api/domain/repository/ExternalCareerRepository.java +++ b/src/main/java/com/example/api/domain/repository/ExternalCareerRepository.java @@ -1,6 +1,6 @@ package com.example.api.domain.repository; -import com.example.api.board.controller.domain.ExternalCareerDTO; +import com.example.api.board.controller.domain.response.ExternalCareerDTO; import com.example.api.domain.ExternalCareer; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; diff --git a/src/main/java/com/example/api/domain/repository/FlavoredRepository.java b/src/main/java/com/example/api/domain/repository/FlavoredRepository.java index 8062ee20..7c8b0870 100644 --- a/src/main/java/com/example/api/domain/repository/FlavoredRepository.java +++ b/src/main/java/com/example/api/domain/repository/FlavoredRepository.java @@ -1,6 +1,6 @@ package com.example.api.domain.repository; -import com.example.api.board.controller.domain.CategoryDTO; +import com.example.api.board.controller.domain.response.CategoryDTO; import com.example.api.domain.Flavored; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; diff --git a/src/main/java/com/example/api/domain/repository/MyInfoRepository.java b/src/main/java/com/example/api/domain/repository/MyInfoRepository.java index 784bc1fd..1d9145d4 100644 --- a/src/main/java/com/example/api/domain/repository/MyInfoRepository.java +++ b/src/main/java/com/example/api/domain/repository/MyInfoRepository.java @@ -1,6 +1,6 @@ package com.example.api.domain.repository; -import com.example.api.board.controller.domain.MyInfoDTO; +import com.example.api.board.controller.domain.response.MyInfoDTO; import com.example.api.domain.Account; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; diff --git a/src/main/java/com/example/api/domain/repository/OfferEmploymentRepository.java b/src/main/java/com/example/api/domain/repository/OfferEmploymentRepository.java index be0abc91..3a52018a 100644 --- a/src/main/java/com/example/api/domain/repository/OfferEmploymentRepository.java +++ b/src/main/java/com/example/api/domain/repository/OfferEmploymentRepository.java @@ -1,6 +1,6 @@ package com.example.api.domain.repository; -import com.example.api.board.controller.domain.InnerCareerDTO; +import com.example.api.board.controller.domain.response.InnerCareerDTO; import com.example.api.domain.OfferEmployment; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; diff --git a/src/main/java/com/example/api/domain/repository/PossibleBoardRepository.java b/src/main/java/com/example/api/domain/repository/PossibleBoardRepository.java index c76ade9c..bb7adfea 100644 --- a/src/main/java/com/example/api/domain/repository/PossibleBoardRepository.java +++ b/src/main/java/com/example/api/domain/repository/PossibleBoardRepository.java @@ -1,6 +1,6 @@ package com.example.api.domain.repository; -import com.example.api.board.controller.domain.PossibleBoardDTO; +import com.example.api.board.controller.domain.response.PossibleBoardDTO; import com.example.api.domain.PossibleBoard; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; diff --git a/src/main/java/com/example/api/employer/controller/domain/LikeEmployeeDTO.java b/src/main/java/com/example/api/employer/controller/domain/LikeEmployeeDTO.java index 73941ed9..fcd77d35 100644 --- a/src/main/java/com/example/api/employer/controller/domain/LikeEmployeeDTO.java +++ b/src/main/java/com/example/api/employer/controller/domain/LikeEmployeeDTO.java @@ -1,7 +1,7 @@ package com.example.api.employer.controller.domain; -import com.example.api.board.controller.domain.CategoryDTO; -import com.example.api.board.controller.domain.ExternalCareerDTO; +import com.example.api.board.controller.domain.response.CategoryDTO; +import com.example.api.board.controller.domain.response.ExternalCareerDTO; import lombok.AllArgsConstructor; import lombok.EqualsAndHashCode; import lombok.Getter; diff --git a/src/test/java/com/example/api/board/controller/BoardControllerTest.java b/src/test/java/com/example/api/board/controller/BoardControllerTest.java index dee42532..7b20b902 100644 --- a/src/test/java/com/example/api/board/controller/BoardControllerTest.java +++ b/src/test/java/com/example/api/board/controller/BoardControllerTest.java @@ -1,8 +1,8 @@ package com.example.api.board.controller; -import com.example.api.board.controller.domain.Board; -import com.example.api.board.controller.domain.CategoryDTO; -import com.example.api.board.controller.domain.MyInfoDTO; +import com.example.api.board.controller.domain.response.Board; +import com.example.api.board.controller.domain.response.CategoryDTO; +import com.example.api.board.controller.domain.response.MyInfoDTO; import com.example.api.global.BaseIntegrationTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; diff --git a/src/test/java/com/example/api/board/service/BoardServiceTest.java b/src/test/java/com/example/api/board/service/BoardServiceTest.java index 5784a491..43b0ce71 100644 --- a/src/test/java/com/example/api/board/service/BoardServiceTest.java +++ b/src/test/java/com/example/api/board/service/BoardServiceTest.java @@ -1,6 +1,6 @@ package com.example.api.board.service; -import com.example.api.board.controller.domain.MyInfoDTO; +import com.example.api.board.controller.domain.response.MyInfoDTO; import com.example.api.global.BaseIntegrationTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.DisplayName; diff --git a/src/test/java/com/example/api/board/service/CategoryServiceTest.java b/src/test/java/com/example/api/board/service/CategoryServiceTest.java index 7bafcdb1..e230a919 100644 --- a/src/test/java/com/example/api/board/service/CategoryServiceTest.java +++ b/src/test/java/com/example/api/board/service/CategoryServiceTest.java @@ -1,12 +1,11 @@ package com.example.api.board.service; -import com.example.api.board.controller.domain.CategoryDTO; +import com.example.api.board.controller.domain.response.CategoryDTO; import com.example.api.global.BaseIntegrationTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; import java.util.ArrayList; import java.util.List; diff --git a/src/test/java/com/example/api/board/service/EmployeeServiceTest.java b/src/test/java/com/example/api/board/service/EmployeeServiceTest.java index f2f37885..764aacf7 100644 --- a/src/test/java/com/example/api/board/service/EmployeeServiceTest.java +++ b/src/test/java/com/example/api/board/service/EmployeeServiceTest.java @@ -1,5 +1,6 @@ package com.example.api.board.service; +import com.example.api.board.controller.domain.request.EmployeeIdRequest; import com.example.api.global.BaseIntegrationTest; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -13,7 +14,8 @@ class EmployeeServiceTest extends BaseIntegrationTest { @Test @DisplayName("공고 공개 여부 변경") void changeOpenStatus(){ - Boolean result = employeeService.changeOpenStatus(1L, false); + EmployeeIdRequest employeeIdRequest = new EmployeeIdRequest(1L); + Boolean result = employeeService.changeOpenStatus(employeeIdRequest , false); assertTrue(result); } } \ No newline at end of file diff --git a/src/test/java/com/example/api/global/BaseIntegrationTest.java b/src/test/java/com/example/api/global/BaseIntegrationTest.java index 2e70deee..6a20fb5b 100644 --- a/src/test/java/com/example/api/global/BaseIntegrationTest.java +++ b/src/test/java/com/example/api/global/BaseIntegrationTest.java @@ -1,9 +1,9 @@ package com.example.api.global; -import com.example.api.board.controller.domain.CategoryDTO; -import com.example.api.board.controller.domain.ExternalCareerDTO; -import com.example.api.board.controller.domain.InnerCareerDTO; -import com.example.api.board.controller.domain.PossibleBoardDTO; +import com.example.api.board.controller.domain.response.CategoryDTO; +import com.example.api.board.controller.domain.response.ExternalCareerDTO; +import com.example.api.board.controller.domain.response.InnerCareerDTO; +import com.example.api.board.controller.domain.response.PossibleBoardDTO; import com.example.api.domain.*; import com.example.api.domain.repository.*; import org.junit.jupiter.api.BeforeEach; From 49242a2be8e947bb02ecd51912e436bfca7ac842 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 19:43:38 +0900 Subject: [PATCH 111/276] =?UTF-8?q?#1=20EmployerController,=20=20EmployerS?= =?UTF-8?q?ervice=EC=97=90=EC=84=9C=20employeeId=EB=A5=BC=20=EA=B0=9D?= =?UTF-8?q?=EC=B2=B4=EB=A1=9C=20=EB=84=98=EA=B8=B0=EB=8A=94=20=EA=B2=83?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/employer/controller/EmployerController.java | 8 +++++--- .../controller/{domain => dto}/LikeEmployeeDTO.java | 2 +- .../com/example/api/employer/service/EmployerService.java | 7 ++++--- 3 files changed, 10 insertions(+), 7 deletions(-) rename src/main/java/com/example/api/employer/controller/{domain => dto}/LikeEmployeeDTO.java (92%) diff --git a/src/main/java/com/example/api/employer/controller/EmployerController.java b/src/main/java/com/example/api/employer/controller/EmployerController.java index 838d3190..78a1026b 100644 --- a/src/main/java/com/example/api/employer/controller/EmployerController.java +++ b/src/main/java/com/example/api/employer/controller/EmployerController.java @@ -1,6 +1,7 @@ package com.example.api.employer.controller; -import com.example.api.employer.controller.domain.LikeEmployeeDTO; +import com.example.api.board.controller.domain.request.EmployeeIdRequest; +import com.example.api.employer.controller.dto.LikeEmployeeDTO; import com.example.api.employer.service.EmployerService; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; @@ -16,8 +17,9 @@ public class EmployerController { private final EmployerService employerService; @GetMapping("/api/v1/employees/favorites/{employerId}") - public ResponseEntity getLikeEmployee(@PathVariable("employerId") Long employerId) { - List result = employerService.getLikeEmployee(employerId); + public ResponseEntity getLikeEmployee(@PathVariable() Long employerId) { + EmployeeIdRequest employeeIdRequest = new EmployeeIdRequest(employerId); + List result = employerService.getLikeEmployee(employeeIdRequest); return ResponseEntity.ok(result); } } diff --git a/src/main/java/com/example/api/employer/controller/domain/LikeEmployeeDTO.java b/src/main/java/com/example/api/employer/controller/dto/LikeEmployeeDTO.java similarity index 92% rename from src/main/java/com/example/api/employer/controller/domain/LikeEmployeeDTO.java rename to src/main/java/com/example/api/employer/controller/dto/LikeEmployeeDTO.java index fcd77d35..eb8a92bb 100644 --- a/src/main/java/com/example/api/employer/controller/domain/LikeEmployeeDTO.java +++ b/src/main/java/com/example/api/employer/controller/dto/LikeEmployeeDTO.java @@ -1,4 +1,4 @@ -package com.example.api.employer.controller.domain; +package com.example.api.employer.controller.dto; import com.example.api.board.controller.domain.response.CategoryDTO; import com.example.api.board.controller.domain.response.ExternalCareerDTO; diff --git a/src/main/java/com/example/api/employer/service/EmployerService.java b/src/main/java/com/example/api/employer/service/EmployerService.java index 483a8e43..84ee8545 100644 --- a/src/main/java/com/example/api/employer/service/EmployerService.java +++ b/src/main/java/com/example/api/employer/service/EmployerService.java @@ -1,10 +1,11 @@ package com.example.api.employer.service; +import com.example.api.board.controller.domain.request.EmployeeIdRequest; import com.example.api.domain.repository.EmployeeRepository; import com.example.api.domain.repository.ExternalCareerRepository; import com.example.api.domain.repository.FlavoredRepository; import com.example.api.domain.Account; -import com.example.api.employer.controller.domain.LikeEmployeeDTO; +import com.example.api.employer.controller.dto.LikeEmployeeDTO; import com.example.api.employer.repository.ScrapRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -22,8 +23,8 @@ public class EmployerService { private final FlavoredRepository flavoredRepository; - public List getLikeEmployee(Long employerId) { - Set employeeIds = scrapRepository.findAllByEmployerId(employerId).stream() + public List getLikeEmployee(final EmployeeIdRequest employeeIdRequest) { + Set employeeIds = scrapRepository.findAllByEmployerId(employeeIdRequest.employeeId()).stream() .map(scrap -> scrap.getEmployee().getAccountId()) .collect(Collectors.toSet()); List likeEmployeeList = employeeRepository.findAllById(employeeIds); From ebc43fea98789502fa926f708868744a2110e2cf Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 19:45:52 +0900 Subject: [PATCH 112/276] =?UTF-8?q?#1=20SuggestController,=20=20SuggestSer?= =?UTF-8?q?vice=EC=97=90=EC=84=9C=20businessId=EB=A5=BC=20=EA=B0=9D?= =?UTF-8?q?=EC=B2=B4=EB=A1=9C=20=EB=84=98=EA=B8=B0=EB=8A=94=20=EA=B2=83?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/api/suggest/controller/SuggestController.java | 8 +++++--- .../controller/{domain => dto}/SuggestStatusDTO.java | 2 +- .../suggest/controller/dto/request/BusinessIdRequest.java | 4 ++++ .../com/example/api/suggest/service/SuggestService.java | 7 ++++--- 4 files changed, 14 insertions(+), 7 deletions(-) rename src/main/java/com/example/api/suggest/controller/{domain => dto}/SuggestStatusDTO.java (84%) create mode 100644 src/main/java/com/example/api/suggest/controller/dto/request/BusinessIdRequest.java diff --git a/src/main/java/com/example/api/suggest/controller/SuggestController.java b/src/main/java/com/example/api/suggest/controller/SuggestController.java index 24e91df0..62eea25f 100644 --- a/src/main/java/com/example/api/suggest/controller/SuggestController.java +++ b/src/main/java/com/example/api/suggest/controller/SuggestController.java @@ -1,6 +1,7 @@ package com.example.api.suggest.controller; -import com.example.api.suggest.controller.domain.SuggestStatusDTO; +import com.example.api.suggest.controller.dto.SuggestStatusDTO; +import com.example.api.suggest.controller.dto.request.BusinessIdRequest; import com.example.api.suggest.service.SuggestService; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; @@ -16,8 +17,9 @@ public class SuggestController { private final SuggestService suggestService; @GetMapping("/api/v1/employment-suggests/status/{businessId}") - public ResponseEntity getSuggestStatus(@PathVariable("businessId") long businessId) { - List suggestStatus = suggestService.getSuggestStatus(businessId); + public ResponseEntity getSuggestStatus(@PathVariable() long businessId) { + BusinessIdRequest businessIdRequest = new BusinessIdRequest(businessId); + List suggestStatus = suggestService.getSuggestStatus(businessIdRequest); return ResponseEntity.ok(suggestStatus); } } diff --git a/src/main/java/com/example/api/suggest/controller/domain/SuggestStatusDTO.java b/src/main/java/com/example/api/suggest/controller/dto/SuggestStatusDTO.java similarity index 84% rename from src/main/java/com/example/api/suggest/controller/domain/SuggestStatusDTO.java rename to src/main/java/com/example/api/suggest/controller/dto/SuggestStatusDTO.java index 4b8f1d8a..a0e86f8d 100644 --- a/src/main/java/com/example/api/suggest/controller/domain/SuggestStatusDTO.java +++ b/src/main/java/com/example/api/suggest/controller/dto/SuggestStatusDTO.java @@ -1,4 +1,4 @@ -package com.example.api.suggest.controller.domain; +package com.example.api.suggest.controller.dto; import lombok.*; diff --git a/src/main/java/com/example/api/suggest/controller/dto/request/BusinessIdRequest.java b/src/main/java/com/example/api/suggest/controller/dto/request/BusinessIdRequest.java new file mode 100644 index 00000000..7d3fe7b5 --- /dev/null +++ b/src/main/java/com/example/api/suggest/controller/dto/request/BusinessIdRequest.java @@ -0,0 +1,4 @@ +package com.example.api.suggest.controller.dto.request; + +public record BusinessIdRequest(Long BusinessId) { +} diff --git a/src/main/java/com/example/api/suggest/service/SuggestService.java b/src/main/java/com/example/api/suggest/service/SuggestService.java index 813d49ce..84cec80f 100644 --- a/src/main/java/com/example/api/suggest/service/SuggestService.java +++ b/src/main/java/com/example/api/suggest/service/SuggestService.java @@ -2,7 +2,8 @@ import com.example.api.domain.repository.OfferEmploymentRepository; import com.example.api.domain.OfferEmployment; -import com.example.api.suggest.controller.domain.SuggestStatusDTO; +import com.example.api.suggest.controller.dto.SuggestStatusDTO; +import com.example.api.suggest.controller.dto.request.BusinessIdRequest; import jakarta.transaction.Transactional; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -19,8 +20,8 @@ public class SuggestService { private final OfferEmploymentRepository offerEmploymentRepository; private final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.MM.dd"); - public List getSuggestStatus(long businessId) { - List offerList = offerEmploymentRepository.findAllByBusinessBusinessId(businessId); + public List getSuggestStatus(final BusinessIdRequest businessIdRequest) { + List offerList = offerEmploymentRepository.findAllByBusinessBusinessId(businessIdRequest.BusinessId()); List suggestStatusDTOList = new ArrayList<>(); String status; From 40111eb4232d3b7b1d65a27d7a3a574cfee0f99b Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 20:07:33 +0900 Subject: [PATCH 113/276] =?UTF-8?q?=EC=98=A4=ED=83=80=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/example/api/board/controller/BoardController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/board/controller/BoardController.java b/src/main/java/com/example/api/board/controller/BoardController.java index 04f13916..c4ebe92b 100644 --- a/src/main/java/com/example/api/board/controller/BoardController.java +++ b/src/main/java/com/example/api/board/controller/BoardController.java @@ -45,7 +45,7 @@ public ResponseEntity submitBoard(@PathVariable("employeeId") Long employeeId, @ EmployeeIdRequest employeeIdRequest = new EmployeeIdRequest(employeeId); boolean updated = employeeService.updateUserInfo(employeeIdRequest, myInfo); if (updated) { - MyInfoDTO myInfoById = boardService.findMyInfoById(employeeId); + MyInfoDTO myInfoById = boardService.findMyInfoById(employeeIdRequest); List categoryList = categoryService.getAllCategories(); return ResponseEntity.ok(new Board(myInfoById, categoryList)); } else { From 7728077eacc77704ac95369983d612878e4f4489 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 20:12:22 +0900 Subject: [PATCH 114/276] =?UTF-8?q?#1=20@Trasactional=20=EC=9C=84=EC=B9=98?= =?UTF-8?q?=EB=A5=BC=20=EA=B0=81=20=EB=A9=94=EC=86=8C=EB=93=9C=EB=A7=88?= =?UTF-8?q?=EB=8B=A4=20=EC=84=A0=EC=96=B8=ED=95=98=EB=8A=94=20=EA=B1=B8?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/example/api/board/service/BoardService.java | 4 ++-- .../java/com/example/api/board/service/CategoryService.java | 4 ++-- .../java/com/example/api/board/service/EmployeeService.java | 5 +++-- src/main/java/com/example/api/contracts/ContractService.java | 1 + .../com/example/api/employer/service/EmployerService.java | 3 ++- .../java/com/example/api/suggest/service/SuggestService.java | 4 ++-- 6 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/example/api/board/service/BoardService.java b/src/main/java/com/example/api/board/service/BoardService.java index 37997daa..753bd6ad 100644 --- a/src/main/java/com/example/api/board/service/BoardService.java +++ b/src/main/java/com/example/api/board/service/BoardService.java @@ -4,13 +4,12 @@ import com.example.api.board.controller.domain.request.EmployeeIdRequest; import com.example.api.board.controller.domain.response.MyInfoDTO; import com.example.api.domain.repository.*; -import jakarta.transaction.Transactional; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; @Service -@Transactional @RequiredArgsConstructor public class BoardService { private final MyInfoRepository myInfoRepository; @@ -19,6 +18,7 @@ public class BoardService { private final PossibleBoardRepository possibleBoardRepository; private final FlavoredRepository flavoredRepository; + @Transactional(readOnly = true) public MyInfoDTO findMyInfoById(final EmployeeIdRequest employeeIdRequest) { MyInfoDTO myInfoDTOById = myInfoRepository.findMyInfoDTOById(employeeIdRequest.employeeId()); myInfoDTOById.setInnerCarrerList(offerEmploymentRepository.findAllDTOByEmployeeId(employeeIdRequest.employeeId())); diff --git a/src/main/java/com/example/api/board/service/CategoryService.java b/src/main/java/com/example/api/board/service/CategoryService.java index 83c0cdca..8ee263e2 100644 --- a/src/main/java/com/example/api/board/service/CategoryService.java +++ b/src/main/java/com/example/api/board/service/CategoryService.java @@ -3,19 +3,19 @@ import com.example.api.board.controller.domain.response.CategoryDTO; import com.example.api.domain.repository.CategoryRepository; import com.example.api.domain.Category; -import jakarta.transaction.Transactional; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.util.stream.Collectors; @Service -@Transactional @RequiredArgsConstructor public class CategoryService { private final CategoryRepository categoryRepository; + @Transactional(readOnly = true) public List getAllCategories() { List categories = categoryRepository.findAll(); return categories.stream() diff --git a/src/main/java/com/example/api/board/service/EmployeeService.java b/src/main/java/com/example/api/board/service/EmployeeService.java index 2ec9c055..1fcd73b2 100644 --- a/src/main/java/com/example/api/board/service/EmployeeService.java +++ b/src/main/java/com/example/api/board/service/EmployeeService.java @@ -10,9 +10,9 @@ import com.example.api.domain.repository.ExternalCareerRepository; import com.example.api.domain.repository.FlavoredRepository; import com.example.api.domain.repository.PossibleBoardRepository; -import jakarta.transaction.Transactional; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; import java.util.HashSet; import java.util.List; @@ -20,7 +20,6 @@ import java.util.stream.Collectors; @Repository -@Transactional @RequiredArgsConstructor public class EmployeeService { private final EmployeeRepository employeeRepository; @@ -28,6 +27,7 @@ public class EmployeeService { private final FlavoredRepository flavoredRepository; private final PossibleBoardRepository possibleBoardRepository; + @Transactional public Boolean changeOpenStatus(final EmployeeIdRequest employeeIdRequest, boolean openStatus) { return employeeRepository.findByAccountId(employeeIdRequest.employeeId()).map(employee -> { employee.setOpenStatus(openStatus); @@ -35,6 +35,7 @@ public Boolean changeOpenStatus(final EmployeeIdRequest employeeIdRequest, boole return true; }).orElse(false); } + @Transactional public boolean updateUserInfo(final EmployeeIdRequest employeeIdRequest, MyInfoDTO myInfo) { return employeeRepository.findByAccountId(employeeIdRequest.employeeId()).map(employee -> { setUserInfo(employee, myInfo); diff --git a/src/main/java/com/example/api/contracts/ContractService.java b/src/main/java/com/example/api/contracts/ContractService.java index 4be902ad..81e63419 100644 --- a/src/main/java/com/example/api/contracts/ContractService.java +++ b/src/main/java/com/example/api/contracts/ContractService.java @@ -54,6 +54,7 @@ private OfferEmployment loadOffer(final Long offerId) { .orElseThrow(); } + @Transactional(readOnly = true) public ContractDTO getContractInfo(final AcceptContractCommand contractStatusCommand) { BusinessInfoDTO businessDTO = contractRepository.findBusinessDTOByContractId(contractStatusCommand.contractId()); EmployeeInfoDTO employeeDTO = contractRepository.findEmployeeDTOByContractId(contractStatusCommand.contractId()); diff --git a/src/main/java/com/example/api/employer/service/EmployerService.java b/src/main/java/com/example/api/employer/service/EmployerService.java index 84ee8545..7421f926 100644 --- a/src/main/java/com/example/api/employer/service/EmployerService.java +++ b/src/main/java/com/example/api/employer/service/EmployerService.java @@ -9,6 +9,7 @@ import com.example.api.employer.repository.ScrapRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.util.Set; @@ -22,7 +23,7 @@ public class EmployerService { private final ExternalCareerRepository externalCareerRepository; private final FlavoredRepository flavoredRepository; - + @Transactional(readOnly = true) public List getLikeEmployee(final EmployeeIdRequest employeeIdRequest) { Set employeeIds = scrapRepository.findAllByEmployerId(employeeIdRequest.employeeId()).stream() .map(scrap -> scrap.getEmployee().getAccountId()) diff --git a/src/main/java/com/example/api/suggest/service/SuggestService.java b/src/main/java/com/example/api/suggest/service/SuggestService.java index 84cec80f..0f9da16e 100644 --- a/src/main/java/com/example/api/suggest/service/SuggestService.java +++ b/src/main/java/com/example/api/suggest/service/SuggestService.java @@ -4,9 +4,9 @@ import com.example.api.domain.OfferEmployment; import com.example.api.suggest.controller.dto.SuggestStatusDTO; import com.example.api.suggest.controller.dto.request.BusinessIdRequest; -import jakarta.transaction.Transactional; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; @@ -14,12 +14,12 @@ import java.util.List; @Service -@Transactional @RequiredArgsConstructor public class SuggestService { private final OfferEmploymentRepository offerEmploymentRepository; private final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.MM.dd"); + @Transactional(readOnly = true) public List getSuggestStatus(final BusinessIdRequest businessIdRequest) { List offerList = offerEmploymentRepository.findAllByBusinessBusinessId(businessIdRequest.BusinessId()); List suggestStatusDTOList = new ArrayList<>(); From 918ef1d5b0f5a02437984c55acfeb20ea646c201 Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Sat, 23 Nov 2024 21:30:23 +0900 Subject: [PATCH 115/276] =?UTF-8?q?=ED=8C=8C=EC=9D=BC=20=EA=B5=AC=EC=A1=B0?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD=EC=9C=BC=EB=A1=9C=20=EC=9D=B8=ED=95=9C=20?= =?UTF-8?q?sql=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/api/domain/repository/ExternalCareerRepository.java | 2 +- .../com/example/api/domain/repository/FlavoredRepository.java | 2 +- .../com/example/api/domain/repository/MyInfoRepository.java | 2 +- .../api/domain/repository/OfferEmploymentRepository.java | 2 +- .../example/api/domain/repository/PossibleBoardRepository.java | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/example/api/domain/repository/ExternalCareerRepository.java b/src/main/java/com/example/api/domain/repository/ExternalCareerRepository.java index e70246dd..1b69c4ef 100644 --- a/src/main/java/com/example/api/domain/repository/ExternalCareerRepository.java +++ b/src/main/java/com/example/api/domain/repository/ExternalCareerRepository.java @@ -11,7 +11,7 @@ @Repository public interface ExternalCareerRepository extends JpaRepository { - @Query("select new com.example.api.board.controller.domain.ExternalCareerDTO(e.id, e.Name, e.period) " + + @Query("select new com.example.api.board.controller.domain.response.ExternalCareerDTO(e.id, e.Name, e.period) " + "from ExternalCareer e where e.employee.accountId = :employeeId") List findAllDTOByEmployeeAccountId(@Param("employeeId") Long employeeId); diff --git a/src/main/java/com/example/api/domain/repository/FlavoredRepository.java b/src/main/java/com/example/api/domain/repository/FlavoredRepository.java index 7c8b0870..3d860e3a 100644 --- a/src/main/java/com/example/api/domain/repository/FlavoredRepository.java +++ b/src/main/java/com/example/api/domain/repository/FlavoredRepository.java @@ -11,7 +11,7 @@ @Repository public interface FlavoredRepository extends JpaRepository { - @Query("select distinct new com.example.api.board.controller.domain.CategoryDTO(c.categoryId, c.categoryName) " + + @Query("select distinct new com.example.api.board.controller.domain.response.CategoryDTO(c.categoryId, c.categoryName) " + "from Flavored f join Category c on f.category.categoryId = c.categoryId where f.employee.accountId = :employeeId") List findAllCategoryDTOByEmployeeId(@Param("employeeId") long employeeId); diff --git a/src/main/java/com/example/api/domain/repository/MyInfoRepository.java b/src/main/java/com/example/api/domain/repository/MyInfoRepository.java index 1d9145d4..0a68ab64 100644 --- a/src/main/java/com/example/api/domain/repository/MyInfoRepository.java +++ b/src/main/java/com/example/api/domain/repository/MyInfoRepository.java @@ -9,7 +9,7 @@ @Repository public interface MyInfoRepository extends JpaRepository { - @Query("select new com.example.api.board.controller.domain." + + @Query("select new com.example.api.board.controller.domain.response." + "MyInfoDTO(a.name, a.nickname, a.age, a.sex, a.email, a.phoneNumber, a.starPoint, a.workCount) " + "from Account a " + "where a.accountId = :EmployeeId") diff --git a/src/main/java/com/example/api/domain/repository/OfferEmploymentRepository.java b/src/main/java/com/example/api/domain/repository/OfferEmploymentRepository.java index 3a52018a..bebf713e 100644 --- a/src/main/java/com/example/api/domain/repository/OfferEmploymentRepository.java +++ b/src/main/java/com/example/api/domain/repository/OfferEmploymentRepository.java @@ -11,7 +11,7 @@ @Repository public interface OfferEmploymentRepository extends JpaRepository { - @Query("select new com.example.api.board.controller.domain.InnerCareerDTO(b.businessName, c.contractStartTime, b.representationName, r) " + + @Query("select new com.example.api.board.controller.domain.response.InnerCareerDTO(b.businessName, c.contractStartTime, b.representationName, r) " + "from OfferEmployment o " + "join Contract c on o.suggestId = c.contractId " + "join Business b on o.business.businessId = b.businessId "+ diff --git a/src/main/java/com/example/api/domain/repository/PossibleBoardRepository.java b/src/main/java/com/example/api/domain/repository/PossibleBoardRepository.java index bb7adfea..d06eb24f 100644 --- a/src/main/java/com/example/api/domain/repository/PossibleBoardRepository.java +++ b/src/main/java/com/example/api/domain/repository/PossibleBoardRepository.java @@ -13,7 +13,7 @@ public interface PossibleBoardRepository extends JpaRepository { List findAllByEmployeeAccountId(Long employeeId); - @Query("select new com.example.api.board.controller.domain.PossibleBoardDTO(p.possibleId, p.startTime, p.endTime) " + + @Query("select new com.example.api.board.controller.domain.response.PossibleBoardDTO(p.possibleId, p.startTime, p.endTime) " + "from PossibleBoard p where p.employee.accountId = :employeeId") List findAllDTOByEmployeeAccountId(@Param("employeeId")Long employeeId); } From a846fcd91a25643da3b96ad68c64f7c6de17edfe Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Tue, 19 Nov 2024 16:22:32 +0900 Subject: [PATCH 116/276] =?UTF-8?q?#27=20=EB=AA=BD=EA=B3=A0=20DB=20?= =?UTF-8?q?=EC=9D=98=EC=A1=B4=EC=84=B1=20=EB=B0=8F=20=EC=9B=B9=20=EC=86=8C?= =?UTF-8?q?=EC=BC=93=20=EC=9D=98=EC=A1=B4=EC=84=B1=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build.gradle b/build.gradle index d48d37f6..a2f03ade 100644 --- a/build.gradle +++ b/build.gradle @@ -26,6 +26,8 @@ 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' + implementation 'org.springframework.boot:spring-boot-starter-websocket' compileOnly 'org.projectlombok:lombok' // runtimeOnly 'com.mysql:mysql-connector-j' runtimeOnly 'com.h2database:h2' From e01779b2be202df77fbd722c6c6f442bfa2a600e Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Tue, 19 Nov 2024 17:30:37 +0900 Subject: [PATCH 117/276] =?UTF-8?q?#30=20Chat=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20MongoDB=20=EB=8F=84=EB=A9=94=EC=9D=B8=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/example/api/domain/Chat.java | 64 ++++++++++--------- 1 file changed, 34 insertions(+), 30 deletions(-) diff --git a/src/main/java/com/example/api/domain/Chat.java b/src/main/java/com/example/api/domain/Chat.java index 8d55967c..5ddead91 100644 --- a/src/main/java/com/example/api/domain/Chat.java +++ b/src/main/java/com/example/api/domain/Chat.java @@ -1,43 +1,47 @@ package com.example.api.domain; import jakarta.persistence.*; -import lombok.EqualsAndHashCode; import lombok.Getter; -import lombok.Setter; +import org.springframework.data.mongodb.core.mapping.Document; -import java.time.LocalDateTime; +import java.util.Date; -import static jakarta.persistence.FetchType.*; - -@Entity @Getter -@Setter -@EqualsAndHashCode -@Table(name = "CHAT") +@Document(collection = "chat") public class Chat { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long chatId; - - @ManyToOne(fetch = LAZY) - @JoinColumn(name = "CHAT_ROOM_ID") - private ChatRoom chatRoom; - - @ManyToOne(fetch = LAZY) - @JoinColumn(name = "ACCOUNT_UNIQUE_ID") - private Account account; - - private String chatContent; - - @Column(name = "CHAT_DELETED", columnDefinition = "BOOLEAN DEFAULT false") - private boolean deleted; + private Long id; + private String content; + private Long roomId; + private Long senderId; + private Long receiverId; + private Date sendTime; + private Boolean isRead; + + protected Chat() { + } - @Column(name = "CHAT_REGISTER_DATE") - private LocalDateTime chatRegisterDate; + public static Chat from(chatSendRequest chatSendRequest){ + Chat chat = new Chat(); + chat.content = chatSendRequest.content(); + chat.roomId = chatSendRequest.roomId(); + chat.senderId = chatSendRequest.senderId(); + chat.receiverId = chatSendRequest.receiverId(); + chat.sendTime = new Date(); + chat.isRead = false; + return chat; + } - @PrePersist - protected void onCreate() { - this.chatRegisterDate = LocalDateTime.now(); + @Override + public String toString() { + return "Message{" + + "id=" + id + + ", content='" + content + '\'' + + ", roomId=" + roomId + + ", senderId=" + senderId + + ", receiverId=" + receiverId + + ", sendTime=" + sendTime + + ", isRead=" + isRead + + '}'; } } From a8657ebbff8ea18133c771bf38fe150c2eb6f8cf Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Tue, 19 Nov 2024 17:47:12 +0900 Subject: [PATCH 118/276] =?UTF-8?q?#27=2030=EB=B2=88=20=EC=9D=B4=EC=8A=88,?= =?UTF-8?q?=20Chat=20=EB=8F=84=EB=A9=94=EC=9D=B8=20=EB=B3=80=EA=B2=BD=20ch?= =?UTF-8?q?erry-pick?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/api/domain/Chat.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/domain/Chat.java b/src/main/java/com/example/api/domain/Chat.java index 5ddead91..078a210a 100644 --- a/src/main/java/com/example/api/domain/Chat.java +++ b/src/main/java/com/example/api/domain/Chat.java @@ -1,5 +1,6 @@ package com.example.api.domain; +import com.example.api.chat.controller.dto.request.ChatSendRequest; import jakarta.persistence.*; import lombok.Getter; import org.springframework.data.mongodb.core.mapping.Document; @@ -21,7 +22,7 @@ public class Chat { protected Chat() { } - public static Chat from(chatSendRequest chatSendRequest){ + public static Chat from(ChatSendRequest chatSendRequest){ Chat chat = new Chat(); chat.content = chatSendRequest.content(); chat.roomId = chatSendRequest.roomId(); From 8716b28559c41acf97989996d2ecdb89f0764e08 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Tue, 19 Nov 2024 21:31:44 +0900 Subject: [PATCH 119/276] =?UTF-8?q?#27=20=EC=B1=84=ED=8C=85=20=EC=A0=84?= =?UTF-8?q?=EC=86=A1=ED=95=98=EA=B8=B0=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/chat/controller/ChatController.java | 20 +++++++ .../chat/controller/dto/RequestUserId.java | 4 ++ .../dto/request/ChatSendRequest.java | 4 ++ .../controller/dto/request/ReadRequest.java | 4 ++ .../dto/response/ChatSummaryResponse.java | 4 ++ .../controller/dto/response/ReadResponse.java | 4 ++ .../example/api/chat/domain/ChatSummary.java | 4 ++ .../api/chat/repository/ChatRepository.java | 9 ++++ .../chat/repository/ChatRoomRepository.java | 9 ++++ .../chat/repository/CustomChatRepository.java | 4 ++ .../repository/CustomChatRepositoryImpl.java | 4 ++ .../example/api/chat/service/ChatService.java | 52 +++++++++++++++++++ .../api/chat/service/model/ChatSender.java | 23 ++++++++ .../api/global/config/WebSocketConfig.java | 4 ++ 14 files changed, 149 insertions(+) create mode 100644 src/main/java/com/example/api/chat/controller/ChatController.java create mode 100644 src/main/java/com/example/api/chat/controller/dto/RequestUserId.java create mode 100644 src/main/java/com/example/api/chat/controller/dto/request/ChatSendRequest.java create mode 100644 src/main/java/com/example/api/chat/controller/dto/request/ReadRequest.java create mode 100644 src/main/java/com/example/api/chat/controller/dto/response/ChatSummaryResponse.java create mode 100644 src/main/java/com/example/api/chat/controller/dto/response/ReadResponse.java create mode 100644 src/main/java/com/example/api/chat/domain/ChatSummary.java create mode 100644 src/main/java/com/example/api/chat/repository/ChatRepository.java create mode 100644 src/main/java/com/example/api/chat/repository/ChatRoomRepository.java create mode 100644 src/main/java/com/example/api/chat/repository/CustomChatRepository.java create mode 100644 src/main/java/com/example/api/chat/repository/CustomChatRepositoryImpl.java create mode 100644 src/main/java/com/example/api/chat/service/ChatService.java create mode 100644 src/main/java/com/example/api/chat/service/model/ChatSender.java create mode 100644 src/main/java/com/example/api/global/config/WebSocketConfig.java diff --git a/src/main/java/com/example/api/chat/controller/ChatController.java b/src/main/java/com/example/api/chat/controller/ChatController.java new file mode 100644 index 00000000..75e0422b --- /dev/null +++ b/src/main/java/com/example/api/chat/controller/ChatController.java @@ -0,0 +1,20 @@ +package com.example.api.chat.controller; + +import com.example.api.chat.controller.dto.request.ChatSendRequest; +import com.example.api.chat.service.ChatService; +import lombok.RequiredArgsConstructor; +import org.springframework.messaging.handler.annotation.MessageMapping; +import org.springframework.messaging.handler.annotation.Payload; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +public class ChatController { + private final ChatService chatService; + + @MessageMapping("/send") + public void sendMessage(@Payload ChatSendRequest messageRequest) { + String result = chatService.sendMessage(messageRequest); + System.out.println("result = " + result); + } +} diff --git a/src/main/java/com/example/api/chat/controller/dto/RequestUserId.java b/src/main/java/com/example/api/chat/controller/dto/RequestUserId.java new file mode 100644 index 00000000..665a147b --- /dev/null +++ b/src/main/java/com/example/api/chat/controller/dto/RequestUserId.java @@ -0,0 +1,4 @@ +package com.example.api.chat.controller.dto; + +public record requestUserId() { +} diff --git a/src/main/java/com/example/api/chat/controller/dto/request/ChatSendRequest.java b/src/main/java/com/example/api/chat/controller/dto/request/ChatSendRequest.java new file mode 100644 index 00000000..e9de2004 --- /dev/null +++ b/src/main/java/com/example/api/chat/controller/dto/request/ChatSendRequest.java @@ -0,0 +1,4 @@ +package com.example.api.chat.controller.dto.request; + +public record ChatSendRequest(Long roomId, Long senderId, Long receiverId, String content) { +} diff --git a/src/main/java/com/example/api/chat/controller/dto/request/ReadRequest.java b/src/main/java/com/example/api/chat/controller/dto/request/ReadRequest.java new file mode 100644 index 00000000..9e14c097 --- /dev/null +++ b/src/main/java/com/example/api/chat/controller/dto/request/ReadRequest.java @@ -0,0 +1,4 @@ +package com.example.api.chat.controller.dto.request; + +public record ReadRequest(Long roomId, Long userId) { +} \ No newline at end of file diff --git a/src/main/java/com/example/api/chat/controller/dto/response/ChatSummaryResponse.java b/src/main/java/com/example/api/chat/controller/dto/response/ChatSummaryResponse.java new file mode 100644 index 00000000..2c1545f3 --- /dev/null +++ b/src/main/java/com/example/api/chat/controller/dto/response/ChatSummaryResponse.java @@ -0,0 +1,4 @@ +package com.example.api.chat.controller.dto.response; + +public class ChatSummaryResponse { +} diff --git a/src/main/java/com/example/api/chat/controller/dto/response/ReadResponse.java b/src/main/java/com/example/api/chat/controller/dto/response/ReadResponse.java new file mode 100644 index 00000000..17334c33 --- /dev/null +++ b/src/main/java/com/example/api/chat/controller/dto/response/ReadResponse.java @@ -0,0 +1,4 @@ +package com.example.api.chat.controller.dto.response; + +public record ReadResponse(Long readBy) { +} \ No newline at end of file diff --git a/src/main/java/com/example/api/chat/domain/ChatSummary.java b/src/main/java/com/example/api/chat/domain/ChatSummary.java new file mode 100644 index 00000000..12ebc43c --- /dev/null +++ b/src/main/java/com/example/api/chat/domain/ChatSummary.java @@ -0,0 +1,4 @@ +package com.example.api.chat.controller.dto.response; + +public record ChatSummary() { +} diff --git a/src/main/java/com/example/api/chat/repository/ChatRepository.java b/src/main/java/com/example/api/chat/repository/ChatRepository.java new file mode 100644 index 00000000..ccac91c7 --- /dev/null +++ b/src/main/java/com/example/api/chat/repository/ChatRepository.java @@ -0,0 +1,9 @@ +package com.example.api.chat.repository; + +import com.example.api.domain.Chat; +import org.springframework.data.mongodb.repository.MongoRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface ChatRepository extends MongoRepository { +} diff --git a/src/main/java/com/example/api/chat/repository/ChatRoomRepository.java b/src/main/java/com/example/api/chat/repository/ChatRoomRepository.java new file mode 100644 index 00000000..57d13a24 --- /dev/null +++ b/src/main/java/com/example/api/chat/repository/ChatRoomRepository.java @@ -0,0 +1,9 @@ +package com.example.api.chat.repository; + +import com.example.api.domain.ChatRoom; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface ChatRoomRepository extends JpaRepository { +} diff --git a/src/main/java/com/example/api/chat/repository/CustomChatRepository.java b/src/main/java/com/example/api/chat/repository/CustomChatRepository.java new file mode 100644 index 00000000..544045ae --- /dev/null +++ b/src/main/java/com/example/api/chat/repository/CustomChatRepository.java @@ -0,0 +1,4 @@ +package com.example.api.chat.repository; + +public interface CustionRepository { +} diff --git a/src/main/java/com/example/api/chat/repository/CustomChatRepositoryImpl.java b/src/main/java/com/example/api/chat/repository/CustomChatRepositoryImpl.java new file mode 100644 index 00000000..a19aa8ea --- /dev/null +++ b/src/main/java/com/example/api/chat/repository/CustomChatRepositoryImpl.java @@ -0,0 +1,4 @@ +package com.example.api.chat.repository; + +public class CustomChatReposityImpl { +} diff --git a/src/main/java/com/example/api/chat/service/ChatService.java b/src/main/java/com/example/api/chat/service/ChatService.java new file mode 100644 index 00000000..4d8d5b72 --- /dev/null +++ b/src/main/java/com/example/api/chat/service/ChatService.java @@ -0,0 +1,52 @@ +package com.example.api.chat.service; + +import com.example.api.chat.controller.dto.request.ChatSendRequest; +import com.example.api.chat.repository.ChatRepository; +import com.example.api.chat.repository.ChatRoomRepository; +import com.example.api.chat.service.model.ChatSender; +import com.example.api.domain.Chat; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +public class ChatService { + private final ChatRepository chatRepository; + private final ChatRoomRepository chatRoomRepository; + private final ChatSender chatSender; + + @Transactional + public String sendMessage(ChatSendRequest request) { + Chat chat = saveChat(request); + messageSender.send(savedMessage); + return "메세지 전송 성공~"; + } + + private Chat saveChat(ChatSendRequest request) { + Chat chat = Chat.from(request); + return messageRepository.save(message); + } + + @Transactional + public String readMessages(ReadRequest request) { + messageRepository.markMessagesAsRead(request.roomId(), request.memberId()); + messageSender.sendReadResponse(request); + return "메세지 읽기 성공~"; + } + + public ChatSummaryResponse getChatSummaries(Member loginMember) { + List chatRooms = chatRoomRepository.findByMemberId(loginMember.getId()); + List chatRoomIds = chatRooms.stream().map(ChatRoom::getChatRoomId).toList(); + List chatMessageSummaries = messageRepository.aggregateMessageSummaries(chatRoomIds, loginMember.getId()); + return new ChatSummaryResponse(chatRooms, chatMessageSummaries); + } + + public List getMessages(Long chatRoomId, String lastMessageId) { + return messageRepository.findMessages(chatRoomId,lastMessageId); + } + + public List getChatRooms(Long memberId) { + return chatRoomRepository.findByMemberId(memberId); + } +} diff --git a/src/main/java/com/example/api/chat/service/model/ChatSender.java b/src/main/java/com/example/api/chat/service/model/ChatSender.java new file mode 100644 index 00000000..78110e5f --- /dev/null +++ b/src/main/java/com/example/api/chat/service/model/ChatSender.java @@ -0,0 +1,23 @@ +package com.example.api.chat.service.model; + +import com.example.api.chat.controller.dto.request.ReadRequest; +import com.example.api.chat.controller.dto.response.ReadResponse; +import lombok.RequiredArgsConstructor; +import org.springframework.messaging.Message; +import org.springframework.messaging.simp.SimpMessagingTemplate; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class ChatSender { + private final SimpMessagingTemplate messagingTemplate; + + public void send(Message message) { + messagingTemplate.convertAndSend("/room/"+ message.getRoomId(), message); + } + + public void sendReadResponse(ReadRequest request) { + ReadResponse readResponse = new ReadResponse(request.userId()); + messagingTemplate.convertAndSend("/room/" + request.roomId(), readResponse); + } +} diff --git a/src/main/java/com/example/api/global/config/WebSocketConfig.java b/src/main/java/com/example/api/global/config/WebSocketConfig.java new file mode 100644 index 00000000..456e46cf --- /dev/null +++ b/src/main/java/com/example/api/global/config/WebSocketConfig.java @@ -0,0 +1,4 @@ +package com.example.api.global.config; + +public class WebSocketConfig { +} From 3d9ddd0c3fdb4a37c3d4e1e9d7e9fc6164972997 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Tue, 19 Nov 2024 21:33:56 +0900 Subject: [PATCH 120/276] =?UTF-8?q?#27=20=EC=B1=84=ED=8C=85=20=EC=A0=84?= =?UTF-8?q?=EC=86=A1=ED=95=98=EA=B8=B0=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84,=20=EC=B1=84=ED=8C=85=20=EC=9D=BD=EA=B8=B0,=20?= =?UTF-8?q?=EC=B1=84=ED=8C=85=20=EC=B6=95=EC=95=BD=20=EC=A0=95=EB=B3=B4=20?= =?UTF-8?q?=EC=84=9C=EB=B9=84=EC=8A=A4=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/chat/controller/ChatController.java | 5 +- .../chat/controller/dto/RequestUserId.java | 2 +- .../dto/response/ChatSummaryResponse.java | 7 +- .../example/api/chat/domain/ChatSummary.java | 6 +- .../api/chat/repository/ChatRepository.java | 5 +- .../chat/repository/ChatRoomRepository.java | 7 ++ .../chat/repository/CustomChatRepository.java | 10 ++- .../repository/CustomChatRepositoryImpl.java | 78 ++++++++++++++++++- .../example/api/chat/service/ChatService.java | 37 +++++---- .../api/chat/service/model/ChatSender.java | 6 +- .../api/global/config/WebSocketConfig.java | 23 +++++- 11 files changed, 156 insertions(+), 30 deletions(-) diff --git a/src/main/java/com/example/api/chat/controller/ChatController.java b/src/main/java/com/example/api/chat/controller/ChatController.java index 75e0422b..4ac0fe9b 100644 --- a/src/main/java/com/example/api/chat/controller/ChatController.java +++ b/src/main/java/com/example/api/chat/controller/ChatController.java @@ -13,8 +13,7 @@ public class ChatController { private final ChatService chatService; @MessageMapping("/send") - public void sendMessage(@Payload ChatSendRequest messageRequest) { - String result = chatService.sendMessage(messageRequest); - System.out.println("result = " + result); + public void sendMessage(@Payload ChatSendRequest chatRequest) { + chatService.sendChat(chatRequest); } } diff --git a/src/main/java/com/example/api/chat/controller/dto/RequestUserId.java b/src/main/java/com/example/api/chat/controller/dto/RequestUserId.java index 665a147b..ab6deaed 100644 --- a/src/main/java/com/example/api/chat/controller/dto/RequestUserId.java +++ b/src/main/java/com/example/api/chat/controller/dto/RequestUserId.java @@ -1,4 +1,4 @@ package com.example.api.chat.controller.dto; -public record requestUserId() { +public record RequestUserId(Long userId) { } diff --git a/src/main/java/com/example/api/chat/controller/dto/response/ChatSummaryResponse.java b/src/main/java/com/example/api/chat/controller/dto/response/ChatSummaryResponse.java index 2c1545f3..230af4e8 100644 --- a/src/main/java/com/example/api/chat/controller/dto/response/ChatSummaryResponse.java +++ b/src/main/java/com/example/api/chat/controller/dto/response/ChatSummaryResponse.java @@ -1,4 +1,9 @@ package com.example.api.chat.controller.dto.response; -public class ChatSummaryResponse { +import com.example.api.chat.domain.ChatSummary; +import com.example.api.domain.ChatRoom; + +import java.util.List; + +public record ChatSummaryResponse(List chatRooms, List chatSummaries) { } diff --git a/src/main/java/com/example/api/chat/domain/ChatSummary.java b/src/main/java/com/example/api/chat/domain/ChatSummary.java index 12ebc43c..d641a695 100644 --- a/src/main/java/com/example/api/chat/domain/ChatSummary.java +++ b/src/main/java/com/example/api/chat/domain/ChatSummary.java @@ -1,4 +1,6 @@ -package com.example.api.chat.controller.dto.response; +package com.example.api.chat.domain; -public record ChatSummary() { +import java.util.Date; + +public record ChatSummary(Long roomId, String lastMessageContent, Date lastMessageTime, Long numberOfUnreadMessages) { } diff --git a/src/main/java/com/example/api/chat/repository/ChatRepository.java b/src/main/java/com/example/api/chat/repository/ChatRepository.java index ccac91c7..ab3f83ad 100644 --- a/src/main/java/com/example/api/chat/repository/ChatRepository.java +++ b/src/main/java/com/example/api/chat/repository/ChatRepository.java @@ -1,9 +1,12 @@ package com.example.api.chat.repository; +import com.example.api.chat.domain.ChatSummary; import com.example.api.domain.Chat; import org.springframework.data.mongodb.repository.MongoRepository; import org.springframework.stereotype.Repository; +import java.util.List; + @Repository -public interface ChatRepository extends MongoRepository { +public interface ChatRepository extends MongoRepository, CustomChatRepository { } diff --git a/src/main/java/com/example/api/chat/repository/ChatRoomRepository.java b/src/main/java/com/example/api/chat/repository/ChatRoomRepository.java index 57d13a24..b178b6b4 100644 --- a/src/main/java/com/example/api/chat/repository/ChatRoomRepository.java +++ b/src/main/java/com/example/api/chat/repository/ChatRoomRepository.java @@ -2,8 +2,15 @@ import com.example.api.domain.ChatRoom; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; +import java.util.List; + @Repository public interface ChatRoomRepository extends JpaRepository { + @Query("select c from ChatRoom c join c.offerEmployment oe " + + "where oe.employee.accountId = :userId or oe.business.employer.accountId = :userId") + List findByUserId(@Param("userId") Long userId); } diff --git a/src/main/java/com/example/api/chat/repository/CustomChatRepository.java b/src/main/java/com/example/api/chat/repository/CustomChatRepository.java index 544045ae..d5206d47 100644 --- a/src/main/java/com/example/api/chat/repository/CustomChatRepository.java +++ b/src/main/java/com/example/api/chat/repository/CustomChatRepository.java @@ -1,4 +1,12 @@ package com.example.api.chat.repository; -public interface CustionRepository { +import com.example.api.chat.domain.ChatSummary; +import com.example.api.domain.Chat; + +import java.util.List; + +public interface CustomChatRepository { + void markChatsAsRead(Long chatRoomId, Long readBy); + List findChats(Long chatRoomId, String lastChatId); + List aggregateChatSummaries(List chatRoomIds, Long memberId); } diff --git a/src/main/java/com/example/api/chat/repository/CustomChatRepositoryImpl.java b/src/main/java/com/example/api/chat/repository/CustomChatRepositoryImpl.java index a19aa8ea..d12a6baa 100644 --- a/src/main/java/com/example/api/chat/repository/CustomChatRepositoryImpl.java +++ b/src/main/java/com/example/api/chat/repository/CustomChatRepositoryImpl.java @@ -1,4 +1,78 @@ package com.example.api.chat.repository; -public class CustomChatReposityImpl { -} +import com.example.api.chat.domain.ChatSummary; +import com.example.api.domain.Chat; +import lombok.RequiredArgsConstructor; +import org.bson.types.ObjectId; +import org.springframework.data.domain.Sort; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.aggregation.Aggregation; +import org.springframework.data.mongodb.core.aggregation.AggregationOperation; +import org.springframework.data.mongodb.core.aggregation.AggregationResults; +import org.springframework.data.mongodb.core.aggregation.ConditionalOperators; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.data.mongodb.core.query.Update; +import org.springframework.stereotype.Repository; + +import java.util.ArrayList; +import java.util.List; + +@Repository +@RequiredArgsConstructor +public class CustomChatRepositoryImpl implements CustomChatRepository { + private final MongoTemplate mongoTemplate; + + + @Override + public void markChatsAsRead(Long chatRoomId, Long readBy) { + Query query = new Query(Criteria.where("roomId").is(chatRoomId) + .and("receiverId").is(readBy) + .and("isRead").is(false)); + Update update = new Update(); + update.set("isRead", true); + mongoTemplate.updateMulti(query, update, Chat.class); + } + + @Override + public List findChats(Long chatRoomID, String lastChatId) { + Query query = new Query( + Criteria.where("roomId").is(chatRoomID) + ).with(Sort.by(Sort.Direction.DESC, "_id")).limit(100); + + if (lastChatId != null) { + query.addCriteria(Criteria.where("_id").lt(new ObjectId(lastChatId))); + } + + return mongoTemplate.find(query, Chat.class); + } + + + + @Override + public List aggregateChatSummaries(List roomIds, Long memberId) { + Criteria matchCriteria = Criteria.where("roomId").in(roomIds); + AggregationOperation match = Aggregation.match(matchCriteria); + + AggregationOperation sort = Aggregation.sort(Sort.Direction.DESC, "sendTime"); + + AggregationOperation group = Aggregation.group("roomId") + .first("roomId").as("roomId") + .first("content").as("lastChatContent") + .first("sendTime").as("lastChatTime") + .sum(ConditionalOperators + .when(new Criteria().andOperator( + Criteria.where("receiverId").is(memberId), + Criteria.where("isRead").is(false) + )) + .then(1) + .otherwise(0)) + .as("numberOfUnreadChats"); + + Aggregation aggregation = Aggregation.newAggregation(match, sort, group); + + AggregationResults results = mongoTemplate.aggregate( + aggregation, "chat", ChatSummary.class); + return new ArrayList<>(results.getMappedResults()); + } +} \ No newline at end of file diff --git a/src/main/java/com/example/api/chat/service/ChatService.java b/src/main/java/com/example/api/chat/service/ChatService.java index 4d8d5b72..a3ed0ab3 100644 --- a/src/main/java/com/example/api/chat/service/ChatService.java +++ b/src/main/java/com/example/api/chat/service/ChatService.java @@ -1,14 +1,21 @@ package com.example.api.chat.service; +import com.example.api.chat.controller.dto.RequestUserId; import com.example.api.chat.controller.dto.request.ChatSendRequest; +import com.example.api.chat.controller.dto.request.ReadRequest; +import com.example.api.chat.controller.dto.response.ChatSummaryResponse; +import com.example.api.chat.domain.ChatSummary; import com.example.api.chat.repository.ChatRepository; import com.example.api.chat.repository.ChatRoomRepository; import com.example.api.chat.service.model.ChatSender; import com.example.api.domain.Chat; +import com.example.api.domain.ChatRoom; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.List; + @Service @RequiredArgsConstructor public class ChatService { @@ -17,36 +24,36 @@ public class ChatService { private final ChatSender chatSender; @Transactional - public String sendMessage(ChatSendRequest request) { - Chat chat = saveChat(request); - messageSender.send(savedMessage); + public String sendChat(ChatSendRequest request) { + Chat savedChat = saveChat(request); + chatSender.send(savedChat); return "메세지 전송 성공~"; } private Chat saveChat(ChatSendRequest request) { Chat chat = Chat.from(request); - return messageRepository.save(message); + return chatRepository.save(chat); } @Transactional - public String readMessages(ReadRequest request) { - messageRepository.markMessagesAsRead(request.roomId(), request.memberId()); - messageSender.sendReadResponse(request); + public String readChats(ReadRequest request) { + chatRepository.markChatsAsRead(request.roomId(), request.userId()); + chatSender.sendReadResponse(request); return "메세지 읽기 성공~"; } - public ChatSummaryResponse getChatSummaries(Member loginMember) { - List chatRooms = chatRoomRepository.findByMemberId(loginMember.getId()); + public ChatSummaryResponse getChatSummaries(RequestUserId requestUserId) { + List chatRooms = chatRoomRepository.findByUserId(requestUserId.userId()); List chatRoomIds = chatRooms.stream().map(ChatRoom::getChatRoomId).toList(); - List chatMessageSummaries = messageRepository.aggregateMessageSummaries(chatRoomIds, loginMember.getId()); - return new ChatSummaryResponse(chatRooms, chatMessageSummaries); + List chatSummaries = chatRepository.aggregateChatSummaries(chatRoomIds, requestUserId.userId()); + return new ChatSummaryResponse(chatRooms, chatSummaries); } - public List getMessages(Long chatRoomId, String lastMessageId) { - return messageRepository.findMessages(chatRoomId,lastMessageId); + public List getChats(Long chatRoomId, String lastChatId) { + return chatRepository.findChats(chatRoomId,lastChatId); } - public List getChatRooms(Long memberId) { - return chatRoomRepository.findByMemberId(memberId); + public List getChatRooms(Long userId) { + return chatRoomRepository.findByUserId(userId); } } diff --git a/src/main/java/com/example/api/chat/service/model/ChatSender.java b/src/main/java/com/example/api/chat/service/model/ChatSender.java index 78110e5f..e827d378 100644 --- a/src/main/java/com/example/api/chat/service/model/ChatSender.java +++ b/src/main/java/com/example/api/chat/service/model/ChatSender.java @@ -2,8 +2,8 @@ import com.example.api.chat.controller.dto.request.ReadRequest; import com.example.api.chat.controller.dto.response.ReadResponse; +import com.example.api.domain.Chat; import lombok.RequiredArgsConstructor; -import org.springframework.messaging.Message; import org.springframework.messaging.simp.SimpMessagingTemplate; import org.springframework.stereotype.Component; @@ -12,8 +12,8 @@ public class ChatSender { private final SimpMessagingTemplate messagingTemplate; - public void send(Message message) { - messagingTemplate.convertAndSend("/room/"+ message.getRoomId(), message); + public void send(Chat chat) { + messagingTemplate.convertAndSend("/room/"+ chat.getRoomId(), chat); } public void sendReadResponse(ReadRequest request) { diff --git a/src/main/java/com/example/api/global/config/WebSocketConfig.java b/src/main/java/com/example/api/global/config/WebSocketConfig.java index 456e46cf..7c574c9e 100644 --- a/src/main/java/com/example/api/global/config/WebSocketConfig.java +++ b/src/main/java/com/example/api/global/config/WebSocketConfig.java @@ -1,4 +1,25 @@ package com.example.api.global.config; -public class WebSocketConfig { +import org.springframework.context.annotation.Configuration; +import org.springframework.messaging.simp.config.MessageBrokerRegistry; +import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker; +import org.springframework.web.socket.config.annotation.StompEndpointRegistry; +import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer; + +@Configuration +@EnableWebSocketMessageBroker +public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { + + @Override + public void configureMessageBroker(MessageBrokerRegistry config) { + config.enableSimpleBroker("/room"); + config.setApplicationDestinationPrefixes("/chat"); + } + + @Override + public void registerStompEndpoints(StompEndpointRegistry registry) { + registry.addEndpoint("/ws") + .setAllowedOriginPatterns("*") + .withSockJS(); + } } From 5220e8fd41985d0666e8ef78e4c55e94bf634443 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Wed, 20 Nov 2024 00:17:10 +0900 Subject: [PATCH 121/276] =?UTF-8?q?#27=20=EB=AA=BD=EA=B3=A0=20DB=20Configu?= =?UTF-8?q?ration=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application.properties | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 6e9b53b2..986de5c9 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -21,3 +21,9 @@ spring.h2.console.path=/h2-console # Logging (Optional) logging.level.org.hibernate.SQL=DEBUG logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE + +# Mongo Database Configuration +spring.data.mongodb.host=localhost +spring.data.mongodb.port=27017 +spring.data.mongodb.database=chatdb + From ad73c43f06d60e0682df53ff777e1405437480bd Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Wed, 20 Nov 2024 00:19:11 +0900 Subject: [PATCH 122/276] =?UTF-8?q?#27=20=EC=B1=84=ED=8C=85=20=EC=A0=84?= =?UTF-8?q?=EC=86=A1,=20=EC=9D=BD=EA=B8=B0,=20=EC=B1=84=ED=8C=85=EB=B0=A9?= =?UTF-8?q?=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EC=A1=B0=ED=9A=8C(=EC=B1=84?= =?UTF-8?q?=ED=8C=85=20=EC=B6=95=EC=95=BD=20=EC=A0=95=EB=B3=B4),=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=95=20=EC=B1=84=ED=8C=85=20=EC=9A=94?= =?UTF-8?q?=EC=B2=AD=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/chat/controller/ChatController.java | 25 ++++++++++++++++++- .../chat/controller/dto/RequestUserId.java | 4 --- .../controller/dto/request/UserIdRequest.java | 4 +++ .../example/api/chat/service/ChatService.java | 6 +++-- 4 files changed, 32 insertions(+), 7 deletions(-) delete mode 100644 src/main/java/com/example/api/chat/controller/dto/RequestUserId.java create mode 100644 src/main/java/com/example/api/chat/controller/dto/request/UserIdRequest.java diff --git a/src/main/java/com/example/api/chat/controller/ChatController.java b/src/main/java/com/example/api/chat/controller/ChatController.java index 4ac0fe9b..6785dae0 100644 --- a/src/main/java/com/example/api/chat/controller/ChatController.java +++ b/src/main/java/com/example/api/chat/controller/ChatController.java @@ -1,11 +1,18 @@ package com.example.api.chat.controller; import com.example.api.chat.controller.dto.request.ChatSendRequest; +import com.example.api.chat.controller.dto.request.ReadRequest; +import com.example.api.chat.controller.dto.request.UserIdRequest; +import com.example.api.chat.controller.dto.response.ChatSummaryResponse; import com.example.api.chat.service.ChatService; +import com.example.api.domain.Chat; import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; import org.springframework.messaging.handler.annotation.MessageMapping; import org.springframework.messaging.handler.annotation.Payload; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; + +import java.util.List; @RestController @RequiredArgsConstructor @@ -16,4 +23,20 @@ public class ChatController { public void sendMessage(@Payload ChatSendRequest chatRequest) { chatService.sendChat(chatRequest); } + + @MessageMapping("/read") + public void readMessage(@Payload ReadRequest readRequest) { + chatService.readChats(readRequest); + } + + @GetMapping("/chat/summaries") + public ResponseEntity getChatSummaries(@RequestBody UserIdRequest userIdRequest) { + return ResponseEntity.ok(chatService.getChatSummaries(userIdRequest)); + } + + @GetMapping("/chat/room/{roomId}/chats") + public ResponseEntity> getMessages(@PathVariable("roomId") Long chatRoomId, + @RequestParam(value = "lastChatId", required = false) String chatId) { + return ResponseEntity.ok(chatService.getChats(chatRoomId,chatId)); + } } diff --git a/src/main/java/com/example/api/chat/controller/dto/RequestUserId.java b/src/main/java/com/example/api/chat/controller/dto/RequestUserId.java deleted file mode 100644 index ab6deaed..00000000 --- a/src/main/java/com/example/api/chat/controller/dto/RequestUserId.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.example.api.chat.controller.dto; - -public record RequestUserId(Long userId) { -} diff --git a/src/main/java/com/example/api/chat/controller/dto/request/UserIdRequest.java b/src/main/java/com/example/api/chat/controller/dto/request/UserIdRequest.java new file mode 100644 index 00000000..18e2316c --- /dev/null +++ b/src/main/java/com/example/api/chat/controller/dto/request/UserIdRequest.java @@ -0,0 +1,4 @@ +package com.example.api.chat.controller.dto.request; + +public record UserIdRequest(Long userId) { +} diff --git a/src/main/java/com/example/api/chat/service/ChatService.java b/src/main/java/com/example/api/chat/service/ChatService.java index a3ed0ab3..25e3205f 100644 --- a/src/main/java/com/example/api/chat/service/ChatService.java +++ b/src/main/java/com/example/api/chat/service/ChatService.java @@ -1,6 +1,6 @@ package com.example.api.chat.service; -import com.example.api.chat.controller.dto.RequestUserId; +import com.example.api.chat.controller.dto.request.UserIdRequest; import com.example.api.chat.controller.dto.request.ChatSendRequest; import com.example.api.chat.controller.dto.request.ReadRequest; import com.example.api.chat.controller.dto.response.ChatSummaryResponse; @@ -42,13 +42,15 @@ public String readChats(ReadRequest request) { return "메세지 읽기 성공~"; } - public ChatSummaryResponse getChatSummaries(RequestUserId requestUserId) { + @Transactional(readOnly = true) + public ChatSummaryResponse getChatSummaries(UserIdRequest requestUserId) { List chatRooms = chatRoomRepository.findByUserId(requestUserId.userId()); List chatRoomIds = chatRooms.stream().map(ChatRoom::getChatRoomId).toList(); List chatSummaries = chatRepository.aggregateChatSummaries(chatRoomIds, requestUserId.userId()); return new ChatSummaryResponse(chatRooms, chatSummaries); } + @Transactional(readOnly = true) public List getChats(Long chatRoomId, String lastChatId) { return chatRepository.findChats(chatRoomId,lastChatId); } From 460f0d0dfeff4cd081607218254e1ece8cb90118 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Wed, 20 Nov 2024 00:20:00 +0900 Subject: [PATCH 123/276] =?UTF-8?q?#27=20=EC=B1=84=ED=8C=85=20=EC=A0=84?= =?UTF-8?q?=EC=86=A1=20=EB=B0=8F=20=EC=9D=BD=EA=B8=B0=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=84=B1=EA=B3=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/chat/service/ChatServiceTest.java | 95 +++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 src/test/java/com/example/api/chat/service/ChatServiceTest.java 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..09c6ffcb --- /dev/null +++ b/src/test/java/com/example/api/chat/service/ChatServiceTest.java @@ -0,0 +1,95 @@ +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 java.util.List; + + +@SpringBootTest() +@Transactional +@Rollback(false) +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); + } +} From 340353dfb94b1d501c5271797b76a45fde72a72f Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Wed, 20 Nov 2024 00:21:52 +0900 Subject: [PATCH 124/276] =?UTF-8?q?#27=20=EB=AA=BD=EA=B3=A0=20DB=EC=97=90?= =?UTF-8?q?=EC=84=9C=20ID=EA=B0=80=20Object=20=ED=83=80=EC=9E=85=20?= =?UTF-8?q?=EB=AC=B8=EC=9E=90=EC=97=B4=EC=9D=B4=EB=AF=80=EB=A1=9C=20Chat?= =?UTF-8?q?=20=EC=8B=9D=EB=B3=84=EC=9E=90=20ID=20String=20=ED=83=80?= =?UTF-8?q?=EC=9E=85=EC=9C=BC=EB=A1=9C=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/Chat.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/domain/Chat.java b/src/main/java/com/example/api/domain/Chat.java index 078a210a..9cb57b35 100644 --- a/src/main/java/com/example/api/domain/Chat.java +++ b/src/main/java/com/example/api/domain/Chat.java @@ -11,7 +11,7 @@ @Document(collection = "chat") public class Chat { @Id - private Long id; + private String id; private String content; private Long roomId; private Long senderId; From 414a5f846283c2f5f075509377e9360324eed9a5 Mon Sep 17 00:00:00 2001 From: yuna83 Date: Thu, 21 Nov 2024 21:41:00 +0900 Subject: [PATCH 125/276] =?UTF-8?q?#2=20feat(RegisterService):=20=ED=9A=8C?= =?UTF-8?q?=EC=9B=90=EA=B0=80=EC=9E=85=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 6 +++ .../com/example/api/auth/AuthRepository.java | 11 ++++ .../auth/register/Config/SecurityConfig.java | 29 +++++++++++ .../api/auth/register/RegisterController.java | 23 +++++++++ .../api/auth/register/RegisterService.java | 50 +++++++++++++++++++ .../auth/register/dto/RegisterRequest.java | 33 ++++++++++++ .../auth/register/dto/RegisterResponse.java | 11 ++++ .../com/example/api/exception/ErrorCode.java | 4 +- 8 files changed, 166 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/example/api/auth/AuthRepository.java create mode 100644 src/main/java/com/example/api/auth/register/Config/SecurityConfig.java create mode 100644 src/main/java/com/example/api/auth/register/RegisterController.java create mode 100644 src/main/java/com/example/api/auth/register/RegisterService.java create mode 100644 src/main/java/com/example/api/auth/register/dto/RegisterRequest.java create mode 100644 src/main/java/com/example/api/auth/register/dto/RegisterResponse.java diff --git a/build.gradle b/build.gradle index a2f03ade..b329d068 100644 --- a/build.gradle +++ b/build.gradle @@ -37,6 +37,12 @@ dependencies { // env 파일 읽도록 도와주는 라이브러리 implementation 'me.paulschwarz:spring-dotenv:4.0.0' + + //회원가입 어노테이션 사용 + implementation 'org.springframework.boot:spring-boot-starter-validation' + + //비밀번호 암호화 + implementation 'org.springframework.boot:spring-boot-starter-security' } tasks.named('test') { diff --git a/src/main/java/com/example/api/auth/AuthRepository.java b/src/main/java/com/example/api/auth/AuthRepository.java new file mode 100644 index 00000000..6306cb14 --- /dev/null +++ b/src/main/java/com/example/api/auth/AuthRepository.java @@ -0,0 +1,11 @@ +package com.example.api.auth; + +import com.example.api.domain.Account; +import org.springframework.data.jpa.repository.JpaRepository; +import java.util.Optional; +public interface AuthRepository extends JpaRepository { + Optional findByLoginId(String loginId); + boolean existsByLoginId(String loginId); + +} + diff --git a/src/main/java/com/example/api/auth/register/Config/SecurityConfig.java b/src/main/java/com/example/api/auth/register/Config/SecurityConfig.java new file mode 100644 index 00000000..1155e204 --- /dev/null +++ b/src/main/java/com/example/api/auth/register/Config/SecurityConfig.java @@ -0,0 +1,29 @@ +package com.example.api.auth.register.Config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.web.SecurityFilterChain; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; + +@Configuration +public class SecurityConfig { + + @Bean + public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { + http.csrf(csrf -> csrf.disable()) + .authorizeHttpRequests(authorize -> + authorize + .requestMatchers("/api/v1/auth/register").permitAll() + .anyRequest().authenticated() + ) + .formLogin(form -> form.defaultSuccessUrl("/").permitAll()); + + return http.build(); + } + + @Bean + public BCryptPasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } +} diff --git a/src/main/java/com/example/api/auth/register/RegisterController.java b/src/main/java/com/example/api/auth/register/RegisterController.java new file mode 100644 index 00000000..5e3a94b2 --- /dev/null +++ b/src/main/java/com/example/api/auth/register/RegisterController.java @@ -0,0 +1,23 @@ +package com.example.api.auth.register; + +import com.example.api.auth.register.dto.RegisterRequest; +import jakarta.validation.Valid; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/api/v1/auth/register") +public class RegisterController { + private final RegisterService registerService; + + public RegisterController(RegisterService registerService) { + this.registerService = registerService; + } + + @PostMapping + @ResponseStatus(HttpStatus.CREATED) + public String register(@Valid @RequestBody RegisterRequest request) { + registerService.register(request); + return "Registration successful"; + } +} diff --git a/src/main/java/com/example/api/auth/register/RegisterService.java b/src/main/java/com/example/api/auth/register/RegisterService.java new file mode 100644 index 00000000..ec7a6dcb --- /dev/null +++ b/src/main/java/com/example/api/auth/register/RegisterService.java @@ -0,0 +1,50 @@ +package com.example.api.auth.register; + +import com.example.api.auth.AuthRepository; +import com.example.api.auth.register.dto.RegisterRequest; +import com.example.api.domain.Account; +import com.example.api.exception.BusinessException; +import com.example.api.exception.ErrorCode; +import lombok.RequiredArgsConstructor; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.stereotype.Service; + +import java.util.Date; + +@RequiredArgsConstructor +@Service +public class RegisterService { + private final AuthRepository authRepository; + private final BCryptPasswordEncoder passwordEncoder; + + public void register(RegisterRequest request) { + // 중복 로그인 ID 확인 + validateDuplicateLoginId(request.getLoginId()); + + // Account 엔티티 생성 (빌더 사용하지 않음) + Account account = new Account(); + account.setLoginId(request.getLoginId()); + account.setPassword(passwordEncoder.encode(request.getPassword())); // 비밀번호 암호화 + account.setName(request.getName()); + account.setEmail(request.getEmail()); + account.setSex(request.getSex()); + account.setAge(request.getAge()); + account.setPhoneNumber(request.getPhoneNumber()); + account.setNickname(request.getNickname()); + account.setRegisteredDatetime(new Date()); // 현재 시간 + account.setStarPoint(0.0f); // 초기값 설정 + account.setWorkCount(0); // 초기값 설정 + account.setDeleted(false); // 초기값 설정 + + // 엔티티 저장 + authRepository.save(account); + } + + // 중복 로그인 ID 검증 + private void validateDuplicateLoginId(String loginId) { + if (authRepository.existsByLoginId(loginId)) { + throw new BusinessException(ErrorCode.DUPLICATE_LOGIN_ID); + } + } +} + diff --git a/src/main/java/com/example/api/auth/register/dto/RegisterRequest.java b/src/main/java/com/example/api/auth/register/dto/RegisterRequest.java new file mode 100644 index 00000000..a4eb721e --- /dev/null +++ b/src/main/java/com/example/api/auth/register/dto/RegisterRequest.java @@ -0,0 +1,33 @@ +package com.example.api.auth.register.dto; + +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotBlank; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class RegisterRequest { + @NotBlank + private String loginId; + + @NotBlank + private String password; + + @NotBlank + private String name; + + @NotBlank + @Email + private String email; + + @NotBlank + private String sex; + + private int age; + + private String phoneNumber; + + private String nickname; + +} diff --git a/src/main/java/com/example/api/auth/register/dto/RegisterResponse.java b/src/main/java/com/example/api/auth/register/dto/RegisterResponse.java new file mode 100644 index 00000000..3b0200d9 --- /dev/null +++ b/src/main/java/com/example/api/auth/register/dto/RegisterResponse.java @@ -0,0 +1,11 @@ +package com.example.api.auth.register.dto; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor +public class RegisterResponse { + private final String message; + private final String loginId; +} diff --git a/src/main/java/com/example/api/exception/ErrorCode.java b/src/main/java/com/example/api/exception/ErrorCode.java index e69e52ff..760e510f 100644 --- a/src/main/java/com/example/api/exception/ErrorCode.java +++ b/src/main/java/com/example/api/exception/ErrorCode.java @@ -5,7 +5,8 @@ @Getter public enum ErrorCode { - SERVER_EXCEPTION(HttpStatus.INTERNAL_SERVER_ERROR, "-000", "서버 에러"); + SERVER_EXCEPTION(HttpStatus.INTERNAL_SERVER_ERROR, "-000", "서버 에러"), + DUPLICATE_LOGIN_ID(HttpStatus.BAD_REQUEST, "-001", "중복된 ID입니다."); private final HttpStatus httpStatus; private final String errorCode; @@ -17,3 +18,4 @@ public enum ErrorCode { this.errorDescription = errorDescription; } } + From 8ba74ee3727b44e324e5f5a462290b336f3d6994 Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Sun, 1 Dec 2024 23:19:32 +0900 Subject: [PATCH 126/276] =?UTF-8?q?#2=20env=20=ED=8C=8C=EC=9D=BC=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 4c75e424..ab064487 100644 --- a/.gitignore +++ b/.gitignore @@ -36,4 +36,5 @@ out/ ### VS Code ### .vscode/ +### .env ### .env \ No newline at end of file From 4fb6c96ce71a595532498f1f67038e3d24c58bb6 Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Sun, 1 Dec 2024 23:23:57 +0900 Subject: [PATCH 127/276] =?UTF-8?q?#2=20=EC=9D=B4=EB=A9=94=C3=AC=C2=9D(?= =?UTF-8?q?=C2=BC,=20=EB=B3=B4=EC=95=88=20=EC=84=A4=EC=A0=95=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/global/config/EmailConfig.java | 75 +++++++++++++++++++ .../api/global/config/SecurityConfig.java | 30 ++++++++ .../global/config/resolver/ValidEmail.java | 15 ++++ 3 files changed, 120 insertions(+) create mode 100644 src/main/java/com/example/api/global/config/EmailConfig.java create mode 100644 src/main/java/com/example/api/global/config/SecurityConfig.java create mode 100644 src/main/java/com/example/api/global/config/resolver/ValidEmail.java diff --git a/src/main/java/com/example/api/global/config/EmailConfig.java b/src/main/java/com/example/api/global/config/EmailConfig.java new file mode 100644 index 00000000..ede330ee --- /dev/null +++ b/src/main/java/com/example/api/global/config/EmailConfig.java @@ -0,0 +1,75 @@ +package com.example.api.global.config; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.mail.javamail.JavaMailSenderImpl; + +import java.util.Properties; + +@Configuration +public class EmailConfig { + + @Value("${spring.mail.host}") + private String host; + + @Value("${spring.mail.port}") + private int port; + + @Value("${spring.mail.username}") + private String username; + + @Value("${spring.mail.password}") + private String password; + + @Value("${spring.mail.protocol}") + private String protocol ; + + @Value("${spring.mail.properties.mail.smtp.auth}") + private boolean auth; + + @Value("${spring.mail.properties.mail.smtp.starttls.enable}") + private boolean starttlsEnable; + + @Value("${spring.mail.properties.mail.smtp.starttls.required}") + private boolean starttlsRequired; + + @Value("${spring.mail.properties.mail.smtp.connectiontimeout}") + private int connectionTimeout; + + @Value("${spring.mail.properties.mail.smtp.timeout}") + private int timeout; + + @Value("${spring.mail.properties.mail.smtp.writetimeout}") + private int writeTimeout; + + @Value("${spring.mail.auth-code-expiration-millis}") + private int expirationMillis; + + @Bean + public JavaMailSender javaMailSender() { + JavaMailSenderImpl mailSender = new JavaMailSenderImpl(); + mailSender.setHost(host); + mailSender.setPort(port); + mailSender.setUsername(username); + mailSender.setPassword(password); + mailSender.setDefaultEncoding("UTF-8"); + mailSender.setJavaMailProperties(getMailProperties()); + + return mailSender; + } + + private Properties getMailProperties() { + Properties properties = new Properties(); + properties.put("mail.smtp.auth", auth); + properties.put("mail.smtp.starttls.enable", starttlsEnable); + properties.put("mail.smtp.starttls.required", starttlsRequired); + properties.put("mail.smtp.connectiontimeout", connectionTimeout); + properties.put("mail.smtp.timeout", timeout); + properties.put("mail.smtp.writetimeout", writeTimeout); + properties.put("mail.smtp.expirationMillis", expirationMillis); + + return properties; + } +} \ No newline at end of file diff --git a/src/main/java/com/example/api/global/config/SecurityConfig.java b/src/main/java/com/example/api/global/config/SecurityConfig.java new file mode 100644 index 00000000..5e91fe44 --- /dev/null +++ b/src/main/java/com/example/api/global/config/SecurityConfig.java @@ -0,0 +1,30 @@ +package com.example.api.global.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.web.SecurityFilterChain; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; + +@Configuration +public class SecurityConfig { + + @Bean + public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { + http.csrf(csrf -> csrf.disable()) + .authorizeHttpRequests(authorize -> + authorize + .requestMatchers("/api/v1/auth/register").permitAll() + .anyRequest().authenticated() + ) + .formLogin(form -> form.defaultSuccessUrl("/").permitAll()); + + return http.build(); + } + + @Bean + public PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } +} diff --git a/src/main/java/com/example/api/global/config/resolver/ValidEmail.java b/src/main/java/com/example/api/global/config/resolver/ValidEmail.java new file mode 100644 index 00000000..480a338c --- /dev/null +++ b/src/main/java/com/example/api/global/config/resolver/ValidEmail.java @@ -0,0 +1,15 @@ +package com.example.api.global.config.resolver; + +import com.example.api.global.validator.ValidEmailValidator; +import jakarta.validation.Constraint; +import jakarta.validation.Payload; + +import java.lang.annotation.*; + +@Target({ElementType.FIELD, ElementType.PARAMETER}) +@Retention(RetentionPolicy.RUNTIME) +@Constraint(validatedBy = { ValidEmailValidator.class }) +@Documented +public @interface ValidEmail { + String message() default "이메일이 유효하지 않습니다."; +} From f333aae242c785afe25d1bdfddafff37e66a4313 Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Sun, 1 Dec 2024 23:24:46 +0900 Subject: [PATCH 128/276] =?UTF-8?q?#2=20=EC=9D=B4=EB=A9=94=EC=9D=BC=20?= =?UTF-8?q?=EC=9C=A0=ED=9A=A8=EC=84=B1=20=EA=B2=80=EC=82=AC=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../global/validator/ValidEmailValidator.java | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 src/main/java/com/example/api/global/validator/ValidEmailValidator.java diff --git a/src/main/java/com/example/api/global/validator/ValidEmailValidator.java b/src/main/java/com/example/api/global/validator/ValidEmailValidator.java new file mode 100644 index 00000000..640df848 --- /dev/null +++ b/src/main/java/com/example/api/global/validator/ValidEmailValidator.java @@ -0,0 +1,34 @@ +package com.example.api.global.validator; + +import com.example.api.global.config.resolver.ValidEmail; +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; + +import java.net.UnknownHostException; +import java.util.regex.Pattern; + +public class ValidEmailValidator implements ConstraintValidator { + private static final String EMAIL_REGEX = "[a-zA-Z0-9._%+!#$&'*/=?^`{|}~]+@[a-zA-Z0-9.\\-]+\\.[a-zA-Z]{2,}$"; + + @Override + public boolean isValid(String value, ConstraintValidatorContext context) { + // 이메일이 null이거나, 공란인지 확인 + if (value == null || value.isBlank()) { + return false; + } + + // 기본 이메일 형식 확인 + if (!Pattern.matches(EMAIL_REGEX, value)) { + return false; + } + + // 도메인 유효성 확인 (간단한 예) + try { + String domain = value.substring(value.indexOf("@") + 1); + java.net.InetAddress.getByName(domain); + return true; + } catch (UnknownHostException e) { + return false; + } + } +} From 3f81d0ea9fec934b4e686413e405a8a1a793b9de Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Sun, 1 Dec 2024 23:25:45 +0900 Subject: [PATCH 129/276] =?UTF-8?q?#2=20=ED=9A=8C=EC=9B=90=EA=B0=80?= =?UTF-8?q?=EC=9E=85=20=EB=B0=8F=20=EC=9D=B4=EB=A9=94=EC=9D=BC=20=EC=A0=84?= =?UTF-8?q?=EC=86=A1=20=EC=9A=94=EC=B2=AD,=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EA=B2=80=EC=A6=9D=20=EC=9A=94=EC=B2=AD=20=EC=BB=A8=ED=8A=B8?= =?UTF-8?q?=EB=A1=A4=EB=9F=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../account/controller/AccountController.java | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 src/main/java/com/example/api/account/controller/AccountController.java diff --git a/src/main/java/com/example/api/account/controller/AccountController.java b/src/main/java/com/example/api/account/controller/AccountController.java new file mode 100644 index 00000000..7ce2617e --- /dev/null +++ b/src/main/java/com/example/api/account/controller/AccountController.java @@ -0,0 +1,38 @@ +package com.example.api.account.controller; + +import com.example.api.account.controller.dto.request.EmailCodeRequestDto; +import com.example.api.account.controller.dto.request.EmailRequestDto; +import com.example.api.account.domain.Code; +import com.example.api.account.service.AccountService; +import com.example.api.account.controller.dto.request.SignUpRequestDto; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/api/v1/account") +@RequiredArgsConstructor +public class AccountController { + private final AccountService signUpService; + + @PostMapping("/email/code") + public ResponseEntity sendEmailCode(@Valid @RequestBody final EmailRequestDto request) { + Code code = signUpService.sendEmail(request); + String successMessage = signUpService.saveCode(code); + return ResponseEntity.ok(successMessage); + } + + @PostMapping("/email/verification") + public ResponseEntity verifyEmail(@Valid @RequestBody final EmailCodeRequestDto request) { + String successMessage = signUpService.verifyEmail(request); + return ResponseEntity.ok(successMessage); + } + + @PostMapping("/sign-up") + public ResponseEntity signUp(@Valid @RequestBody final SignUpRequestDto request) { + String successMessage = signUpService.signUp(request); + return ResponseEntity.status(HttpStatus.CREATED).body(successMessage); + } +} From fef24ab6e588f043e71515753a6dad778670c867 Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Sun, 1 Dec 2024 23:26:33 +0900 Subject: [PATCH 130/276] =?UTF-8?q?#2=20=ED=9A=8C=EC=9B=90=EA=B0=80?= =?UTF-8?q?=EC=9E=85=20=EB=B0=8F=20=EC=9D=B4=EB=A9=94=EC=9D=BC=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=EC=9A=94=EC=B2=AD=20DTO=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/request/EmailCodeRequestDto.java | 6 ++++ .../dto/request/EmailRequestDto.java | 6 ++++ .../dto/request/LoginIdRequestDto.java | 4 +++ .../dto/request/SignUpRequestDto.java | 29 +++++++++++++++++++ 4 files changed, 45 insertions(+) create mode 100644 src/main/java/com/example/api/account/controller/dto/request/EmailCodeRequestDto.java create mode 100644 src/main/java/com/example/api/account/controller/dto/request/EmailRequestDto.java create mode 100644 src/main/java/com/example/api/account/controller/dto/request/LoginIdRequestDto.java create mode 100644 src/main/java/com/example/api/account/controller/dto/request/SignUpRequestDto.java diff --git a/src/main/java/com/example/api/account/controller/dto/request/EmailCodeRequestDto.java b/src/main/java/com/example/api/account/controller/dto/request/EmailCodeRequestDto.java new file mode 100644 index 00000000..4cccb061 --- /dev/null +++ b/src/main/java/com/example/api/account/controller/dto/request/EmailCodeRequestDto.java @@ -0,0 +1,6 @@ +package com.example.api.account.controller.dto.request; + +import com.example.api.global.config.resolver.ValidEmail; + +public record EmailCodeRequestDto(@ValidEmail String email, String code) { +} diff --git a/src/main/java/com/example/api/account/controller/dto/request/EmailRequestDto.java b/src/main/java/com/example/api/account/controller/dto/request/EmailRequestDto.java new file mode 100644 index 00000000..c67f6a68 --- /dev/null +++ b/src/main/java/com/example/api/account/controller/dto/request/EmailRequestDto.java @@ -0,0 +1,6 @@ +package com.example.api.account.controller.dto.request; + +import com.example.api.global.config.resolver.ValidEmail; + +public record EmailRequestDto(@ValidEmail String email) { +} diff --git a/src/main/java/com/example/api/account/controller/dto/request/LoginIdRequestDto.java b/src/main/java/com/example/api/account/controller/dto/request/LoginIdRequestDto.java new file mode 100644 index 00000000..70dd5ca2 --- /dev/null +++ b/src/main/java/com/example/api/account/controller/dto/request/LoginIdRequestDto.java @@ -0,0 +1,4 @@ +package com.example.api.account.controller.dto.request; + +public record LoginIdRequestDto(String loginId) { +} diff --git a/src/main/java/com/example/api/account/controller/dto/request/SignUpRequestDto.java b/src/main/java/com/example/api/account/controller/dto/request/SignUpRequestDto.java new file mode 100644 index 00000000..18401142 --- /dev/null +++ b/src/main/java/com/example/api/account/controller/dto/request/SignUpRequestDto.java @@ -0,0 +1,29 @@ +package com.example.api.account.controller.dto.request; + +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotBlank; + +public record SignUpRequestDto( + @NotBlank + String loginId, + + @NotBlank + String password, + + @NotBlank + String name, + + @NotBlank + String nickname, + + @NotBlank + @Email + String email, + + @NotBlank + String nationality, + + @NotBlank + String phoneNumber +) { +} From 2a9e6bbe65e0575a09df19b044d1e7a9ce584b39 Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Sun, 1 Dec 2024 23:27:03 +0900 Subject: [PATCH 131/276] =?UTF-8?q?#2=20=ED=9A=8C=EC=9B=90=EA=B0=80?= =?UTF-8?q?=EC=9E=85=20=EB=B0=8F=20=EC=9D=B4=EB=A9=94=EC=9D=BC=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=EC=9A=94=C3=AC=EC=9D=91=EB=8B=B5=20TO=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/dto/response/RegisterResponseDto.java | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 src/main/java/com/example/api/account/controller/dto/response/RegisterResponseDto.java diff --git a/src/main/java/com/example/api/account/controller/dto/response/RegisterResponseDto.java b/src/main/java/com/example/api/account/controller/dto/response/RegisterResponseDto.java new file mode 100644 index 00000000..6d03816d --- /dev/null +++ b/src/main/java/com/example/api/account/controller/dto/response/RegisterResponseDto.java @@ -0,0 +1,11 @@ +package com.example.api.account.controller.dto.response; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor +public class RegisterResponseDto { + private final String message; + private final String loginId; +} From 1268e64736c7a586ac25fdc659d1696d20e4d0d0 Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Sun, 1 Dec 2024 23:27:48 +0900 Subject: [PATCH 132/276] =?UTF-8?q?#2=20=ED=9A=8C=EC=9B=90=20=EA=B0=80?= =?UTF-8?q?=EC=9E=85=20=EB=B0=8F=20=EC=9D=B4=EB=A9=94=EC=9D=BC=20=EC=9A=94?= =?UTF-8?q?=EC=B2=AD=20=EA=B4=80=EB=A0=A8=20=EC=84=9C=EB=B9=84=EC=8A=A4=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/account/service/AccountService.java | 90 +++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 src/main/java/com/example/api/account/service/AccountService.java diff --git a/src/main/java/com/example/api/account/service/AccountService.java b/src/main/java/com/example/api/account/service/AccountService.java new file mode 100644 index 00000000..91090b52 --- /dev/null +++ b/src/main/java/com/example/api/account/service/AccountService.java @@ -0,0 +1,90 @@ +package com.example.api.account.service; + +import com.example.api.account.controller.dto.request.EmailCodeRequestDto; +import com.example.api.account.controller.dto.request.EmailRequestDto; +import com.example.api.account.controller.dto.request.LoginIdRequestDto; +import com.example.api.account.domain.Code; +import com.example.api.account.repository.AccountRepository; +import com.example.api.account.controller.dto.request.SignUpRequestDto; +import com.example.api.account.repository.CodeRepository; +import com.example.api.account.domain.MailSender; +import com.example.api.domain.Account; +import com.example.api.exception.BusinessException; +import com.example.api.exception.ErrorCode; +import jakarta.transaction.Transactional; +import lombok.RequiredArgsConstructor; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Service; + +import java.util.Optional; + +@Service +@RequiredArgsConstructor +public class AccountService { + private final AccountRepository authRepository; + private final CodeRepository codeRepository; + private final PasswordEncoder passwordEncoder; + private final MailSender mailSender; + + public Code sendEmail(final EmailRequestDto request) throws BusinessException { + // 이미 가입된 이메일인지 검증 + validateDuplicateEmail(request); + return mailSender.sendEmail(request); + } + + @Transactional + public String saveCode(final Code code){ + try { + codeRepository.save(code); + return "이메일 전송을 완료하였습니다."; + } catch (Exception e){ + throw new BusinessException(ErrorCode.FAIL_SAVE_CODE); + } + } + + @Transactional + public String verifyEmail(final EmailCodeRequestDto request) { + Optional findCode = codeRepository.findCodeByEmail(request.email()); + + return findCode.map(code -> { + if (code.getCode().equals(request.code())) { + return "유효한 이메일입니다."; + } else { + throw new BusinessException(ErrorCode.INCORRECT_CODE); + } + }).orElseThrow(() -> new BusinessException(ErrorCode.EXPIRATION_DATE_END)); + } + + @Transactional + public String signUp(final SignUpRequestDto request) { + // 중복 로그인 ID 확인 + validateDuplicateLoginId(new LoginIdRequestDto(request.loginId())); + // 계정 저장 + saveAccount(request); + return "회원가입이 완료되었습니다"; + } + + private void saveAccount(final SignUpRequestDto request) { + Account account = new Account( + request.loginId(), + passwordEncoder.encode(request.password()), + request.name(), + request.nickname(), + request.email(), + request.phoneNumber() + ); + authRepository.save(account); + } + + private void validateDuplicateLoginId(final LoginIdRequestDto loginIdRequest) { + if (authRepository.existsByLoginId(loginIdRequest.loginId())) { + throw new BusinessException(ErrorCode.DUPLICATE_LOGIN_ID); + } + } + + private void validateDuplicateEmail(final EmailRequestDto emailRequest) { + if (authRepository.existsByEmail(emailRequest.email())) { + throw new BusinessException(ErrorCode.DUPLICATE_EMAIL); + } + } +} From e69da378799334ef512b85494a436f3154a213da Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Sun, 1 Dec 2024 23:28:31 +0900 Subject: [PATCH 133/276] =?UTF-8?q?#2=20=ED=9A=8C=EC=9B=90=20=EA=B0=80?= =?UTF-8?q?=EC=9E=85=20=EC=A0=95=EB=B3=B4=20=EC=A0=80=EC=9E=A5=20repositor?= =?UTF-8?q?y=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/account/repository/AccountRepository.java | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/main/java/com/example/api/account/repository/AccountRepository.java diff --git a/src/main/java/com/example/api/account/repository/AccountRepository.java b/src/main/java/com/example/api/account/repository/AccountRepository.java new file mode 100644 index 00000000..8cf19a68 --- /dev/null +++ b/src/main/java/com/example/api/account/repository/AccountRepository.java @@ -0,0 +1,10 @@ +package com.example.api.account.repository; + +import com.example.api.domain.Account; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface AccountRepository extends JpaRepository { + boolean existsByLoginId(String loginId); + + boolean existsByEmail(String email); +} From 238a983e9c8fe145e3d973ea437e5bb9f119003d Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Sun, 1 Dec 2024 23:29:08 +0900 Subject: [PATCH 134/276] =?UTF-8?q?#2=20=EC=9D=B8=EC=A6=9D=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=A0=80=EC=9E=A5=20MongoDB=20repository=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/account/repository/CodeRepository.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 src/main/java/com/example/api/account/repository/CodeRepository.java diff --git a/src/main/java/com/example/api/account/repository/CodeRepository.java b/src/main/java/com/example/api/account/repository/CodeRepository.java new file mode 100644 index 00000000..10d7d6ea --- /dev/null +++ b/src/main/java/com/example/api/account/repository/CodeRepository.java @@ -0,0 +1,12 @@ +package com.example.api.account.repository; + +import com.example.api.account.domain.Code; +import org.springframework.data.mongodb.repository.MongoRepository; +import org.springframework.stereotype.Repository; + +import java.util.Optional; + +@Repository +public interface CodeRepository extends MongoRepository { + Optional findCodeByEmail(String email); +} From 4bb79900d49722f7fc9254875bca4707c68e75d1 Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Sun, 1 Dec 2024 23:29:51 +0900 Subject: [PATCH 135/276] =?UTF-8?q?#2=20=EC=9D=B8=C3=AC=C2=A6#2=20?= =?UTF-8?q?=EB=A9=94=EC=9D=BC=20=EC=A0=84=EC=86=A1=20=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=EB=84=8C=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/account/domain/MailSender.java | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 src/main/java/com/example/api/account/domain/MailSender.java diff --git a/src/main/java/com/example/api/account/domain/MailSender.java b/src/main/java/com/example/api/account/domain/MailSender.java new file mode 100644 index 00000000..138e6886 --- /dev/null +++ b/src/main/java/com/example/api/account/domain/MailSender.java @@ -0,0 +1,41 @@ +package com.example.api.account.domain; + +import com.example.api.account.controller.dto.request.EmailRequestDto; +import com.example.api.exception.BusinessException; +import com.example.api.exception.ErrorCode; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.mail.SimpleMailMessage; +import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class MailSender { + private final JavaMailSender mailSender; + + @Value("${spring.mail.username}") + private String fromEmail; + + public Code sendEmail(final EmailRequestDto emailRequest){ + String code = CodeGenerator.generateCode(); + + try { + SimpleMailMessage message = createEmail(emailRequest.email(), code); + mailSender.send(message); + + return new Code(emailRequest.email(), code); + } catch (Exception e) { + throw new BusinessException(ErrorCode.FAIL_SEND_EMAIL); + } + } + + private SimpleMailMessage createEmail(final String to, final String code) { + SimpleMailMessage message = new SimpleMailMessage(); + message.setTo(to); + message.setSubject("단팥의 인증 이메일입니다."); + message.setText(String.format("단팥 인증코드 %s 입니다.", code)); + message.setFrom(fromEmail); + return message; + } +} From 0fd0a91186b27d5ef6a060d6e20be3ca11b95357 Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Sun, 1 Dec 2024 23:30:37 +0900 Subject: [PATCH 136/276] =?UTF-8?q?#2=20=EC=BD=94=EB=93=9C=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=EA=B8=B0,=20=EC=BD=94=EB=93=9C=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/api/account/domain/Code.java | 25 +++++++++++++++++ .../api/account/domain/CodeGenerator.java | 27 +++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 src/main/java/com/example/api/account/domain/Code.java create mode 100644 src/main/java/com/example/api/account/domain/CodeGenerator.java diff --git a/src/main/java/com/example/api/account/domain/Code.java b/src/main/java/com/example/api/account/domain/Code.java new file mode 100644 index 00000000..04f5649c --- /dev/null +++ b/src/main/java/com/example/api/account/domain/Code.java @@ -0,0 +1,25 @@ +package com.example.api.account.domain; + +import jakarta.persistence.Id; +import lombok.Getter; +import org.springframework.data.mongodb.core.index.Indexed; +import org.springframework.data.mongodb.core.mapping.Document; + +import java.util.Date; + +@Getter +@Document(collection = "code") +public class Code { + @Id + private String id; + private String email; + private String code; + @Indexed(expireAfterSeconds = 600) + private Date createdAt; + + public Code(String email, String code) { + this.email = email; + this.code = code; + this.createdAt = new Date(); + } +} diff --git a/src/main/java/com/example/api/account/domain/CodeGenerator.java b/src/main/java/com/example/api/account/domain/CodeGenerator.java new file mode 100644 index 00000000..d442b6f1 --- /dev/null +++ b/src/main/java/com/example/api/account/domain/CodeGenerator.java @@ -0,0 +1,27 @@ +package com.example.api.account.domain; + +import com.example.api.exception.BusinessException; +import com.example.api.exception.ErrorCode; +import lombok.extern.slf4j.Slf4j; + +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; +import java.util.Random; + +@Slf4j +public class CodeGenerator { + public static String generateCode() { + int length = 6; + try { + Random random = SecureRandom.getInstanceStrong(); + StringBuilder builder = new StringBuilder(); + for (int i = 0; i < length; i++) { + builder.append(random.nextInt(10)); + } + return builder.toString(); + } catch (NoSuchAlgorithmException e) { + log.debug("CodeGenerator.generateCode() exception occur", e); + throw new BusinessException(ErrorCode.FAIL_GENERATE_CODE); + } + } +} From e06f6603e1dfc3c6151fc4615ea88e4c5a2e0b83 Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Sun, 1 Dec 2024 23:31:34 +0900 Subject: [PATCH 137/276] =?UTF-8?q?#2=20=ED=9A=8C=EC=9B=90=20=EA=B0=80?= =?UTF-8?q?=EC=9E=85=20=EB=B0=8F=20=EC=9D=B4=EB=A9=94=EC=9D=BC=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=EC=98=A4=EB=A5=98=20=EC=BD=94=EB=93=9C=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/api/exception/ErrorCode.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/exception/ErrorCode.java b/src/main/java/com/example/api/exception/ErrorCode.java index 760e510f..a97e41db 100644 --- a/src/main/java/com/example/api/exception/ErrorCode.java +++ b/src/main/java/com/example/api/exception/ErrorCode.java @@ -6,7 +6,14 @@ @Getter public enum ErrorCode { SERVER_EXCEPTION(HttpStatus.INTERNAL_SERVER_ERROR, "-000", "서버 에러"), - DUPLICATE_LOGIN_ID(HttpStatus.BAD_REQUEST, "-001", "중복된 ID입니다."); + DUPLICATE_LOGIN_ID(HttpStatus.BAD_REQUEST, "-100", "중복된 ID입니다."), + DUPLICATE_EMAIL(HttpStatus.BAD_REQUEST, "-101", "이미 가입된 이메일입니다."), + INCORRECT_CODE(HttpStatus.BAD_REQUEST, "-103", "이메일 인증에 실패하였습니다."), + EXPIRATION_DATE_END(HttpStatus.BAD_REQUEST, "-104", "코드의 유효 기간이 만료 되었습니다."), + + FAIL_GENERATE_CODE(HttpStatus.INTERNAL_SERVER_ERROR, "-500", "코드 생성에 실패하였습니다."), + FAIL_SEND_EMAIL(HttpStatus.INTERNAL_SERVER_ERROR, "-501", "이메일 전송에 실패하였습니다."), + FAIL_SAVE_CODE(HttpStatus.INTERNAL_SERVER_ERROR, "-502", "코드 저장에 실패하였습니다."); private final HttpStatus httpStatus; private final String errorCode; From 6b6d615346cb70c122e207f06c11f0f8f0a5b86b Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Sun, 1 Dec 2024 23:32:26 +0900 Subject: [PATCH 138/276] =?UTF-8?q?#2=20Account=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=EC=97=90=EC=84=9C=20=EC=83=9D=EC=84=B1=20=EB=82=A0?= =?UTF-8?q?=EC=A7=9C=20=EC=A4=91=EB=B3=B5=20=ED=95=84=EB=93=9C=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/example/api/domain/Account.java | 26 ++++++++++++++----- 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/example/api/domain/Account.java b/src/main/java/com/example/api/domain/Account.java index 8451291e..913e7961 100644 --- a/src/main/java/com/example/api/domain/Account.java +++ b/src/main/java/com/example/api/domain/Account.java @@ -9,6 +9,7 @@ @Entity @Getter @Setter +@AttributeOverride(name = "createdDate", column = @Column(name = "ACCOUNT_REGISTERED_DATETIME")) @Table(name = "ACCOUNT") public class Account extends BaseEntity { @Id @@ -24,18 +25,16 @@ public class Account extends BaseEntity { private String name; @Column(name = "ACCOUNT_NICKNAME") private String nickname; + @Column(name = "ACCOUNT_PHONE_NUMBER") + private String phoneNumber; + @Column(name = "ACCOUNT_EMAIL") + private String email; @Column(name = "ACCOUNT_SEX") private String sex; @Column(name = "ACCOUNT_AGE") private int age; - @Column(name = "ACCOUNT_PHONE_NUMBER") - private String phoneNumber; - @Column(name = "ACCOUNT_REGISTERED_DATETIME") - private Date registeredDatetime; @Column(name = "ACCOUNT_PROFILE_IMAGE") private String profileImage; - @Column(name = "ACCOUNT_EMAIL") - private String email; @Column(name = "ACCOUNT_STAR_RATING") private float starPoint; @Column(name = "ACCOUNT_WORK_COUNT") @@ -44,4 +43,19 @@ public class Account extends BaseEntity { private boolean openStatus; @Column(name = "ACCOUNT_DELETED", columnDefinition = "BOOLEAN DEFAULT false") private boolean deleted = false; + + public Account() { + } + + public Account(String loginId, String password, String name, String nickname, String phoneNumber, String email) { + this.loginId = loginId; + this.password = password; + this.name = name; + this.nickname = nickname; + this.email = email; + this.phoneNumber = phoneNumber; + this.starPoint = 0.0f; + this.workCount = 0; + this.openStatus = true; + } } \ No newline at end of file From f108f4375b4fab052560dddea1ec95c850778f90 Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Sun, 1 Dec 2024 23:33:31 +0900 Subject: [PATCH 139/276] =?UTF-8?q?#2=20SMTP=20=EA=B4=80=EB=A0=A8=20?= =?UTF-8?q?=ED=99=98=EA=B2=BD=20=EB=B3=80=EC=88=98=20application.propertie?= =?UTF-8?q?s=EC=97=90=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application.properties | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 986de5c9..04ae0272 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -25,5 +25,20 @@ logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE # Mongo Database Configuration spring.data.mongodb.host=localhost spring.data.mongodb.port=27017 -spring.data.mongodb.database=chatdb +spring.data.mongodb.database=danpatime + +# SMTP +spring.mail.host=smtp.gmail.com +spring.mail.port=587 +spring.mail.username=${spring_mail_username} +spring.mail.password=${spring_mail_password} +spring.mail.protocol=smtp +spring.mail.properties.mail.smtp.auth=true +spring.mail.properties.mail.smtp.starttls.enable=true +spring.mail.properties.mail.smtp.starttls.required=true +spring.mail.properties.mail.smtp.connectiontimeout:5000 +spring.mail.properties.mail.smtp.timeout:5000 +spring.mail.properties.mail.smtp.writetimeout:5000 +spring.mail.auth-code-expiration-millis:600000 + From 77d4b883ad3e17345d41b01dd07572a0bc74a3d8 Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Sun, 1 Dec 2024 23:34:06 +0900 Subject: [PATCH 140/276] =?UTF-8?q?#2=20SMTP=20=EC=9D=98=EC=A1=B4=EC=84=B1?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index b329d068..447ae8bf 100644 --- a/build.gradle +++ b/build.gradle @@ -38,11 +38,14 @@ dependencies { // env 파일 읽도록 도와주는 라이브러리 implementation 'me.paulschwarz:spring-dotenv:4.0.0' - //회원가입 어노테이션 사용 + //valid implementation 'org.springframework.boot:spring-boot-starter-validation' - //비밀번호 암호화 + //security implementation 'org.springframework.boot:spring-boot-starter-security' + + // smtp + implementation 'org.springframework.boot:spring-boot-starter-mail' } tasks.named('test') { From 0bf19349f4922941cb16caa77ad7315a2e2aa0df Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Sun, 1 Dec 2024 23:35:01 +0900 Subject: [PATCH 141/276] =?UTF-8?q?#2=20api=20=EB=84=98=EA=B2=A8=20?= =?UTF-8?q?=EB=B0=9B=EA=B8=B0=20=EC=A0=84=20=ED=8C=8C=EC=9D=BC=20=EC=A0=95?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/api/auth/AuthRepository.java | 11 ---- .../auth/register/Config/SecurityConfig.java | 29 ----------- .../api/auth/register/RegisterController.java | 23 --------- .../api/auth/register/RegisterService.java | 50 ------------------- .../auth/register/dto/RegisterRequest.java | 33 ------------ .../auth/register/dto/RegisterResponse.java | 11 ---- 6 files changed, 157 deletions(-) delete mode 100644 src/main/java/com/example/api/auth/AuthRepository.java delete mode 100644 src/main/java/com/example/api/auth/register/Config/SecurityConfig.java delete mode 100644 src/main/java/com/example/api/auth/register/RegisterController.java delete mode 100644 src/main/java/com/example/api/auth/register/RegisterService.java delete mode 100644 src/main/java/com/example/api/auth/register/dto/RegisterRequest.java delete mode 100644 src/main/java/com/example/api/auth/register/dto/RegisterResponse.java diff --git a/src/main/java/com/example/api/auth/AuthRepository.java b/src/main/java/com/example/api/auth/AuthRepository.java deleted file mode 100644 index 6306cb14..00000000 --- a/src/main/java/com/example/api/auth/AuthRepository.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.example.api.auth; - -import com.example.api.domain.Account; -import org.springframework.data.jpa.repository.JpaRepository; -import java.util.Optional; -public interface AuthRepository extends JpaRepository { - Optional findByLoginId(String loginId); - boolean existsByLoginId(String loginId); - -} - diff --git a/src/main/java/com/example/api/auth/register/Config/SecurityConfig.java b/src/main/java/com/example/api/auth/register/Config/SecurityConfig.java deleted file mode 100644 index 1155e204..00000000 --- a/src/main/java/com/example/api/auth/register/Config/SecurityConfig.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.example.api.auth.register.Config; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.web.SecurityFilterChain; -import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; - -@Configuration -public class SecurityConfig { - - @Bean - public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { - http.csrf(csrf -> csrf.disable()) - .authorizeHttpRequests(authorize -> - authorize - .requestMatchers("/api/v1/auth/register").permitAll() - .anyRequest().authenticated() - ) - .formLogin(form -> form.defaultSuccessUrl("/").permitAll()); - - return http.build(); - } - - @Bean - public BCryptPasswordEncoder passwordEncoder() { - return new BCryptPasswordEncoder(); - } -} diff --git a/src/main/java/com/example/api/auth/register/RegisterController.java b/src/main/java/com/example/api/auth/register/RegisterController.java deleted file mode 100644 index 5e3a94b2..00000000 --- a/src/main/java/com/example/api/auth/register/RegisterController.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.example.api.auth.register; - -import com.example.api.auth.register.dto.RegisterRequest; -import jakarta.validation.Valid; -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.*; - -@RestController -@RequestMapping("/api/v1/auth/register") -public class RegisterController { - private final RegisterService registerService; - - public RegisterController(RegisterService registerService) { - this.registerService = registerService; - } - - @PostMapping - @ResponseStatus(HttpStatus.CREATED) - public String register(@Valid @RequestBody RegisterRequest request) { - registerService.register(request); - return "Registration successful"; - } -} diff --git a/src/main/java/com/example/api/auth/register/RegisterService.java b/src/main/java/com/example/api/auth/register/RegisterService.java deleted file mode 100644 index ec7a6dcb..00000000 --- a/src/main/java/com/example/api/auth/register/RegisterService.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.example.api.auth.register; - -import com.example.api.auth.AuthRepository; -import com.example.api.auth.register.dto.RegisterRequest; -import com.example.api.domain.Account; -import com.example.api.exception.BusinessException; -import com.example.api.exception.ErrorCode; -import lombok.RequiredArgsConstructor; -import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; -import org.springframework.stereotype.Service; - -import java.util.Date; - -@RequiredArgsConstructor -@Service -public class RegisterService { - private final AuthRepository authRepository; - private final BCryptPasswordEncoder passwordEncoder; - - public void register(RegisterRequest request) { - // 중복 로그인 ID 확인 - validateDuplicateLoginId(request.getLoginId()); - - // Account 엔티티 생성 (빌더 사용하지 않음) - Account account = new Account(); - account.setLoginId(request.getLoginId()); - account.setPassword(passwordEncoder.encode(request.getPassword())); // 비밀번호 암호화 - account.setName(request.getName()); - account.setEmail(request.getEmail()); - account.setSex(request.getSex()); - account.setAge(request.getAge()); - account.setPhoneNumber(request.getPhoneNumber()); - account.setNickname(request.getNickname()); - account.setRegisteredDatetime(new Date()); // 현재 시간 - account.setStarPoint(0.0f); // 초기값 설정 - account.setWorkCount(0); // 초기값 설정 - account.setDeleted(false); // 초기값 설정 - - // 엔티티 저장 - authRepository.save(account); - } - - // 중복 로그인 ID 검증 - private void validateDuplicateLoginId(String loginId) { - if (authRepository.existsByLoginId(loginId)) { - throw new BusinessException(ErrorCode.DUPLICATE_LOGIN_ID); - } - } -} - diff --git a/src/main/java/com/example/api/auth/register/dto/RegisterRequest.java b/src/main/java/com/example/api/auth/register/dto/RegisterRequest.java deleted file mode 100644 index a4eb721e..00000000 --- a/src/main/java/com/example/api/auth/register/dto/RegisterRequest.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.example.api.auth.register.dto; - -import jakarta.validation.constraints.Email; -import jakarta.validation.constraints.NotBlank; -import lombok.Getter; -import lombok.Setter; - -@Getter -@Setter -public class RegisterRequest { - @NotBlank - private String loginId; - - @NotBlank - private String password; - - @NotBlank - private String name; - - @NotBlank - @Email - private String email; - - @NotBlank - private String sex; - - private int age; - - private String phoneNumber; - - private String nickname; - -} diff --git a/src/main/java/com/example/api/auth/register/dto/RegisterResponse.java b/src/main/java/com/example/api/auth/register/dto/RegisterResponse.java deleted file mode 100644 index 3b0200d9..00000000 --- a/src/main/java/com/example/api/auth/register/dto/RegisterResponse.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.example.api.auth.register.dto; - -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -@Getter -@RequiredArgsConstructor -public class RegisterResponse { - private final String message; - private final String loginId; -} From 56edae4a1b7fc7e2eb92133809a79f8c5797dff9 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Tue, 3 Dec 2024 10:17:12 +0900 Subject: [PATCH 142/276] =?UTF-8?q?#2=20Account=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=EC=97=90=20=EA=B5=AD=EC=A0=81,=20=EC=97=AD=ED=95=A0?= =?UTF-8?q?=20=ED=95=84=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/api/domain/Account.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/example/api/domain/Account.java b/src/main/java/com/example/api/domain/Account.java index 913e7961..8157962d 100644 --- a/src/main/java/com/example/api/domain/Account.java +++ b/src/main/java/com/example/api/domain/Account.java @@ -1,10 +1,11 @@ package com.example.api.domain; +import com.example.api.account.domain.Nationality; +import com.example.api.account.domain.UserRole; import jakarta.persistence.*; import lombok.Getter; import lombok.Setter; -import java.util.Date; @Entity @Getter @@ -29,6 +30,12 @@ public class Account extends BaseEntity { private String phoneNumber; @Column(name = "ACCOUNT_EMAIL") private String email; + @Column(name = "ACCOUNT_NATIONALITY") + @Enumerated(EnumType.STRING) + private Nationality nationality; + @Column(name = "ACCOUNT_ROLE") + @Enumerated(EnumType.STRING) + private UserRole role; @Column(name = "ACCOUNT_SEX") private String sex; @Column(name = "ACCOUNT_AGE") @@ -47,13 +54,15 @@ public class Account extends BaseEntity { public Account() { } - public Account(String loginId, String password, String name, String nickname, String phoneNumber, String email) { + public Account(String loginId, String password, String name, String nickname, String phoneNumber, String email, Nationality nationality, UserRole role) { this.loginId = loginId; this.password = password; this.name = name; this.nickname = nickname; this.email = email; this.phoneNumber = phoneNumber; + this.nationality = nationality; + this.role = role; this.starPoint = 0.0f; this.workCount = 0; this.openStatus = true; From ac4c8542b64408235244662c54ed2c021e2ca56b Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Tue, 3 Dec 2024 10:22:53 +0900 Subject: [PATCH 143/276] =?UTF-8?q?#2=20SignUpRequestDto=EC=97=90=20?= =?UTF-8?q?=EA=B5=AD=EC=A0=81,=20=EC=97=AD=ED=95=A0=20=ED=95=84=EB=93=9C?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/dto/request/SignUpRequestDto.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/example/api/account/controller/dto/request/SignUpRequestDto.java b/src/main/java/com/example/api/account/controller/dto/request/SignUpRequestDto.java index 18401142..5fc813c6 100644 --- a/src/main/java/com/example/api/account/controller/dto/request/SignUpRequestDto.java +++ b/src/main/java/com/example/api/account/controller/dto/request/SignUpRequestDto.java @@ -1,7 +1,10 @@ package com.example.api.account.controller.dto.request; +import com.example.api.account.domain.Nationality; +import com.example.api.account.domain.UserRole; import jakarta.validation.constraints.Email; import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; public record SignUpRequestDto( @NotBlank @@ -20,8 +23,11 @@ public record SignUpRequestDto( @Email String email, - @NotBlank - String nationality, + @NotNull + Nationality nationality, + + @NotNull + UserRole role, @NotBlank String phoneNumber From 8ad2d49452d6e3c15677637f4e2b724d9d3d5c4b Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Tue, 3 Dec 2024 10:24:22 +0900 Subject: [PATCH 144/276] =?UTF-8?q?#2=20Code=20=EB=8F=84=EB=A9=94=EC=9D=B8?= =?UTF-8?q?=EC=9D=98=20createdAt=20=ED=95=84=EB=93=9C=EC=97=90=20final=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/api/account/domain/Code.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/account/domain/Code.java b/src/main/java/com/example/api/account/domain/Code.java index 04f5649c..36b945fd 100644 --- a/src/main/java/com/example/api/account/domain/Code.java +++ b/src/main/java/com/example/api/account/domain/Code.java @@ -14,8 +14,9 @@ public class Code { private String id; private String email; private String code; + @Indexed(expireAfterSeconds = 600) - private Date createdAt; + private final Date createdAt; public Code(String email, String code) { this.email = email; From 937560b98998b149d42a178d0890e72697f81dfa Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Tue, 3 Dec 2024 10:26:06 +0900 Subject: [PATCH 145/276] =?UTF-8?q?#2=20=EA=B5=AD=EC=A0=81=20=EB=8F=84?= =?UTF-8?q?=EB=A9=94=EC=9D=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/account/domain/Nationality.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/main/java/com/example/api/account/domain/Nationality.java diff --git a/src/main/java/com/example/api/account/domain/Nationality.java b/src/main/java/com/example/api/account/domain/Nationality.java new file mode 100644 index 00000000..4e7b3e56 --- /dev/null +++ b/src/main/java/com/example/api/account/domain/Nationality.java @@ -0,0 +1,27 @@ +package com.example.api.account.domain; + +public enum Nationality { + KOREAN(0, "내국인"), + FOREIGN(1, "외국인"); + + private final Integer code; + private final String description; + + Nationality(final Integer code, final String description) { + this.code = code; + this.description = description; + } + + public static Nationality of(final Integer code) { + for (Nationality nationality : values()) { + if (nationality.getCode().equals(code)) { + return nationality; + } + } + return null; + } + + public Integer getCode() { + return code; + } +} From 0826a1a489cf699b751a2b472e416ddd9bc2facb Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Tue, 3 Dec 2024 10:26:29 +0900 Subject: [PATCH 146/276] =?UTF-8?q?#2=20=EC=97=AD=ED=95=A0=20=EB=8F=84?= =?UTF-8?q?=EB=A9=94=EC=9D=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/api/account/domain/UserRole.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/main/java/com/example/api/account/domain/UserRole.java diff --git a/src/main/java/com/example/api/account/domain/UserRole.java b/src/main/java/com/example/api/account/domain/UserRole.java new file mode 100644 index 00000000..a72da024 --- /dev/null +++ b/src/main/java/com/example/api/account/domain/UserRole.java @@ -0,0 +1,27 @@ +package com.example.api.account.domain; + +public enum UserRole { + EMPLOYEE(0, "알바생"), + EMPLOYER(1, "사장"); + + private final Integer code; + private final String description; + + UserRole(final Integer code, final String description) { + this.code = code; + this.description = description; + } + + public static UserRole of(final Integer code) { + for (UserRole role : values()) { + if (role.getCode().equals(code)) { + return role; + } + } + return null; + } + + public Integer getCode() { + return code; + } +} \ No newline at end of file From 63b47a531e83b0de42bcf384c6ec9e064b82db69 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Tue, 3 Dec 2024 10:27:56 +0900 Subject: [PATCH 147/276] =?UTF-8?q?#2=20CodeRepository=EC=9D=98=20?= =?UTF-8?q?=ED=95=A8=EC=88=98=EB=AA=85=20=EB=B3=80=EA=B2=BD=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EC=9D=B8=ED=95=9C=20=EC=84=9C=EB=B9=84=EC=8A=A4=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/api/account/repository/CodeRepository.java | 2 +- .../com/example/api/account/service/AccountService.java | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/example/api/account/repository/CodeRepository.java b/src/main/java/com/example/api/account/repository/CodeRepository.java index 10d7d6ea..9ee6cfed 100644 --- a/src/main/java/com/example/api/account/repository/CodeRepository.java +++ b/src/main/java/com/example/api/account/repository/CodeRepository.java @@ -8,5 +8,5 @@ @Repository public interface CodeRepository extends MongoRepository { - Optional findCodeByEmail(String email); + Optional findFirstByEmailOrderByCreatedAtDesc(String email); } diff --git a/src/main/java/com/example/api/account/service/AccountService.java b/src/main/java/com/example/api/account/service/AccountService.java index 91090b52..40204cab 100644 --- a/src/main/java/com/example/api/account/service/AccountService.java +++ b/src/main/java/com/example/api/account/service/AccountService.java @@ -44,7 +44,7 @@ public String saveCode(final Code code){ @Transactional public String verifyEmail(final EmailCodeRequestDto request) { - Optional findCode = codeRepository.findCodeByEmail(request.email()); + Optional findCode = codeRepository.findFirstByEmailOrderByCreatedAtDesc(request.email()); return findCode.map(code -> { if (code.getCode().equals(request.code())) { @@ -71,8 +71,11 @@ private void saveAccount(final SignUpRequestDto request) { request.name(), request.nickname(), request.email(), - request.phoneNumber() + request.phoneNumber(), + request.nationality(), + request.role() ); + authRepository.save(account); } From cf6351adee7a94bee0dda6bff1d1d2bef40aa381 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Tue, 3 Dec 2024 10:29:15 +0900 Subject: [PATCH 148/276] =?UTF-8?q?#2=20SecurityConfig=EC=97=90=EC=84=9C?= =?UTF-8?q?=20formLogin=EC=9D=84=20=EC=82=AC=EC=9A=A9=ED=95=98=EC=A7=80=20?= =?UTF-8?q?=EC=95=8A=EA=B3=A0,=20=EB=B9=84=EB=A1=9C=EA=B7=B8=EC=9D=B8=20?= =?UTF-8?q?=EC=A0=91=EA=B7=BC=20=ED=97=88=EC=9A=A9=20=EA=B2=BD=EB=A1=9C=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/api/global/config/SecurityConfig.java | 11 +++++++++-- .../api/global/config/resolver/ValidEmail.java | 2 ++ 2 files changed, 11 insertions(+), 2 deletions(-) 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 5e91fe44..ee7e689d 100644 --- a/src/main/java/com/example/api/global/config/SecurityConfig.java +++ b/src/main/java/com/example/api/global/config/SecurityConfig.java @@ -3,10 +3,13 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import static org.springframework.security.config.Customizer.withDefaults; + @Configuration public class SecurityConfig { @@ -15,10 +18,14 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti http.csrf(csrf -> csrf.disable()) .authorizeHttpRequests(authorize -> authorize - .requestMatchers("/api/v1/auth/register").permitAll() + .requestMatchers("/api/v1/account/**", + "/api/v1/**").permitAll() .anyRequest().authenticated() ) - .formLogin(form -> form.defaultSuccessUrl("/").permitAll()); + .formLogin(AbstractHttpConfigurer::disable) + .httpBasic(withDefaults()); + + return http.build(); } diff --git a/src/main/java/com/example/api/global/config/resolver/ValidEmail.java b/src/main/java/com/example/api/global/config/resolver/ValidEmail.java index 480a338c..67c971b2 100644 --- a/src/main/java/com/example/api/global/config/resolver/ValidEmail.java +++ b/src/main/java/com/example/api/global/config/resolver/ValidEmail.java @@ -12,4 +12,6 @@ @Documented public @interface ValidEmail { String message() default "이메일이 유효하지 않습니다."; + Class[] groups() default {}; + Class[] payload() default {}; } From e1e49b7084f44c17ec91f9772d72a2a204ff955f Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Tue, 3 Dec 2024 10:33:09 +0900 Subject: [PATCH 149/276] =?UTF-8?q?#2=20EmailConfig=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/global/config/EmailConfig.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/global/config/EmailConfig.java b/src/main/java/com/example/api/global/config/EmailConfig.java index ede330ee..d8380c0b 100644 --- a/src/main/java/com/example/api/global/config/EmailConfig.java +++ b/src/main/java/com/example/api/global/config/EmailConfig.java @@ -24,7 +24,7 @@ public class EmailConfig { private String password; @Value("${spring.mail.protocol}") - private String protocol ; + private String protocol; @Value("${spring.mail.properties.mail.smtp.auth}") private boolean auth; @@ -49,6 +49,7 @@ public class EmailConfig { @Bean public JavaMailSender javaMailSender() { + System.out.println("Configuring JavaMailSender with host: " + host); JavaMailSenderImpl mailSender = new JavaMailSenderImpl(); mailSender.setHost(host); mailSender.setPort(port); From 3e190c7e45f27e1b672c17ded88c82d4160ca60a Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Tue, 3 Dec 2024 10:34:44 +0900 Subject: [PATCH 150/276] =?UTF-8?q?#2=20MongoDB=20=EC=9D=B8=EB=8D=B1?= =?UTF-8?q?=EC=8A=A4=20=EC=9E=90=EB=8F=99=20=EC=83=9D=EC=84=B1=20=EB=B0=8F?= =?UTF-8?q?=20=EC=9D=B8=EC=A6=9D=20=EC=84=A4=EC=A0=95=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application.properties | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 04ae0272..f527c3ef 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -25,7 +25,9 @@ logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE # Mongo Database Configuration spring.data.mongodb.host=localhost spring.data.mongodb.port=27017 +spring.data.mongodb.authentication-database=admin spring.data.mongodb.database=danpatime +spring.data.mongodb.auto-index-creation=true # SMTP spring.mail.host=smtp.gmail.com @@ -36,9 +38,7 @@ spring.mail.protocol=smtp spring.mail.properties.mail.smtp.auth=true spring.mail.properties.mail.smtp.starttls.enable=true spring.mail.properties.mail.smtp.starttls.required=true -spring.mail.properties.mail.smtp.connectiontimeout:5000 -spring.mail.properties.mail.smtp.timeout:5000 -spring.mail.properties.mail.smtp.writetimeout:5000 -spring.mail.auth-code-expiration-millis:600000 - - +spring.mail.properties.mail.smtp.connectiontimeout=5000 +spring.mail.properties.mail.smtp.timeout=5000 +spring.mail.properties.mail.smtp.writetimeout=5000 +spring.mail.auth-code-expiration-millis=600000 \ No newline at end of file From a259a5c7a26ea31eaf2c8083fdbada5ba966771a Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Tue, 3 Dec 2024 10:47:41 +0900 Subject: [PATCH 151/276] =?UTF-8?q?#2=20Account=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20=EB=B3=80=EA=B2=BD=EC=9C=BC=EB=A1=9C=20=EC=9D=B8?= =?UTF-8?q?=ED=95=9C=20data.sql,=20schema.sql=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 2 ++ .../example/api/contracts/ContractRepository.java | 2 +- .../com/example/api/global/BaseIntegrationTest.java | 13 +++++++------ src/test/resources/data.sql | 8 ++++---- src/test/resources/schema.sql | 7 ++++++- 5 files changed, 20 insertions(+), 12 deletions(-) diff --git a/build.gradle b/build.gradle index 447ae8bf..610601c9 100644 --- a/build.gradle +++ b/build.gradle @@ -2,6 +2,7 @@ plugins { id 'java' id 'org.springframework.boot' version '3.3.5' id 'io.spring.dependency-management' version '1.1.6' + id 'org.jetbrains.kotlin.jvm' } group = 'com.example' @@ -46,6 +47,7 @@ dependencies { // smtp implementation 'org.springframework.boot:spring-boot-starter-mail' + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8" } tasks.named('test') { diff --git a/src/main/java/com/example/api/contracts/ContractRepository.java b/src/main/java/com/example/api/contracts/ContractRepository.java index be394ffd..1b231235 100644 --- a/src/main/java/com/example/api/contracts/ContractRepository.java +++ b/src/main/java/com/example/api/contracts/ContractRepository.java @@ -7,7 +7,7 @@ import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; -interface ContractRepository extends JpaRepository { +public interface ContractRepository extends JpaRepository { @Query("select new com.example.api.contracts.dto." + "BusinessInfoDTO(b.businessName, b.representationName, c.contractStartTime, c.contractEndTime, b.location, e.phoneNumber, c.updatedDate) " + "from Contract c " + diff --git a/src/test/java/com/example/api/global/BaseIntegrationTest.java b/src/test/java/com/example/api/global/BaseIntegrationTest.java index 6a20fb5b..073544ea 100644 --- a/src/test/java/com/example/api/global/BaseIntegrationTest.java +++ b/src/test/java/com/example/api/global/BaseIntegrationTest.java @@ -4,6 +4,7 @@ import com.example.api.board.controller.domain.response.ExternalCareerDTO; import com.example.api.board.controller.domain.response.InnerCareerDTO; import com.example.api.board.controller.domain.response.PossibleBoardDTO; +import com.example.api.contracts.ContractRepository; import com.example.api.domain.*; import com.example.api.domain.repository.*; import org.junit.jupiter.api.BeforeEach; @@ -106,12 +107,12 @@ void setUpData() { offerEmployment.setSuggestSucceeded(false); offerEmploymentRepository.save(offerEmployment); - Contract contract = new Contract(); - contract.setOfferEmployment(offerEmployment); // 일대일 관계 설정 - contract.setContractStartTime(LocalDateTime.of(2024, 11, 10, 9, 0)); - contract.setContractEndTime(LocalDateTime.of(2024, 11, 10, 18, 0)); - contract.setContractHourlyPay(22000); - contract.setContractSucceeded(true); + Contract contract = new Contract(offerEmployment, + LocalDateTime.of(2024, 11, 10, 9, 0), + LocalDateTime.of(2024, 11, 10, 18, 0), + 22000, + true); + contractRepository.save(contract); ExternalCareer externalCareer1 = new ExternalCareer(employee, "Consultant", "24-10-01"); diff --git a/src/test/resources/data.sql b/src/test/resources/data.sql index f17124a6..7a2b1dd4 100644 --- a/src/test/resources/data.sql +++ b/src/test/resources/data.sql @@ -1,11 +1,11 @@ -- ACCOUNT 테이블 초기화 데이터 INSERT INTO account ( - account_unique_id, account_id, account_password, account_name, account_sex, + account_unique_id, account_id, account_password, account_name, account_nickname, account_sex, account_age, account_phone_number, account_registered_datetime, account_profile_image, - account_email, account_deleted, created_at, updated_at + account_email, account_deleted, updated_at, account_nationality, account_role, account_star_rating, account_work_count, account_open_status ) VALUES - (1, 'user01', 'pass01', 'Alice', 'F', 25, '010-1234-5678', CURRENT_TIMESTAMP, 'profile1.jpg', 'alice@example.com', false, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP), - (2, 'user02', 'pass02', 'Bob', 'M', 30, '010-2345-6789', CURRENT_TIMESTAMP, 'profile2.jpg', 'bob@example.com', false, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); + (1, 'user01', 'pass01', 'Alice', 'nickname1', 'F', 25, '010-1234-5678', CURRENT_TIMESTAMP, 'profile1.jpg', 'alice@example.com', false, CURRENT_TIMESTAMP, 'KOREAN', 'EMPLOYEE', 0, 0, true), + (2, 'user02', 'pass02', 'Bob', 'nickname2', 'M', 30, '010-2345-6789', CURRENT_TIMESTAMP, 'profile2.jpg', 'bob@example.com', false, CURRENT_TIMESTAMP, 'KOREAN', 'EMPLOYEE', 0, 0, true); -- EMPLOYER 테이블 초기화 데이터 INSERT INTO employer ( diff --git a/src/test/resources/schema.sql b/src/test/resources/schema.sql index 98f078e6..8d3e2de4 100644 --- a/src/test/resources/schema.sql +++ b/src/test/resources/schema.sql @@ -21,15 +21,20 @@ create table account account_deleted BOOLEAN DEFAULT false, account_registered_datetime timestamp(6), account_unique_id bigint generated by default as identity, - created_at timestamp(6), updated_at timestamp(6), account_email varchar(255), account_id varchar(255), account_name varchar(255), + account_nickname varchar(255), + account_nationality varchar(255), + account_role varchar(255), account_password varchar(255), account_phone_number varchar(255), account_profile_image varchar(255), account_sex varchar(255), + account_star_rating float, + account_work_count integer, + account_open_status BOOLEAN DEFAULT true, primary key (account_unique_id) ); create table announcement From 86d00e4678ecc8f9715af8b4266244fd6b3570bb Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Tue, 3 Dec 2024 20:17:07 +0900 Subject: [PATCH 152/276] =?UTF-8?q?#2=20EmailConfig=20=EC=84=A4=EC=A0=95?= =?UTF-8?q?=EA=B3=BC=20=EC=86=8D=EC=84=B1=EC=9D=84=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/global/config/EmailConfig.java | 64 +++++-------------- .../global/properties/EmailProperties.java | 45 +++++++++++++ 2 files changed, 62 insertions(+), 47 deletions(-) create mode 100644 src/main/java/com/example/api/global/properties/EmailProperties.java diff --git a/src/main/java/com/example/api/global/config/EmailConfig.java b/src/main/java/com/example/api/global/config/EmailConfig.java index d8380c0b..411e001a 100644 --- a/src/main/java/com/example/api/global/config/EmailConfig.java +++ b/src/main/java/com/example/api/global/config/EmailConfig.java @@ -1,5 +1,6 @@ package com.example.api.global.config; +import com.example.api.global.properties.EmailProperties; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -10,51 +11,20 @@ @Configuration public class EmailConfig { + private final EmailProperties emailProperties; - @Value("${spring.mail.host}") - private String host; - - @Value("${spring.mail.port}") - private int port; - - @Value("${spring.mail.username}") - private String username; - - @Value("${spring.mail.password}") - private String password; - - @Value("${spring.mail.protocol}") - private String protocol; - - @Value("${spring.mail.properties.mail.smtp.auth}") - private boolean auth; - - @Value("${spring.mail.properties.mail.smtp.starttls.enable}") - private boolean starttlsEnable; - - @Value("${spring.mail.properties.mail.smtp.starttls.required}") - private boolean starttlsRequired; - - @Value("${spring.mail.properties.mail.smtp.connectiontimeout}") - private int connectionTimeout; - - @Value("${spring.mail.properties.mail.smtp.timeout}") - private int timeout; - - @Value("${spring.mail.properties.mail.smtp.writetimeout}") - private int writeTimeout; - - @Value("${spring.mail.auth-code-expiration-millis}") - private int expirationMillis; + public EmailConfig(EmailProperties emailProperties) { + this.emailProperties = emailProperties; + } @Bean public JavaMailSender javaMailSender() { - System.out.println("Configuring JavaMailSender with host: " + host); + System.out.println("Configuring JavaMailSender with host: " + emailProperties.getHost()); JavaMailSenderImpl mailSender = new JavaMailSenderImpl(); - mailSender.setHost(host); - mailSender.setPort(port); - mailSender.setUsername(username); - mailSender.setPassword(password); + mailSender.setHost(emailProperties.getHost()); + mailSender.setPort(emailProperties.getPort()); + mailSender.setUsername(emailProperties.getUsername()); + mailSender.setPassword(emailProperties.getPassword()); mailSender.setDefaultEncoding("UTF-8"); mailSender.setJavaMailProperties(getMailProperties()); @@ -63,13 +33,13 @@ public JavaMailSender javaMailSender() { private Properties getMailProperties() { Properties properties = new Properties(); - properties.put("mail.smtp.auth", auth); - properties.put("mail.smtp.starttls.enable", starttlsEnable); - properties.put("mail.smtp.starttls.required", starttlsRequired); - properties.put("mail.smtp.connectiontimeout", connectionTimeout); - properties.put("mail.smtp.timeout", timeout); - properties.put("mail.smtp.writetimeout", writeTimeout); - properties.put("mail.smtp.expirationMillis", expirationMillis); + properties.put("mail.smtp.auth", emailProperties.isAuth()); + properties.put("mail.smtp.starttls.enable", emailProperties.isStarttlsEnable()); + properties.put("mail.smtp.starttls.required", emailProperties.isStarttlsRequired()); + properties.put("mail.smtp.connectiontimeout", emailProperties.getConnectionTimeout()); + properties.put("mail.smtp.timeout", emailProperties.getTimeout()); + properties.put("mail.smtp.writetimeout", emailProperties.getWriteTimeout()); + properties.put("mail.smtp.expirationMillis", emailProperties.getExpirationMillis()); return properties; } diff --git a/src/main/java/com/example/api/global/properties/EmailProperties.java b/src/main/java/com/example/api/global/properties/EmailProperties.java new file mode 100644 index 00000000..720e4fec --- /dev/null +++ b/src/main/java/com/example/api/global/properties/EmailProperties.java @@ -0,0 +1,45 @@ +package com.example.api.global.properties; + +import lombok.Getter; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +@Getter +@Component +public class EmailProperties { + @Value("${spring.mail.host}") + private String host; + + @Value("${spring.mail.port}") + private int port; + + @Value("${spring.mail.username}") + private String username; + + @Value("${spring.mail.password}") + private String password; + + @Value("${spring.mail.protocol}") + private String protocol; + + @Value("${spring.mail.properties.mail.smtp.auth}") + private boolean auth; + + @Value("${spring.mail.properties.mail.smtp.starttls.enable}") + private boolean starttlsEnable; + + @Value("${spring.mail.properties.mail.smtp.starttls.required}") + private boolean starttlsRequired; + + @Value("${spring.mail.properties.mail.smtp.connectiontimeout}") + private int connectionTimeout; + + @Value("${spring.mail.properties.mail.smtp.timeout}") + private int timeout; + + @Value("${spring.mail.properties.mail.smtp.writetimeout}") + private int writeTimeout; + + @Value("${spring.mail.auth-code-expiration-millis}") + private int expirationMillis; +} From 81f24dc06f4b1b1645a52fc8b7ed119f8ba7a7e6 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Sat, 21 Dec 2024 00:02:14 +0900 Subject: [PATCH 153/276] =?UTF-8?q?#12=20(AuthController)=20=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=EC=9D=B8,=20=ED=86=A0=ED=81=B0=20=EC=9E=AC=EB=B0=9C?= =?UTF-8?q?=EA=B8=89,=20=EB=A1=9C=EA=B7=B8=EC=95=84=EC=9B=83=20=EC=9A=94?= =?UTF-8?q?=EC=B2=AD=20controller?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/auth/controller/AuthController.java | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 src/main/java/com/example/api/auth/controller/AuthController.java diff --git a/src/main/java/com/example/api/auth/controller/AuthController.java b/src/main/java/com/example/api/auth/controller/AuthController.java new file mode 100644 index 00000000..7491ebd4 --- /dev/null +++ b/src/main/java/com/example/api/auth/controller/AuthController.java @@ -0,0 +1,45 @@ +package com.example.api.auth.controller; + +import com.example.api.auth.dto.AuthTokenRequest; +import com.example.api.auth.dto.LoginRequest; +import com.example.api.auth.dto.LoginUserRequest; +import com.example.api.auth.dto.RefreshTokenRequest; +import com.example.api.auth.service.AuthService; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/v1/auth") +@RequiredArgsConstructor +public class AuthController { + private final AuthService authService; + private final AuthenticationManager authenticationManager; + + @PostMapping("/login") + public ResponseEntity login(@Valid @RequestBody final LoginRequest loginRequest) { + AuthTokenRequest authTokenRequest = authService.login(loginRequest); + return ResponseEntity.ok(authTokenRequest); + } + + @PostMapping("/refresh") + public ResponseEntity refresh(@Valid @RequestBody final RefreshTokenRequest refreshTokenRequest) { + AuthTokenRequest authTokenRequest = authService.refreshAuthToken(refreshTokenRequest); + return ResponseEntity.ok(authTokenRequest); + } + + @PostMapping("/logout") + public ResponseEntity logout(@AuthenticationPrincipal final Object principal) { + System.out.println("please = " + SecurityContextHolder.getContext().getAuthentication().getPrincipal().toString()); + Long userId = Long.parseLong(principal.toString()); + AuthTokenRequest authTokenRequest = authService.logout(new LoginUserRequest(userId)); + return ResponseEntity.ok(authTokenRequest); + } +} From 84fab79e6692e058c0daf210c90ce0638900b395 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Sat, 21 Dec 2024 00:03:32 +0900 Subject: [PATCH 154/276] =?UTF-8?q?#12=20=ED=86=A0=ED=81=B0=20=EB=B0=8F=20?= =?UTF-8?q?=EB=A1=9C=EA=B7=B8=EC=9D=B8=20=EC=9C=A0=EC=A0=80=20dto=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/example/api/auth/dto/AuthTokenRequest.java | 4 ++++ src/main/java/com/example/api/auth/dto/LoginRequest.java | 6 ++++++ .../java/com/example/api/auth/dto/LoginUserRequest.java | 4 ++++ .../com/example/api/auth/dto/RefreshTokenRequest.java | 6 ++++++ .../java/com/example/api/auth/dto/UserDetailRequest.java | 9 +++++++++ 5 files changed, 29 insertions(+) create mode 100644 src/main/java/com/example/api/auth/dto/AuthTokenRequest.java create mode 100644 src/main/java/com/example/api/auth/dto/LoginRequest.java create mode 100644 src/main/java/com/example/api/auth/dto/LoginUserRequest.java create mode 100644 src/main/java/com/example/api/auth/dto/RefreshTokenRequest.java create mode 100644 src/main/java/com/example/api/auth/dto/UserDetailRequest.java diff --git a/src/main/java/com/example/api/auth/dto/AuthTokenRequest.java b/src/main/java/com/example/api/auth/dto/AuthTokenRequest.java new file mode 100644 index 00000000..3747ac96 --- /dev/null +++ b/src/main/java/com/example/api/auth/dto/AuthTokenRequest.java @@ -0,0 +1,4 @@ +package com.example.api.auth.dto; + +public record AuthTokenRequest(String accessToken, String refreshToken) { +} diff --git a/src/main/java/com/example/api/auth/dto/LoginRequest.java b/src/main/java/com/example/api/auth/dto/LoginRequest.java new file mode 100644 index 00000000..c61d805e --- /dev/null +++ b/src/main/java/com/example/api/auth/dto/LoginRequest.java @@ -0,0 +1,6 @@ +package com.example.api.auth.dto; + +import jakarta.validation.constraints.NotBlank; + +public record LoginRequest(@NotBlank String loginId, @NotBlank String password) { +} diff --git a/src/main/java/com/example/api/auth/dto/LoginUserRequest.java b/src/main/java/com/example/api/auth/dto/LoginUserRequest.java new file mode 100644 index 00000000..2f351d82 --- /dev/null +++ b/src/main/java/com/example/api/auth/dto/LoginUserRequest.java @@ -0,0 +1,4 @@ +package com.example.api.auth.dto; + +public record LoginUserRequest(Long userId) { +} diff --git a/src/main/java/com/example/api/auth/dto/RefreshTokenRequest.java b/src/main/java/com/example/api/auth/dto/RefreshTokenRequest.java new file mode 100644 index 00000000..b791f221 --- /dev/null +++ b/src/main/java/com/example/api/auth/dto/RefreshTokenRequest.java @@ -0,0 +1,6 @@ +package com.example.api.auth.dto; + +import jakarta.validation.constraints.NotBlank; + +public record RefreshTokenRequest(@NotBlank String refreshToken) { +} diff --git a/src/main/java/com/example/api/auth/dto/UserDetailRequest.java b/src/main/java/com/example/api/auth/dto/UserDetailRequest.java new file mode 100644 index 00000000..916fe4cc --- /dev/null +++ b/src/main/java/com/example/api/auth/dto/UserDetailRequest.java @@ -0,0 +1,9 @@ +package com.example.api.auth.dto; + +import com.example.api.account.domain.UserRole; +import jakarta.validation.constraints.NotNull; + +import java.util.Collection; + +public record UserDetailRequest(@NotNull Long userId, @NotNull Collection authorities) { +} From 56d9acf4307dc841e780bed9645e2719507b15f6 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Sat, 21 Dec 2024 00:09:39 +0900 Subject: [PATCH 155/276] =?UTF-8?q?#12=20jwtToken=20=EC=97=94=ED=8B=B0?= =?UTF-8?q?=ED=8B=B0=20=EB=B0=8F=20=EC=8A=A4=ED=94=84=EB=A7=81=20=EC=8B=9C?= =?UTF-8?q?=ED=81=90=EB=A6=AC=ED=8B=B0=20=ED=86=A0=ED=81=B0=20=EC=9D=B8?= =?UTF-8?q?=EC=A6=9D=EC=9D=84=20=EC=9C=84=ED=95=9C=20=EC=97=94=ED=8B=B0?= =?UTF-8?q?=ED=8B=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../auth/entitiy/CustomUserDetailService.java | 33 ++++++++++++ .../api/auth/entitiy/CustomUserDetails.java | 23 +++++++++ .../entitiy/JwtAuthenticationProvider.java | 40 +++++++++++++++ .../auth/entitiy/JwtAuthenticationToken.java | 50 ++++++++++++++++++ .../api/auth/entitiy/RefreshToken.java | 51 +++++++++++++++++++ 5 files changed, 197 insertions(+) create mode 100644 src/main/java/com/example/api/auth/entitiy/CustomUserDetailService.java create mode 100644 src/main/java/com/example/api/auth/entitiy/CustomUserDetails.java create mode 100644 src/main/java/com/example/api/auth/entitiy/JwtAuthenticationProvider.java create mode 100644 src/main/java/com/example/api/auth/entitiy/JwtAuthenticationToken.java create mode 100644 src/main/java/com/example/api/auth/entitiy/RefreshToken.java diff --git a/src/main/java/com/example/api/auth/entitiy/CustomUserDetailService.java b/src/main/java/com/example/api/auth/entitiy/CustomUserDetailService.java new file mode 100644 index 00000000..c8e52a3f --- /dev/null +++ b/src/main/java/com/example/api/auth/entitiy/CustomUserDetailService.java @@ -0,0 +1,33 @@ +package com.example.api.auth.entitiy; + +import com.example.api.account.repository.AccountRepository; +import com.example.api.domain.Account; +import com.example.api.exception.BusinessException; +import com.example.api.exception.ErrorCode; +import lombok.RequiredArgsConstructor; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Collection; + +@Component +@RequiredArgsConstructor +public class CustomUserDetailService { + private final AccountRepository accountRepository; + + @Transactional(readOnly = true) + public CustomUserDetails loadUserByUserId(final Long userId) { + Account user = accountRepository.findById(userId) + .orElseThrow(() -> new BusinessException(ErrorCode.NULL_USER)); + + if(user.isDeleted()) + throw new BusinessException(ErrorCode.DELETED_USER); + + Collection authorities = user.getRoles().stream() + .map(authority -> new SimpleGrantedAuthority(authority.getAuthority())) + .toList(); + + return new CustomUserDetails(user.getAccountId(), authorities); + } +} diff --git a/src/main/java/com/example/api/auth/entitiy/CustomUserDetails.java b/src/main/java/com/example/api/auth/entitiy/CustomUserDetails.java new file mode 100644 index 00000000..b0f011ff --- /dev/null +++ b/src/main/java/com/example/api/auth/entitiy/CustomUserDetails.java @@ -0,0 +1,23 @@ +package com.example.api.auth.entitiy; + +import org.springframework.security.core.GrantedAuthority; + +import java.util.Collection; + +public class CustomUserDetails{ + private final Long userId; + private final Collection authorities; + + public CustomUserDetails(final Long userId, final Collection authorities) { + this.userId = userId; + this.authorities = authorities; + } + + public Collection getAuthorities() { + return authorities; + } + + public Long getUserId() { + return userId; + } +} \ No newline at end of file diff --git a/src/main/java/com/example/api/auth/entitiy/JwtAuthenticationProvider.java b/src/main/java/com/example/api/auth/entitiy/JwtAuthenticationProvider.java new file mode 100644 index 00000000..1abc4e53 --- /dev/null +++ b/src/main/java/com/example/api/auth/entitiy/JwtAuthenticationProvider.java @@ -0,0 +1,40 @@ +package com.example.api.auth.entitiy; + +import com.example.api.auth.service.JwtTokenProvider; +import com.example.api.exception.BusinessException; +import com.example.api.exception.ErrorCode; +import io.jsonwebtoken.Claims; +import lombok.RequiredArgsConstructor; +import org.springframework.security.authentication.AuthenticationProvider; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.AuthenticationException; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class JwtAuthenticationProvider implements AuthenticationProvider { + private final JwtTokenProvider jwtTokenProvider; + private final CustomUserDetailService customUserDetailService; + + @Override + public Authentication authenticate(Authentication authentication) throws AuthenticationException { + if (!(authentication instanceof JwtAuthenticationToken)) { + return null; + } + String accessToken = authentication.getCredentials().toString(); + + Claims claims = jwtTokenProvider.getClaimsByToken(accessToken); + if (claims.get("auth") == null) { + throw new BusinessException(ErrorCode.TOKEN_MISSING_AUTHORITY); + } + + Long userId = claims.get("userId", Long.class); + + CustomUserDetails customUserDetails = customUserDetailService.loadUserByUserId(userId); + return new JwtAuthenticationToken(userId, accessToken, customUserDetails.getAuthorities()); + } + + public boolean supports(final Class authentication) { + return JwtAuthenticationToken.class.isAssignableFrom(authentication); + } +} diff --git a/src/main/java/com/example/api/auth/entitiy/JwtAuthenticationToken.java b/src/main/java/com/example/api/auth/entitiy/JwtAuthenticationToken.java new file mode 100644 index 00000000..ed73a45b --- /dev/null +++ b/src/main/java/com/example/api/auth/entitiy/JwtAuthenticationToken.java @@ -0,0 +1,50 @@ +package com.example.api.auth.entitiy; + +import org.springframework.security.authentication.AbstractAuthenticationToken; +import org.springframework.security.core.GrantedAuthority; + +import java.util.Collection; + +public class JwtAuthenticationToken extends AbstractAuthenticationToken { + private final Long userId; + private String token; + + public JwtAuthenticationToken(String token) { + super(null); + this.userId = null; + this.token = token; + setAuthenticated(false); + } + + public JwtAuthenticationToken(Long userId, String token, Collection authorities) { + super(authorities); + this.userId = userId; + this.token = token; + setAuthenticated(false); + } + + @Override + public Object getCredentials() { + return this.token; + } + + @Override + public Object getPrincipal() { + return this.userId; + } + + @Override + public void setAuthenticated(boolean authenticated) throws IllegalArgumentException { + if (authenticated) { + throw new IllegalArgumentException("옳지 않은 과정을 통해 인증되었습니다."); + } + super.setAuthenticated(false); + } + + @Override + public void eraseCredentials() { + super.eraseCredentials(); + this.token = null; + } +} + diff --git a/src/main/java/com/example/api/auth/entitiy/RefreshToken.java b/src/main/java/com/example/api/auth/entitiy/RefreshToken.java new file mode 100644 index 00000000..905a831e --- /dev/null +++ b/src/main/java/com/example/api/auth/entitiy/RefreshToken.java @@ -0,0 +1,51 @@ +package com.example.api.auth.entitiy; + +import com.example.api.domain.Account; +import jakarta.persistence.*; + +import java.time.LocalDateTime; + +@Entity +public class RefreshToken { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "tokenId") + private Long id; + + @Column + private String refreshToken; + + @Column + private boolean isExpired = false; + + @Column + private LocalDateTime recentLogin = LocalDateTime.now(); + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "ACCOUNT_UNIQUE_ID") + private Account user; + + protected RefreshToken() { + } + + public RefreshToken(Account user) { + this.user = user; + } + + public Long getId() { + return id; + } + + public void putRefreshToken(String refreshToken) { + this.refreshToken = refreshToken; + } + + public void expire() { + isExpired = true; + } + + public boolean isExpired() { + return isExpired; + } +} \ No newline at end of file From 204f552cf90714a2bcf682b54ed27f60cf510848 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Sat, 21 Dec 2024 00:10:27 +0900 Subject: [PATCH 156/276] =?UTF-8?q?#12=20=EC=9D=B8=EC=A6=9D=20=EB=B0=8F=20?= =?UTF-8?q?=ED=86=A0=ED=81=B0=20=EB=A0=88=ED=8F=AC=EC=A7=80=ED=86=A0?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/auth/repository/AuthRepository.java | 10 ++++++++++ .../api/auth/repository/TokenRepository.java | 15 +++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 src/main/java/com/example/api/auth/repository/AuthRepository.java create mode 100644 src/main/java/com/example/api/auth/repository/TokenRepository.java diff --git a/src/main/java/com/example/api/auth/repository/AuthRepository.java b/src/main/java/com/example/api/auth/repository/AuthRepository.java new file mode 100644 index 00000000..b1a64fac --- /dev/null +++ b/src/main/java/com/example/api/auth/repository/AuthRepository.java @@ -0,0 +1,10 @@ +package com.example.api.auth.repository; + +import com.example.api.domain.Account; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; + +public interface AuthRepository extends JpaRepository { + Optional findUserByLoginId(String loginId); +} diff --git a/src/main/java/com/example/api/auth/repository/TokenRepository.java b/src/main/java/com/example/api/auth/repository/TokenRepository.java new file mode 100644 index 00000000..49ff62f2 --- /dev/null +++ b/src/main/java/com/example/api/auth/repository/TokenRepository.java @@ -0,0 +1,15 @@ +package com.example.api.auth.repository; + +import com.example.api.auth.entitiy.RefreshToken; +import com.example.api.domain.Account; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.Optional; + +@Repository +public interface TokenRepository extends JpaRepository { + Optional findByUser(Account user); + + void deleteAllByUser(Account user); +} From 9451808fb2c8f5111d10b32f3e28510272b4a4a6 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Sat, 21 Dec 2024 00:11:09 +0900 Subject: [PATCH 157/276] =?UTF-8?q?#12=20(AuthService)=20=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=EC=9D=B8=20=EA=B4=80=EB=A0=A8=20=EC=84=9C=EB=B9=84?= =?UTF-8?q?=EC=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/api/auth/service/AuthService.java | 89 +++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 src/main/java/com/example/api/auth/service/AuthService.java diff --git a/src/main/java/com/example/api/auth/service/AuthService.java b/src/main/java/com/example/api/auth/service/AuthService.java new file mode 100644 index 00000000..284d22e4 --- /dev/null +++ b/src/main/java/com/example/api/auth/service/AuthService.java @@ -0,0 +1,89 @@ +package com.example.api.auth.service; + +import com.example.api.auth.entitiy.RefreshToken; +import com.example.api.auth.dto.*; +import com.example.api.auth.repository.AuthRepository; +import com.example.api.auth.repository.TokenRepository; +import com.example.api.domain.Account; +import com.example.api.exception.BusinessException; +import com.example.api.exception.ErrorCode; +import jakarta.transaction.Transactional; +import lombok.RequiredArgsConstructor; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +@Service +@RequiredArgsConstructor +public class AuthService { + private final AuthRepository authRepository; + private final PasswordEncoder passwordEncoder; + private final JwtTokenProvider jwtTokenProvider; + private final TokenRepository tokenRepository; + + @Transactional + public AuthTokenRequest login(@Validated final LoginRequest request) { + final Account user = getUserByLoginId(request.loginId()); + checkPassword(request, user); + return generateAuthToken(user); + } + + private Account getUserByLoginId(final String loginId) { + final Account user = authRepository.findUserByLoginId(loginId) + .orElseThrow(() -> new BusinessException(ErrorCode.NULL_USER)); + + if(user.isDeleted()) + throw new BusinessException(ErrorCode.DELETED_USER); + + return user; + } + + private void checkPassword(final LoginRequest request, final Account user) { + if(!passwordEncoder.matches(request.password(), user.getPassword())) { + throw new BusinessException(ErrorCode.INCORRECT_PASSWORD); + } + } + + private AuthTokenRequest generateAuthToken(final Account user) { + String accessToken = jwtTokenProvider.generateAccessToken(new UserDetailRequest(user.getAccountId(), user.getRoles())); + String refreshToken = generateRefreshToken(user); + + return new AuthTokenRequest(accessToken,refreshToken); + } + + private String generateRefreshToken(final Account user) { + RefreshToken token = new RefreshToken(user); + + if(tokenRepository.findByUser(user).isPresent()) { + tokenRepository.deleteAllByUser(user); + } + + tokenRepository.save(token); + String refreshToken = jwtTokenProvider.generateRefreshToken(new UserDetailRequest(user.getAccountId(), user.getRoles()), token.getId()); + + token.putRefreshToken(refreshToken); + return refreshToken; + } + + @Transactional + public AuthTokenRequest refreshAuthToken(@Validated final RefreshTokenRequest request){ + if(!jwtTokenProvider.isNotExpiredToken(request.refreshToken())){ + throw new BusinessException(ErrorCode.EXPIRED_REFRESH_TOKEN); + } + + Long userId = jwtTokenProvider.getUserIdFromToken(request.refreshToken()); + Account user = getUserById(userId); + return generateAuthToken(user); + } + + @Transactional + public AuthTokenRequest logout(@Validated final LoginUserRequest loginUserRequest) { + Account user = getUserById(loginUserRequest.userId()); + tokenRepository.deleteAllByUser(user); + return new AuthTokenRequest(null, null); + } + + private Account getUserById(final Long userId) { + return authRepository.findById(userId).orElseThrow(() -> new BusinessException(ErrorCode.NULL_USER)); + } +} \ No newline at end of file From e93ce8cf241320e0b19f203c8c882f534d98fed6 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Sat, 21 Dec 2024 00:12:13 +0900 Subject: [PATCH 158/276] =?UTF-8?q?#12=20(JwtTokenProvider)=20jwt=20?= =?UTF-8?q?=ED=86=A0=ED=81=B0=20=EA=B4=80=EB=A0=A8=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=A0=9C=EA=B3=B5=20=EC=84=9C=EB=B9=84=EC=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/auth/service/JwtTokenProvider.java | 128 ++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 src/main/java/com/example/api/auth/service/JwtTokenProvider.java diff --git a/src/main/java/com/example/api/auth/service/JwtTokenProvider.java b/src/main/java/com/example/api/auth/service/JwtTokenProvider.java new file mode 100644 index 00000000..9da5979f --- /dev/null +++ b/src/main/java/com/example/api/auth/service/JwtTokenProvider.java @@ -0,0 +1,128 @@ +package com.example.api.auth.service; + +import com.example.api.auth.dto.UserDetailRequest; +import com.example.api.exception.BusinessException; +import com.example.api.exception.ErrorCode; +import com.example.api.global.properties.JwtProperties; +import io.jsonwebtoken.*; +import io.jsonwebtoken.security.Keys; +import jakarta.servlet.http.HttpServletRequest; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +import java.util.Date; + +@Component +@RequiredArgsConstructor +public class JwtTokenProvider { + private final JwtProperties jwtProperties; + + // AccessToken 생성 + public String generateAccessToken(final UserDetailRequest user) { + Claims claims = getClaimsFrom(user); + return getTokenFrom(claims, jwtProperties.getAccessTokenValidTime() * 1000); + } + + // AccessToken용 Claim 생성 + private Claims getClaimsFrom(final UserDetailRequest user) { + Claims claims = Jwts.claims(); + claims.put("userId", user.userId()); + claims.put("auth", user.authorities()); + return claims; + } + + // RefrshToken 생성 + public String generateRefreshToken(final UserDetailRequest user, final Long tokenId) { + Claims claims = getClaimsFrom(user, tokenId); + return getTokenFrom(claims, jwtProperties.getRefreshTokenValidTime() * 1000); + } + + // RefreshToken용 Claim 생성 + private Claims getClaimsFrom(final UserDetailRequest user, final Long tokenId) { + Claims claims = Jwts.claims(); + claims.put("userId", user.userId()); + claims.put("tokenId", tokenId); + claims.put("auth", user.authorities()); + return claims; + } + + // claim 정보로 Token 얻기 + private String getTokenFrom(final Claims claims, final long validTime) { + Date now = new Date(); + return Jwts.builder() + .setHeaderParam("type", "JWT") + .setClaims(claims) + .setIssuedAt(now) + .setExpiration(new Date(now.getTime() + validTime)) + .signWith( + Keys.hmacShaKeyFor(jwtProperties.getBytesSecretKey()), + SignatureAlgorithm.HS256 + ) + .compact(); + } + + // Token에서 유저 인증 정보 얻기 + public Long getUserIdFromToken(final String token) { + try { + Claims claims = Jwts.parserBuilder() + .setSigningKey(Keys.hmacShaKeyFor(jwtProperties.getBytesSecretKey())) + .build() + .parseClaimsJws(token) + .getBody(); + return claims.get("userId", Long.class); + } catch (ExpiredJwtException e) { + throw new BusinessException(ErrorCode.EXPIRED_ACCESS_TOKEN); + } catch (Exception e) { + throw new BusinessException(ErrorCode.INVALID_TOKEN); + } + } + + // AccessToken 값만 남도록 접두사 삭제 + public String extractAccessToken(final HttpServletRequest request) { + String token = request.getHeader("Authorization"); + if (token != null && token.startsWith("Bearer ")) { + return token.substring(7); + } + return token; + } + + // 만료된 토큰인지 확인 + public boolean isNotExpiredToken(final String token) { + try { + return !Jwts.parserBuilder() + .setSigningKey(Keys.hmacShaKeyFor(jwtProperties.getBytesSecretKey())) + .build() + .parseClaimsJws(token) + .getBody() + .getExpiration().before(new Date()); + } catch (ExpiredJwtException e) { + return false; + } + } + + // 토큰으로부터 토큰 ID 얻기 + public Long getTokenIdFromToken(final String refreshToken) { + try { + Claims claims = Jwts.parserBuilder() + .setSigningKey(Keys.hmacShaKeyFor(jwtProperties.getBytesSecretKey())) + .build() + .parseClaimsJws(refreshToken) + .getBody(); + + return Long.parseLong(String.valueOf(claims.get("tokenId"))); + } catch (ExpiredJwtException e) { + throw new BusinessException(ErrorCode.EXPIRED_ACCESS_TOKEN); + } catch (Exception e) { + throw new BusinessException(ErrorCode.INVALID_TOKEN); + } + } + + // 토큰으로부터 Claims 얻기 + public Claims getClaimsByToken(final String accessToken) { + return Jwts.parserBuilder() + .setSigningKey(Keys.hmacShaKeyFor(jwtProperties.getBytesSecretKey())) + .build() + .parseClaimsJws(accessToken) + .getBody(); + } +} \ No newline at end of file From 15bd0e5e32effa32a336946e66f151b17315da7f Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Sat, 21 Dec 2024 00:13:30 +0900 Subject: [PATCH 159/276] =?UTF-8?q?#12=20(JwtAuthenticationFilter)=20jwt?= =?UTF-8?q?=20=ED=86=A0=ED=81=B0=20=EC=9D=B8=EC=A6=9D=20=ED=95=84=ED=84=B0?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../filter/JwtAuthenticationFilter.java | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 src/main/java/com/example/api/global/config/filter/JwtAuthenticationFilter.java diff --git a/src/main/java/com/example/api/global/config/filter/JwtAuthenticationFilter.java b/src/main/java/com/example/api/global/config/filter/JwtAuthenticationFilter.java new file mode 100644 index 00000000..5e483c23 --- /dev/null +++ b/src/main/java/com/example/api/global/config/filter/JwtAuthenticationFilter.java @@ -0,0 +1,58 @@ +package com.example.api.global.config.filter; + +import com.example.api.auth.entitiy.JwtAuthenticationProvider; +import com.example.api.auth.entitiy.JwtAuthenticationToken; +import com.example.api.auth.service.JwtTokenProvider; +import com.example.api.exception.BusinessException; +import com.example.api.exception.ErrorCode; +import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Component; +import org.springframework.web.filter.OncePerRequestFilter; + +import java.io.IOException; +import java.util.Map; + +@Component +@RequiredArgsConstructor +public class JwtAuthenticationFilter extends OncePerRequestFilter { + private final JwtAuthenticationProvider jwtAuthenticationProvider; + private final JwtTokenProvider jwtTokenProvider; + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { + try { + String accessToken = jwtTokenProvider.extractAccessToken(request); + if (accessToken != null) { + if (!jwtTokenProvider.isNotExpiredToken(accessToken)) { + throw new BusinessException(ErrorCode.EXPIRED_ACCESS_TOKEN.getErrorDescription(), ErrorCode.EXPIRED_ACCESS_TOKEN); + } + + Authentication authentication = jwtAuthenticationProvider.authenticate(new JwtAuthenticationToken(accessToken)); + SecurityContextHolder.getContext().setAuthentication(authentication); + } + + filterChain.doFilter(request, response); + } catch (BusinessException ex) { + response.setStatus(ex.getErrorCode().getHttpStatus().value()); + response.setContentType("application/json"); + response.setCharacterEncoding("UTF-8"); + + Map errorResponse = Map.of( + "httpStatus", ex.getErrorCode().getHttpStatus().value(), + "errorCodeResponse", ex.getErrorCode().getErrorCode(), + "errorMessage", ex.getErrorCode().getErrorDescription() + ); + + response.getWriter().write(new ObjectMapper().writeValueAsString(errorResponse)); + } finally { + SecurityContextHolder.clearContext(); + } + } +} From 41ce3574da2e11111d0d224f9c462f58524c3e31 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Sat, 21 Dec 2024 00:14:15 +0900 Subject: [PATCH 160/276] =?UTF-8?q?#12=20(SecurityConfig)=20=EC=8B=9C?= =?UTF-8?q?=ED=81=90=EB=A6=AC=ED=8B=B0=20=EC=84=A4=EC=A0=95=20=ED=8C=8C?= =?UTF-8?q?=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/global/config/SecurityConfig.java | 48 ++++++++++++++----- 1 file changed, 35 insertions(+), 13 deletions(-) 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 ee7e689d..2912a5b5 100644 --- a/src/main/java/com/example/api/global/config/SecurityConfig.java +++ b/src/main/java/com/example/api/global/config/SecurityConfig.java @@ -1,37 +1,59 @@ package com.example.api.global.config; +import com.example.api.auth.entitiy.JwtAuthenticationProvider; +import com.example.api.global.config.filter.JwtAuthenticationFilter; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.ProviderManager; import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; +import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; -import static org.springframework.security.config.Customizer.withDefaults; + +import java.util.List; @Configuration public class SecurityConfig { + private final JwtAuthenticationProvider jwtAuthenticationProvider; + private final JwtAuthenticationFilter jwtAuthenticationFilter; + + public SecurityConfig(JwtAuthenticationProvider authenticationProvider, JwtAuthenticationFilter jwtAuthenticationFilter) { + this.jwtAuthenticationProvider = authenticationProvider; + this.jwtAuthenticationFilter = jwtAuthenticationFilter; + } @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { - http.csrf(csrf -> csrf.disable()) - .authorizeHttpRequests(authorize -> - authorize - .requestMatchers("/api/v1/account/**", - "/api/v1/**").permitAll() - .anyRequest().authenticated() + http + .csrf(csrf -> csrf.disable()) + .authorizeHttpRequests(authorize -> authorize + .requestMatchers( + "/api/v1/account/**", + "/api/v1/**" + ).permitAll() + .anyRequest().hasRole("EMPLOYEE") ) - .formLogin(AbstractHttpConfigurer::disable) - .httpBasic(withDefaults()); - - + .addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class) + .sessionManagement(session -> + session.sessionCreationPolicy(SessionCreationPolicy.STATELESS) + ) + .httpBasic(httpBasic -> httpBasic.disable()) + .formLogin(formLogin -> formLogin.disable()); return http.build(); } + @Bean + public AuthenticationManager authenticationManager() { + return new ProviderManager(List.of(jwtAuthenticationProvider)); + } + @Bean public PasswordEncoder passwordEncoder() { - return new BCryptPasswordEncoder(); + return new BCryptPasswordEncoder(12); } } From b64d5d47d69ef8b6c85c3d0187c1ece3a440b6d1 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Sat, 21 Dec 2024 00:14:59 +0900 Subject: [PATCH 161/276] =?UTF-8?q?#12=20(JwtProperties)=20jwt=20=EC=86=8D?= =?UTF-8?q?=EC=84=B1=20=EA=B0=92=20=ED=8C=8C=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/global/properties/JwtProperties.java | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 src/main/java/com/example/api/global/properties/JwtProperties.java diff --git a/src/main/java/com/example/api/global/properties/JwtProperties.java b/src/main/java/com/example/api/global/properties/JwtProperties.java new file mode 100644 index 00000000..646caa88 --- /dev/null +++ b/src/main/java/com/example/api/global/properties/JwtProperties.java @@ -0,0 +1,33 @@ +package com.example.api.global.properties; + +import lombok.Getter; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import java.nio.charset.StandardCharsets; + +@Getter +@Component +public class JwtProperties { + @Value("${jwt.secret_key}") + private String secretKey; + + @Value("${jwt.access_token_valid_time}") + private Long accessTokenValidTime; + + @Value("${jwt.refresh_token_valid_time}") + private Long refreshTokenValidTime ; + + + public byte[] getBytesSecretKey() { + return secretKey.getBytes(StandardCharsets.UTF_8); + } + + public void setAccessTokenValidTime(final Long time) { + accessTokenValidTime = time; + } + + public void setRefreshTokenValidTime(final Long time) { + refreshTokenValidTime = time; + } +} From ea258ae7a3b4a2974a64559eb2de7d216b7abd13 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Sat, 21 Dec 2024 00:16:06 +0900 Subject: [PATCH 162/276] =?UTF-8?q?#12=20(application.properties)=20jwt=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20=EC=86=8D=EC=84=B1=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application.properties | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index f527c3ef..7274b980 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -41,4 +41,11 @@ spring.mail.properties.mail.smtp.starttls.required=true spring.mail.properties.mail.smtp.connectiontimeout=5000 spring.mail.properties.mail.smtp.timeout=5000 spring.mail.properties.mail.smtp.writetimeout=5000 -spring.mail.auth-code-expiration-millis=600000 \ No newline at end of file +spring.mail.auth-code-expiration-millis=600000 + +# JWT +jwt.secret_key=${jwt.secret_key} +# 60? +jwt.access_token_valid_time=3600 +# 30? +jwt.refresh_token_valid_time=2592000 \ No newline at end of file From 2631e1464ba6d265c18f319b01721575b65c1cbd Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Sat, 21 Dec 2024 00:16:44 +0900 Subject: [PATCH 163/276] =?UTF-8?q?#12=20(build.gradle)=20jwt=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=EC=9D=98=EC=A1=B4=EC=84=B1=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/build.gradle b/build.gradle index 610601c9..d7b18743 100644 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,6 @@ plugins { id 'java' id 'org.springframework.boot' version '3.3.5' id 'io.spring.dependency-management' version '1.1.6' - id 'org.jetbrains.kotlin.jvm' } group = 'com.example' @@ -27,8 +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' - implementation 'org.springframework.boot:spring-boot-starter-websocket' compileOnly 'org.projectlombok:lombok' // runtimeOnly 'com.mysql:mysql-connector-j' runtimeOnly 'com.h2database:h2' @@ -36,18 +33,30 @@ dependencies { testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' - // env 파일 읽도록 도와주는 라이브러리 + + // WEB SOCKET + implementation 'org.springframework.boot:spring-boot-starter-websocket' + + // MONGO DB + implementation 'org.springframework.boot:spring-boot-starter-data-mongodb' + + // ENV implementation 'me.paulschwarz:spring-dotenv:4.0.0' - //valid + // VALIDATION implementation 'org.springframework.boot:spring-boot-starter-validation' - //security + // SECURITY implementation 'org.springframework.boot:spring-boot-starter-security' - // smtp + // SMTP implementation 'org.springframework.boot:spring-boot-starter-mail' implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8" + + // JWT + implementation 'io.jsonwebtoken:jjwt-api:0.11.5' + runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.5' + runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.11.5' } tasks.named('test') { From c998a9ce636c9dce997aa623e21fa626d62b1d5d Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Sat, 21 Dec 2024 00:17:48 +0900 Subject: [PATCH 164/276] =?UTF-8?q?#12=20(ErrorCode)=20=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EC=9D=B8=20=EB=B0=8F=20=ED=86=A0=ED=81=B0=20=EA=B4=80=EB=A0=A8?= =?UTF-8?q?=20=EC=97=90=EB=9F=AC=EC=BD=94=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/example/api/exception/ErrorCode.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/main/java/com/example/api/exception/ErrorCode.java b/src/main/java/com/example/api/exception/ErrorCode.java index a97e41db..17b06e7e 100644 --- a/src/main/java/com/example/api/exception/ErrorCode.java +++ b/src/main/java/com/example/api/exception/ErrorCode.java @@ -10,6 +10,17 @@ public enum ErrorCode { DUPLICATE_EMAIL(HttpStatus.BAD_REQUEST, "-101", "이미 가입된 이메일입니다."), INCORRECT_CODE(HttpStatus.BAD_REQUEST, "-103", "이메일 인증에 실패하였습니다."), EXPIRATION_DATE_END(HttpStatus.BAD_REQUEST, "-104", "코드의 유효 기간이 만료 되었습니다."), + NULL_USER(HttpStatus.BAD_REQUEST, "-105", "존재하지 않는 회원입니다."), + DELETED_USER(HttpStatus.BAD_REQUEST, "-106", "탈퇴한 회원입니다."), + INCORRECT_PASSWORD(HttpStatus.BAD_REQUEST, "-107", "틀린 비밀번호입니다."), + + INVALID_TOKEN(HttpStatus.BAD_REQUEST, "-T1", "올바르지 않은 AccessToken입니다."), + EXPIRED_ACCESS_TOKEN(HttpStatus.UNAUTHORIZED, "-T2", "만료된 AccessToken입니다."), + EXPIRED_REFRESH_TOKEN(HttpStatus.UNAUTHORIZED, "T3", "만료된 ReFreshToken"), + NULL_REFRESH_TOKEN(HttpStatus.UNAUTHORIZED,"T4", "존재하지 않은 ReFreshToken 접근"), + NOT_ACCESS_TOKEN_FOR_REISSUE(HttpStatus.BAD_REQUEST,"T5","재발급하기에는 유효기간이 남은 AccessToken"), + TOKEN_MISSING_AUTHORITY(HttpStatus.BAD_REQUEST,"T6","권한 정보가 담겨있지 않은 토큰입니다."), + FAIL_GENERATE_CODE(HttpStatus.INTERNAL_SERVER_ERROR, "-500", "코드 생성에 실패하였습니다."), FAIL_SEND_EMAIL(HttpStatus.INTERNAL_SERVER_ERROR, "-501", "이메일 전송에 실패하였습니다."), From 77e34181a087ca64265c5e1146f67f1925f15870 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Sat, 21 Dec 2024 00:19:39 +0900 Subject: [PATCH 165/276] =?UTF-8?q?#12=20(Account)=20Account=20=EB=8F=84?= =?UTF-8?q?=EB=A9=94=EC=9D=B8=EC=97=90=20=EA=B6=8C=ED=95=9C=20=ED=95=84?= =?UTF-8?q?=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/example/api/domain/Account.java | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/example/api/domain/Account.java b/src/main/java/com/example/api/domain/Account.java index 8157962d..c0bea441 100644 --- a/src/main/java/com/example/api/domain/Account.java +++ b/src/main/java/com/example/api/domain/Account.java @@ -2,10 +2,13 @@ import com.example.api.account.domain.Nationality; import com.example.api.account.domain.UserRole; +import com.example.api.auth.dto.LoginUserRequest; import jakarta.persistence.*; import lombok.Getter; import lombok.Setter; +import java.util.Collection; + @Entity @Getter @@ -33,9 +36,10 @@ public class Account extends BaseEntity { @Column(name = "ACCOUNT_NATIONALITY") @Enumerated(EnumType.STRING) private Nationality nationality; - @Column(name = "ACCOUNT_ROLE") + @ElementCollection(targetClass = UserRole.class) + @CollectionTable(name = "AUTHORITY", joinColumns = @JoinColumn(name = "ACCOUNT_UNIQUE_ID")) @Enumerated(EnumType.STRING) - private UserRole role; + private Collection roles; @Column(name = "ACCOUNT_SEX") private String sex; @Column(name = "ACCOUNT_AGE") @@ -54,7 +58,7 @@ public class Account extends BaseEntity { public Account() { } - public Account(String loginId, String password, String name, String nickname, String phoneNumber, String email, Nationality nationality, UserRole role) { + public Account(String loginId, String password, String name, String nickname, String phoneNumber, String email, Nationality nationality, Collection roles) { this.loginId = loginId; this.password = password; this.name = name; @@ -62,9 +66,13 @@ public Account(String loginId, String password, String name, String nickname, St this.email = email; this.phoneNumber = phoneNumber; this.nationality = nationality; - this.role = role; + this.roles = roles; this.starPoint = 0.0f; this.workCount = 0; this.openStatus = true; } + + public LoginUserRequest getLoginUser(){ + return new LoginUserRequest(accountId); + } } \ No newline at end of file From e6159ef2b907c9b932041dc749ddade5e340858b Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Sat, 21 Dec 2024 00:34:47 +0900 Subject: [PATCH 166/276] =?UTF-8?q?#12=20(UserRole)=20UserRole=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EA=B6=8C=ED=95=9C=EC=9D=84=20=ED=9A=8D=EB=93=9D?= =?UTF-8?q?=ED=95=A0=20=EC=88=98=20=EC=9E=88=EB=8F=84=EB=A1=9D=20get=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/dto/request/EmailCodeRequestDto.java | 6 ------ .../controller/dto/request/EmailRequestDto.java | 6 ------ .../controller/dto/request/LoginIdRequestDto.java | 4 ---- .../controller/dto/response/RegisterResponseDto.java | 11 ----------- .../com/example/api/account/dto/EmailCodeRequest.java | 6 ++++++ .../com/example/api/account/dto/EmailRequest.java | 6 ++++++ .../com/example/api/account/dto/LoginIdRequest.java | 6 ++++++ .../SignUpRequestDto.java => dto/SignUpRequest.java} | 4 ++-- .../example/api/account/{domain => entity}/Code.java | 0 .../api/account/{domain => entity}/CodeGenerator.java | 0 .../api/account/{domain => entity}/MailSender.java | 4 ++-- .../api/account/{domain => entity}/Nationality.java | 0 .../api/account/{domain => entity}/UserRole.java | 10 +++++++++- 13 files changed, 31 insertions(+), 32 deletions(-) delete mode 100644 src/main/java/com/example/api/account/controller/dto/request/EmailCodeRequestDto.java delete mode 100644 src/main/java/com/example/api/account/controller/dto/request/EmailRequestDto.java delete mode 100644 src/main/java/com/example/api/account/controller/dto/request/LoginIdRequestDto.java delete mode 100644 src/main/java/com/example/api/account/controller/dto/response/RegisterResponseDto.java create mode 100644 src/main/java/com/example/api/account/dto/EmailCodeRequest.java create mode 100644 src/main/java/com/example/api/account/dto/EmailRequest.java create mode 100644 src/main/java/com/example/api/account/dto/LoginIdRequest.java rename src/main/java/com/example/api/account/{controller/dto/request/SignUpRequestDto.java => dto/SignUpRequest.java} (86%) rename src/main/java/com/example/api/account/{domain => entity}/Code.java (100%) rename src/main/java/com/example/api/account/{domain => entity}/CodeGenerator.java (100%) rename src/main/java/com/example/api/account/{domain => entity}/MailSender.java (90%) rename src/main/java/com/example/api/account/{domain => entity}/Nationality.java (100%) rename src/main/java/com/example/api/account/{domain => entity}/UserRole.java (71%) diff --git a/src/main/java/com/example/api/account/controller/dto/request/EmailCodeRequestDto.java b/src/main/java/com/example/api/account/controller/dto/request/EmailCodeRequestDto.java deleted file mode 100644 index 4cccb061..00000000 --- a/src/main/java/com/example/api/account/controller/dto/request/EmailCodeRequestDto.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.example.api.account.controller.dto.request; - -import com.example.api.global.config.resolver.ValidEmail; - -public record EmailCodeRequestDto(@ValidEmail String email, String code) { -} diff --git a/src/main/java/com/example/api/account/controller/dto/request/EmailRequestDto.java b/src/main/java/com/example/api/account/controller/dto/request/EmailRequestDto.java deleted file mode 100644 index c67f6a68..00000000 --- a/src/main/java/com/example/api/account/controller/dto/request/EmailRequestDto.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.example.api.account.controller.dto.request; - -import com.example.api.global.config.resolver.ValidEmail; - -public record EmailRequestDto(@ValidEmail String email) { -} diff --git a/src/main/java/com/example/api/account/controller/dto/request/LoginIdRequestDto.java b/src/main/java/com/example/api/account/controller/dto/request/LoginIdRequestDto.java deleted file mode 100644 index 70dd5ca2..00000000 --- a/src/main/java/com/example/api/account/controller/dto/request/LoginIdRequestDto.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.example.api.account.controller.dto.request; - -public record LoginIdRequestDto(String loginId) { -} diff --git a/src/main/java/com/example/api/account/controller/dto/response/RegisterResponseDto.java b/src/main/java/com/example/api/account/controller/dto/response/RegisterResponseDto.java deleted file mode 100644 index 6d03816d..00000000 --- a/src/main/java/com/example/api/account/controller/dto/response/RegisterResponseDto.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.example.api.account.controller.dto.response; - -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -@Getter -@RequiredArgsConstructor -public class RegisterResponseDto { - private final String message; - private final String loginId; -} diff --git a/src/main/java/com/example/api/account/dto/EmailCodeRequest.java b/src/main/java/com/example/api/account/dto/EmailCodeRequest.java new file mode 100644 index 00000000..4d44d0a0 --- /dev/null +++ b/src/main/java/com/example/api/account/dto/EmailCodeRequest.java @@ -0,0 +1,6 @@ +package com.example.api.account.dto.request; + +import com.example.api.global.config.resolver.ValidEmail; + +public record EmailCodeRequest(@ValidEmail String email, String code) { +} diff --git a/src/main/java/com/example/api/account/dto/EmailRequest.java b/src/main/java/com/example/api/account/dto/EmailRequest.java new file mode 100644 index 00000000..497c82c7 --- /dev/null +++ b/src/main/java/com/example/api/account/dto/EmailRequest.java @@ -0,0 +1,6 @@ +package com.example.api.account.dto.request; + +import com.example.api.global.config.resolver.ValidEmail; + +public record EmailRequest(@ValidEmail String email) { +} diff --git a/src/main/java/com/example/api/account/dto/LoginIdRequest.java b/src/main/java/com/example/api/account/dto/LoginIdRequest.java new file mode 100644 index 00000000..149ef77f --- /dev/null +++ b/src/main/java/com/example/api/account/dto/LoginIdRequest.java @@ -0,0 +1,6 @@ +package com.example.api.account.dto.request; + +import jakarta.validation.constraints.NotBlank; + +public record LoginIdRequest(@NotBlank String loginId) { +} diff --git a/src/main/java/com/example/api/account/controller/dto/request/SignUpRequestDto.java b/src/main/java/com/example/api/account/dto/SignUpRequest.java similarity index 86% rename from src/main/java/com/example/api/account/controller/dto/request/SignUpRequestDto.java rename to src/main/java/com/example/api/account/dto/SignUpRequest.java index 5fc813c6..91a18946 100644 --- a/src/main/java/com/example/api/account/controller/dto/request/SignUpRequestDto.java +++ b/src/main/java/com/example/api/account/dto/SignUpRequest.java @@ -1,4 +1,4 @@ -package com.example.api.account.controller.dto.request; +package com.example.api.account.dto.request; import com.example.api.account.domain.Nationality; import com.example.api.account.domain.UserRole; @@ -6,7 +6,7 @@ import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; -public record SignUpRequestDto( +public record SignUpRequest( @NotBlank String loginId, diff --git a/src/main/java/com/example/api/account/domain/Code.java b/src/main/java/com/example/api/account/entity/Code.java similarity index 100% rename from src/main/java/com/example/api/account/domain/Code.java rename to src/main/java/com/example/api/account/entity/Code.java diff --git a/src/main/java/com/example/api/account/domain/CodeGenerator.java b/src/main/java/com/example/api/account/entity/CodeGenerator.java similarity index 100% rename from src/main/java/com/example/api/account/domain/CodeGenerator.java rename to src/main/java/com/example/api/account/entity/CodeGenerator.java diff --git a/src/main/java/com/example/api/account/domain/MailSender.java b/src/main/java/com/example/api/account/entity/MailSender.java similarity index 90% rename from src/main/java/com/example/api/account/domain/MailSender.java rename to src/main/java/com/example/api/account/entity/MailSender.java index 138e6886..f2813d38 100644 --- a/src/main/java/com/example/api/account/domain/MailSender.java +++ b/src/main/java/com/example/api/account/entity/MailSender.java @@ -1,6 +1,6 @@ package com.example.api.account.domain; -import com.example.api.account.controller.dto.request.EmailRequestDto; +import com.example.api.account.dto.request.EmailRequest; import com.example.api.exception.BusinessException; import com.example.api.exception.ErrorCode; import lombok.RequiredArgsConstructor; @@ -17,7 +17,7 @@ public class MailSender { @Value("${spring.mail.username}") private String fromEmail; - public Code sendEmail(final EmailRequestDto emailRequest){ + public Code sendEmail(final EmailRequest emailRequest){ String code = CodeGenerator.generateCode(); try { diff --git a/src/main/java/com/example/api/account/domain/Nationality.java b/src/main/java/com/example/api/account/entity/Nationality.java similarity index 100% rename from src/main/java/com/example/api/account/domain/Nationality.java rename to src/main/java/com/example/api/account/entity/Nationality.java diff --git a/src/main/java/com/example/api/account/domain/UserRole.java b/src/main/java/com/example/api/account/entity/UserRole.java similarity index 71% rename from src/main/java/com/example/api/account/domain/UserRole.java rename to src/main/java/com/example/api/account/entity/UserRole.java index a72da024..15897a4b 100644 --- a/src/main/java/com/example/api/account/domain/UserRole.java +++ b/src/main/java/com/example/api/account/entity/UserRole.java @@ -1,4 +1,4 @@ -package com.example.api.account.domain; +package com.example.api.account.entity; public enum UserRole { EMPLOYEE(0, "알바생"), @@ -24,4 +24,12 @@ public static UserRole of(final Integer code) { public Integer getCode() { return code; } + + public String getDescription() { + return description; + } + + public String getAuthority() { + return "ROLE_" + this.name(); // ROLE_EMPLOYEE, ROLE_EMPLOYER 형식 + } } \ No newline at end of file From fbc5d7179ad1de8e9819c4744380a082e1db0e6c Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Sat, 21 Dec 2024 00:35:29 +0900 Subject: [PATCH 167/276] =?UTF-8?q?#12=20=ED=8C=8C=EC=9D=BC=20=EA=B5=AC?= =?UTF-8?q?=EC=A1=B0=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../account/controller/AccountController.java | 14 ++++---- .../api/account/dto/EmailCodeRequest.java | 2 +- .../example/api/account/dto/EmailRequest.java | 2 +- .../api/account/dto/LoginIdRequest.java | 2 +- .../api/account/dto/SignUpRequest.java | 17 +++------- .../com/example/api/account/entity/Code.java | 2 +- .../api/account/entity/CodeGenerator.java | 2 +- .../api/account/entity/MailSender.java | 4 +-- .../api/account/entity/Nationality.java | 2 +- .../account/repository/AccountRepository.java | 2 ++ .../account/repository/CodeRepository.java | 2 +- .../api/account/service/AccountService.java | 33 +++++++++++-------- .../api/auth/dto/UserDetailRequest.java | 2 +- .../api/contracts/ContractService.java | 2 +- .../java/com/example/api/domain/Account.java | 4 +-- 15 files changed, 46 insertions(+), 46 deletions(-) diff --git a/src/main/java/com/example/api/account/controller/AccountController.java b/src/main/java/com/example/api/account/controller/AccountController.java index 7ce2617e..1216de54 100644 --- a/src/main/java/com/example/api/account/controller/AccountController.java +++ b/src/main/java/com/example/api/account/controller/AccountController.java @@ -1,10 +1,10 @@ package com.example.api.account.controller; -import com.example.api.account.controller.dto.request.EmailCodeRequestDto; -import com.example.api.account.controller.dto.request.EmailRequestDto; -import com.example.api.account.domain.Code; +import com.example.api.account.dto.EmailCodeRequest; +import com.example.api.account.dto.EmailRequest; +import com.example.api.account.entity.Code; import com.example.api.account.service.AccountService; -import com.example.api.account.controller.dto.request.SignUpRequestDto; +import com.example.api.account.dto.SignUpRequest; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; @@ -18,20 +18,20 @@ public class AccountController { private final AccountService signUpService; @PostMapping("/email/code") - public ResponseEntity sendEmailCode(@Valid @RequestBody final EmailRequestDto request) { + public ResponseEntity sendEmailCode(@Valid @RequestBody final EmailRequest request) { Code code = signUpService.sendEmail(request); String successMessage = signUpService.saveCode(code); return ResponseEntity.ok(successMessage); } @PostMapping("/email/verification") - public ResponseEntity verifyEmail(@Valid @RequestBody final EmailCodeRequestDto request) { + public ResponseEntity verifyEmail(@Valid @RequestBody final EmailCodeRequest request) { String successMessage = signUpService.verifyEmail(request); return ResponseEntity.ok(successMessage); } @PostMapping("/sign-up") - public ResponseEntity signUp(@Valid @RequestBody final SignUpRequestDto request) { + public ResponseEntity signUp(@Valid @RequestBody final SignUpRequest request) { String successMessage = signUpService.signUp(request); return ResponseEntity.status(HttpStatus.CREATED).body(successMessage); } diff --git a/src/main/java/com/example/api/account/dto/EmailCodeRequest.java b/src/main/java/com/example/api/account/dto/EmailCodeRequest.java index 4d44d0a0..261bb29e 100644 --- a/src/main/java/com/example/api/account/dto/EmailCodeRequest.java +++ b/src/main/java/com/example/api/account/dto/EmailCodeRequest.java @@ -1,4 +1,4 @@ -package com.example.api.account.dto.request; +package com.example.api.account.dto; import com.example.api.global.config.resolver.ValidEmail; diff --git a/src/main/java/com/example/api/account/dto/EmailRequest.java b/src/main/java/com/example/api/account/dto/EmailRequest.java index 497c82c7..f2fc422a 100644 --- a/src/main/java/com/example/api/account/dto/EmailRequest.java +++ b/src/main/java/com/example/api/account/dto/EmailRequest.java @@ -1,4 +1,4 @@ -package com.example.api.account.dto.request; +package com.example.api.account.dto; import com.example.api.global.config.resolver.ValidEmail; diff --git a/src/main/java/com/example/api/account/dto/LoginIdRequest.java b/src/main/java/com/example/api/account/dto/LoginIdRequest.java index 149ef77f..a55502ce 100644 --- a/src/main/java/com/example/api/account/dto/LoginIdRequest.java +++ b/src/main/java/com/example/api/account/dto/LoginIdRequest.java @@ -1,4 +1,4 @@ -package com.example.api.account.dto.request; +package com.example.api.account.dto; import jakarta.validation.constraints.NotBlank; diff --git a/src/main/java/com/example/api/account/dto/SignUpRequest.java b/src/main/java/com/example/api/account/dto/SignUpRequest.java index 91a18946..27051f7c 100644 --- a/src/main/java/com/example/api/account/dto/SignUpRequest.java +++ b/src/main/java/com/example/api/account/dto/SignUpRequest.java @@ -1,7 +1,8 @@ -package com.example.api.account.dto.request; +package com.example.api.account.dto; -import com.example.api.account.domain.Nationality; -import com.example.api.account.domain.UserRole; +import com.example.api.account.entity.Nationality; +import com.example.api.account.entity.UserRole; +import com.example.api.global.config.resolver.ValidEmail; import jakarta.validation.constraints.Email; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; @@ -9,26 +10,18 @@ public record SignUpRequest( @NotBlank String loginId, - @NotBlank String password, - @NotBlank String name, - @NotBlank String nickname, - - @NotBlank - @Email + @ValidEmail String email, - @NotNull Nationality nationality, - @NotNull UserRole role, - @NotBlank String phoneNumber ) { diff --git a/src/main/java/com/example/api/account/entity/Code.java b/src/main/java/com/example/api/account/entity/Code.java index 36b945fd..0e470cd9 100644 --- a/src/main/java/com/example/api/account/entity/Code.java +++ b/src/main/java/com/example/api/account/entity/Code.java @@ -1,4 +1,4 @@ -package com.example.api.account.domain; +package com.example.api.account.entity; import jakarta.persistence.Id; import lombok.Getter; diff --git a/src/main/java/com/example/api/account/entity/CodeGenerator.java b/src/main/java/com/example/api/account/entity/CodeGenerator.java index d442b6f1..50c40a41 100644 --- a/src/main/java/com/example/api/account/entity/CodeGenerator.java +++ b/src/main/java/com/example/api/account/entity/CodeGenerator.java @@ -1,4 +1,4 @@ -package com.example.api.account.domain; +package com.example.api.account.entity; import com.example.api.exception.BusinessException; import com.example.api.exception.ErrorCode; diff --git a/src/main/java/com/example/api/account/entity/MailSender.java b/src/main/java/com/example/api/account/entity/MailSender.java index f2813d38..177ef701 100644 --- a/src/main/java/com/example/api/account/entity/MailSender.java +++ b/src/main/java/com/example/api/account/entity/MailSender.java @@ -1,6 +1,6 @@ -package com.example.api.account.domain; +package com.example.api.account.entity; -import com.example.api.account.dto.request.EmailRequest; +import com.example.api.account.dto.EmailRequest; import com.example.api.exception.BusinessException; import com.example.api.exception.ErrorCode; import lombok.RequiredArgsConstructor; diff --git a/src/main/java/com/example/api/account/entity/Nationality.java b/src/main/java/com/example/api/account/entity/Nationality.java index 4e7b3e56..312527e0 100644 --- a/src/main/java/com/example/api/account/entity/Nationality.java +++ b/src/main/java/com/example/api/account/entity/Nationality.java @@ -1,4 +1,4 @@ -package com.example.api.account.domain; +package com.example.api.account.entity; public enum Nationality { KOREAN(0, "내국인"), diff --git a/src/main/java/com/example/api/account/repository/AccountRepository.java b/src/main/java/com/example/api/account/repository/AccountRepository.java index 8cf19a68..6468638f 100644 --- a/src/main/java/com/example/api/account/repository/AccountRepository.java +++ b/src/main/java/com/example/api/account/repository/AccountRepository.java @@ -3,6 +3,8 @@ import com.example.api.domain.Account; import org.springframework.data.jpa.repository.JpaRepository; +import java.util.Optional; + public interface AccountRepository extends JpaRepository { boolean existsByLoginId(String loginId); diff --git a/src/main/java/com/example/api/account/repository/CodeRepository.java b/src/main/java/com/example/api/account/repository/CodeRepository.java index 9ee6cfed..5a7a57fe 100644 --- a/src/main/java/com/example/api/account/repository/CodeRepository.java +++ b/src/main/java/com/example/api/account/repository/CodeRepository.java @@ -1,6 +1,6 @@ package com.example.api.account.repository; -import com.example.api.account.domain.Code; +import com.example.api.account.entity.Code; import org.springframework.data.mongodb.repository.MongoRepository; import org.springframework.stereotype.Repository; diff --git a/src/main/java/com/example/api/account/service/AccountService.java b/src/main/java/com/example/api/account/service/AccountService.java index 40204cab..ceee7be9 100644 --- a/src/main/java/com/example/api/account/service/AccountService.java +++ b/src/main/java/com/example/api/account/service/AccountService.java @@ -1,13 +1,14 @@ package com.example.api.account.service; -import com.example.api.account.controller.dto.request.EmailCodeRequestDto; -import com.example.api.account.controller.dto.request.EmailRequestDto; -import com.example.api.account.controller.dto.request.LoginIdRequestDto; -import com.example.api.account.domain.Code; +import com.example.api.account.dto.EmailCodeRequest; +import com.example.api.account.dto.EmailRequest; +import com.example.api.account.dto.LoginIdRequest; +import com.example.api.account.entity.Code; +import com.example.api.account.entity.UserRole; import com.example.api.account.repository.AccountRepository; -import com.example.api.account.controller.dto.request.SignUpRequestDto; +import com.example.api.account.dto.SignUpRequest; import com.example.api.account.repository.CodeRepository; -import com.example.api.account.domain.MailSender; +import com.example.api.account.entity.MailSender; import com.example.api.domain.Account; import com.example.api.exception.BusinessException; import com.example.api.exception.ErrorCode; @@ -16,6 +17,8 @@ import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; +import java.util.Collection; +import java.util.List; import java.util.Optional; @Service @@ -26,7 +29,7 @@ public class AccountService { private final PasswordEncoder passwordEncoder; private final MailSender mailSender; - public Code sendEmail(final EmailRequestDto request) throws BusinessException { + public Code sendEmail(final EmailRequest request) throws BusinessException { // 이미 가입된 이메일인지 검증 validateDuplicateEmail(request); return mailSender.sendEmail(request); @@ -36,6 +39,7 @@ public Code sendEmail(final EmailRequestDto request) throws BusinessException { public String saveCode(final Code code){ try { codeRepository.save(code); + return "이메일 전송을 완료하였습니다."; } catch (Exception e){ throw new BusinessException(ErrorCode.FAIL_SAVE_CODE); @@ -43,7 +47,7 @@ public String saveCode(final Code code){ } @Transactional - public String verifyEmail(final EmailCodeRequestDto request) { + public String verifyEmail(final EmailCodeRequest request) { Optional findCode = codeRepository.findFirstByEmailOrderByCreatedAtDesc(request.email()); return findCode.map(code -> { @@ -56,15 +60,16 @@ public String verifyEmail(final EmailCodeRequestDto request) { } @Transactional - public String signUp(final SignUpRequestDto request) { + public String signUp(final SignUpRequest request) { // 중복 로그인 ID 확인 - validateDuplicateLoginId(new LoginIdRequestDto(request.loginId())); + validateDuplicateLoginId(new LoginIdRequest(request.loginId())); // 계정 저장 saveAccount(request); return "회원가입이 완료되었습니다"; } - private void saveAccount(final SignUpRequestDto request) { + private void saveAccount(final SignUpRequest request) { + Collection roles = List.of(request.role()); Account account = new Account( request.loginId(), passwordEncoder.encode(request.password()), @@ -73,19 +78,19 @@ private void saveAccount(final SignUpRequestDto request) { request.email(), request.phoneNumber(), request.nationality(), - request.role() + roles ); authRepository.save(account); } - private void validateDuplicateLoginId(final LoginIdRequestDto loginIdRequest) { + private void validateDuplicateLoginId(final LoginIdRequest loginIdRequest) { if (authRepository.existsByLoginId(loginIdRequest.loginId())) { throw new BusinessException(ErrorCode.DUPLICATE_LOGIN_ID); } } - private void validateDuplicateEmail(final EmailRequestDto emailRequest) { + private void validateDuplicateEmail(final EmailRequest emailRequest) { if (authRepository.existsByEmail(emailRequest.email())) { throw new BusinessException(ErrorCode.DUPLICATE_EMAIL); } diff --git a/src/main/java/com/example/api/auth/dto/UserDetailRequest.java b/src/main/java/com/example/api/auth/dto/UserDetailRequest.java index 916fe4cc..a1e542c5 100644 --- a/src/main/java/com/example/api/auth/dto/UserDetailRequest.java +++ b/src/main/java/com/example/api/auth/dto/UserDetailRequest.java @@ -1,6 +1,6 @@ package com.example.api.auth.dto; -import com.example.api.account.domain.UserRole; +import com.example.api.account.entity.UserRole; import jakarta.validation.constraints.NotNull; import java.util.Collection; diff --git a/src/main/java/com/example/api/contracts/ContractService.java b/src/main/java/com/example/api/contracts/ContractService.java index 81e63419..e1537494 100644 --- a/src/main/java/com/example/api/contracts/ContractService.java +++ b/src/main/java/com/example/api/contracts/ContractService.java @@ -60,4 +60,4 @@ public ContractDTO getContractInfo(final AcceptContractCommand contractStatusCom EmployeeInfoDTO employeeDTO = contractRepository.findEmployeeDTOByContractId(contractStatusCommand.contractId()); return new ContractDTO(businessDTO, employeeDTO); } -} +} \ 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 c0bea441..6a7973c6 100644 --- a/src/main/java/com/example/api/domain/Account.java +++ b/src/main/java/com/example/api/domain/Account.java @@ -1,7 +1,7 @@ package com.example.api.domain; -import com.example.api.account.domain.Nationality; -import com.example.api.account.domain.UserRole; +import com.example.api.account.entity.Nationality; +import com.example.api.account.entity.UserRole; import com.example.api.auth.dto.LoginUserRequest; import jakarta.persistence.*; import lombok.Getter; From c5fdbf1240cbd2ce926bbd04d4a9f6397f4abb83 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Sat, 21 Dec 2024 00:48:06 +0900 Subject: [PATCH 168/276] =?UTF-8?q?#12=20@Valid=20=EB=B9=A0=EC=A7=84=20?= =?UTF-8?q?=EA=B3=B3=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/api/account/entity/CodeGenerator.java | 3 --- .../com/example/api/account/service/AccountService.java | 9 +++++---- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/example/api/account/entity/CodeGenerator.java b/src/main/java/com/example/api/account/entity/CodeGenerator.java index 50c40a41..3dc3a621 100644 --- a/src/main/java/com/example/api/account/entity/CodeGenerator.java +++ b/src/main/java/com/example/api/account/entity/CodeGenerator.java @@ -2,13 +2,11 @@ import com.example.api.exception.BusinessException; import com.example.api.exception.ErrorCode; -import lombok.extern.slf4j.Slf4j; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.util.Random; -@Slf4j public class CodeGenerator { public static String generateCode() { int length = 6; @@ -20,7 +18,6 @@ public static String generateCode() { } return builder.toString(); } catch (NoSuchAlgorithmException e) { - log.debug("CodeGenerator.generateCode() exception occur", e); throw new BusinessException(ErrorCode.FAIL_GENERATE_CODE); } } diff --git a/src/main/java/com/example/api/account/service/AccountService.java b/src/main/java/com/example/api/account/service/AccountService.java index ceee7be9..d4700d50 100644 --- a/src/main/java/com/example/api/account/service/AccountService.java +++ b/src/main/java/com/example/api/account/service/AccountService.java @@ -13,6 +13,7 @@ import com.example.api.exception.BusinessException; import com.example.api.exception.ErrorCode; import jakarta.transaction.Transactional; +import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; @@ -29,14 +30,14 @@ public class AccountService { private final PasswordEncoder passwordEncoder; private final MailSender mailSender; - public Code sendEmail(final EmailRequest request) throws BusinessException { + public Code sendEmail(@Valid final EmailRequest request) throws BusinessException { // 이미 가입된 이메일인지 검증 validateDuplicateEmail(request); return mailSender.sendEmail(request); } @Transactional - public String saveCode(final Code code){ + public String saveCode(@Valid final Code code){ try { codeRepository.save(code); @@ -47,7 +48,7 @@ public String saveCode(final Code code){ } @Transactional - public String verifyEmail(final EmailCodeRequest request) { + public String verifyEmail(@Valid final EmailCodeRequest request) { Optional findCode = codeRepository.findFirstByEmailOrderByCreatedAtDesc(request.email()); return findCode.map(code -> { @@ -60,7 +61,7 @@ public String verifyEmail(final EmailCodeRequest request) { } @Transactional - public String signUp(final SignUpRequest request) { + public String signUp(@Valid final SignUpRequest request) { // 중복 로그인 ID 확인 validateDuplicateLoginId(new LoginIdRequest(request.loginId())); // 계정 저장 From 12fcf524f1ba6de33d737309a3245c9fb70c1bbe Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Sat, 21 Dec 2024 00:52:33 +0900 Subject: [PATCH 169/276] =?UTF-8?q?#12=20@Valid=20=EB=B9=A0=C3=ACated?= =?UTF-8?q?=C2=A7=C2=84=20=EA=B3=B3=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/api/account/service/AccountService.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/example/api/account/service/AccountService.java b/src/main/java/com/example/api/account/service/AccountService.java index d4700d50..b8ceb8a9 100644 --- a/src/main/java/com/example/api/account/service/AccountService.java +++ b/src/main/java/com/example/api/account/service/AccountService.java @@ -17,6 +17,7 @@ import lombok.RequiredArgsConstructor; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; import java.util.Collection; import java.util.List; @@ -30,14 +31,14 @@ public class AccountService { private final PasswordEncoder passwordEncoder; private final MailSender mailSender; - public Code sendEmail(@Valid final EmailRequest request) throws BusinessException { + public Code sendEmail(@Validated final EmailRequest request) throws BusinessException { // 이미 가입된 이메일인지 검증 validateDuplicateEmail(request); return mailSender.sendEmail(request); } @Transactional - public String saveCode(@Valid final Code code){ + public String saveCode(@Validated final Code code){ try { codeRepository.save(code); @@ -48,7 +49,7 @@ public String saveCode(@Valid final Code code){ } @Transactional - public String verifyEmail(@Valid final EmailCodeRequest request) { + public String verifyEmail(@Validated final EmailCodeRequest request) { Optional findCode = codeRepository.findFirstByEmailOrderByCreatedAtDesc(request.email()); return findCode.map(code -> { @@ -61,7 +62,7 @@ public String verifyEmail(@Valid final EmailCodeRequest request) { } @Transactional - public String signUp(@Valid final SignUpRequest request) { + public String signUp(@Validated final SignUpRequest request) { // 중복 로그인 ID 확인 validateDuplicateLoginId(new LoginIdRequest(request.loginId())); // 계정 저장 From bea615c4f580965217b110a499167f00b0df1b57 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Sat, 21 Dec 2024 01:01:37 +0900 Subject: [PATCH 170/276] =?UTF-8?q?#12=20=EC=BD=94=EB=93=9C=20=EC=BB=A8?= =?UTF-8?q?=EB=B2=A4=EC=85=98=EC=97=90=20=EB=A7=9E=EA=B2=8C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/api/account/controller/AccountController.java | 8 ++++---- .../com/example/api/account/dto/EmailCodeRequest.java | 7 +++++-- .../java/com/example/api/account/dto/EmailRequest.java | 2 +- .../java/com/example/api/account/dto/LoginIdRequest.java | 2 +- .../java/com/example/api/account/dto/SignUpRequest.java | 2 +- src/main/java/com/example/api/account/entity/Code.java | 2 +- .../com/example/api/account/entity/CodeGenerator.java | 2 +- .../java/com/example/api/account/entity/MailSender.java | 2 +- .../java/com/example/api/account/entity/Nationality.java | 2 +- .../example/api/account/repository/AccountRepository.java | 2 +- .../example/api/account/repository/CodeRepository.java | 2 +- .../com/example/api/account/service/AccountService.java | 3 +-- .../com/example/api/auth/controller/AuthController.java | 2 +- .../java/com/example/api/auth/dto/AuthTokenRequest.java | 7 +++++-- src/main/java/com/example/api/auth/dto/LoginRequest.java | 7 +++++-- .../java/com/example/api/auth/dto/LoginUserRequest.java | 2 +- .../com/example/api/auth/dto/RefreshTokenRequest.java | 2 +- .../java/com/example/api/auth/dto/UserDetailRequest.java | 7 +++++-- .../example/api/auth/entitiy/CustomUserDetailService.java | 2 +- .../api/auth/entitiy/JwtAuthenticationProvider.java | 2 +- .../example/api/auth/entitiy/JwtAuthenticationToken.java | 3 +-- .../java/com/example/api/auth/entitiy/RefreshToken.java | 1 - .../com/example/api/auth/repository/AuthRepository.java | 2 +- .../com/example/api/auth/repository/TokenRepository.java | 2 +- .../com/example/api/global/config/SecurityConfig.java | 2 +- .../com/example/api/global/config/WebSocketConfig.java | 2 +- .../api/global/config/filter/JwtAuthenticationFilter.java | 2 +- .../example/api/global/config/resolver/ValidEmail.java | 2 +- .../example/api/global/properties/EmailProperties.java | 2 +- .../com/example/api/global/properties/JwtProperties.java | 2 +- .../example/api/global/validator/ValidEmailValidator.java | 2 +- 31 files changed, 49 insertions(+), 40 deletions(-) diff --git a/src/main/java/com/example/api/account/controller/AccountController.java b/src/main/java/com/example/api/account/controller/AccountController.java index 1216de54..630bd8b5 100644 --- a/src/main/java/com/example/api/account/controller/AccountController.java +++ b/src/main/java/com/example/api/account/controller/AccountController.java @@ -18,21 +18,21 @@ public class AccountController { private final AccountService signUpService; @PostMapping("/email/code") - public ResponseEntity sendEmailCode(@Valid @RequestBody final EmailRequest request) { + public ResponseEntity sendEmailCode(@Valid @RequestBody final EmailRequest request) { Code code = signUpService.sendEmail(request); String successMessage = signUpService.saveCode(code); return ResponseEntity.ok(successMessage); } @PostMapping("/email/verification") - public ResponseEntity verifyEmail(@Valid @RequestBody final EmailCodeRequest request) { + public ResponseEntity verifyEmail(@Valid @RequestBody final EmailCodeRequest request) { String successMessage = signUpService.verifyEmail(request); return ResponseEntity.ok(successMessage); } @PostMapping("/sign-up") - public ResponseEntity signUp(@Valid @RequestBody final SignUpRequest request) { + public ResponseEntity signUp(@Valid @RequestBody final SignUpRequest request) { String successMessage = signUpService.signUp(request); return ResponseEntity.status(HttpStatus.CREATED).body(successMessage); } -} +} \ No newline at end of file diff --git a/src/main/java/com/example/api/account/dto/EmailCodeRequest.java b/src/main/java/com/example/api/account/dto/EmailCodeRequest.java index 261bb29e..e0cd62f7 100644 --- a/src/main/java/com/example/api/account/dto/EmailCodeRequest.java +++ b/src/main/java/com/example/api/account/dto/EmailCodeRequest.java @@ -2,5 +2,8 @@ import com.example.api.global.config.resolver.ValidEmail; -public record EmailCodeRequest(@ValidEmail String email, String code) { -} +public record EmailCodeRequest( + @ValidEmail String email, + String code +) { +} \ No newline at end of file diff --git a/src/main/java/com/example/api/account/dto/EmailRequest.java b/src/main/java/com/example/api/account/dto/EmailRequest.java index f2fc422a..8f5118c0 100644 --- a/src/main/java/com/example/api/account/dto/EmailRequest.java +++ b/src/main/java/com/example/api/account/dto/EmailRequest.java @@ -3,4 +3,4 @@ import com.example.api.global.config.resolver.ValidEmail; public record EmailRequest(@ValidEmail String email) { -} +} \ No newline at end of file diff --git a/src/main/java/com/example/api/account/dto/LoginIdRequest.java b/src/main/java/com/example/api/account/dto/LoginIdRequest.java index a55502ce..e086a7cf 100644 --- a/src/main/java/com/example/api/account/dto/LoginIdRequest.java +++ b/src/main/java/com/example/api/account/dto/LoginIdRequest.java @@ -3,4 +3,4 @@ import jakarta.validation.constraints.NotBlank; public record LoginIdRequest(@NotBlank String loginId) { -} +} \ No newline at end of file diff --git a/src/main/java/com/example/api/account/dto/SignUpRequest.java b/src/main/java/com/example/api/account/dto/SignUpRequest.java index 27051f7c..b7ed9c04 100644 --- a/src/main/java/com/example/api/account/dto/SignUpRequest.java +++ b/src/main/java/com/example/api/account/dto/SignUpRequest.java @@ -25,4 +25,4 @@ public record SignUpRequest( @NotBlank String phoneNumber ) { -} +} \ No newline at end of file diff --git a/src/main/java/com/example/api/account/entity/Code.java b/src/main/java/com/example/api/account/entity/Code.java index 0e470cd9..8ace57c5 100644 --- a/src/main/java/com/example/api/account/entity/Code.java +++ b/src/main/java/com/example/api/account/entity/Code.java @@ -23,4 +23,4 @@ public Code(String email, String code) { this.code = code; this.createdAt = new Date(); } -} +} \ No newline at end of file diff --git a/src/main/java/com/example/api/account/entity/CodeGenerator.java b/src/main/java/com/example/api/account/entity/CodeGenerator.java index 3dc3a621..d99bc4e6 100644 --- a/src/main/java/com/example/api/account/entity/CodeGenerator.java +++ b/src/main/java/com/example/api/account/entity/CodeGenerator.java @@ -21,4 +21,4 @@ public static String generateCode() { throw new BusinessException(ErrorCode.FAIL_GENERATE_CODE); } } -} +} \ No newline at end of file diff --git a/src/main/java/com/example/api/account/entity/MailSender.java b/src/main/java/com/example/api/account/entity/MailSender.java index 177ef701..11c1b146 100644 --- a/src/main/java/com/example/api/account/entity/MailSender.java +++ b/src/main/java/com/example/api/account/entity/MailSender.java @@ -38,4 +38,4 @@ private SimpleMailMessage createEmail(final String to, final String code) { message.setFrom(fromEmail); return message; } -} +} \ No newline at end of file diff --git a/src/main/java/com/example/api/account/entity/Nationality.java b/src/main/java/com/example/api/account/entity/Nationality.java index 312527e0..58ac54cd 100644 --- a/src/main/java/com/example/api/account/entity/Nationality.java +++ b/src/main/java/com/example/api/account/entity/Nationality.java @@ -24,4 +24,4 @@ public static Nationality of(final Integer code) { public Integer getCode() { return code; } -} +} \ No newline at end of file diff --git a/src/main/java/com/example/api/account/repository/AccountRepository.java b/src/main/java/com/example/api/account/repository/AccountRepository.java index 6468638f..de037166 100644 --- a/src/main/java/com/example/api/account/repository/AccountRepository.java +++ b/src/main/java/com/example/api/account/repository/AccountRepository.java @@ -9,4 +9,4 @@ public interface AccountRepository extends JpaRepository { boolean existsByLoginId(String loginId); boolean existsByEmail(String email); -} +} \ No newline at end of file diff --git a/src/main/java/com/example/api/account/repository/CodeRepository.java b/src/main/java/com/example/api/account/repository/CodeRepository.java index 5a7a57fe..a73ff693 100644 --- a/src/main/java/com/example/api/account/repository/CodeRepository.java +++ b/src/main/java/com/example/api/account/repository/CodeRepository.java @@ -9,4 +9,4 @@ @Repository public interface CodeRepository extends MongoRepository { Optional findFirstByEmailOrderByCreatedAtDesc(String email); -} +} \ No newline at end of file diff --git a/src/main/java/com/example/api/account/service/AccountService.java b/src/main/java/com/example/api/account/service/AccountService.java index b8ceb8a9..ef40b3f1 100644 --- a/src/main/java/com/example/api/account/service/AccountService.java +++ b/src/main/java/com/example/api/account/service/AccountService.java @@ -13,7 +13,6 @@ import com.example.api.exception.BusinessException; import com.example.api.exception.ErrorCode; import jakarta.transaction.Transactional; -import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; @@ -97,4 +96,4 @@ private void validateDuplicateEmail(final EmailRequest emailRequest) { throw new BusinessException(ErrorCode.DUPLICATE_EMAIL); } } -} +} \ No newline at end of file diff --git a/src/main/java/com/example/api/auth/controller/AuthController.java b/src/main/java/com/example/api/auth/controller/AuthController.java index 7491ebd4..a7777597 100644 --- a/src/main/java/com/example/api/auth/controller/AuthController.java +++ b/src/main/java/com/example/api/auth/controller/AuthController.java @@ -42,4 +42,4 @@ public ResponseEntity logout(@AuthenticationPrincipal final Ob AuthTokenRequest authTokenRequest = authService.logout(new LoginUserRequest(userId)); return ResponseEntity.ok(authTokenRequest); } -} +} \ No newline at end of file diff --git a/src/main/java/com/example/api/auth/dto/AuthTokenRequest.java b/src/main/java/com/example/api/auth/dto/AuthTokenRequest.java index 3747ac96..48ca4b32 100644 --- a/src/main/java/com/example/api/auth/dto/AuthTokenRequest.java +++ b/src/main/java/com/example/api/auth/dto/AuthTokenRequest.java @@ -1,4 +1,7 @@ package com.example.api.auth.dto; -public record AuthTokenRequest(String accessToken, String refreshToken) { -} +public record AuthTokenRequest( + String accessToken, + String refreshToken +) { +} \ No newline at end of file diff --git a/src/main/java/com/example/api/auth/dto/LoginRequest.java b/src/main/java/com/example/api/auth/dto/LoginRequest.java index c61d805e..b997c08d 100644 --- a/src/main/java/com/example/api/auth/dto/LoginRequest.java +++ b/src/main/java/com/example/api/auth/dto/LoginRequest.java @@ -2,5 +2,8 @@ import jakarta.validation.constraints.NotBlank; -public record LoginRequest(@NotBlank String loginId, @NotBlank String password) { -} +public record LoginRequest( + @NotBlank String loginId, + @NotBlank String password +) { +} \ No newline at end of file diff --git a/src/main/java/com/example/api/auth/dto/LoginUserRequest.java b/src/main/java/com/example/api/auth/dto/LoginUserRequest.java index 2f351d82..f0abb90a 100644 --- a/src/main/java/com/example/api/auth/dto/LoginUserRequest.java +++ b/src/main/java/com/example/api/auth/dto/LoginUserRequest.java @@ -1,4 +1,4 @@ package com.example.api.auth.dto; public record LoginUserRequest(Long userId) { -} +} \ No newline at end of file diff --git a/src/main/java/com/example/api/auth/dto/RefreshTokenRequest.java b/src/main/java/com/example/api/auth/dto/RefreshTokenRequest.java index b791f221..dc01eb0d 100644 --- a/src/main/java/com/example/api/auth/dto/RefreshTokenRequest.java +++ b/src/main/java/com/example/api/auth/dto/RefreshTokenRequest.java @@ -3,4 +3,4 @@ import jakarta.validation.constraints.NotBlank; public record RefreshTokenRequest(@NotBlank String refreshToken) { -} +} \ No newline at end of file diff --git a/src/main/java/com/example/api/auth/dto/UserDetailRequest.java b/src/main/java/com/example/api/auth/dto/UserDetailRequest.java index a1e542c5..e7522e9b 100644 --- a/src/main/java/com/example/api/auth/dto/UserDetailRequest.java +++ b/src/main/java/com/example/api/auth/dto/UserDetailRequest.java @@ -5,5 +5,8 @@ import java.util.Collection; -public record UserDetailRequest(@NotNull Long userId, @NotNull Collection authorities) { -} +public record UserDetailRequest( + @NotNull Long userId, + @NotNull Collection authorities +) { +} \ No newline at end of file diff --git a/src/main/java/com/example/api/auth/entitiy/CustomUserDetailService.java b/src/main/java/com/example/api/auth/entitiy/CustomUserDetailService.java index c8e52a3f..838f0ea7 100644 --- a/src/main/java/com/example/api/auth/entitiy/CustomUserDetailService.java +++ b/src/main/java/com/example/api/auth/entitiy/CustomUserDetailService.java @@ -30,4 +30,4 @@ public CustomUserDetails loadUserByUserId(final Long userId) { return new CustomUserDetails(user.getAccountId(), authorities); } -} +} \ No newline at end of file diff --git a/src/main/java/com/example/api/auth/entitiy/JwtAuthenticationProvider.java b/src/main/java/com/example/api/auth/entitiy/JwtAuthenticationProvider.java index 1abc4e53..f51080fe 100644 --- a/src/main/java/com/example/api/auth/entitiy/JwtAuthenticationProvider.java +++ b/src/main/java/com/example/api/auth/entitiy/JwtAuthenticationProvider.java @@ -37,4 +37,4 @@ public Authentication authenticate(Authentication authentication) throws Authent public boolean supports(final Class authentication) { return JwtAuthenticationToken.class.isAssignableFrom(authentication); } -} +} \ No newline at end of file diff --git a/src/main/java/com/example/api/auth/entitiy/JwtAuthenticationToken.java b/src/main/java/com/example/api/auth/entitiy/JwtAuthenticationToken.java index ed73a45b..f867ceab 100644 --- a/src/main/java/com/example/api/auth/entitiy/JwtAuthenticationToken.java +++ b/src/main/java/com/example/api/auth/entitiy/JwtAuthenticationToken.java @@ -46,5 +46,4 @@ public void eraseCredentials() { super.eraseCredentials(); this.token = null; } -} - +} \ No newline at end of file diff --git a/src/main/java/com/example/api/auth/entitiy/RefreshToken.java b/src/main/java/com/example/api/auth/entitiy/RefreshToken.java index 905a831e..2940ecad 100644 --- a/src/main/java/com/example/api/auth/entitiy/RefreshToken.java +++ b/src/main/java/com/example/api/auth/entitiy/RefreshToken.java @@ -7,7 +7,6 @@ @Entity public class RefreshToken { - @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "tokenId") diff --git a/src/main/java/com/example/api/auth/repository/AuthRepository.java b/src/main/java/com/example/api/auth/repository/AuthRepository.java index b1a64fac..d7181ad9 100644 --- a/src/main/java/com/example/api/auth/repository/AuthRepository.java +++ b/src/main/java/com/example/api/auth/repository/AuthRepository.java @@ -7,4 +7,4 @@ public interface AuthRepository extends JpaRepository { Optional findUserByLoginId(String loginId); -} +} \ No newline at end of file diff --git a/src/main/java/com/example/api/auth/repository/TokenRepository.java b/src/main/java/com/example/api/auth/repository/TokenRepository.java index 49ff62f2..61379fd1 100644 --- a/src/main/java/com/example/api/auth/repository/TokenRepository.java +++ b/src/main/java/com/example/api/auth/repository/TokenRepository.java @@ -12,4 +12,4 @@ public interface TokenRepository extends JpaRepository { Optional findByUser(Account user); void deleteAllByUser(Account user); -} +} \ No newline at end of file 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 2912a5b5..3dacf0ab 100644 --- a/src/main/java/com/example/api/global/config/SecurityConfig.java +++ b/src/main/java/com/example/api/global/config/SecurityConfig.java @@ -56,4 +56,4 @@ public AuthenticationManager authenticationManager() { public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(12); } -} +} \ No newline at end of file diff --git a/src/main/java/com/example/api/global/config/WebSocketConfig.java b/src/main/java/com/example/api/global/config/WebSocketConfig.java index 7c574c9e..c10411ac 100644 --- a/src/main/java/com/example/api/global/config/WebSocketConfig.java +++ b/src/main/java/com/example/api/global/config/WebSocketConfig.java @@ -22,4 +22,4 @@ public void registerStompEndpoints(StompEndpointRegistry registry) { .setAllowedOriginPatterns("*") .withSockJS(); } -} +} \ No newline at end of file diff --git a/src/main/java/com/example/api/global/config/filter/JwtAuthenticationFilter.java b/src/main/java/com/example/api/global/config/filter/JwtAuthenticationFilter.java index 5e483c23..2745a4c7 100644 --- a/src/main/java/com/example/api/global/config/filter/JwtAuthenticationFilter.java +++ b/src/main/java/com/example/api/global/config/filter/JwtAuthenticationFilter.java @@ -55,4 +55,4 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse SecurityContextHolder.clearContext(); } } -} +} \ No newline at end of file diff --git a/src/main/java/com/example/api/global/config/resolver/ValidEmail.java b/src/main/java/com/example/api/global/config/resolver/ValidEmail.java index 67c971b2..3d354e80 100644 --- a/src/main/java/com/example/api/global/config/resolver/ValidEmail.java +++ b/src/main/java/com/example/api/global/config/resolver/ValidEmail.java @@ -14,4 +14,4 @@ String message() default "이메일이 유효하지 않습니다."; Class[] groups() default {}; Class[] payload() default {}; -} +} \ No newline at end of file diff --git a/src/main/java/com/example/api/global/properties/EmailProperties.java b/src/main/java/com/example/api/global/properties/EmailProperties.java index 720e4fec..5b1d8415 100644 --- a/src/main/java/com/example/api/global/properties/EmailProperties.java +++ b/src/main/java/com/example/api/global/properties/EmailProperties.java @@ -42,4 +42,4 @@ public class EmailProperties { @Value("${spring.mail.auth-code-expiration-millis}") private int expirationMillis; -} +} \ No newline at end of file diff --git a/src/main/java/com/example/api/global/properties/JwtProperties.java b/src/main/java/com/example/api/global/properties/JwtProperties.java index 646caa88..f0f15df6 100644 --- a/src/main/java/com/example/api/global/properties/JwtProperties.java +++ b/src/main/java/com/example/api/global/properties/JwtProperties.java @@ -30,4 +30,4 @@ public void setAccessTokenValidTime(final Long time) { public void setRefreshTokenValidTime(final Long time) { refreshTokenValidTime = time; } -} +} \ No newline at end of file diff --git a/src/main/java/com/example/api/global/validator/ValidEmailValidator.java b/src/main/java/com/example/api/global/validator/ValidEmailValidator.java index 640df848..d48dd468 100644 --- a/src/main/java/com/example/api/global/validator/ValidEmailValidator.java +++ b/src/main/java/com/example/api/global/validator/ValidEmailValidator.java @@ -31,4 +31,4 @@ public boolean isValid(String value, ConstraintValidatorContext context) { return false; } } -} +} \ No newline at end of file From 892767d339c6018ff2e3ff26d834137c1ba5740b Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Tue, 24 Dec 2024 16:51:48 +0900 Subject: [PATCH 171/276] =?UTF-8?q?#12=20CodeGenerator=20Component?= =?UTF-8?q?=EB=A1=9C=20=EB=93=B1=EB=A1=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/api/account/entity/CodeGenerator.java | 13 ++++++++++--- .../com/example/api/account/entity/MailSender.java | 3 ++- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/example/api/account/entity/CodeGenerator.java b/src/main/java/com/example/api/account/entity/CodeGenerator.java index d99bc4e6..4b17243b 100644 --- a/src/main/java/com/example/api/account/entity/CodeGenerator.java +++ b/src/main/java/com/example/api/account/entity/CodeGenerator.java @@ -2,19 +2,26 @@ import com.example.api.exception.BusinessException; import com.example.api.exception.ErrorCode; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.util.Random; +@Component public class CodeGenerator { - public static String generateCode() { - int length = 6; + @Value("${code.length}") + private int length; + @Value("${code.digit_range}") + private int digitRange; + + public String generateCode() { try { Random random = SecureRandom.getInstanceStrong(); StringBuilder builder = new StringBuilder(); for (int i = 0; i < length; i++) { - builder.append(random.nextInt(10)); + builder.append(random.nextInt(digitRange)); } return builder.toString(); } catch (NoSuchAlgorithmException e) { diff --git a/src/main/java/com/example/api/account/entity/MailSender.java b/src/main/java/com/example/api/account/entity/MailSender.java index 11c1b146..b7e3e079 100644 --- a/src/main/java/com/example/api/account/entity/MailSender.java +++ b/src/main/java/com/example/api/account/entity/MailSender.java @@ -13,12 +13,13 @@ @RequiredArgsConstructor public class MailSender { private final JavaMailSender mailSender; + private final CodeGenerator codeGenerator; @Value("${spring.mail.username}") private String fromEmail; public Code sendEmail(final EmailRequest emailRequest){ - String code = CodeGenerator.generateCode(); + String code = codeGenerator.generateCode(); try { SimpleMailMessage message = createEmail(emailRequest.email(), code); From b750a3819fa210be330bd2caffc2e479606b5b7b Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Tue, 24 Dec 2024 16:52:36 +0900 Subject: [PATCH 172/276] =?UTF-8?q?#12=20=EC=BD=94=EB=93=9C=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20=EA=B8=B8=EC=9D=B4,=20=EB=B2=94=EC=9C=84=20?= =?UTF-8?q?=EC=86=8D=EC=84=B1=EC=9C=BC=EB=A1=9C=20=EB=93=B1=EB=A1=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application.properties | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 7274b980..f467b9fa 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -48,4 +48,7 @@ jwt.secret_key=${jwt.secret_key} # 60? jwt.access_token_valid_time=3600 # 30? -jwt.refresh_token_valid_time=2592000 \ No newline at end of file +jwt.refresh_token_valid_time=2592000 + +code.length=6 +code.digit_range=10 \ No newline at end of file From f3c77d8c98c26a37ed0ad90673406735dbe98035 Mon Sep 17 00:00:00 2001 From: huhdy32 Date: Mon, 2 Dec 2024 18:02:24 +0900 Subject: [PATCH 173/276] =?UTF-8?q?#45=20feat(build):=20queryDSL=20Q=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 20 +- .../com/example/api/domain/QAccount.java | 73 +++++++ .../com/example/api/domain/QAnnouncement.java | 53 +++++ .../com/example/api/domain/QBaseEntity.java | 39 ++++ .../com/example/api/domain/QBusiness.java | 71 +++++++ .../example/api/domain/QBusinessCategory.java | 62 ++++++ .../com/example/api/domain/QCategory.java | 47 +++++ .../com/example/api/domain/QChatRoom.java | 53 +++++ .../com/example/api/domain/QContract.java | 67 ++++++ .../example/api/domain/QExternalCareer.java | 63 ++++++ .../com/example/api/domain/QFlavored.java | 62 ++++++ .../example/api/domain/QOfferEmployment.java | 69 +++++++ .../example/api/domain/QPossibleBoard.java | 63 ++++++ .../com/example/api/domain/QReview.java | 49 +++++ .../com/example/api/domain/QScrap.java | 62 ++++++ .../api/board/controller/BoardController.java | 12 +- .../request/QueryPossibleEmployerRequest.java | 11 + .../response/PossibleEmployeeResponse.java | 13 ++ .../api/board/service/EmployeeService.java | 14 +- .../BusinessRepository.java | 6 +- .../example/api/business/BusinessService.java | 31 +++ .../java/com/example/api/domain/Account.java | 1 + .../com/example/api/domain/Announcement.java | 2 + .../java/com/example/api/domain/Business.java | 2 + .../example/api/domain/BusinessCategory.java | 2 + .../java/com/example/api/domain/Category.java | 2 +- .../java/com/example/api/domain/Chat.java | 2 + .../java/com/example/api/domain/Contract.java | 2 + .../example/api/domain/ExternalCareer.java | 2 +- .../java/com/example/api/domain/Flavored.java | 2 +- .../com/example/api/domain/PossibleBoard.java | 2 +- .../java/com/example/api/domain/Review.java | 2 + .../java/com/example/api/domain/Scrap.java | 2 + .../board/controller/BoardControllerTest.java | 45 ----- .../api/board/service/BoardServiceTest.java | 35 ---- .../board/service/CategoryServiceTest.java | 28 --- .../board/service/EmployeeServiceTest.java | 21 -- .../api/chat/service/ChatServiceTest.java | 190 +++++++++--------- .../api/global/BaseIntegrationTest.java | 1 + 39 files changed, 1043 insertions(+), 240 deletions(-) create mode 100644 src/main/generated/com/example/api/domain/QAccount.java create mode 100644 src/main/generated/com/example/api/domain/QAnnouncement.java create mode 100644 src/main/generated/com/example/api/domain/QBaseEntity.java create mode 100644 src/main/generated/com/example/api/domain/QBusiness.java create mode 100644 src/main/generated/com/example/api/domain/QBusinessCategory.java create mode 100644 src/main/generated/com/example/api/domain/QCategory.java create mode 100644 src/main/generated/com/example/api/domain/QChatRoom.java create mode 100644 src/main/generated/com/example/api/domain/QContract.java create mode 100644 src/main/generated/com/example/api/domain/QExternalCareer.java create mode 100644 src/main/generated/com/example/api/domain/QFlavored.java create mode 100644 src/main/generated/com/example/api/domain/QOfferEmployment.java create mode 100644 src/main/generated/com/example/api/domain/QPossibleBoard.java create mode 100644 src/main/generated/com/example/api/domain/QReview.java create mode 100644 src/main/generated/com/example/api/domain/QScrap.java create mode 100644 src/main/java/com/example/api/board/controller/domain/request/QueryPossibleEmployerRequest.java create mode 100644 src/main/java/com/example/api/board/controller/domain/response/PossibleEmployeeResponse.java rename src/main/java/com/example/api/{domain/repository => business}/BusinessRepository.java (58%) create mode 100644 src/main/java/com/example/api/business/BusinessService.java delete mode 100644 src/test/java/com/example/api/board/controller/BoardControllerTest.java delete mode 100644 src/test/java/com/example/api/board/service/BoardServiceTest.java delete mode 100644 src/test/java/com/example/api/board/service/CategoryServiceTest.java delete mode 100644 src/test/java/com/example/api/board/service/EmployeeServiceTest.java diff --git a/build.gradle b/build.gradle index d7b18743..ff193cdc 100644 --- a/build.gradle +++ b/build.gradle @@ -42,7 +42,6 @@ dependencies { // ENV implementation 'me.paulschwarz:spring-dotenv:4.0.0' - // VALIDATION implementation 'org.springframework.boot:spring-boot-starter-validation' @@ -57,12 +56,31 @@ dependencies { implementation 'io.jsonwebtoken:jjwt-api:0.11.5' runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.5' runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.11.5' + // Query DSL + implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' + annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta" + annotationProcessor "jakarta.annotation:jakarta.annotation-api" + annotationProcessor "jakarta.persistence:jakarta.persistence-api" } tasks.named('test') { useJUnitPlatform() } +def querydslDir = "src/main/generated" + +sourceSets { + main.java.srcDirs += [ querydslDir ] +} + +tasks.withType(JavaCompile) { + options.getGeneratedSourceOutputDirectory().set(file(querydslDir)) +} + +clean.doLast { + file(querydslDir).deleteDir() +} + sourceSets { test { java { diff --git a/src/main/generated/com/example/api/domain/QAccount.java b/src/main/generated/com/example/api/domain/QAccount.java new file mode 100644 index 00000000..e9e925a8 --- /dev/null +++ b/src/main/generated/com/example/api/domain/QAccount.java @@ -0,0 +1,73 @@ +package com.example.api.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QAccount is a Querydsl query type for Account + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QAccount extends EntityPathBase { + + private static final long serialVersionUID = -1087167288L; + + public static final QAccount account = new QAccount("account"); + + public final QBaseEntity _super = new QBaseEntity(this); + + public final NumberPath accountId = createNumber("accountId", Long.class); + + public final NumberPath age = createNumber("age", Integer.class); + + //inherited + public final DateTimePath createdDate = _super.createdDate; + + public final BooleanPath deleted = createBoolean("deleted"); + + public final StringPath email = createString("email"); + + public final StringPath loginId = createString("loginId"); + + public final StringPath name = createString("name"); + + public final StringPath nickname = createString("nickname"); + + public final BooleanPath openStatus = createBoolean("openStatus"); + + public final StringPath password = createString("password"); + + public final StringPath phoneNumber = createString("phoneNumber"); + + public final StringPath profileImage = createString("profileImage"); + + public final DateTimePath registeredDatetime = createDateTime("registeredDatetime", java.util.Date.class); + + public final StringPath sex = createString("sex"); + + public final NumberPath starPoint = createNumber("starPoint", Float.class); + + //inherited + public final DateTimePath updatedDate = _super.updatedDate; + + public final NumberPath workCount = createNumber("workCount", Integer.class); + + public QAccount(String variable) { + super(Account.class, forVariable(variable)); + } + + public QAccount(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QAccount(PathMetadata metadata) { + super(Account.class, metadata); + } + +} + diff --git a/src/main/generated/com/example/api/domain/QAnnouncement.java b/src/main/generated/com/example/api/domain/QAnnouncement.java new file mode 100644 index 00000000..2280f648 --- /dev/null +++ b/src/main/generated/com/example/api/domain/QAnnouncement.java @@ -0,0 +1,53 @@ +package com.example.api.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QAnnouncement is a Querydsl query type for Announcement + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QAnnouncement extends EntityPathBase { + + private static final long serialVersionUID = 1512577932L; + + public static final QAnnouncement announcement = new QAnnouncement("announcement"); + + public final QBaseEntity _super = new QBaseEntity(this); + + public final StringPath announcementContent = createString("announcementContent"); + + public final NumberPath announcementId = createNumber("announcementId", Long.class); + + public final StringPath announcementTitle = createString("announcementTitle"); + + public final StringPath announcementType = createString("announcementType"); + + //inherited + public final DateTimePath createdDate = _super.createdDate; + + //inherited + public final DateTimePath updatedDate = _super.updatedDate; + + public final NumberPath viewCount = createNumber("viewCount", Integer.class); + + public QAnnouncement(String variable) { + super(Announcement.class, forVariable(variable)); + } + + public QAnnouncement(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QAnnouncement(PathMetadata metadata) { + super(Announcement.class, metadata); + } + +} + diff --git a/src/main/generated/com/example/api/domain/QBaseEntity.java b/src/main/generated/com/example/api/domain/QBaseEntity.java new file mode 100644 index 00000000..09c42891 --- /dev/null +++ b/src/main/generated/com/example/api/domain/QBaseEntity.java @@ -0,0 +1,39 @@ +package com.example.api.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QBaseEntity is a Querydsl query type for BaseEntity + */ +@Generated("com.querydsl.codegen.DefaultSupertypeSerializer") +public class QBaseEntity extends EntityPathBase { + + private static final long serialVersionUID = 127095193L; + + public static final QBaseEntity baseEntity = new QBaseEntity("baseEntity"); + + public final DateTimePath createdDate = createDateTime("createdDate", java.time.LocalDateTime.class); + + public final DateTimePath updatedDate = createDateTime("updatedDate", java.time.LocalDateTime.class); + + public QBaseEntity(String variable) { + super(BaseEntity.class, forVariable(variable)); + } + + public QBaseEntity(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QBaseEntity(PathMetadata metadata) { + super(BaseEntity.class, metadata); + } + +} + diff --git a/src/main/generated/com/example/api/domain/QBusiness.java b/src/main/generated/com/example/api/domain/QBusiness.java new file mode 100644 index 00000000..8cc945d1 --- /dev/null +++ b/src/main/generated/com/example/api/domain/QBusiness.java @@ -0,0 +1,71 @@ +package com.example.api.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QBusiness is a Querydsl query type for Business + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QBusiness extends EntityPathBase { + + private static final long serialVersionUID = 1647868037L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QBusiness business = new QBusiness("business"); + + public final QBaseEntity _super = new QBaseEntity(this); + + public final ListPath businessCategories = this.createList("businessCategories", BusinessCategory.class, QBusinessCategory.class, PathInits.DIRECT2); + + public final NumberPath businessId = createNumber("businessId", Long.class); + + public final StringPath businessName = createString("businessName"); + + //inherited + public final DateTimePath createdDate = _super.createdDate; + + public final QAccount employer; + + public final StringPath location = createString("location"); + + public final DatePath openDate = createDate("openDate", java.time.LocalDate.class); + + public final StringPath registrationNumber = createString("registrationNumber"); + + public final StringPath representationName = createString("representationName"); + + //inherited + public final DateTimePath updatedDate = _super.updatedDate; + + public QBusiness(String variable) { + this(Business.class, forVariable(variable), INITS); + } + + public QBusiness(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QBusiness(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QBusiness(PathMetadata metadata, PathInits inits) { + this(Business.class, metadata, inits); + } + + public QBusiness(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.employer = inits.isInitialized("employer") ? new QAccount(forProperty("employer")) : null; + } + +} + diff --git a/src/main/generated/com/example/api/domain/QBusinessCategory.java b/src/main/generated/com/example/api/domain/QBusinessCategory.java new file mode 100644 index 00000000..975e63bc --- /dev/null +++ b/src/main/generated/com/example/api/domain/QBusinessCategory.java @@ -0,0 +1,62 @@ +package com.example.api.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QBusinessCategory is a Querydsl query type for BusinessCategory + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QBusinessCategory extends EntityPathBase { + + private static final long serialVersionUID = -861191005L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QBusinessCategory businessCategory = new QBusinessCategory("businessCategory"); + + public final QBaseEntity _super = new QBaseEntity(this); + + public final QBusiness business; + + public final QCategory category; + + //inherited + public final DateTimePath createdDate = _super.createdDate; + + public final NumberPath id = createNumber("id", Long.class); + + //inherited + public final DateTimePath updatedDate = _super.updatedDate; + + public QBusinessCategory(String variable) { + this(BusinessCategory.class, forVariable(variable), INITS); + } + + public QBusinessCategory(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QBusinessCategory(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QBusinessCategory(PathMetadata metadata, PathInits inits) { + this(BusinessCategory.class, metadata, inits); + } + + public QBusinessCategory(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.business = inits.isInitialized("business") ? new QBusiness(forProperty("business"), inits.get("business")) : null; + this.category = inits.isInitialized("category") ? new QCategory(forProperty("category")) : null; + } + +} + diff --git a/src/main/generated/com/example/api/domain/QCategory.java b/src/main/generated/com/example/api/domain/QCategory.java new file mode 100644 index 00000000..5065ce4c --- /dev/null +++ b/src/main/generated/com/example/api/domain/QCategory.java @@ -0,0 +1,47 @@ +package com.example.api.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QCategory is a Querydsl query type for Category + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QCategory extends EntityPathBase { + + private static final long serialVersionUID = -1449757245L; + + public static final QCategory category = new QCategory("category"); + + public final QBaseEntity _super = new QBaseEntity(this); + + public final NumberPath categoryId = createNumber("categoryId", Long.class); + + public final StringPath categoryName = createString("categoryName"); + + //inherited + public final DateTimePath createdDate = _super.createdDate; + + //inherited + public final DateTimePath updatedDate = _super.updatedDate; + + public QCategory(String variable) { + super(Category.class, forVariable(variable)); + } + + public QCategory(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QCategory(PathMetadata metadata) { + super(Category.class, metadata); + } + +} + diff --git a/src/main/generated/com/example/api/domain/QChatRoom.java b/src/main/generated/com/example/api/domain/QChatRoom.java new file mode 100644 index 00000000..b8542ca3 --- /dev/null +++ b/src/main/generated/com/example/api/domain/QChatRoom.java @@ -0,0 +1,53 @@ +package com.example.api.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QChatRoom is a Querydsl query type for ChatRoom + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QChatRoom extends EntityPathBase { + + private static final long serialVersionUID = -62925544L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QChatRoom chatRoom = new QChatRoom("chatRoom"); + + public final NumberPath chatRoomId = createNumber("chatRoomId", Long.class); + + public final QOfferEmployment offerEmployment; + + public final DateTimePath suggestGeneratedDate = createDateTime("suggestGeneratedDate", java.time.LocalDateTime.class); + + public QChatRoom(String variable) { + this(ChatRoom.class, forVariable(variable), INITS); + } + + public QChatRoom(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QChatRoom(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QChatRoom(PathMetadata metadata, PathInits inits) { + this(ChatRoom.class, metadata, inits); + } + + public QChatRoom(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.offerEmployment = inits.isInitialized("offerEmployment") ? new QOfferEmployment(forProperty("offerEmployment"), inits.get("offerEmployment")) : null; + } + +} + diff --git a/src/main/generated/com/example/api/domain/QContract.java b/src/main/generated/com/example/api/domain/QContract.java new file mode 100644 index 00000000..59932355 --- /dev/null +++ b/src/main/generated/com/example/api/domain/QContract.java @@ -0,0 +1,67 @@ +package com.example.api.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QContract is a Querydsl query type for Contract + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QContract extends EntityPathBase { + + private static final long serialVersionUID = -2067215913L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QContract contract = new QContract("contract"); + + public final QBaseEntity _super = new QBaseEntity(this); + + public final DateTimePath contractEndTime = createDateTime("contractEndTime", java.time.LocalDateTime.class); + + public final NumberPath contractHourlyPay = createNumber("contractHourlyPay", Integer.class); + + public final NumberPath contractId = createNumber("contractId", Long.class); + + public final DateTimePath contractStartTime = createDateTime("contractStartTime", java.time.LocalDateTime.class); + + public final BooleanPath contractSucceeded = createBoolean("contractSucceeded"); + + //inherited + public final DateTimePath createdDate = _super.createdDate; + + public final QOfferEmployment offerEmployment; + + //inherited + public final DateTimePath updatedDate = _super.updatedDate; + + public QContract(String variable) { + this(Contract.class, forVariable(variable), INITS); + } + + public QContract(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QContract(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QContract(PathMetadata metadata, PathInits inits) { + this(Contract.class, metadata, inits); + } + + public QContract(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.offerEmployment = inits.isInitialized("offerEmployment") ? new QOfferEmployment(forProperty("offerEmployment"), inits.get("offerEmployment")) : null; + } + +} + diff --git a/src/main/generated/com/example/api/domain/QExternalCareer.java b/src/main/generated/com/example/api/domain/QExternalCareer.java new file mode 100644 index 00000000..0c112002 --- /dev/null +++ b/src/main/generated/com/example/api/domain/QExternalCareer.java @@ -0,0 +1,63 @@ +package com.example.api.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QExternalCareer is a Querydsl query type for ExternalCareer + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QExternalCareer extends EntityPathBase { + + private static final long serialVersionUID = 606757934L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QExternalCareer externalCareer = new QExternalCareer("externalCareer"); + + public final QBaseEntity _super = new QBaseEntity(this); + + //inherited + public final DateTimePath createdDate = _super.createdDate; + + public final QAccount employee; + + public final NumberPath id = createNumber("id", Long.class); + + public final StringPath Name = createString("Name"); + + public final StringPath period = createString("period"); + + //inherited + public final DateTimePath updatedDate = _super.updatedDate; + + public QExternalCareer(String variable) { + this(ExternalCareer.class, forVariable(variable), INITS); + } + + public QExternalCareer(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QExternalCareer(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QExternalCareer(PathMetadata metadata, PathInits inits) { + this(ExternalCareer.class, metadata, inits); + } + + public QExternalCareer(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.employee = inits.isInitialized("employee") ? new QAccount(forProperty("employee")) : null; + } + +} + diff --git a/src/main/generated/com/example/api/domain/QFlavored.java b/src/main/generated/com/example/api/domain/QFlavored.java new file mode 100644 index 00000000..5c0a13db --- /dev/null +++ b/src/main/generated/com/example/api/domain/QFlavored.java @@ -0,0 +1,62 @@ +package com.example.api.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QFlavored is a Querydsl query type for Flavored + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QFlavored extends EntityPathBase { + + private static final long serialVersionUID = 128299138L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QFlavored flavored = new QFlavored("flavored"); + + public final QBaseEntity _super = new QBaseEntity(this); + + public final QCategory category; + + //inherited + public final DateTimePath createdDate = _super.createdDate; + + public final QAccount employee; + + public final NumberPath flavoredId = createNumber("flavoredId", Long.class); + + //inherited + public final DateTimePath updatedDate = _super.updatedDate; + + public QFlavored(String variable) { + this(Flavored.class, forVariable(variable), INITS); + } + + public QFlavored(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QFlavored(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QFlavored(PathMetadata metadata, PathInits inits) { + this(Flavored.class, metadata, inits); + } + + public QFlavored(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.category = inits.isInitialized("category") ? new QCategory(forProperty("category")) : null; + this.employee = inits.isInitialized("employee") ? new QAccount(forProperty("employee")) : null; + } + +} + diff --git a/src/main/generated/com/example/api/domain/QOfferEmployment.java b/src/main/generated/com/example/api/domain/QOfferEmployment.java new file mode 100644 index 00000000..a6634fba --- /dev/null +++ b/src/main/generated/com/example/api/domain/QOfferEmployment.java @@ -0,0 +1,69 @@ +package com.example.api.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QOfferEmployment is a Querydsl query type for OfferEmployment + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QOfferEmployment extends EntityPathBase { + + private static final long serialVersionUID = -82696445L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QOfferEmployment offerEmployment = new QOfferEmployment("offerEmployment"); + + public final QBusiness business; + + public final QContract contract; + + public final QAccount employee; + + public final DateTimePath suggestEndTime = createDateTime("suggestEndTime", java.time.LocalDateTime.class); + + public final NumberPath suggestHourlyPay = createNumber("suggestHourlyPay", Integer.class); + + public final NumberPath suggestId = createNumber("suggestId", Long.class); + + public final BooleanPath suggestReaded = createBoolean("suggestReaded"); + + public final DateTimePath suggestRegisterTime = createDateTime("suggestRegisterTime", java.time.LocalDateTime.class); + + public final DateTimePath suggestStartTime = createDateTime("suggestStartTime", java.time.LocalDateTime.class); + + public final BooleanPath suggestSucceeded = createBoolean("suggestSucceeded"); + + public QOfferEmployment(String variable) { + this(OfferEmployment.class, forVariable(variable), INITS); + } + + public QOfferEmployment(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QOfferEmployment(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QOfferEmployment(PathMetadata metadata, PathInits inits) { + this(OfferEmployment.class, metadata, inits); + } + + public QOfferEmployment(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.business = inits.isInitialized("business") ? new QBusiness(forProperty("business"), inits.get("business")) : null; + this.contract = inits.isInitialized("contract") ? new QContract(forProperty("contract"), inits.get("contract")) : null; + this.employee = inits.isInitialized("employee") ? new QAccount(forProperty("employee")) : null; + } + +} + diff --git a/src/main/generated/com/example/api/domain/QPossibleBoard.java b/src/main/generated/com/example/api/domain/QPossibleBoard.java new file mode 100644 index 00000000..23743abc --- /dev/null +++ b/src/main/generated/com/example/api/domain/QPossibleBoard.java @@ -0,0 +1,63 @@ +package com.example.api.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QPossibleBoard is a Querydsl query type for PossibleBoard + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QPossibleBoard extends EntityPathBase { + + private static final long serialVersionUID = -1378693552L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QPossibleBoard possibleBoard = new QPossibleBoard("possibleBoard"); + + public final QBaseEntity _super = new QBaseEntity(this); + + //inherited + public final DateTimePath createdDate = _super.createdDate; + + public final QAccount employee; + + public final DateTimePath endTime = createDateTime("endTime", java.time.LocalDateTime.class); + + public final NumberPath possibleId = createNumber("possibleId", Long.class); + + public final DateTimePath startTime = createDateTime("startTime", java.time.LocalDateTime.class); + + //inherited + public final DateTimePath updatedDate = _super.updatedDate; + + public QPossibleBoard(String variable) { + this(PossibleBoard.class, forVariable(variable), INITS); + } + + public QPossibleBoard(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QPossibleBoard(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QPossibleBoard(PathMetadata metadata, PathInits inits) { + this(PossibleBoard.class, metadata, inits); + } + + public QPossibleBoard(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.employee = inits.isInitialized("employee") ? new QAccount(forProperty("employee")) : null; + } + +} + diff --git a/src/main/generated/com/example/api/domain/QReview.java b/src/main/generated/com/example/api/domain/QReview.java new file mode 100644 index 00000000..6fbd36d7 --- /dev/null +++ b/src/main/generated/com/example/api/domain/QReview.java @@ -0,0 +1,49 @@ +package com.example.api.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QReview is a Querydsl query type for Review + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QReview extends EntityPathBase { + + private static final long serialVersionUID = 731127133L; + + public static final QReview review = new QReview("review"); + + public final QBaseEntity _super = new QBaseEntity(this); + + //inherited + public final DateTimePath createdDate = _super.createdDate; + + public final StringPath reviewContent = createString("reviewContent"); + + public final NumberPath reviewStarPoint = createNumber("reviewStarPoint", Integer.class); + + public final NumberPath suggestId = createNumber("suggestId", Long.class); + + //inherited + public final DateTimePath updatedDate = _super.updatedDate; + + public QReview(String variable) { + super(Review.class, forVariable(variable)); + } + + public QReview(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QReview(PathMetadata metadata) { + super(Review.class, metadata); + } + +} + diff --git a/src/main/generated/com/example/api/domain/QScrap.java b/src/main/generated/com/example/api/domain/QScrap.java new file mode 100644 index 00000000..6caf4631 --- /dev/null +++ b/src/main/generated/com/example/api/domain/QScrap.java @@ -0,0 +1,62 @@ +package com.example.api.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QScrap is a Querydsl query type for Scrap + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QScrap extends EntityPathBase { + + private static final long serialVersionUID = -391197396L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QScrap scrap = new QScrap("scrap"); + + public final QBaseEntity _super = new QBaseEntity(this); + + //inherited + public final DateTimePath createdDate = _super.createdDate; + + public final QAccount employee; + + public final QAccount employer; + + public final NumberPath scrapId = createNumber("scrapId", Long.class); + + //inherited + public final DateTimePath updatedDate = _super.updatedDate; + + public QScrap(String variable) { + this(Scrap.class, forVariable(variable), INITS); + } + + public QScrap(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QScrap(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QScrap(PathMetadata metadata, PathInits inits) { + this(Scrap.class, metadata, inits); + } + + public QScrap(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.employee = inits.isInitialized("employee") ? new QAccount(forProperty("employee")) : null; + this.employer = inits.isInitialized("employer") ? new QAccount(forProperty("employer")) : null; + } + +} + diff --git a/src/main/java/com/example/api/board/controller/BoardController.java b/src/main/java/com/example/api/board/controller/BoardController.java index c4ebe92b..a5cbe63e 100644 --- a/src/main/java/com/example/api/board/controller/BoardController.java +++ b/src/main/java/com/example/api/board/controller/BoardController.java @@ -1,18 +1,22 @@ package com.example.api.board.controller; import com.example.api.board.controller.domain.request.EmployeeIdRequest; -import com.example.api.board.controller.domain.response.CategoryDTO; import com.example.api.board.controller.domain.response.Board; +import com.example.api.board.controller.domain.response.CategoryDTO; import com.example.api.board.controller.domain.response.MyInfoDTO; import com.example.api.board.service.BoardService; import com.example.api.board.service.CategoryService; import com.example.api.board.service.EmployeeService; +import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import java.util.List; +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.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; @RestController @RequiredArgsConstructor diff --git a/src/main/java/com/example/api/board/controller/domain/request/QueryPossibleEmployerRequest.java b/src/main/java/com/example/api/board/controller/domain/request/QueryPossibleEmployerRequest.java new file mode 100644 index 00000000..f1c2fc01 --- /dev/null +++ b/src/main/java/com/example/api/board/controller/domain/request/QueryPossibleEmployerRequest.java @@ -0,0 +1,11 @@ +package com.example.api.board.controller.domain.request; + +import java.time.LocalDateTime; + +public record QueryPossibleEmployerRequest( + String name, + Integer age, + LocalDateTime possibleStartDateTime, + LocalDateTime possibleEndDateTime +) { +} diff --git a/src/main/java/com/example/api/board/controller/domain/response/PossibleEmployeeResponse.java b/src/main/java/com/example/api/board/controller/domain/response/PossibleEmployeeResponse.java new file mode 100644 index 00000000..bb7420a7 --- /dev/null +++ b/src/main/java/com/example/api/board/controller/domain/response/PossibleEmployeeResponse.java @@ -0,0 +1,13 @@ +package com.example.api.board.controller.domain.response; + +import java.time.LocalDateTime; + +public record PossibleEmployeeResponse( + Long accountId, + String name, + Integer age, + String sex, + LocalDateTime possibleStartDateTime, + LocalDateTime possibleEndDateTime +) { +} diff --git a/src/main/java/com/example/api/board/service/EmployeeService.java b/src/main/java/com/example/api/board/service/EmployeeService.java index 1fcd73b2..47d33b19 100644 --- a/src/main/java/com/example/api/board/service/EmployeeService.java +++ b/src/main/java/com/example/api/board/service/EmployeeService.java @@ -5,19 +5,22 @@ import com.example.api.board.controller.domain.response.ExternalCareerDTO; import com.example.api.board.controller.domain.response.MyInfoDTO; import com.example.api.board.controller.domain.response.PossibleBoardDTO; -import com.example.api.domain.*; +import com.example.api.domain.Account; +import com.example.api.domain.Category; +import com.example.api.domain.ExternalCareer; +import com.example.api.domain.Flavored; +import com.example.api.domain.PossibleBoard; import com.example.api.domain.repository.EmployeeRepository; import com.example.api.domain.repository.ExternalCareerRepository; import com.example.api.domain.repository.FlavoredRepository; import com.example.api.domain.repository.PossibleBoardRepository; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Repository; -import org.springframework.transaction.annotation.Transactional; - import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.stream.Collectors; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; @Repository @RequiredArgsConstructor @@ -35,6 +38,7 @@ public Boolean changeOpenStatus(final EmployeeIdRequest employeeIdRequest, boole return true; }).orElse(false); } + @Transactional public boolean updateUserInfo(final EmployeeIdRequest employeeIdRequest, MyInfoDTO myInfo) { return employeeRepository.findByAccountId(employeeIdRequest.employeeId()).map(employee -> { diff --git a/src/main/java/com/example/api/domain/repository/BusinessRepository.java b/src/main/java/com/example/api/business/BusinessRepository.java similarity index 58% rename from src/main/java/com/example/api/domain/repository/BusinessRepository.java rename to src/main/java/com/example/api/business/BusinessRepository.java index e5258856..19d6a104 100644 --- a/src/main/java/com/example/api/domain/repository/BusinessRepository.java +++ b/src/main/java/com/example/api/business/BusinessRepository.java @@ -1,9 +1,11 @@ -package com.example.api.domain.repository; +package com.example.api.business; import com.example.api.domain.Business; +import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; -@Repository public interface BusinessRepository extends JpaRepository { } diff --git a/src/main/java/com/example/api/business/BusinessService.java b/src/main/java/com/example/api/business/BusinessService.java new file mode 100644 index 00000000..bdb9ad58 --- /dev/null +++ b/src/main/java/com/example/api/business/BusinessService.java @@ -0,0 +1,31 @@ +package com.example.api.business; + +import com.example.api.domain.repository.BusinessCategoryRepository; +import com.example.api.domain.Account; +import com.example.api.domain.Business; +import com.example.api.exception.BusinessException; +import com.example.api.exception.ErrorCode; +import java.util.List; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +@Service +@Slf4j +@RequiredArgsConstructor +public class BusinessService { + + private final BusinessRepository businessRepository; + private final BusinessCategoryRepository categoryRepository; + +// @Transactional(readOnly = true) +// public BusinessDetailsResponse loadDetails(@Validated final QueryBusinessDetailCommand queryBusinessDetailCommand) { +// final Business business = businessRepository.findById(queryBusinessDetailCommand.businessId()) +// .orElseThrow(() -> new BusinessException(ErrorCode.NO_SUCH_BUSINESS_EXCEPTION)); +// final Account account = business.getEmployer(); +// +// final List categoryInfos = categoryRepository.queryBusinessCategoriesById(queryBusinessDetailCommand.businessId()); +// final BusinessOwner owner = new BusinessOwner(account.getAccountId(), account.getName()); +// return new BusinessDetailsResponse(business.getBusinessName(), business.getBusinessId(), owner, business.getLocation(), categoryInfos); +// } +} diff --git a/src/main/java/com/example/api/domain/Account.java b/src/main/java/com/example/api/domain/Account.java index 6a7973c6..1d6d3013 100644 --- a/src/main/java/com/example/api/domain/Account.java +++ b/src/main/java/com/example/api/domain/Account.java @@ -4,6 +4,7 @@ import com.example.api.account.entity.UserRole; import com.example.api.auth.dto.LoginUserRequest; import jakarta.persistence.*; +import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; diff --git a/src/main/java/com/example/api/domain/Announcement.java b/src/main/java/com/example/api/domain/Announcement.java index a5549d04..90bacf08 100644 --- a/src/main/java/com/example/api/domain/Announcement.java +++ b/src/main/java/com/example/api/domain/Announcement.java @@ -1,12 +1,14 @@ package com.example.api.domain; import jakarta.persistence.*; +import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; @Entity @Getter @Setter +@EqualsAndHashCode(callSuper = false) @Table(name = "ANNOUNCEMENT") public class Announcement extends BaseEntity { @Id diff --git a/src/main/java/com/example/api/domain/Business.java b/src/main/java/com/example/api/domain/Business.java index c3ef0be9..a2a77e08 100644 --- a/src/main/java/com/example/api/domain/Business.java +++ b/src/main/java/com/example/api/domain/Business.java @@ -1,6 +1,7 @@ package com.example.api.domain; import jakarta.persistence.*; +import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; @@ -13,6 +14,7 @@ @Entity @Getter @Setter +@EqualsAndHashCode(callSuper = false) @Table(name = "BUSINESS") public class Business extends BaseEntity { @Id diff --git a/src/main/java/com/example/api/domain/BusinessCategory.java b/src/main/java/com/example/api/domain/BusinessCategory.java index 84b612a9..9141e0a9 100644 --- a/src/main/java/com/example/api/domain/BusinessCategory.java +++ b/src/main/java/com/example/api/domain/BusinessCategory.java @@ -1,6 +1,7 @@ package com.example.api.domain; import jakarta.persistence.*; +import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; @@ -11,6 +12,7 @@ @Entity @Getter @Setter +@EqualsAndHashCode(callSuper = false) @Table(name = "BUSINESS_CATEGORY") public class BusinessCategory extends BaseEntity{ @Id diff --git a/src/main/java/com/example/api/domain/Category.java b/src/main/java/com/example/api/domain/Category.java index 1d681ceb..17586854 100644 --- a/src/main/java/com/example/api/domain/Category.java +++ b/src/main/java/com/example/api/domain/Category.java @@ -11,7 +11,7 @@ @Entity @Getter @Setter -@EqualsAndHashCode +@EqualsAndHashCode(callSuper = false) @Table(name = "CATEGORY") public class Category extends BaseEntity{ @Id diff --git a/src/main/java/com/example/api/domain/Chat.java b/src/main/java/com/example/api/domain/Chat.java index 9cb57b35..62c506b7 100644 --- a/src/main/java/com/example/api/domain/Chat.java +++ b/src/main/java/com/example/api/domain/Chat.java @@ -2,12 +2,14 @@ import com.example.api.chat.controller.dto.request.ChatSendRequest; import jakarta.persistence.*; +import lombok.EqualsAndHashCode; import lombok.Getter; import org.springframework.data.mongodb.core.mapping.Document; import java.util.Date; @Getter +@EqualsAndHashCode @Document(collection = "chat") public class Chat { @Id diff --git a/src/main/java/com/example/api/domain/Contract.java b/src/main/java/com/example/api/domain/Contract.java index 52d776af..53bcd85a 100644 --- a/src/main/java/com/example/api/domain/Contract.java +++ b/src/main/java/com/example/api/domain/Contract.java @@ -1,6 +1,7 @@ package com.example.api.domain; import jakarta.persistence.*; +import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; @@ -9,6 +10,7 @@ @Entity @Getter @Table(name = "CONTRACT") +@EqualsAndHashCode(callSuper = false) @NoArgsConstructor public class Contract extends BaseEntity { @Id diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 78319ded..3342e0ef 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -12,8 +12,8 @@ @Entity @Getter @Setter +@EqualsAndHashCode(callSuper = false) @Table(name = "EXTERANL_CARRER") -@EqualsAndHashCode(onlyExplicitlyIncluded = true) public class ExternalCareer extends BaseEntity{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) diff --git a/src/main/java/com/example/api/domain/Flavored.java b/src/main/java/com/example/api/domain/Flavored.java index c10e721b..e3becf35 100644 --- a/src/main/java/com/example/api/domain/Flavored.java +++ b/src/main/java/com/example/api/domain/Flavored.java @@ -10,10 +10,10 @@ @Entity @Getter @Setter +@EqualsAndHashCode(callSuper = false) @Table(name = "flavored", uniqueConstraints = { @UniqueConstraint(columnNames = {"employee_id", "category_id"}) }) -@EqualsAndHashCode(callSuper = false) public class Flavored extends BaseEntity{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) diff --git a/src/main/java/com/example/api/domain/PossibleBoard.java b/src/main/java/com/example/api/domain/PossibleBoard.java index 54e36139..c4d304a2 100644 --- a/src/main/java/com/example/api/domain/PossibleBoard.java +++ b/src/main/java/com/example/api/domain/PossibleBoard.java @@ -11,8 +11,8 @@ @Getter @Setter @AllArgsConstructor +@EqualsAndHashCode(callSuper = false) @NoArgsConstructor -@EqualsAndHashCode public class PossibleBoard extends BaseEntity{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) diff --git a/src/main/java/com/example/api/domain/Review.java b/src/main/java/com/example/api/domain/Review.java index bbdadd9f..f3e89840 100644 --- a/src/main/java/com/example/api/domain/Review.java +++ b/src/main/java/com/example/api/domain/Review.java @@ -2,6 +2,7 @@ import jakarta.persistence.*; import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; @@ -11,6 +12,7 @@ @Setter @Table(name = "REVIEW") @AllArgsConstructor +@EqualsAndHashCode(callSuper = true) @NoArgsConstructor public class Review extends BaseEntity { diff --git a/src/main/java/com/example/api/domain/Scrap.java b/src/main/java/com/example/api/domain/Scrap.java index a8d20e1a..8a9da7c1 100644 --- a/src/main/java/com/example/api/domain/Scrap.java +++ b/src/main/java/com/example/api/domain/Scrap.java @@ -1,6 +1,7 @@ package com.example.api.domain; import jakarta.persistence.*; +import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; @@ -9,6 +10,7 @@ @Entity @Getter @Setter +@EqualsAndHashCode(callSuper = false) @Table(name = "SCRAP") public class Scrap extends BaseEntity { @Id diff --git a/src/test/java/com/example/api/board/controller/BoardControllerTest.java b/src/test/java/com/example/api/board/controller/BoardControllerTest.java deleted file mode 100644 index 7b20b902..00000000 --- a/src/test/java/com/example/api/board/controller/BoardControllerTest.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.example.api.board.controller; - -import com.example.api.board.controller.domain.response.Board; -import com.example.api.board.controller.domain.response.CategoryDTO; -import com.example.api.board.controller.domain.response.MyInfoDTO; -import com.example.api.global.BaseIntegrationTest; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; - -import java.util.ArrayList; -import java.util.List; - -class BoardControllerTest extends BaseIntegrationTest { - @Autowired BoardController boardController; - - @Test - void getBoard(){ - List expectedCategoryDTOList = new ArrayList<>(); - expectedCategoryDTOList.add(new CategoryDTO(category1.getCategoryId(), category1.getCategoryName())); - expectedCategoryDTOList.add(new CategoryDTO(category2.getCategoryId(), category2.getCategoryName())); - - Board expectedBoard = new Board( - new MyInfoDTO( - "John Doe", - "Johnny", - 30, - "Male", - "johndoe@example.com", - "123-456-7890", - innerCareerList, - externalCareerList, - possibleBoardList, - flavoredCategoryList, - 3.5f, - 3 - ), - expectedCategoryDTOList - ); - - Board boardByEmployeeId = boardController.findBoardByEmployeeId(1L); - - Assertions.assertEquals(expectedBoard, boardByEmployeeId); - } -} \ No newline at end of file diff --git a/src/test/java/com/example/api/board/service/BoardServiceTest.java b/src/test/java/com/example/api/board/service/BoardServiceTest.java deleted file mode 100644 index 43b0ce71..00000000 --- a/src/test/java/com/example/api/board/service/BoardServiceTest.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.example.api.board.service; - -import com.example.api.board.controller.domain.response.MyInfoDTO; -import com.example.api.global.BaseIntegrationTest; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; - - -class BoardServiceTest extends BaseIntegrationTest { - @Autowired BoardService boardService; - - @Test - @DisplayName("나의 이력서 정보 조회") - void MyInfoCheck(){ - MyInfoDTO expectedMyInfoDTO = new MyInfoDTO( - "John Doe", - "Johnny", - 30, - "Male", - "johndoe@example.com", - "123-456-7890", - innerCareerList, - externalCareerList, - possibleBoardList, - flavoredCategoryList, - 3.5f, - 3 - ); - - MyInfoDTO findEmployeeInfo = boardService.findMyInfoById(1L); - Assertions.assertEquals(expectedMyInfoDTO, findEmployeeInfo); - } -} \ No newline at end of file diff --git a/src/test/java/com/example/api/board/service/CategoryServiceTest.java b/src/test/java/com/example/api/board/service/CategoryServiceTest.java deleted file mode 100644 index e230a919..00000000 --- a/src/test/java/com/example/api/board/service/CategoryServiceTest.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.example.api.board.service; - -import com.example.api.board.controller.domain.response.CategoryDTO; -import com.example.api.global.BaseIntegrationTest; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; - -import java.util.ArrayList; -import java.util.List; - - -class CategoryServiceTest extends BaseIntegrationTest { - @Autowired CategoryService categoryService; - - @Test - @DisplayName("모든 카테고리 조회") - void CategoryCheck(){ - List expectedCategoryDTO = new ArrayList<>(); - expectedCategoryDTO.add(new CategoryDTO(category1.getCategoryId(), category1.getCategoryName())); - expectedCategoryDTO.add(new CategoryDTO(category2.getCategoryId(), category2.getCategoryName())); - - List allCategories = categoryService.getAllCategories(); - Assertions.assertEquals(expectedCategoryDTO, allCategories); - } - -} \ No newline at end of file diff --git a/src/test/java/com/example/api/board/service/EmployeeServiceTest.java b/src/test/java/com/example/api/board/service/EmployeeServiceTest.java deleted file mode 100644 index 764aacf7..00000000 --- a/src/test/java/com/example/api/board/service/EmployeeServiceTest.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.example.api.board.service; - -import com.example.api.board.controller.domain.request.EmployeeIdRequest; -import com.example.api.global.BaseIntegrationTest; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; - -import static org.junit.jupiter.api.Assertions.*; - -class EmployeeServiceTest extends BaseIntegrationTest { - @Autowired EmployeeService employeeService; - - @Test - @DisplayName("공고 공개 여부 변경") - void changeOpenStatus(){ - EmployeeIdRequest employeeIdRequest = new EmployeeIdRequest(1L); - Boolean result = employeeService.changeOpenStatus(employeeIdRequest , false); - assertTrue(result); - } -} \ No newline at end of file diff --git a/src/test/java/com/example/api/chat/service/ChatServiceTest.java b/src/test/java/com/example/api/chat/service/ChatServiceTest.java index 09c6ffcb..536ac74d 100644 --- a/src/test/java/com/example/api/chat/service/ChatServiceTest.java +++ b/src/test/java/com/example/api/chat/service/ChatServiceTest.java @@ -1,95 +1,95 @@ -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 java.util.List; - - -@SpringBootTest() -@Transactional -@Rollback(false) -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); - } -} +//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 java.util.List; +// +// +//@SpringBootTest() +//@Transactional +//@Rollback(false) +//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); +// } +//} diff --git a/src/test/java/com/example/api/global/BaseIntegrationTest.java b/src/test/java/com/example/api/global/BaseIntegrationTest.java index 073544ea..b7a9e2ee 100644 --- a/src/test/java/com/example/api/global/BaseIntegrationTest.java +++ b/src/test/java/com/example/api/global/BaseIntegrationTest.java @@ -4,6 +4,7 @@ import com.example.api.board.controller.domain.response.ExternalCareerDTO; import com.example.api.board.controller.domain.response.InnerCareerDTO; import com.example.api.board.controller.domain.response.PossibleBoardDTO; +import com.example.api.business.BusinessRepository; import com.example.api.contracts.ContractRepository; import com.example.api.domain.*; import com.example.api.domain.repository.*; From 11d7f4e2877f1952e6a8d2602a0454ebb2eb9249 Mon Sep 17 00:00:00 2001 From: huhdy32 Date: Fri, 22 Nov 2024 21:09:46 +0900 Subject: [PATCH 174/276] =?UTF-8?q?#29=20feat(AccountService):=20=EA=B3=84?= =?UTF-8?q?=EC=A0=95=20=EB=B6=88=EB=9F=AC=EC=98=A4=EB=8A=94=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/api/account/AccountRepository.java | 9 +++++++++ .../com/example/api/account/AccountService.java | 17 +++++++++++++++++ .../com/example/api/exception/ErrorCode.java | 7 ++++++- 3 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/example/api/account/AccountRepository.java create mode 100644 src/main/java/com/example/api/account/AccountService.java diff --git a/src/main/java/com/example/api/account/AccountRepository.java b/src/main/java/com/example/api/account/AccountRepository.java new file mode 100644 index 00000000..a3588098 --- /dev/null +++ b/src/main/java/com/example/api/account/AccountRepository.java @@ -0,0 +1,9 @@ +package com.example.api.account; + +import com.example.api.domain.Account; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +interface AccountRepository extends JpaRepository { +} diff --git a/src/main/java/com/example/api/account/AccountService.java b/src/main/java/com/example/api/account/AccountService.java new file mode 100644 index 00000000..e7a17364 --- /dev/null +++ b/src/main/java/com/example/api/account/AccountService.java @@ -0,0 +1,17 @@ +package com.example.api.account; + +import com.example.api.domain.Account; +import com.example.api.exception.BusinessException; +import com.example.api.exception.ErrorCode; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class AccountService { + private final AccountRepository accountRepository; + public Account loadAccount(final Long requestMemberId) { + return accountRepository.findById(requestMemberId) + .orElseThrow(() -> new BusinessException(ErrorCode.ACCOUNT_NOT_FOUND_EXCEPTION)); + } +} diff --git a/src/main/java/com/example/api/exception/ErrorCode.java b/src/main/java/com/example/api/exception/ErrorCode.java index 17b06e7e..578960a6 100644 --- a/src/main/java/com/example/api/exception/ErrorCode.java +++ b/src/main/java/com/example/api/exception/ErrorCode.java @@ -24,7 +24,12 @@ public enum ErrorCode { FAIL_GENERATE_CODE(HttpStatus.INTERNAL_SERVER_ERROR, "-500", "코드 생성에 실패하였습니다."), FAIL_SEND_EMAIL(HttpStatus.INTERNAL_SERVER_ERROR, "-501", "이메일 전송에 실패하였습니다."), - FAIL_SAVE_CODE(HttpStatus.INTERNAL_SERVER_ERROR, "-502", "코드 저장에 실패하였습니다."); + FAIL_SAVE_CODE(HttpStatus.INTERNAL_SERVER_ERROR, "-502", "코드 저장에 실패하였습니다."), + + + ACCOUNT_NOT_FOUND_EXCEPTION(HttpStatus.BAD_REQUEST, "-101", "찾을 수 없는 계정"), + + POSSIBLE_TIME_REGISTER_EXCEPTION(HttpStatus.BAD_REQUEST, "-401", "알바 가능 시간 등록 에러"); private final HttpStatus httpStatus; private final String errorCode; From 8abf881bc634825f69bc1e65d2a29b74441d226f Mon Sep 17 00:00:00 2001 From: huhdy32 Date: Fri, 22 Nov 2024 21:12:28 +0900 Subject: [PATCH 175/276] =?UTF-8?q?#29=20feat(PossibleBoardService):=20?= =?UTF-8?q?=EA=B0=80=EB=8A=A5=20=EC=8B=9C=EA=B0=84=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/api/domain/PossibleBoard.java | 2 +- .../PossibleBoardRepository.java | 17 ++++++++ .../possbileboard/PossibleBoardService.java | 41 +++++++++++++++++++ .../api/possbileboard/PossibleMapper.java | 13 ++++++ .../api/possbileboard/PossibleTime.java | 29 +++++++++++++ .../controller/PossibleBoardController.java | 26 ++++++++++++ .../dto/AddPossibleTimeCommand.java | 15 +++++++ .../dto/AddPossibleTimeRequest.java | 24 +++++++++++ 8 files changed, 166 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/example/api/possbileboard/PossibleBoardRepository.java create mode 100644 src/main/java/com/example/api/possbileboard/PossibleBoardService.java create mode 100644 src/main/java/com/example/api/possbileboard/PossibleMapper.java create mode 100644 src/main/java/com/example/api/possbileboard/PossibleTime.java create mode 100644 src/main/java/com/example/api/possbileboard/controller/PossibleBoardController.java create mode 100644 src/main/java/com/example/api/possbileboard/dto/AddPossibleTimeCommand.java create mode 100644 src/main/java/com/example/api/possbileboard/dto/AddPossibleTimeRequest.java diff --git a/src/main/java/com/example/api/domain/PossibleBoard.java b/src/main/java/com/example/api/domain/PossibleBoard.java index c4d304a2..1d417190 100644 --- a/src/main/java/com/example/api/domain/PossibleBoard.java +++ b/src/main/java/com/example/api/domain/PossibleBoard.java @@ -30,7 +30,7 @@ public class PossibleBoard extends BaseEntity{ @EqualsAndHashCode.Include private LocalDateTime endTime; - public PossibleBoard(Account employee, LocalDateTime startTime, LocalDateTime endTime) { + public PossibleBoard(final Account employee, final LocalDateTime startTime, final LocalDateTime endTime) { this.employee = employee; this.startTime = startTime; this.endTime = endTime; diff --git a/src/main/java/com/example/api/possbileboard/PossibleBoardRepository.java b/src/main/java/com/example/api/possbileboard/PossibleBoardRepository.java new file mode 100644 index 00000000..63c00f23 --- /dev/null +++ b/src/main/java/com/example/api/possbileboard/PossibleBoardRepository.java @@ -0,0 +1,17 @@ +package com.example.api.possbileboard; + +import com.example.api.domain.PossibleBoard; +import java.time.LocalDateTime; +import java.util.List; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +@Repository +interface PossibleBoardRepository extends JpaRepository { + @Modifying + @Query("DELETE FROM PossibleBoard possible WHERE (possible.startTime <= :endDateTime AND possible.endTime >= :startDateTime)") + Long deleteDuplicatedWorkTimeIncluded(@Param("startDateTime") final LocalDateTime startDateTimeIncluded, @Param("endDateTime") final LocalDateTime endDateTimeIncluded); +} diff --git a/src/main/java/com/example/api/possbileboard/PossibleBoardService.java b/src/main/java/com/example/api/possbileboard/PossibleBoardService.java new file mode 100644 index 00000000..991b422c --- /dev/null +++ b/src/main/java/com/example/api/possbileboard/PossibleBoardService.java @@ -0,0 +1,41 @@ +package com.example.api.possbileboard; + +import com.example.api.account.AccountService; +import com.example.api.domain.Account; +import com.example.api.domain.PossibleBoard; +import com.example.api.possbileboard.dto.AddPossibleTimeCommand; +import java.util.List; +import java.util.stream.Collectors; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +public class PossibleBoardService { + private final PossibleBoardRepository possibleBoardRepository; + private final AccountService accountService; + private final PossibleMapper possibleMapper; + + @Transactional + public void addPossibleBoard(final AddPossibleTimeCommand addPossibleTimeCommand) { + final List possibleTimes = addPossibleTimeCommand.possibleTimes().stream() + .map(possibleTimeRange -> new PossibleTime(possibleTimeRange.startTime(), possibleTimeRange.endTime())) + .collect(Collectors.toList()); + deleteDuplicatedPeriod(possibleTimes); + final Account account = accountService.loadAccount(addPossibleTimeCommand.requestMemberId()); + addNewPeriod(account, possibleTimes); + } + + private void deleteDuplicatedPeriod(final List possibleTimes) { + possibleTimes.stream() + .forEach(possibleTime -> possibleBoardRepository.deleteDuplicatedWorkTimeIncluded(possibleTime.getStartTime(), possibleTime.getEndTime())); + } + + private void addNewPeriod(final Account account, final List possibleTimes) { + final List possibleBoards = possibleTimes.stream() + .map(possibleTime -> possibleMapper.toBoard(account, possibleTime)) + .toList(); + possibleBoardRepository.saveAll(possibleBoards); + } +} diff --git a/src/main/java/com/example/api/possbileboard/PossibleMapper.java b/src/main/java/com/example/api/possbileboard/PossibleMapper.java new file mode 100644 index 00000000..7681cdc1 --- /dev/null +++ b/src/main/java/com/example/api/possbileboard/PossibleMapper.java @@ -0,0 +1,13 @@ +package com.example.api.possbileboard; + +import com.example.api.domain.Account; +import com.example.api.domain.PossibleBoard; +import org.springframework.stereotype.Service; + +@Service +class PossibleMapper { + + PossibleBoard toBoard(final Account account, final PossibleTime possibleTime) { + return new PossibleBoard(account, possibleTime.getStartTime(), possibleTime.getEndTime()); + } +} diff --git a/src/main/java/com/example/api/possbileboard/PossibleTime.java b/src/main/java/com/example/api/possbileboard/PossibleTime.java new file mode 100644 index 00000000..c9195275 --- /dev/null +++ b/src/main/java/com/example/api/possbileboard/PossibleTime.java @@ -0,0 +1,29 @@ +package com.example.api.possbileboard; + +import com.example.api.exception.BusinessException; +import com.example.api.exception.ErrorCode; +import java.time.LocalDateTime; +import lombok.Getter; + +@Getter +class PossibleTime { + private final LocalDateTime startTime; + private final LocalDateTime endTime; + + public PossibleTime(final LocalDateTime startTime, final LocalDateTime endTime) { + validate(startTime, endTime); + this.startTime = startTime; + this.endTime = endTime; + } + + public void validate(final LocalDateTime startTime, final LocalDateTime endTime) { + validateAfterStartTime(startTime, endTime); + } + + public void validateAfterStartTime(final LocalDateTime startTime, final LocalDateTime endTime) { + if (startTime.isBefore(endTime)) { + return; + } + throw new BusinessException("종료 시간이 시작시간보다 이릅니다. 시작 시간: " + startTime + "종료 시간 : " + endTime, ErrorCode.POSSIBLE_TIME_REGISTER_EXCEPTION); + } +} diff --git a/src/main/java/com/example/api/possbileboard/controller/PossibleBoardController.java b/src/main/java/com/example/api/possbileboard/controller/PossibleBoardController.java new file mode 100644 index 00000000..428244e6 --- /dev/null +++ b/src/main/java/com/example/api/possbileboard/controller/PossibleBoardController.java @@ -0,0 +1,26 @@ +package com.example.api.possbileboard.controller; + +import com.example.api.possbileboard.PossibleBoardService; +import com.example.api.possbileboard.dto.AddPossibleTimeCommand; +import com.example.api.possbileboard.dto.AddPossibleTimeRequest; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +class PossibleBoardController { + private final PossibleBoardService possibleBoardService; + + @PostMapping("/api/v1/possible-board") + public ResponseEntity addPossibleTimes( + @RequestBody final AddPossibleTimeRequest addPossibleTimeRequest, + final Long requestMemberId + ) { + final AddPossibleTimeCommand addPossibleTimeCommand = addPossibleTimeRequest.toCommand(requestMemberId); + possibleBoardService.addPossibleBoard(addPossibleTimeCommand); + return ResponseEntity.ok().build(); + } +} diff --git a/src/main/java/com/example/api/possbileboard/dto/AddPossibleTimeCommand.java b/src/main/java/com/example/api/possbileboard/dto/AddPossibleTimeCommand.java new file mode 100644 index 00000000..7309ccfb --- /dev/null +++ b/src/main/java/com/example/api/possbileboard/dto/AddPossibleTimeCommand.java @@ -0,0 +1,15 @@ +package com.example.api.possbileboard.dto; + +import java.time.LocalDateTime; +import java.util.List; + +public record AddPossibleTimeCommand( + Long requestMemberId, + List possibleTimes +) { + public record PossibleTimeRange( + LocalDateTime startTime, + LocalDateTime endTime + ) { + } +} diff --git a/src/main/java/com/example/api/possbileboard/dto/AddPossibleTimeRequest.java b/src/main/java/com/example/api/possbileboard/dto/AddPossibleTimeRequest.java new file mode 100644 index 00000000..2e911bfe --- /dev/null +++ b/src/main/java/com/example/api/possbileboard/dto/AddPossibleTimeRequest.java @@ -0,0 +1,24 @@ +package com.example.api.possbileboard.dto; + +import com.example.api.possbileboard.dto.AddPossibleTimeCommand.PossibleTimeRange; +import java.time.LocalDateTime; +import java.util.List; +import java.util.stream.Collectors; + +public record AddPossibleTimeRequest( + List possibleTimes +) { + + public AddPossibleTimeCommand toCommand(final Long requestMemberId) { + final List possibleTimeRanges = this.possibleTimes.stream() + .map(possibleTimeForm -> new PossibleTimeRange(possibleTimeForm.startTime, possibleTimeForm.endTime)) + .collect(Collectors.toList()); + return new AddPossibleTimeCommand(requestMemberId, possibleTimeRanges); + } + + record PossibleTimeForm( + LocalDateTime startTime, + LocalDateTime endTime + ) { + } +} From c871810a17625c3a7e4089cf1a199dd25423c7b8 Mon Sep 17 00:00:00 2001 From: huhdy32 Date: Sat, 23 Nov 2024 12:32:18 +0900 Subject: [PATCH 176/276] =?UTF-8?q?#29=20feat(PossibleBoardService):=20?= =?UTF-8?q?=ED=8A=B9=EC=A0=95=20=EA=B3=B5=EA=B3=A0=20=EC=A1=B0=ED=9A=8C=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 --- .../PossibleBoardRepository.java | 20 ++++++++- .../possbileboard/PossibleBoardService.java | 16 +++++++ .../api/possbileboard/PossibleMapper.java | 45 +++++++++++++++++++ .../controller/PossibleBoardController.java | 13 ++++++ .../dto/ExternalCareerResponse.java | 8 ++++ .../possbileboard/dto/FlavoredCategory.java | 7 +++ .../dto/InternalCareerResponse.java | 11 +++++ .../possbileboard/dto/PossibleDetails.java | 16 +++++++ .../dto/PossibleDetailsResponse.java | 20 +++++++++ .../dto/QueryPossibleDetailsCommand.java | 6 +++ 10 files changed, 161 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/example/api/possbileboard/dto/ExternalCareerResponse.java create mode 100644 src/main/java/com/example/api/possbileboard/dto/FlavoredCategory.java create mode 100644 src/main/java/com/example/api/possbileboard/dto/InternalCareerResponse.java create mode 100644 src/main/java/com/example/api/possbileboard/dto/PossibleDetails.java create mode 100644 src/main/java/com/example/api/possbileboard/dto/PossibleDetailsResponse.java create mode 100644 src/main/java/com/example/api/possbileboard/dto/QueryPossibleDetailsCommand.java diff --git a/src/main/java/com/example/api/possbileboard/PossibleBoardRepository.java b/src/main/java/com/example/api/possbileboard/PossibleBoardRepository.java index 63c00f23..e251e923 100644 --- a/src/main/java/com/example/api/possbileboard/PossibleBoardRepository.java +++ b/src/main/java/com/example/api/possbileboard/PossibleBoardRepository.java @@ -1,6 +1,10 @@ package com.example.api.possbileboard; +import com.example.api.domain.Category; +import com.example.api.domain.Contract; +import com.example.api.domain.ExternalCareer; import com.example.api.domain.PossibleBoard; +import com.example.api.possbileboard.dto.PossibleDetails; import java.time.LocalDateTime; import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; @@ -13,5 +17,19 @@ interface PossibleBoardRepository extends JpaRepository { @Modifying @Query("DELETE FROM PossibleBoard possible WHERE (possible.startTime <= :endDateTime AND possible.endTime >= :startDateTime)") - Long deleteDuplicatedWorkTimeIncluded(@Param("startDateTime") final LocalDateTime startDateTimeIncluded, @Param("endDateTime") final LocalDateTime endDateTimeIncluded); + Long deleteDuplicatedWorkTimeIncluded(@Param("startDateTime") final LocalDateTime startDateTimeIncluded, + @Param("endDateTime") final LocalDateTime endDateTimeIncluded); + + @Query("SELECT new com.example.api.possbileboard.dto.PossibleDetails(p.employee.name, p.employee.age, p.employee.email, p.employee.phoneNumber, p.updatedDate, p.startTime, p.endTime, COUNT (p), COALESCE(AVG(r.reviewStarPoint), 0)) FROM PossibleBoard p INNER JOIN Account a INNER JOIN Contract c INNER JOIN Review r WHERE p.possibleId = :possibleId GROUP BY p.employee.name, p.employee.age, p.employee.email, p.employee.phoneNumber, p.updatedDate, p.startTime, p.endTime") + PossibleDetails queryPossibleDetails(@Param("possibleId") final Long possibleId); + + @Query("SELECT f.category FROM Flavored f JOIN Account a JOIN PossibleBoard p WHERE p.possibleId = :possibleId") + List queryFlavoredCategories(@Param("possibleId") final Long possibleId); + + @Query("SELECT ex FROM ExternalCareer ex JOIN PossibleBoard p ON ex.employee.accountId = p.employee.accountId WHERE p.possibleId = :possibleId") + List queryExternalCareeors(@Param("possibleId") final Long possibleId); + + @Query("SELECT c FROM Contract c JOIN PossibleBoard p ON p.employee.accountId = c.offerEmployment.employee.accountId WHERE c.offerEmployment.employee.accountId = :possibleId AND c.contractSucceeded = TRUE ") + List queryInternalCareeors(@Param("possibleId") final Long possibleId); + } diff --git a/src/main/java/com/example/api/possbileboard/PossibleBoardService.java b/src/main/java/com/example/api/possbileboard/PossibleBoardService.java index 991b422c..1f2d3e67 100644 --- a/src/main/java/com/example/api/possbileboard/PossibleBoardService.java +++ b/src/main/java/com/example/api/possbileboard/PossibleBoardService.java @@ -2,8 +2,14 @@ import com.example.api.account.AccountService; import com.example.api.domain.Account; +import com.example.api.domain.Category; +import com.example.api.domain.Contract; +import com.example.api.domain.ExternalCareer; import com.example.api.domain.PossibleBoard; import com.example.api.possbileboard.dto.AddPossibleTimeCommand; +import com.example.api.possbileboard.dto.PossibleDetails; +import com.example.api.possbileboard.dto.PossibleDetailsResponse; +import com.example.api.possbileboard.dto.QueryPossibleDetailsCommand; import java.util.List; import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; @@ -27,6 +33,16 @@ public void addPossibleBoard(final AddPossibleTimeCommand addPossibleTimeCommand addNewPeriod(account, possibleTimes); } + @Transactional(readOnly = true) + public PossibleDetailsResponse queryPossibleDetails(final QueryPossibleDetailsCommand queryPossibleDetailsCommand) { + final PossibleDetails possibleDetails = possibleBoardRepository.queryPossibleDetails(queryPossibleDetailsCommand.possibleId()); + final List categories = possibleBoardRepository.queryFlavoredCategories(queryPossibleDetailsCommand.possibleId()); + final List externalCareers = possibleBoardRepository.queryExternalCareeors(queryPossibleDetailsCommand.possibleId()); + final List contracts = possibleBoardRepository.queryInternalCareeors(queryPossibleDetailsCommand.possibleId()); + + return possibleMapper.toPossibleDetailsResponse(possibleDetails, categories, externalCareers, contracts); + } + private void deleteDuplicatedPeriod(final List possibleTimes) { possibleTimes.stream() .forEach(possibleTime -> possibleBoardRepository.deleteDuplicatedWorkTimeIncluded(possibleTime.getStartTime(), possibleTime.getEndTime())); diff --git a/src/main/java/com/example/api/possbileboard/PossibleMapper.java b/src/main/java/com/example/api/possbileboard/PossibleMapper.java index 7681cdc1..16fb3969 100644 --- a/src/main/java/com/example/api/possbileboard/PossibleMapper.java +++ b/src/main/java/com/example/api/possbileboard/PossibleMapper.java @@ -1,7 +1,17 @@ package com.example.api.possbileboard; import com.example.api.domain.Account; +import com.example.api.domain.Category; +import com.example.api.domain.Contract; +import com.example.api.domain.ExternalCareer; import com.example.api.domain.PossibleBoard; +import com.example.api.possbileboard.dto.ExternalCareerResponse; +import com.example.api.possbileboard.dto.FlavoredCategory; +import com.example.api.possbileboard.dto.InternalCareerResponse; +import com.example.api.possbileboard.dto.PossibleDetails; +import com.example.api.possbileboard.dto.PossibleDetailsResponse; +import java.util.List; +import java.util.stream.Collectors; import org.springframework.stereotype.Service; @Service @@ -10,4 +20,39 @@ class PossibleMapper { PossibleBoard toBoard(final Account account, final PossibleTime possibleTime) { return new PossibleBoard(account, possibleTime.getStartTime(), possibleTime.getEndTime()); } + + PossibleDetailsResponse toPossibleDetailsResponse(final PossibleDetails possibleDetails, final List categories, final List externalCareers, final List internalCareeors) { + return new PossibleDetailsResponse( + possibleDetails.name(), + possibleDetails.age(), + possibleDetails.email(), + possibleDetails.phoneNumber(), + possibleDetails.recentlyUpdatedTime(), + possibleDetails.possibleStartTime(), + possibleDetails.possibleEndTime(), + categories.stream() + .map(this::toFlavoredCategory) + .toList(), + externalCareers.stream() + .map(this::toExternalCareerResponse) + .toList(), + internalCareeors.stream() + .map(this::toInternalCareerResponse) + .toList(), + possibleDetails.contractCount(), + possibleDetails.starPoint() + ); + } + + ExternalCareerResponse toExternalCareerResponse(final ExternalCareer externalCareer) { + return new ExternalCareerResponse(externalCareer.getId(), externalCareer.getName(), externalCareer.getPeriod()); + } + + FlavoredCategory toFlavoredCategory(final Category category) { + return new FlavoredCategory(category.getCategoryId(), category.getCategoryName()); + } + + InternalCareerResponse toInternalCareerResponse(final Contract contract) { + return new InternalCareerResponse(contract.getContractId(), contract.getContractHourlyPay(), contract.getContractStartTime(), contract.getContractEndTime()); + } } diff --git a/src/main/java/com/example/api/possbileboard/controller/PossibleBoardController.java b/src/main/java/com/example/api/possbileboard/controller/PossibleBoardController.java index 428244e6..4f8af6a0 100644 --- a/src/main/java/com/example/api/possbileboard/controller/PossibleBoardController.java +++ b/src/main/java/com/example/api/possbileboard/controller/PossibleBoardController.java @@ -3,8 +3,12 @@ import com.example.api.possbileboard.PossibleBoardService; import com.example.api.possbileboard.dto.AddPossibleTimeCommand; import com.example.api.possbileboard.dto.AddPossibleTimeRequest; +import com.example.api.possbileboard.dto.PossibleDetailsResponse; +import com.example.api.possbileboard.dto.QueryPossibleDetailsCommand; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; +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.RequestBody; import org.springframework.web.bind.annotation.RestController; @@ -23,4 +27,13 @@ public ResponseEntity addPossibleTimes( possibleBoardService.addPossibleBoard(addPossibleTimeCommand); return ResponseEntity.ok().build(); } + + @GetMapping("/api/v1/possible-board/{possibleId}") + public ResponseEntity queryPossibleBoardTimes( + @PathVariable(required = true) final Long possibleId + ) { + final QueryPossibleDetailsCommand command = new QueryPossibleDetailsCommand(possibleId); + final PossibleDetailsResponse response = possibleBoardService.queryPossibleDetails(command); + return ResponseEntity.ok(response); + } } diff --git a/src/main/java/com/example/api/possbileboard/dto/ExternalCareerResponse.java b/src/main/java/com/example/api/possbileboard/dto/ExternalCareerResponse.java new file mode 100644 index 00000000..2420d1de --- /dev/null +++ b/src/main/java/com/example/api/possbileboard/dto/ExternalCareerResponse.java @@ -0,0 +1,8 @@ +package com.example.api.possbileboard.dto; + +public record ExternalCareerResponse( + Long externalCareerId, + String careerName, + String period +) { +} diff --git a/src/main/java/com/example/api/possbileboard/dto/FlavoredCategory.java b/src/main/java/com/example/api/possbileboard/dto/FlavoredCategory.java new file mode 100644 index 00000000..29d51cce --- /dev/null +++ b/src/main/java/com/example/api/possbileboard/dto/FlavoredCategory.java @@ -0,0 +1,7 @@ +package com.example.api.possbileboard.dto; + +public record FlavoredCategory( + Long categoryId, + String categoryName +) { +} diff --git a/src/main/java/com/example/api/possbileboard/dto/InternalCareerResponse.java b/src/main/java/com/example/api/possbileboard/dto/InternalCareerResponse.java new file mode 100644 index 00000000..42e97c44 --- /dev/null +++ b/src/main/java/com/example/api/possbileboard/dto/InternalCareerResponse.java @@ -0,0 +1,11 @@ +package com.example.api.possbileboard.dto; + +import java.time.LocalDateTime; + +public record InternalCareerResponse( + Long contractId, + Integer hourlyPayment, + LocalDateTime startTime, + LocalDateTime endTime +) { +} diff --git a/src/main/java/com/example/api/possbileboard/dto/PossibleDetails.java b/src/main/java/com/example/api/possbileboard/dto/PossibleDetails.java new file mode 100644 index 00000000..4f878549 --- /dev/null +++ b/src/main/java/com/example/api/possbileboard/dto/PossibleDetails.java @@ -0,0 +1,16 @@ +package com.example.api.possbileboard.dto; + +import java.time.LocalDateTime; + +public record PossibleDetails( + String name, + Integer age, + String email, + String phoneNumber, + LocalDateTime recentlyUpdatedTime, + LocalDateTime possibleStartTime, + LocalDateTime possibleEndTime, + Long contractCount, + Integer starPoint +) { +} diff --git a/src/main/java/com/example/api/possbileboard/dto/PossibleDetailsResponse.java b/src/main/java/com/example/api/possbileboard/dto/PossibleDetailsResponse.java new file mode 100644 index 00000000..a909c226 --- /dev/null +++ b/src/main/java/com/example/api/possbileboard/dto/PossibleDetailsResponse.java @@ -0,0 +1,20 @@ +package com.example.api.possbileboard.dto; + +import java.time.LocalDateTime; +import java.util.List; + +public record PossibleDetailsResponse( + String name, + Integer age, + String email, + String phoneNumber, + LocalDateTime recentlyUpdatedTime, + LocalDateTime possibleStartTime, + LocalDateTime possibleEndTime, + List flavoredCategories, + List externalExperience, + List internalExperience, + Long contractCount, + Integer starPoint +) { +} diff --git a/src/main/java/com/example/api/possbileboard/dto/QueryPossibleDetailsCommand.java b/src/main/java/com/example/api/possbileboard/dto/QueryPossibleDetailsCommand.java new file mode 100644 index 00000000..4c78050a --- /dev/null +++ b/src/main/java/com/example/api/possbileboard/dto/QueryPossibleDetailsCommand.java @@ -0,0 +1,6 @@ +package com.example.api.possbileboard.dto; + +public record QueryPossibleDetailsCommand( + Long possibleId +) { +} From 83246627876a2f592af1b5269645f91168fa1dd1 Mon Sep 17 00:00:00 2001 From: huhdy32 Date: Thu, 2 Jan 2025 12:15:29 +0900 Subject: [PATCH 177/276] =?UTF-8?q?fix:=20=EC=A4=91=EB=B3=B5=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 4 ++ .../api/auth/entitiy/QRefreshToken.java | 57 +++++++++++++++++++ .../com/example/api/domain/QAccount.java | 5 +- .../api/account/AccountRepository.java | 9 --- .../example/api/account/AccountService.java | 17 ------ .../api/account/service/AccountService.java | 14 +++-- .../api/board/service/BoardService.java | 6 +- .../api/board/service/EmployeeService.java | 2 +- .../repository/PossibleBoardRepository.java | 19 ------- .../PossibleBoardRepository.java | 9 ++- .../possbileboard/PossibleBoardService.java | 2 +- .../api/possbileboard/PossibleMapper.java | 2 +- .../possbileboard/dto/PossibleDetails.java | 2 +- src/main/resources/application.properties | 10 ++-- .../api/global/BaseIntegrationTest.java | 29 +++++++--- 15 files changed, 120 insertions(+), 67 deletions(-) create mode 100644 src/main/generated/com/example/api/auth/entitiy/QRefreshToken.java delete mode 100644 src/main/java/com/example/api/account/AccountRepository.java delete mode 100644 src/main/java/com/example/api/account/AccountService.java delete mode 100644 src/main/java/com/example/api/domain/repository/PossibleBoardRepository.java diff --git a/build.gradle b/build.gradle index ff193cdc..e7d51b42 100644 --- a/build.gradle +++ b/build.gradle @@ -61,6 +61,10 @@ dependencies { annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta" annotationProcessor "jakarta.annotation:jakarta.annotation-api" annotationProcessor "jakarta.persistence:jakarta.persistence-api" + + // 인메모리 몽고디비 flapdoodle + testImplementation 'de.flapdoodle.embed:de.flapdoodle.embed.mongo:4.6.0' + } tasks.named('test') { diff --git a/src/main/generated/com/example/api/auth/entitiy/QRefreshToken.java b/src/main/generated/com/example/api/auth/entitiy/QRefreshToken.java new file mode 100644 index 00000000..ae3f4b01 --- /dev/null +++ b/src/main/generated/com/example/api/auth/entitiy/QRefreshToken.java @@ -0,0 +1,57 @@ +package com.example.api.auth.entitiy; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QRefreshToken is a Querydsl query type for RefreshToken + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QRefreshToken extends EntityPathBase { + + private static final long serialVersionUID = -1655386265L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QRefreshToken refreshToken1 = new QRefreshToken("refreshToken1"); + + public final NumberPath id = createNumber("id", Long.class); + + public final BooleanPath isExpired = createBoolean("isExpired"); + + public final DateTimePath recentLogin = createDateTime("recentLogin", java.time.LocalDateTime.class); + + public final StringPath refreshToken = createString("refreshToken"); + + public final com.example.api.domain.QAccount user; + + public QRefreshToken(String variable) { + this(RefreshToken.class, forVariable(variable), INITS); + } + + public QRefreshToken(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QRefreshToken(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QRefreshToken(PathMetadata metadata, PathInits inits) { + this(RefreshToken.class, metadata, inits); + } + + public QRefreshToken(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.user = inits.isInitialized("user") ? new com.example.api.domain.QAccount(forProperty("user")) : null; + } + +} + diff --git a/src/main/generated/com/example/api/domain/QAccount.java b/src/main/generated/com/example/api/domain/QAccount.java index e9e925a8..da010cca 100644 --- a/src/main/generated/com/example/api/domain/QAccount.java +++ b/src/main/generated/com/example/api/domain/QAccount.java @@ -7,6 +7,7 @@ import com.querydsl.core.types.PathMetadata; import javax.annotation.processing.Generated; import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; /** @@ -36,6 +37,8 @@ public class QAccount extends EntityPathBase { public final StringPath name = createString("name"); + public final EnumPath nationality = createEnum("nationality", com.example.api.account.entity.Nationality.class); + public final StringPath nickname = createString("nickname"); public final BooleanPath openStatus = createBoolean("openStatus"); @@ -46,7 +49,7 @@ public class QAccount extends EntityPathBase { public final StringPath profileImage = createString("profileImage"); - public final DateTimePath registeredDatetime = createDateTime("registeredDatetime", java.util.Date.class); + public final CollectionPath> roles = this.>createCollection("roles", com.example.api.account.entity.UserRole.class, EnumPath.class, PathInits.DIRECT2); public final StringPath sex = createString("sex"); diff --git a/src/main/java/com/example/api/account/AccountRepository.java b/src/main/java/com/example/api/account/AccountRepository.java deleted file mode 100644 index a3588098..00000000 --- a/src/main/java/com/example/api/account/AccountRepository.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.example.api.account; - -import com.example.api.domain.Account; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository -interface AccountRepository extends JpaRepository { -} diff --git a/src/main/java/com/example/api/account/AccountService.java b/src/main/java/com/example/api/account/AccountService.java deleted file mode 100644 index e7a17364..00000000 --- a/src/main/java/com/example/api/account/AccountService.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.example.api.account; - -import com.example.api.domain.Account; -import com.example.api.exception.BusinessException; -import com.example.api.exception.ErrorCode; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; - -@Service -@RequiredArgsConstructor -public class AccountService { - private final AccountRepository accountRepository; - public Account loadAccount(final Long requestMemberId) { - return accountRepository.findById(requestMemberId) - .orElseThrow(() -> new BusinessException(ErrorCode.ACCOUNT_NOT_FOUND_EXCEPTION)); - } -} diff --git a/src/main/java/com/example/api/account/service/AccountService.java b/src/main/java/com/example/api/account/service/AccountService.java index ef40b3f1..f0ea86f7 100644 --- a/src/main/java/com/example/api/account/service/AccountService.java +++ b/src/main/java/com/example/api/account/service/AccountService.java @@ -25,7 +25,7 @@ @Service @RequiredArgsConstructor public class AccountService { - private final AccountRepository authRepository; + private final AccountRepository accountRepository; private final CodeRepository codeRepository; private final PasswordEncoder passwordEncoder; private final MailSender mailSender; @@ -69,6 +69,12 @@ public String signUp(@Validated final SignUpRequest request) { return "회원가입이 완료되었습니다"; } + @org.springframework.transaction.annotation.Transactional(readOnly = true) + public Account loadAccount(final Long requestMemberId) { + return accountRepository.findById(requestMemberId) + .orElseThrow(() -> new BusinessException(ErrorCode.ACCOUNT_NOT_FOUND_EXCEPTION)); + } + private void saveAccount(final SignUpRequest request) { Collection roles = List.of(request.role()); Account account = new Account( @@ -82,17 +88,17 @@ private void saveAccount(final SignUpRequest request) { roles ); - authRepository.save(account); + accountRepository.save(account); } private void validateDuplicateLoginId(final LoginIdRequest loginIdRequest) { - if (authRepository.existsByLoginId(loginIdRequest.loginId())) { + if (accountRepository.existsByLoginId(loginIdRequest.loginId())) { throw new BusinessException(ErrorCode.DUPLICATE_LOGIN_ID); } } private void validateDuplicateEmail(final EmailRequest emailRequest) { - if (authRepository.existsByEmail(emailRequest.email())) { + if (accountRepository.existsByEmail(emailRequest.email())) { throw new BusinessException(ErrorCode.DUPLICATE_EMAIL); } } diff --git a/src/main/java/com/example/api/board/service/BoardService.java b/src/main/java/com/example/api/board/service/BoardService.java index 753bd6ad..87f82ae1 100644 --- a/src/main/java/com/example/api/board/service/BoardService.java +++ b/src/main/java/com/example/api/board/service/BoardService.java @@ -3,7 +3,11 @@ import com.example.api.board.controller.domain.request.EmployeeIdRequest; import com.example.api.board.controller.domain.response.MyInfoDTO; -import com.example.api.domain.repository.*; +import com.example.api.domain.repository.ExternalCareerRepository; +import com.example.api.domain.repository.FlavoredRepository; +import com.example.api.domain.repository.MyInfoRepository; +import com.example.api.domain.repository.OfferEmploymentRepository; +import com.example.api.possbileboard.PossibleBoardRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/src/main/java/com/example/api/board/service/EmployeeService.java b/src/main/java/com/example/api/board/service/EmployeeService.java index 47d33b19..a8d7e01d 100644 --- a/src/main/java/com/example/api/board/service/EmployeeService.java +++ b/src/main/java/com/example/api/board/service/EmployeeService.java @@ -13,7 +13,7 @@ import com.example.api.domain.repository.EmployeeRepository; import com.example.api.domain.repository.ExternalCareerRepository; import com.example.api.domain.repository.FlavoredRepository; -import com.example.api.domain.repository.PossibleBoardRepository; +import com.example.api.possbileboard.PossibleBoardRepository; import java.util.HashSet; import java.util.List; import java.util.Set; diff --git a/src/main/java/com/example/api/domain/repository/PossibleBoardRepository.java b/src/main/java/com/example/api/domain/repository/PossibleBoardRepository.java deleted file mode 100644 index d06eb24f..00000000 --- a/src/main/java/com/example/api/domain/repository/PossibleBoardRepository.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.example.api.domain.repository; - -import com.example.api.board.controller.domain.response.PossibleBoardDTO; -import com.example.api.domain.PossibleBoard; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; -import org.springframework.stereotype.Repository; - -import java.util.List; - -@Repository -public interface PossibleBoardRepository extends JpaRepository { - List findAllByEmployeeAccountId(Long employeeId); - - @Query("select new com.example.api.board.controller.domain.response.PossibleBoardDTO(p.possibleId, p.startTime, p.endTime) " + - "from PossibleBoard p where p.employee.accountId = :employeeId") - List findAllDTOByEmployeeAccountId(@Param("employeeId")Long employeeId); -} diff --git a/src/main/java/com/example/api/possbileboard/PossibleBoardRepository.java b/src/main/java/com/example/api/possbileboard/PossibleBoardRepository.java index e251e923..e4c6c758 100644 --- a/src/main/java/com/example/api/possbileboard/PossibleBoardRepository.java +++ b/src/main/java/com/example/api/possbileboard/PossibleBoardRepository.java @@ -1,5 +1,6 @@ package com.example.api.possbileboard; +import com.example.api.board.controller.domain.response.PossibleBoardDTO; import com.example.api.domain.Category; import com.example.api.domain.Contract; import com.example.api.domain.ExternalCareer; @@ -14,7 +15,7 @@ import org.springframework.stereotype.Repository; @Repository -interface PossibleBoardRepository extends JpaRepository { +public interface PossibleBoardRepository extends JpaRepository { @Modifying @Query("DELETE FROM PossibleBoard possible WHERE (possible.startTime <= :endDateTime AND possible.endTime >= :startDateTime)") Long deleteDuplicatedWorkTimeIncluded(@Param("startDateTime") final LocalDateTime startDateTimeIncluded, @@ -32,4 +33,10 @@ Long deleteDuplicatedWorkTimeIncluded(@Param("startDateTime") final LocalDateTim @Query("SELECT c FROM Contract c JOIN PossibleBoard p ON p.employee.accountId = c.offerEmployment.employee.accountId WHERE c.offerEmployment.employee.accountId = :possibleId AND c.contractSucceeded = TRUE ") List queryInternalCareeors(@Param("possibleId") final Long possibleId); + List findAllByEmployeeAccountId(Long employeeId); + + @Query("select new com.example.api.board.controller.domain.response.PossibleBoardDTO(p.possibleId, p.startTime, p.endTime) " + + "from PossibleBoard p where p.employee.accountId = :employeeId") + List findAllDTOByEmployeeAccountId(@Param("employeeId")Long employeeId); + } diff --git a/src/main/java/com/example/api/possbileboard/PossibleBoardService.java b/src/main/java/com/example/api/possbileboard/PossibleBoardService.java index 1f2d3e67..4ad25752 100644 --- a/src/main/java/com/example/api/possbileboard/PossibleBoardService.java +++ b/src/main/java/com/example/api/possbileboard/PossibleBoardService.java @@ -1,6 +1,6 @@ package com.example.api.possbileboard; -import com.example.api.account.AccountService; +import com.example.api.account.service.AccountService; import com.example.api.domain.Account; import com.example.api.domain.Category; import com.example.api.domain.Contract; diff --git a/src/main/java/com/example/api/possbileboard/PossibleMapper.java b/src/main/java/com/example/api/possbileboard/PossibleMapper.java index 16fb3969..d3334b66 100644 --- a/src/main/java/com/example/api/possbileboard/PossibleMapper.java +++ b/src/main/java/com/example/api/possbileboard/PossibleMapper.java @@ -40,7 +40,7 @@ PossibleDetailsResponse toPossibleDetailsResponse(final PossibleDetails possible .map(this::toInternalCareerResponse) .toList(), possibleDetails.contractCount(), - possibleDetails.starPoint() + possibleDetails.starPoint().intValue() ); } diff --git a/src/main/java/com/example/api/possbileboard/dto/PossibleDetails.java b/src/main/java/com/example/api/possbileboard/dto/PossibleDetails.java index 4f878549..ccb3799f 100644 --- a/src/main/java/com/example/api/possbileboard/dto/PossibleDetails.java +++ b/src/main/java/com/example/api/possbileboard/dto/PossibleDetails.java @@ -11,6 +11,6 @@ public record PossibleDetails( LocalDateTime possibleStartTime, LocalDateTime possibleEndTime, Long contractCount, - Integer starPoint + Double starPoint ) { } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index f467b9fa..74d0dcc2 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -23,11 +23,13 @@ logging.level.org.hibernate.SQL=DEBUG logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE # 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=danpatime -spring.data.mongodb.auto-index-creation=true +#spring.data.mongodb.port=27017 +#spring.data.mongodb.authentication-database=admin +#spring.data.mongodb.database=testdb +#spring.data.mongodb.auto-index-creation=true # SMTP spring.mail.host=smtp.gmail.com diff --git a/src/test/java/com/example/api/global/BaseIntegrationTest.java b/src/test/java/com/example/api/global/BaseIntegrationTest.java index b7a9e2ee..448eeab4 100644 --- a/src/test/java/com/example/api/global/BaseIntegrationTest.java +++ b/src/test/java/com/example/api/global/BaseIntegrationTest.java @@ -6,19 +6,34 @@ import com.example.api.board.controller.domain.response.PossibleBoardDTO; import com.example.api.business.BusinessRepository; import com.example.api.contracts.ContractRepository; -import com.example.api.domain.*; -import com.example.api.domain.repository.*; +import com.example.api.domain.Account; +import com.example.api.domain.Business; +import com.example.api.domain.BusinessCategory; +import com.example.api.domain.Category; +import com.example.api.domain.Contract; +import com.example.api.domain.ExternalCareer; +import com.example.api.domain.OfferEmployment; +import com.example.api.domain.PossibleBoard; +import com.example.api.domain.Review; +import com.example.api.domain.repository.CategoryRepository; +import com.example.api.domain.repository.EmployeeRepository; +import com.example.api.domain.repository.EmployerRepository; +import com.example.api.domain.repository.ExternalCareerRepository; +import com.example.api.domain.repository.FlavoredRepository; +import com.example.api.domain.repository.MyInfoRepository; +import com.example.api.domain.repository.OfferEmploymentRepository; +import com.example.api.domain.repository.ReviewRepository; +import com.example.api.possbileboard.PossibleBoardRepository; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; import org.junit.jupiter.api.BeforeEach; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.annotation.Rollback; import org.springframework.test.context.ActiveProfiles; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; - @SpringBootTest @ActiveProfiles("test") @Rollback(false) From 314d8e211cd7daf00dc4dad3b7f3fda4b248eee5 Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Sat, 28 Dec 2024 12:32:12 +0900 Subject: [PATCH 178/276] =?UTF-8?q?#50=20(dto)=20=EC=B9=B4=EC=B9=B4?= =?UTF-8?q?=EC=98=A4,=20=EB=84=A4=EC=9D=B4=EB=B2=84=20=EC=9D=91=EB=8B=B5?= =?UTF-8?q?=20=EB=B0=8F=20oauth2=20=EC=9C=A0=EC=A0=80=20=EC=A0=95=EB=B3=B4?= =?UTF-8?q?=20dto=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../global/properties/Oauth2Properties.java | 4 + .../example/api/oauth2/dto/KakaoResponse.java | 28 +++++ .../example/api/oauth2/dto/NaverResponse.java | 26 +++++ .../api/oauth2/dto/OAuth2Response.java | 8 ++ .../api/oauth2/dto/Oauth2SignUpRequest.java | 7 ++ .../api/oauth2/dto/Oauth2UserInfoRequest.java | 8 ++ .../api/oauth2/entity/CookieUtils.java | 4 + ...eOAuth2AuthorizationRequestRepository.java | 4 + .../entity/handler/KakaoResponseHandler.java | 22 ++++ .../entity/handler/NaverResponseHandler.java | 23 ++++ .../OAuth2AuthenticationFailureHandler.java | 36 +++++++ .../OAuth2AuthenticationSuccessHandler.java | 102 ++++++++++++++++++ .../entity/handler/OAuth2ResponseHandler.java | 10 ++ .../service/CustomOauth2UserService.java | 62 +++++++++++ 14 files changed, 344 insertions(+) create mode 100644 src/main/java/com/example/api/global/properties/Oauth2Properties.java create mode 100644 src/main/java/com/example/api/oauth2/dto/KakaoResponse.java create mode 100644 src/main/java/com/example/api/oauth2/dto/NaverResponse.java create mode 100644 src/main/java/com/example/api/oauth2/dto/OAuth2Response.java create mode 100644 src/main/java/com/example/api/oauth2/dto/Oauth2SignUpRequest.java create mode 100644 src/main/java/com/example/api/oauth2/dto/Oauth2UserInfoRequest.java create mode 100644 src/main/java/com/example/api/oauth2/entity/CookieUtils.java create mode 100644 src/main/java/com/example/api/oauth2/entity/HttpCookieOAuth2AuthorizationRequestRepository.java create mode 100644 src/main/java/com/example/api/oauth2/entity/handler/KakaoResponseHandler.java create mode 100644 src/main/java/com/example/api/oauth2/entity/handler/NaverResponseHandler.java create mode 100644 src/main/java/com/example/api/oauth2/entity/handler/OAuth2AuthenticationFailureHandler.java create mode 100644 src/main/java/com/example/api/oauth2/entity/handler/OAuth2AuthenticationSuccessHandler.java create mode 100644 src/main/java/com/example/api/oauth2/entity/handler/OAuth2ResponseHandler.java create mode 100644 src/main/java/com/example/api/oauth2/service/CustomOauth2UserService.java diff --git a/src/main/java/com/example/api/global/properties/Oauth2Properties.java b/src/main/java/com/example/api/global/properties/Oauth2Properties.java new file mode 100644 index 00000000..ba216f6e --- /dev/null +++ b/src/main/java/com/example/api/global/properties/Oauth2Properties.java @@ -0,0 +1,4 @@ +package com.example.api.global.properties; + +public class Oauth2Properties { +} diff --git a/src/main/java/com/example/api/oauth2/dto/KakaoResponse.java b/src/main/java/com/example/api/oauth2/dto/KakaoResponse.java new file mode 100644 index 00000000..c9f572e1 --- /dev/null +++ b/src/main/java/com/example/api/oauth2/dto/KakaoResponse.java @@ -0,0 +1,28 @@ +package com.example.api.oauth2.dto; + +import java.util.Map; + +public record KakaoResponse(Map attributes) implements OAuth2Response { + + @Override + public String getProvider() { + return "kakao"; + } + + @Override + public String getProviderId() { + return attributes.get("id").toString(); + } + + @Override + public String getEmail() { + Map kakaoAccount = (Map) attributes.get("kakao_account"); + return kakaoAccount != null ? kakaoAccount.get("email").toString() : null; + } + + @Override + public String getName() { + Map kakaoAccount = (Map) attributes.get("properties"); + return kakaoAccount != null ? kakaoAccount.get("nickname").toString() : null; + } +} diff --git a/src/main/java/com/example/api/oauth2/dto/NaverResponse.java b/src/main/java/com/example/api/oauth2/dto/NaverResponse.java new file mode 100644 index 00000000..c2b7892f --- /dev/null +++ b/src/main/java/com/example/api/oauth2/dto/NaverResponse.java @@ -0,0 +1,26 @@ +package com.example.api.oauth2.dto; + +import java.util.Map; + +public record NaverResponse(Map attributes) implements OAuth2Response { + + @Override + public String getProvider() { + return "naver"; + } + + @Override + public String getProviderId() { + return attributes.get("id").toString(); + } + + @Override + public String getEmail() { + return attributes.get("email").toString(); + } + + @Override + public String getName() { + return attributes.get("name").toString(); + } +} diff --git a/src/main/java/com/example/api/oauth2/dto/OAuth2Response.java b/src/main/java/com/example/api/oauth2/dto/OAuth2Response.java new file mode 100644 index 00000000..664f5412 --- /dev/null +++ b/src/main/java/com/example/api/oauth2/dto/OAuth2Response.java @@ -0,0 +1,8 @@ +package com.example.api.oauth2.dto; + +public interface OAuth2Response { + String getProvider(); + String getProviderId(); + String getEmail(); + String getName(); +} \ No newline at end of file diff --git a/src/main/java/com/example/api/oauth2/dto/Oauth2SignUpRequest.java b/src/main/java/com/example/api/oauth2/dto/Oauth2SignUpRequest.java new file mode 100644 index 00000000..6a44ea14 --- /dev/null +++ b/src/main/java/com/example/api/oauth2/dto/Oauth2SignUpRequest.java @@ -0,0 +1,7 @@ +package com.example.api.oauth2.dto; + +import com.example.api.global.config.resolver.ValidEmail; +import jakarta.validation.constraints.NotBlank; + +public record Oauth2SignUpRequest(@NotBlank String name, @ValidEmail String email) { +} diff --git a/src/main/java/com/example/api/oauth2/dto/Oauth2UserInfoRequest.java b/src/main/java/com/example/api/oauth2/dto/Oauth2UserInfoRequest.java new file mode 100644 index 00000000..c52a277a --- /dev/null +++ b/src/main/java/com/example/api/oauth2/dto/Oauth2UserInfoRequest.java @@ -0,0 +1,8 @@ +package com.example.api.oauth2.dto; + +import com.example.api.account.entity.UserRole; +import com.example.api.global.config.resolver.ValidEmail; +import jakarta.validation.constraints.NotBlank; + +public record Oauth2UserInfoRequest(@NotBlank String name, @ValidEmail String email, @NotBlank UserRole role) { +} diff --git a/src/main/java/com/example/api/oauth2/entity/CookieUtils.java b/src/main/java/com/example/api/oauth2/entity/CookieUtils.java new file mode 100644 index 00000000..9225f0d6 --- /dev/null +++ b/src/main/java/com/example/api/oauth2/entity/CookieUtils.java @@ -0,0 +1,4 @@ +package com.example.api.oauth2.entity; + +public class CookieUtils { +} diff --git a/src/main/java/com/example/api/oauth2/entity/HttpCookieOAuth2AuthorizationRequestRepository.java b/src/main/java/com/example/api/oauth2/entity/HttpCookieOAuth2AuthorizationRequestRepository.java new file mode 100644 index 00000000..d4fdbc8e --- /dev/null +++ b/src/main/java/com/example/api/oauth2/entity/HttpCookieOAuth2AuthorizationRequestRepository.java @@ -0,0 +1,4 @@ +package com.example.api.oauth2.entity; + +public class HttpCookieOAuth2AuthorizationRequestRepository { +} diff --git a/src/main/java/com/example/api/oauth2/entity/handler/KakaoResponseHandler.java b/src/main/java/com/example/api/oauth2/entity/handler/KakaoResponseHandler.java new file mode 100644 index 00000000..7ab11d57 --- /dev/null +++ b/src/main/java/com/example/api/oauth2/entity/handler/KakaoResponseHandler.java @@ -0,0 +1,22 @@ +package com.example.api.oauth2.entity; + +import com.example.api.oauth2.dto.KakaoResponse; +import com.example.api.oauth2.dto.OAuth2Response; +import org.springframework.stereotype.Component; + +import java.util.Map; + +@Component +public class KakaoResponseHandler implements OAuth2ResponseHandler { + + @Override + public boolean supports(String registrationId) { + return "kakao".equalsIgnoreCase(registrationId); + } + + @Override + public OAuth2Response createResponse( Map attributes) { + return new KakaoResponse(attributes); + } +} + diff --git a/src/main/java/com/example/api/oauth2/entity/handler/NaverResponseHandler.java b/src/main/java/com/example/api/oauth2/entity/handler/NaverResponseHandler.java new file mode 100644 index 00000000..958e5c80 --- /dev/null +++ b/src/main/java/com/example/api/oauth2/entity/handler/NaverResponseHandler.java @@ -0,0 +1,23 @@ +package com.example.api.oauth2.entity; + +import com.example.api.oauth2.dto.KakaoResponse; +import com.example.api.oauth2.dto.NaverResponse; +import com.example.api.oauth2.dto.OAuth2Response; +import org.springframework.stereotype.Component; + +import java.util.Map; + +@Component +public class NaverResponseHandler implements OAuth2ResponseHandler { + + @Override + public boolean supports(String registrationId) { + return "naver".equalsIgnoreCase(registrationId); + } + + @Override + public OAuth2Response createResponse(Map attributes) { + return new NaverResponse((Map) attributes.get("response")); + } +} + diff --git a/src/main/java/com/example/api/oauth2/entity/handler/OAuth2AuthenticationFailureHandler.java b/src/main/java/com/example/api/oauth2/entity/handler/OAuth2AuthenticationFailureHandler.java new file mode 100644 index 00000000..3973dbd4 --- /dev/null +++ b/src/main/java/com/example/api/oauth2/entity/handler/OAuth2AuthenticationFailureHandler.java @@ -0,0 +1,36 @@ +package com.example.api.oauth2.entity; + +import jakarta.servlet.ServletException; +import jakarta.servlet.http.Cookie; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler; +import org.springframework.stereotype.Component; +import org.springframework.web.util.UriComponentsBuilder; + +import java.io.IOException; + +import static com.example.api.oauth2.entity.HttpCookieOAuth2AuthorizationRequestRepository.REDIRECT_URI_PARAM_COOKIE_NAME; + +@Component +@RequiredArgsConstructor +public class OAuth2AuthenticationFailureHandler extends SimpleUrlAuthenticationFailureHandler { + private final HttpCookieOAuth2AuthorizationRequestRepository httpCookieOAuth2AuthorizationRequestRepository; + + @Override + public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException { + String targetUrl = CookieUtils.getCookie(request, REDIRECT_URI_PARAM_COOKIE_NAME) + .map(Cookie::getValue) + .orElse(("/")); + + targetUrl = UriComponentsBuilder.fromUriString(targetUrl) + .queryParam("error", exception.getLocalizedMessage()) + .build().toUriString(); + + httpCookieOAuth2AuthorizationRequestRepository.removeAuthorizationRequestCookies(request, response); + + getRedirectStrategy().sendRedirect(request, response, targetUrl); + } +} \ No newline at end of file diff --git a/src/main/java/com/example/api/oauth2/entity/handler/OAuth2AuthenticationSuccessHandler.java b/src/main/java/com/example/api/oauth2/entity/handler/OAuth2AuthenticationSuccessHandler.java new file mode 100644 index 00000000..f377ad3d --- /dev/null +++ b/src/main/java/com/example/api/oauth2/entity/handler/OAuth2AuthenticationSuccessHandler.java @@ -0,0 +1,102 @@ +package com.example.api.oauth2.entity; + +import com.example.api.account.entity.UserRole; +import com.example.api.account.repository.AccountRepository; +import com.example.api.auth.dto.AuthTokenRequest; +import com.example.api.auth.dto.UserDetailRequest; +import com.example.api.auth.entitiy.RefreshToken; +import com.example.api.auth.repository.TokenRepository; +import com.example.api.auth.service.JwtTokenProvider; +import com.example.api.domain.Account; +import com.example.api.exception.BusinessException; +import com.example.api.exception.ErrorCode; +import com.example.api.global.properties.Oauth2Properties; +import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.Cookie; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.security.core.Authentication; +import org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler; +import org.springframework.stereotype.Component; + +import java.io.IOException; +import java.net.URI; +import java.util.Collection; +import java.util.List; +import java.util.Optional; + +import static com.example.api.oauth2.entity.HttpCookieOAuth2AuthorizationRequestRepository.REDIRECT_URI_PARAM_COOKIE_NAME; + +@Component +@RequiredArgsConstructor +public class OAuth2AuthenticationSuccessHandler extends SimpleUrlAuthenticationSuccessHandler { + private final JwtTokenProvider tokenProvider; + private final HttpCookieOAuth2AuthorizationRequestRepository httpCookieOAuth2AuthorizationRequestRepository; + private final AccountRepository accountRepository; + private final TokenRepository tokenRepository; + + @Value("app.oauth2. authorized-redirect-uris") + List authorizedRedirectUris; + + @Override + public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { + String targetUrl = determineTargetUrl(request, response, authentication); + + if (response.isCommitted()) { + logger.debug("Response has already been committed. Unable to redirect to " + targetUrl); + return; + } + + UserDetailRequest userDetailRequest = new UserDetailRequest((Long) authentication.getPrincipal(), (Collection) authentication.getAuthorities()); + Account user = accountRepository.findById((Long) authentication.getPrincipal()).orElse(null); + RefreshToken token = new RefreshToken(user); + String accessToken = tokenProvider.generateAccessToken(userDetailRequest); + String refreshToken = tokenProvider.generateRefreshToken(userDetailRequest, token.getId() ); + token.putRefreshToken(refreshToken); + tokenRepository.save(token); + + clearAuthenticationAttributes(request, response); + + response.setHeader("Authorization", "Bearer " + accessToken); + + Cookie refreshTokenCookie = new Cookie("refreshToken", refreshToken); + refreshTokenCookie.setHttpOnly(true); + refreshTokenCookie.setPath("/"); + // secure 옵션 추가 필요 + response.addCookie(refreshTokenCookie); + + getRedirectStrategy().sendRedirect(request, response, targetUrl); + } + + protected String determineTargetUrl(HttpServletRequest request, HttpServletResponse response, Authentication authentication) { + Optional redirectUri = CookieUtils.getCookie(request, REDIRECT_URI_PARAM_COOKIE_NAME) + .map(Cookie::getValue); + + if(redirectUri.isPresent() && !isAuthorizedRedirectUri(redirectUri.get())) { + throw new BusinessException(ErrorCode.INVALID_REDIRECT_URI); + } + return redirectUri.orElse(getDefaultTargetUrl()); + } + + private boolean isAuthorizedRedirectUri(String uri) { + URI clientRedirectUri = URI.create(uri); + + return authorizedRedirectUris + .stream() + .anyMatch(authorizedRedirectUri -> { + URI authorizedURI = URI.create(authorizedRedirectUri); + if(clientRedirectUri.equals(authorizedURI) || authorizedRedirectUri.equals("*")) { + return true; + } + return false; + }); + } + + protected void clearAuthenticationAttributes(HttpServletRequest request, HttpServletResponse response) { + super.clearAuthenticationAttributes(request); + httpCookieOAuth2AuthorizationRequestRepository.removeAuthorizationRequestCookies(request, response); + } +} diff --git a/src/main/java/com/example/api/oauth2/entity/handler/OAuth2ResponseHandler.java b/src/main/java/com/example/api/oauth2/entity/handler/OAuth2ResponseHandler.java new file mode 100644 index 00000000..22ad2aa0 --- /dev/null +++ b/src/main/java/com/example/api/oauth2/entity/handler/OAuth2ResponseHandler.java @@ -0,0 +1,10 @@ +package com.example.api.oauth2.entity; + +import com.example.api.oauth2.dto.OAuth2Response; + +import java.util.Map; + +public interface OAuth2ResponseHandler { + public boolean supports(String registrationId); + public OAuth2Response createResponse(Map attributes); +} diff --git a/src/main/java/com/example/api/oauth2/service/CustomOauth2UserService.java b/src/main/java/com/example/api/oauth2/service/CustomOauth2UserService.java new file mode 100644 index 00000000..81bcfe39 --- /dev/null +++ b/src/main/java/com/example/api/oauth2/service/CustomOauth2UserService.java @@ -0,0 +1,62 @@ +package com.example.api.oauth2.service; + +import com.example.api.account.entity.UserRole; +import com.example.api.account.repository.AccountRepository; +import com.example.api.auth.entitiy.CustomUserDetails; +import com.example.api.domain.Account; +import com.example.api.oauth2.dto.OAuth2Response; +import com.example.api.oauth2.dto.Oauth2UserInfoRequest; +import com.example.api.oauth2.entity.handler.OAuth2ResponseHandler; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.oauth2.client.userinfo.DefaultOAuth2UserService; +import org.springframework.security.oauth2.client.userinfo.OAuth2UserRequest; +import org.springframework.security.oauth2.core.OAuth2AuthenticationException; +import org.springframework.security.oauth2.core.user.OAuth2User; +import org.springframework.stereotype.Service; + +import java.util.Collections; +import java.util.List; + +@Service +@RequiredArgsConstructor +@Slf4j +public class Oauth2Service extends DefaultOAuth2UserService { + private final AccountRepository accountRepository; + private final List oauth2ResponseHandlers; + + @Override + public OAuth2User loadUser(final OAuth2UserRequest request) throws OAuth2AuthenticationException { + OAuth2User oAuth2User = super.loadUser(request); + log.info(String.valueOf(oAuth2User)); + + String registrationId = request.getClientRegistration().getRegistrationId(); + OAuth2Response oAuth2Response = createOAuth2Response(registrationId, oAuth2User); + Oauth2UserInfoRequest userInfo = new Oauth2UserInfoRequest(oAuth2Response.getName(), oAuth2Response.getEmail(), UserRole.of(0)); + + Account user = accountRepository.findByEmail(oAuth2Response.getEmail()).orElse(null); + if(user == null) { + return saveOauth2Account(userInfo); + } + return new CustomUserDetails(user.getAccountId(), user.getName(), user.getEmail(), user.getRoles()); + } + + private CustomUserDetails saveOauth2Account(final Oauth2UserInfoRequest userInfo) { + Account account = new Account( + userInfo.name(), + userInfo.email(), + Collections.singletonList(userInfo.role()) + ); + Account savedUser = accountRepository.save(account); + return new CustomUserDetails(savedUser.getAccountId(), savedUser.getName(), savedUser.getEmail(), savedUser.getRoles()); + } + + private OAuth2Response createOAuth2Response(final String registrationId, final OAuth2User oAuth2User) { + for (OAuth2ResponseHandler oauth2ResponseHandler : oauth2ResponseHandlers) { + if(oauth2ResponseHandler.supports(registrationId)) { + return oauth2ResponseHandler.createResponse(oAuth2User.getAttributes()); + } + } + return null; + } +} \ No newline at end of file From 3b9ec520fedb0d8de537c711de017e4694fe64e1 Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Sat, 28 Dec 2024 12:33:28 +0900 Subject: [PATCH 179/276] =?UTF-8?q?#50=20(handler)=20=EC=B9=B4=EC=B9=B4?= =?UTF-8?q?=EC=98=A4,=20=EB=84=A4=EC=9D=B4=EB=B2=84=20=ED=95=B8=EB=93=A4?= =?UTF-8?q?=EB=9F=AC=20=EB=B0=8F=20=EC=9D=B8=EC=A6=9D=20=EC=84=B1=EA=B3=B5?= =?UTF-8?q?,=20=EC=8B=A4=ED=8C=A8=20=ED=95=B8=EB=93=A4=EB=9F=AC=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entity/handler/KakaoResponseHandler.java | 8 ++++++-- .../entity/handler/NaverResponseHandler.java | 3 +-- .../OAuth2AuthenticationFailureHandler.java | 4 +++- .../OAuth2AuthenticationSuccessHandler.java | 16 ++++++++-------- .../entity/handler/OAuth2ResponseHandler.java | 2 +- 5 files changed, 19 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/example/api/oauth2/entity/handler/KakaoResponseHandler.java b/src/main/java/com/example/api/oauth2/entity/handler/KakaoResponseHandler.java index 7ab11d57..4b5ac006 100644 --- a/src/main/java/com/example/api/oauth2/entity/handler/KakaoResponseHandler.java +++ b/src/main/java/com/example/api/oauth2/entity/handler/KakaoResponseHandler.java @@ -1,14 +1,17 @@ -package com.example.api.oauth2.entity; +package com.example.api.oauth2.entity.handler; import com.example.api.oauth2.dto.KakaoResponse; import com.example.api.oauth2.dto.OAuth2Response; +import lombok.extern.slf4j.Slf4j; +import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import java.util.Map; +import java.util.logging.Logger; @Component +@Slf4j public class KakaoResponseHandler implements OAuth2ResponseHandler { - @Override public boolean supports(String registrationId) { return "kakao".equalsIgnoreCase(registrationId); @@ -16,6 +19,7 @@ public boolean supports(String registrationId) { @Override public OAuth2Response createResponse( Map attributes) { + log.info("Attributes: {}", attributes); return new KakaoResponse(attributes); } } diff --git a/src/main/java/com/example/api/oauth2/entity/handler/NaverResponseHandler.java b/src/main/java/com/example/api/oauth2/entity/handler/NaverResponseHandler.java index 958e5c80..e18a6144 100644 --- a/src/main/java/com/example/api/oauth2/entity/handler/NaverResponseHandler.java +++ b/src/main/java/com/example/api/oauth2/entity/handler/NaverResponseHandler.java @@ -1,6 +1,5 @@ -package com.example.api.oauth2.entity; +package com.example.api.oauth2.entity.handler; -import com.example.api.oauth2.dto.KakaoResponse; import com.example.api.oauth2.dto.NaverResponse; import com.example.api.oauth2.dto.OAuth2Response; import org.springframework.stereotype.Component; diff --git a/src/main/java/com/example/api/oauth2/entity/handler/OAuth2AuthenticationFailureHandler.java b/src/main/java/com/example/api/oauth2/entity/handler/OAuth2AuthenticationFailureHandler.java index 3973dbd4..19637c62 100644 --- a/src/main/java/com/example/api/oauth2/entity/handler/OAuth2AuthenticationFailureHandler.java +++ b/src/main/java/com/example/api/oauth2/entity/handler/OAuth2AuthenticationFailureHandler.java @@ -1,5 +1,7 @@ -package com.example.api.oauth2.entity; +package com.example.api.oauth2.entity.handler; +import com.example.api.oauth2.entity.CookieUtils; +import com.example.api.oauth2.entity.HttpCookieOAuth2AuthorizationRequestRepository; import jakarta.servlet.ServletException; import jakarta.servlet.http.Cookie; import jakarta.servlet.http.HttpServletRequest; diff --git a/src/main/java/com/example/api/oauth2/entity/handler/OAuth2AuthenticationSuccessHandler.java b/src/main/java/com/example/api/oauth2/entity/handler/OAuth2AuthenticationSuccessHandler.java index f377ad3d..1d3b3775 100644 --- a/src/main/java/com/example/api/oauth2/entity/handler/OAuth2AuthenticationSuccessHandler.java +++ b/src/main/java/com/example/api/oauth2/entity/handler/OAuth2AuthenticationSuccessHandler.java @@ -1,17 +1,17 @@ -package com.example.api.oauth2.entity; +package com.example.api.oauth2.entity.handler; import com.example.api.account.entity.UserRole; import com.example.api.account.repository.AccountRepository; -import com.example.api.auth.dto.AuthTokenRequest; import com.example.api.auth.dto.UserDetailRequest; +import com.example.api.auth.entitiy.CustomUserDetails; import com.example.api.auth.entitiy.RefreshToken; import com.example.api.auth.repository.TokenRepository; import com.example.api.auth.service.JwtTokenProvider; import com.example.api.domain.Account; import com.example.api.exception.BusinessException; import com.example.api.exception.ErrorCode; -import com.example.api.global.properties.Oauth2Properties; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.example.api.oauth2.entity.CookieUtils; +import com.example.api.oauth2.entity.HttpCookieOAuth2AuthorizationRequestRepository; import jakarta.servlet.ServletException; import jakarta.servlet.http.Cookie; import jakarta.servlet.http.HttpServletRequest; @@ -49,9 +49,9 @@ public void onAuthenticationSuccess(HttpServletRequest request, HttpServletRespo logger.debug("Response has already been committed. Unable to redirect to " + targetUrl); return; } - - UserDetailRequest userDetailRequest = new UserDetailRequest((Long) authentication.getPrincipal(), (Collection) authentication.getAuthorities()); - Account user = accountRepository.findById((Long) authentication.getPrincipal()).orElse(null); + CustomUserDetails principal = (CustomUserDetails) authentication.getPrincipal(); + UserDetailRequest userDetailRequest = new UserDetailRequest(principal.getUserId(), (Collection) authentication.getAuthorities()); + Account user = accountRepository.findById(principal.getUserId()).orElse(null); RefreshToken token = new RefreshToken(user); String accessToken = tokenProvider.generateAccessToken(userDetailRequest); String refreshToken = tokenProvider.generateRefreshToken(userDetailRequest, token.getId() ); @@ -78,7 +78,7 @@ protected String determineTargetUrl(HttpServletRequest request, HttpServletRespo if(redirectUri.isPresent() && !isAuthorizedRedirectUri(redirectUri.get())) { throw new BusinessException(ErrorCode.INVALID_REDIRECT_URI); } - return redirectUri.orElse(getDefaultTargetUrl()); + return redirectUri.orElse("http://localhost:3000"); } private boolean isAuthorizedRedirectUri(String uri) { diff --git a/src/main/java/com/example/api/oauth2/entity/handler/OAuth2ResponseHandler.java b/src/main/java/com/example/api/oauth2/entity/handler/OAuth2ResponseHandler.java index 22ad2aa0..f9fdf06f 100644 --- a/src/main/java/com/example/api/oauth2/entity/handler/OAuth2ResponseHandler.java +++ b/src/main/java/com/example/api/oauth2/entity/handler/OAuth2ResponseHandler.java @@ -1,4 +1,4 @@ -package com.example.api.oauth2.entity; +package com.example.api.oauth2.entity.handler; import com.example.api.oauth2.dto.OAuth2Response; From 5e2460f6f110166a2b6b0c87e7225ad19e9ac544 Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Sat, 28 Dec 2024 12:34:10 +0900 Subject: [PATCH 180/276] =?UTF-8?q?#50=20(CookieUtils)=20=EC=BF=A0?= =?UTF-8?q?=ED=82=A4=20Utils=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/oauth2/entity/CookieUtils.java | 56 ++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/oauth2/entity/CookieUtils.java b/src/main/java/com/example/api/oauth2/entity/CookieUtils.java index 9225f0d6..124a032d 100644 --- a/src/main/java/com/example/api/oauth2/entity/CookieUtils.java +++ b/src/main/java/com/example/api/oauth2/entity/CookieUtils.java @@ -1,4 +1,58 @@ package com.example.api.oauth2.entity; +import jakarta.servlet.http.Cookie; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.util.SerializationUtils; + +import java.util.Base64; +import java.util.Optional; + public class CookieUtils { -} + + public static Optional getCookie(HttpServletRequest request, String name) { + Cookie[] cookies = request.getCookies(); + + if (cookies != null && cookies.length > 0) { + for (Cookie cookie : cookies) { + if (cookie.getName().equals(name)) { + return Optional.of(cookie); + } + } + } + + return Optional.empty(); + } + + public static void addCookie(HttpServletResponse response, String name, String value, int maxAge) { + Cookie cookie = new Cookie(name, value); + cookie.setPath("/"); + cookie.setHttpOnly(true); + cookie.setMaxAge(maxAge); + response.addCookie(cookie); + } + + public static void deleteCookie(HttpServletRequest request, HttpServletResponse response, String name) { + Cookie[] cookies = request.getCookies(); + if (cookies != null && cookies.length > 0) { + for (Cookie cookie: cookies) { + if (cookie.getName().equals(name)) { + cookie.setValue(""); + cookie.setPath("/"); + cookie.setMaxAge(0); + response.addCookie(cookie); + } + } + } + } + + public static String serialize(Object object) { + return Base64.getUrlEncoder() + .encodeToString(SerializationUtils.serialize(object)); + } + + public static T deserialize(Cookie cookie, Class cls) { + return cls.cast(SerializationUtils.deserialize( + Base64.getUrlDecoder().decode(cookie.getValue()))); + } +} \ No newline at end of file From 5eb5d656943b40deadaed6c9d08aa9ec4173dffe Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Sat, 28 Dec 2024 12:35:10 +0900 Subject: [PATCH 181/276] =?UTF-8?q?#50=20(CookieRepository)=20=EC=BF=A0?= =?UTF-8?q?=ED=82=A4=20=EC=A0=80=EC=9E=A5=EC=86=8C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...eOAuth2AuthorizationRequestRepository.java | 47 ++++++++++++++++++- 1 file changed, 45 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/example/api/oauth2/entity/HttpCookieOAuth2AuthorizationRequestRepository.java b/src/main/java/com/example/api/oauth2/entity/HttpCookieOAuth2AuthorizationRequestRepository.java index d4fdbc8e..6e0599e9 100644 --- a/src/main/java/com/example/api/oauth2/entity/HttpCookieOAuth2AuthorizationRequestRepository.java +++ b/src/main/java/com/example/api/oauth2/entity/HttpCookieOAuth2AuthorizationRequestRepository.java @@ -1,4 +1,47 @@ package com.example.api.oauth2.entity; -public class HttpCookieOAuth2AuthorizationRequestRepository { -} +import io.micrometer.common.util.StringUtils; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.security.oauth2.client.web.AuthorizationRequestRepository; +import org.springframework.security.oauth2.core.endpoint.OAuth2AuthorizationRequest; +import org.springframework.stereotype.Component; + +@Component +public class HttpCookieOAuth2AuthorizationRequestRepository implements AuthorizationRequestRepository { + public static final String OAUTH2_AUTHORIZATION_REQUEST_COOKIE_NAME = "oauth2_auth_request"; + public static final String REDIRECT_URI_PARAM_COOKIE_NAME = "redirect_uri"; + private static final int cookieExpireSeconds = 180; + + @Override + public OAuth2AuthorizationRequest loadAuthorizationRequest(HttpServletRequest request) { + return CookieUtils.getCookie(request, OAUTH2_AUTHORIZATION_REQUEST_COOKIE_NAME) + .map(cookie -> CookieUtils.deserialize(cookie, OAuth2AuthorizationRequest.class)) + .orElse(null); + } + + @Override + public void saveAuthorizationRequest(OAuth2AuthorizationRequest authorizationRequest, HttpServletRequest request, HttpServletResponse response) { + if (authorizationRequest == null) { + CookieUtils.deleteCookie(request, response, OAUTH2_AUTHORIZATION_REQUEST_COOKIE_NAME); + CookieUtils.deleteCookie(request, response, REDIRECT_URI_PARAM_COOKIE_NAME); + return; + } + + CookieUtils.addCookie(response, OAUTH2_AUTHORIZATION_REQUEST_COOKIE_NAME, CookieUtils.serialize(authorizationRequest), cookieExpireSeconds); + String redirectUriAfterLogin = request.getParameter(REDIRECT_URI_PARAM_COOKIE_NAME); + if (StringUtils.isNotBlank(redirectUriAfterLogin)) { + CookieUtils.addCookie(response, REDIRECT_URI_PARAM_COOKIE_NAME, redirectUriAfterLogin, cookieExpireSeconds); + } + } + + @Override + public OAuth2AuthorizationRequest removeAuthorizationRequest(HttpServletRequest request ,HttpServletResponse response) { + return this.loadAuthorizationRequest(request); + } + + public void removeAuthorizationRequestCookies(HttpServletRequest request, HttpServletResponse response) { + CookieUtils.deleteCookie(request, response, OAUTH2_AUTHORIZATION_REQUEST_COOKIE_NAME); + CookieUtils.deleteCookie(request, response, REDIRECT_URI_PARAM_COOKIE_NAME); + } +} \ No newline at end of file From e2fa41f6145f82d47ff363e8dcc1c8b97cf2cd88 Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Sat, 28 Dec 2024 12:36:02 +0900 Subject: [PATCH 182/276] =?UTF-8?q?#50=20(Oauth2UserService)=20oauth2=20?= =?UTF-8?q?=EC=9C=A0=EC=A0=80=20=EC=A0=95=EB=B3=B4=EB=A5=BC=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=ED=95=98=EB=8A=94=20service?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/api/oauth2/service/CustomOauth2UserService.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/oauth2/service/CustomOauth2UserService.java b/src/main/java/com/example/api/oauth2/service/CustomOauth2UserService.java index 81bcfe39..fad44ac8 100644 --- a/src/main/java/com/example/api/oauth2/service/CustomOauth2UserService.java +++ b/src/main/java/com/example/api/oauth2/service/CustomOauth2UserService.java @@ -7,6 +7,7 @@ import com.example.api.oauth2.dto.OAuth2Response; import com.example.api.oauth2.dto.Oauth2UserInfoRequest; import com.example.api.oauth2.entity.handler.OAuth2ResponseHandler; +import jakarta.transaction.Transactional; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.security.oauth2.client.userinfo.DefaultOAuth2UserService; @@ -21,11 +22,12 @@ @Service @RequiredArgsConstructor @Slf4j -public class Oauth2Service extends DefaultOAuth2UserService { +public class CustomOauth2UserService extends DefaultOAuth2UserService { private final AccountRepository accountRepository; private final List oauth2ResponseHandlers; @Override + @Transactional public OAuth2User loadUser(final OAuth2UserRequest request) throws OAuth2AuthenticationException { OAuth2User oAuth2User = super.loadUser(request); log.info(String.valueOf(oAuth2User)); From 13760e25bb4d1f6552d93d6530021f213218bf67 Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Sat, 28 Dec 2024 12:37:30 +0900 Subject: [PATCH 183/276] =?UTF-8?q?#50=20(application.properties)=20?= =?UTF-8?q?=EC=B9=B4=EC=B9=B4=EC=98=A4,=20=EB=84=A4=EC=9D=B4=EB=B2=84,=20?= =?UTF-8?q?=ED=97=88=EC=9A=A9=20uri=20=EC=86=8D=EC=84=B1=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application.properties | 34 ++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 74d0dcc2..714f320e 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -52,5 +52,37 @@ jwt.access_token_valid_time=3600 # 30? jwt.refresh_token_valid_time=2592000 +# ??? ?? ?? code.length=6 -code.digit_range=10 \ No newline at end of file +code.digit_range=10 + +# kakao Oauth2 ?? +spring.security.oauth2.client.registration.kakao.client-id=${KAKAO_CLIENT_ID} +spring.security.oauth2.client.registration.kakao.client-secret=${KAKAO_CLIENT_SECRET} +spring.security.oauth2.client.registration.kakao.redirect-uri={baseUrl}/oauth2/callback/{registrationId} +spring.security.oauth2.client.registration.kakao.authorization-grant-type=authorization_code +spring.security.oauth2.client.registration.kakao.client-authentication-method=client_secret_post +spring.security.oauth2.client.registration.kakao.scope=profile_nickname,account_email + +# kakao Oauth2 Provider ?? +spring.security.oauth2.client.provider.kakao.authorization-uri=https://kauth.kakao.com/oauth/authorize +spring.security.oauth2.client.provider.kakao.token-uri=https://kauth.kakao.com/oauth/token +spring.security.oauth2.client.provider.kakao.user-info-uri=https://kapi.kakao.com/v2/user/me +spring.security.oauth2.client.provider.kakao.user-name-attribute=id + +# naver Oauth2 ?? +spring.security.oauth2.client.registration.naver.client-id=${NAVER_CLIENT_ID} +spring.security.oauth2.client.registration.naver.client-secret=${NAVER_CLIENT_SECRET} +spring.security.oauth2.client.registration.naver.redirect-uri={baseUrl}/oauth2/callback/{registrationId} +spring.security.oauth2.client.registration.naver.authorization-grant-type=authorization_code +spring.security.oauth2.client.registration.naver.client-authentication-method=client_secret_basic +spring.security.oauth2.client.registration.naver.scope=name,email + +# naver Oauth2 Provider ?? +spring.security.oauth2.client.provider.naver.authorization-uri=https://nid.naver.com/oauth2.0/authorize +spring.security.oauth2.client.provider.naver.token-uri=https://nid.naver.com/oauth2.0/token +spring.security.oauth2.client.provider.naver.user-info-uri=https://openapi.naver.com/v1/nid/me +spring.security.oauth2.client.provider.naver.user-name-attribute=response + +# redirect allow path +app.oauth2.authorized-redirect-uris=* \ No newline at end of file From f16c69a393ad494f45649b3b3eb27313fe17e024 Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Sat, 28 Dec 2024 12:38:29 +0900 Subject: [PATCH 184/276] =?UTF-8?q?#50=20(build.gradle)=20oauth2=20?= =?UTF-8?q?=EC=9D=98=EC=A1=B4=EC=84=B1=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/build.gradle b/build.gradle index e7d51b42..02c72b9a 100644 --- a/build.gradle +++ b/build.gradle @@ -42,6 +42,7 @@ dependencies { // ENV implementation 'me.paulschwarz:spring-dotenv:4.0.0' + // VALIDATION implementation 'org.springframework.boot:spring-boot-starter-validation' @@ -56,6 +57,7 @@ dependencies { implementation 'io.jsonwebtoken:jjwt-api:0.11.5' runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.5' runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.11.5' + // Query DSL implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta" @@ -65,6 +67,8 @@ dependencies { // 인메모리 몽고디비 flapdoodle testImplementation 'de.flapdoodle.embed:de.flapdoodle.embed.mongo:4.6.0' + // OAUTH2 + implementation 'org.springframework.boot:spring-boot-starter-oauth2-client' } tasks.named('test') { From 7ebd34cc0c61efafe3e8f56bfff32928a73b79e7 Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Sat, 28 Dec 2024 12:41:01 +0900 Subject: [PATCH 185/276] =?UTF-8?q?#50=20(SecurityConfig)=20oauth2=20?= =?UTF-8?q?=EB=A1=9C=EA=B7=B8=EC=9D=B8=20=EC=84=A4=EC=A0=95=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/global/config/SecurityConfig.java | 79 +++++++++++++++---- 1 file changed, 63 insertions(+), 16 deletions(-) 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 3dacf0ab..b2a651c4 100644 --- a/src/main/java/com/example/api/global/config/SecurityConfig.java +++ b/src/main/java/com/example/api/global/config/SecurityConfig.java @@ -2,51 +2,98 @@ import com.example.api.auth.entitiy.JwtAuthenticationProvider; import com.example.api.global.config.filter.JwtAuthenticationFilter; +import com.example.api.oauth2.entity.HttpCookieOAuth2AuthorizationRequestRepository; +import com.example.api.oauth2.entity.handler.OAuth2AuthenticationFailureHandler; +import com.example.api.oauth2.entity.handler.OAuth2AuthenticationSuccessHandler; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.ProviderManager; import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.core.AuthenticationException; import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.oauth2.client.userinfo.DefaultOAuth2UserService; +import org.springframework.security.web.AuthenticationEntryPoint; import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.cors.CorsConfigurationSource; +import org.springframework.web.cors.UrlBasedCorsConfigurationSource; +import java.io.IOException; import java.util.List; @Configuration +@EnableWebSecurity +@RequiredArgsConstructor public class SecurityConfig { private final JwtAuthenticationProvider jwtAuthenticationProvider; private final JwtAuthenticationFilter jwtAuthenticationFilter; - - public SecurityConfig(JwtAuthenticationProvider authenticationProvider, JwtAuthenticationFilter jwtAuthenticationFilter) { - this.jwtAuthenticationProvider = authenticationProvider; - this.jwtAuthenticationFilter = jwtAuthenticationFilter; - } + private final DefaultOAuth2UserService oauth2Service; + private final HttpCookieOAuth2AuthorizationRequestRepository httpCookieOAuth2AuthorizationRequestRepository; + private final OAuth2AuthenticationSuccessHandler oauth2AuthorizationSuccessHandler; + private final OAuth2AuthenticationFailureHandler oAuth2AuthenticationFailureHandler; @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http + .cors(cors -> cors + .configurationSource(corsConfigurationSource())) .csrf(csrf -> csrf.disable()) + .httpBasic(httpBasic -> httpBasic.disable()) + .formLogin(formLogin -> formLogin.disable()) .authorizeHttpRequests(authorize -> authorize - .requestMatchers( - "/api/v1/account/**", - "/api/v1/**" - ).permitAll() - .anyRequest().hasRole("EMPLOYEE") + .requestMatchers("/oauth2/**", "/api/v1/**").permitAll() + .anyRequest().authenticated() ) - .addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class) - .sessionManagement(session -> - session.sessionCreationPolicy(SessionCreationPolicy.STATELESS) + .oauth2Login(oauth2 -> oauth2 + .authorizationEndpoint(authorizationEndpoint -> + authorizationEndpoint + .baseUri("/oauth2/authorization") + .authorizationRequestRepository(httpCookieOAuth2AuthorizationRequestRepository)) + .redirectionEndpoint(redirectEndpoint -> redirectEndpoint + .baseUri("/oauth2/callback/*")) + .userInfoEndpoint(endpoint -> endpoint.userService(oauth2Service)) + .successHandler(oauth2AuthorizationSuccessHandler) + .failureHandler(oAuth2AuthenticationFailureHandler) ) - .httpBasic(httpBasic -> httpBasic.disable()) - .formLogin(formLogin -> formLogin.disable()); + .addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class); return http.build(); } + @Bean + public CorsConfigurationSource corsConfigurationSource() { + CorsConfiguration corsConfiguration = new CorsConfiguration(); + corsConfiguration.addAllowedOrigin("*"); + corsConfiguration.addAllowedMethod("*"); + corsConfiguration.addAllowedHeader("*"); + corsConfiguration.setAllowCredentials(true); + + UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); + source.registerCorsConfiguration("/**", corsConfiguration); + return source; + } + + static class FailedAuthenticationEntryPoint implements AuthenticationEntryPoint { + @Override + public void commence(HttpServletRequest request, + HttpServletResponse response, + AuthenticationException authException) throws IOException, ServletException { + response.setContentType("application/json"); + response.setStatus(HttpServletResponse.SC_FORBIDDEN); + + response.getWriter().write("{\"code\": \"NP\", \"message\": \"No Permission.\"}"); + } + } + @Bean public AuthenticationManager authenticationManager() { return new ProviderManager(List.of(jwtAuthenticationProvider)); From 86de814f73f78440d1231ed64f74c22b000ea23d Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Sat, 28 Dec 2024 12:44:17 +0900 Subject: [PATCH 186/276] =?UTF-8?q?#50=20(UserRole)=20=EB=AC=B8=EC=9E=90?= =?UTF-8?q?=EC=97=B4=EC=9D=84=20=EA=B0=9D=EC=B2=B4=EB=A1=9C=20=EB=A7=A4?= =?UTF-8?q?=ED=95=91=EC=8B=9C=EC=BC=9C=EC=A3=BC=EB=8A=94=20@JsonCreator=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/api/account/entity/UserRole.java | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/account/entity/UserRole.java b/src/main/java/com/example/api/account/entity/UserRole.java index 15897a4b..0c30472a 100644 --- a/src/main/java/com/example/api/account/entity/UserRole.java +++ b/src/main/java/com/example/api/account/entity/UserRole.java @@ -1,6 +1,11 @@ package com.example.api.account.entity; -public enum UserRole { +import com.example.api.exception.BusinessException; +import com.example.api.exception.ErrorCode; +import com.fasterxml.jackson.annotation.JsonCreator; +import org.springframework.security.core.GrantedAuthority; + +public enum UserRole implements GrantedAuthority { EMPLOYEE(0, "알바생"), EMPLOYER(1, "사장"); @@ -21,6 +26,16 @@ public static UserRole of(final Integer code) { return null; } + @JsonCreator + public static UserRole from(String value) { + for (UserRole role : values()) { + if (role.name().equalsIgnoreCase(value)) { + return role; + } + } + throw new BusinessException(ErrorCode.INCORRECT_DATA); + } + public Integer getCode() { return code; } From 86f9c2c2387aa014082f3c449533e8a45e173713 Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Sat, 28 Dec 2024 12:45:16 +0900 Subject: [PATCH 187/276] =?UTF-8?q?#50=20(UserDetail)=20oauth2=20=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=EC=9D=B8=EA=B3=BC=20=EC=9D=BC=EB=B0=98=20=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=EC=9D=B8=EC=9D=98=20authentication=20=EC=96=91?= =?UTF-8?q?=EC=8B=9D=EC=9D=84=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../auth/entitiy/CustomUserDetailService.java | 2 +- .../api/auth/entitiy/CustomUserDetails.java | 33 ++++++++++++++++--- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/example/api/auth/entitiy/CustomUserDetailService.java b/src/main/java/com/example/api/auth/entitiy/CustomUserDetailService.java index 838f0ea7..2b7a51ef 100644 --- a/src/main/java/com/example/api/auth/entitiy/CustomUserDetailService.java +++ b/src/main/java/com/example/api/auth/entitiy/CustomUserDetailService.java @@ -28,6 +28,6 @@ public CustomUserDetails loadUserByUserId(final Long userId) { .map(authority -> new SimpleGrantedAuthority(authority.getAuthority())) .toList(); - return new CustomUserDetails(user.getAccountId(), authorities); + return new CustomUserDetails(user.getAccountId(), user.getName(), user.getEmail(), authorities); } } \ No newline at end of file diff --git a/src/main/java/com/example/api/auth/entitiy/CustomUserDetails.java b/src/main/java/com/example/api/auth/entitiy/CustomUserDetails.java index b0f011ff..7eedc0e7 100644 --- a/src/main/java/com/example/api/auth/entitiy/CustomUserDetails.java +++ b/src/main/java/com/example/api/auth/entitiy/CustomUserDetails.java @@ -1,23 +1,48 @@ package com.example.api.auth.entitiy; +import lombok.Getter; import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.oauth2.core.user.OAuth2User; import java.util.Collection; +import java.util.Map; -public class CustomUserDetails{ +@Getter +public class CustomUserDetails implements UserDetails, OAuth2User { private final Long userId; + private final String name; + private final String email; private final Collection authorities; - public CustomUserDetails(final Long userId, final Collection authorities) { + public CustomUserDetails(final Long userId, final String name, final String email, final Collection authorities) { this.userId = userId; + this.name = name; + this.email = email; this.authorities = authorities; } + @Override + public Map getAttributes(){ + return Map.of( + "userId", userId, + "name", name, + "email", email + ); + } + + @Override public Collection getAuthorities() { return authorities; } - public Long getUserId() { - return userId; + @Override + public String getUsername() { + return this.email; + } + + @Override + public String getPassword() { + return null; } } \ No newline at end of file From d7596cdae2ee7b8e3f4e36cff3bce38d6ebb9cb0 Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Sat, 28 Dec 2024 12:46:13 +0900 Subject: [PATCH 188/276] =?UTF-8?q?#50=20(AuthController)=20println=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/api/auth/controller/AuthController.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/example/api/auth/controller/AuthController.java b/src/main/java/com/example/api/auth/controller/AuthController.java index a7777597..2fc12fd9 100644 --- a/src/main/java/com/example/api/auth/controller/AuthController.java +++ b/src/main/java/com/example/api/auth/controller/AuthController.java @@ -5,16 +5,14 @@ import com.example.api.auth.dto.LoginUserRequest; import com.example.api.auth.dto.RefreshTokenRequest; import com.example.api.auth.service.AuthService; +import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/api/v1/auth") @@ -37,7 +35,6 @@ public ResponseEntity refresh(@Valid @RequestBody final Refres @PostMapping("/logout") public ResponseEntity logout(@AuthenticationPrincipal final Object principal) { - System.out.println("please = " + SecurityContextHolder.getContext().getAuthentication().getPrincipal().toString()); Long userId = Long.parseLong(principal.toString()); AuthTokenRequest authTokenRequest = authService.logout(new LoginUserRequest(userId)); return ResponseEntity.ok(authTokenRequest); From d79a7adfe957d1b666e17bfbcd9fd7c8605eb29a Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Sat, 28 Dec 2024 12:47:07 +0900 Subject: [PATCH 189/276] =?UTF-8?q?#50=20(AccountRepository)=20findByEmail?= =?UTF-8?q?=20=EB=A9=94=EC=86=8C=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/api/account/repository/AccountRepository.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/example/api/account/repository/AccountRepository.java b/src/main/java/com/example/api/account/repository/AccountRepository.java index de037166..04853654 100644 --- a/src/main/java/com/example/api/account/repository/AccountRepository.java +++ b/src/main/java/com/example/api/account/repository/AccountRepository.java @@ -9,4 +9,6 @@ public interface AccountRepository extends JpaRepository { boolean existsByLoginId(String loginId); boolean existsByEmail(String email); + + Optional findByEmail(String email); } \ No newline at end of file From 180903830ebcfbe0b439c9f9a496ca08d48ee0dc Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Sat, 28 Dec 2024 12:47:59 +0900 Subject: [PATCH 190/276] =?UTF-8?q?#50=20(Accoutn)=20Account=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=EC=9E=90=20=EC=B6=94=EA=B0=80(=EC=98=A4=EB=B2=84?= =?UTF-8?q?=EB=A1=9C=EB=94=A9)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/api/domain/Account.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/com/example/api/domain/Account.java b/src/main/java/com/example/api/domain/Account.java index 1d6d3013..bb074d8b 100644 --- a/src/main/java/com/example/api/domain/Account.java +++ b/src/main/java/com/example/api/domain/Account.java @@ -59,6 +59,12 @@ public class Account extends BaseEntity { public Account() { } + public Account(String name, String email, Collection roles) { + this.name = name; + this.email = email; + this.roles = roles; + } + public Account(String loginId, String password, String name, String nickname, String phoneNumber, String email, Nationality nationality, Collection roles) { this.loginId = loginId; this.password = password; From d6c37d8b4946a8e64378a822f4e8567991add698 Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Sat, 28 Dec 2024 12:48:38 +0900 Subject: [PATCH 191/276] =?UTF-8?q?#50=20(ApiApplication)=20=ED=95=84?= =?UTF-8?q?=EC=9A=94=20=EC=97=86=EB=8A=94=20=EC=A4=84=EB=B0=94=EA=BF=88=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/api/ApiApplication.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/com/example/api/ApiApplication.java b/src/main/java/com/example/api/ApiApplication.java index 7235c2f0..633e4efa 100644 --- a/src/main/java/com/example/api/ApiApplication.java +++ b/src/main/java/com/example/api/ApiApplication.java @@ -8,9 +8,7 @@ @SpringBootApplication @EnableJpaAuditing public class ApiApplication { - public static void main(String[] args) { - SpringApplication.run(ApiApplication.class, args); } } From c2183818651123203b5bdae833e2eb8175668e1d Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Sat, 28 Dec 2024 12:50:01 +0900 Subject: [PATCH 192/276] =?UTF-8?q?#50=20(SecurityConfig)=20=EC=9D=B8?= =?UTF-8?q?=EC=A6=9D=20=EC=97=90=EB=9F=AC=20=ED=95=B8=EB=93=A4=EB=A7=81=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/api/global/config/SecurityConfig.java | 2 ++ 1 file changed, 2 insertions(+) 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 b2a651c4..f92ca385 100644 --- a/src/main/java/com/example/api/global/config/SecurityConfig.java +++ b/src/main/java/com/example/api/global/config/SecurityConfig.java @@ -49,6 +49,8 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti .csrf(csrf -> csrf.disable()) .httpBasic(httpBasic -> httpBasic.disable()) .formLogin(formLogin -> formLogin.disable()) + .exceptionHandling(exceptionHandling -> + exceptionHandling.authenticationEntryPoint(new FailedAuthenticationEntryPoint())) .authorizeHttpRequests(authorize -> authorize .requestMatchers("/oauth2/**", "/api/v1/**").permitAll() .anyRequest().authenticated() From ce303eb7c269f7faad776fb7aacc99ebb69273d3 Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Sat, 28 Dec 2024 12:50:40 +0900 Subject: [PATCH 193/276] =?UTF-8?q?#50=20(Oauth2Properties)=20oauth2=20?= =?UTF-8?q?=EC=86=8D=EC=84=B1=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../global/properties/Oauth2Properties.java | 51 ++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/global/properties/Oauth2Properties.java b/src/main/java/com/example/api/global/properties/Oauth2Properties.java index ba216f6e..e5ece356 100644 --- a/src/main/java/com/example/api/global/properties/Oauth2Properties.java +++ b/src/main/java/com/example/api/global/properties/Oauth2Properties.java @@ -1,4 +1,53 @@ package com.example.api.global.properties; +import lombok.Getter; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component +@Getter public class Oauth2Properties { -} + @Value("${spring.security.oauth2.client.registration.kakao.client-id}") + private String kakao_clientId; + @Value("${spring.security.oauth2.client.registration.kakao.redirect-uri}") + private String kakao_redirectUri; + @Value("${spring.security.oauth2.client.registration.kakao.client-secret}") + private String kakao_clientSecret; + @Value("${spring.security.oauth2.client.registration.kakao.authorization-grant-type}") + private String kakao_authorizationGrantType; + @Value("${spring.security.oauth2.client.registration.kakao.client-authentication-method}") + private String kakao_clientAuthenticationMethod; + @Value("#{'${spring.security.oauth2.client.registration.kakao.scope}'.split(',')}") + List kakao_scopes; + @Value("${spring.security.oauth2.client.provider.kakao.authorization-uri}") + private String kakao_authorizationUri; + @Value("${spring.security.oauth2.client.provider.kakao.token-uri}") + private String kakao_tokenUri; + @Value("${spring.security.oauth2.client.provider.kakao.user-info-uri}") + private String kakao_userInfoUri; + @Value("${spring.security.oauth2.client.provider.kakao.user-name-attribute}") + private String kakao_userNameAttribute; + + @Value("${spring.security.oauth2.client.registration.naver.client-id}") + private String naver_clientId; + @Value("${spring.security.oauth2.client.registration.naver.redirect-uri}") + private String naver_redirectUri; + @Value("${spring.security.oauth2.client.registration.naver.client-secret}") + private String naver_clientSecret; + @Value("${spring.security.oauth2.client.registration.naver.authorization-grant-type}") + private String naver_authorizationGrantType; + @Value("${spring.security.oauth2.client.registration.naver.client-authentication-method}") + private String naver_clientAuthenticationMethod; + @Value("#{'${spring.security.oauth2.client.registration.naver.scope}'.split(',')}") + List naver_scopes; + @Value("${spring.security.oauth2.client.provider.naver.authorization-uri}") + private String naver_authorizationUri; + @Value("${spring.security.oauth2.client.provider.naver.token-uri}") + private String naver_tokenUri; + @Value("${spring.security.oauth2.client.provider.naver.user-info-uri}") + private String naver_userInfoUri; + @Value("${spring.security.oauth2.client.provider.naver.user-name-attribute}") + private String naver_userNameAttribute; +} \ No newline at end of file From e106eecdc2b1bb34549cdc9ef153eecf4a595c18 Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Sat, 28 Dec 2024 12:51:22 +0900 Subject: [PATCH 194/276] =?UTF-8?q?#50=20(ErrorCode)=20oauth2=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=EC=97=90=EB=9F=AC=EC=BD=94=EB=93=9C=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/api/exception/ErrorCode.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/exception/ErrorCode.java b/src/main/java/com/example/api/exception/ErrorCode.java index 578960a6..2b5bc142 100644 --- a/src/main/java/com/example/api/exception/ErrorCode.java +++ b/src/main/java/com/example/api/exception/ErrorCode.java @@ -13,6 +13,8 @@ public enum ErrorCode { NULL_USER(HttpStatus.BAD_REQUEST, "-105", "존재하지 않는 회원입니다."), DELETED_USER(HttpStatus.BAD_REQUEST, "-106", "탈퇴한 회원입니다."), INCORRECT_PASSWORD(HttpStatus.BAD_REQUEST, "-107", "틀린 비밀번호입니다."), + INCORRECT_DATA(HttpStatus.BAD_REQUEST, "-108", "올바르지 않은 정보입니다."), + INVALID_REDIRECT_URI(HttpStatus.BAD_REQUEST,"-109","유효하지 않은 REDIRECT URI입니다."), INVALID_TOKEN(HttpStatus.BAD_REQUEST, "-T1", "올바르지 않은 AccessToken입니다."), EXPIRED_ACCESS_TOKEN(HttpStatus.UNAUTHORIZED, "-T2", "만료된 AccessToken입니다."), @@ -21,7 +23,6 @@ public enum ErrorCode { NOT_ACCESS_TOKEN_FOR_REISSUE(HttpStatus.BAD_REQUEST,"T5","재발급하기에는 유효기간이 남은 AccessToken"), TOKEN_MISSING_AUTHORITY(HttpStatus.BAD_REQUEST,"T6","권한 정보가 담겨있지 않은 토큰입니다."), - FAIL_GENERATE_CODE(HttpStatus.INTERNAL_SERVER_ERROR, "-500", "코드 생성에 실패하였습니다."), FAIL_SEND_EMAIL(HttpStatus.INTERNAL_SERVER_ERROR, "-501", "이메일 전송에 실패하였습니다."), FAIL_SAVE_CODE(HttpStatus.INTERNAL_SERVER_ERROR, "-502", "코드 저장에 실패하였습니다."), From 6f6369377b7701a82da89c55ada4a9f5d24fdda5 Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Sun, 29 Dec 2024 01:17:59 +0900 Subject: [PATCH 195/276] =?UTF-8?q?#50=20=EC=BB=A8=EB=B2=A4=EC=85=98=20?= =?UTF-8?q?=EB=A7=9E=EC=B6=B0=EC=84=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/auth/dto/AuthTokenRequest.java | 6 +- .../example/api/oauth2/dto/KakaoResponse.java | 4 +- .../example/api/oauth2/dto/NaverResponse.java | 4 +- .../api/oauth2/entity/CookieUtils.java | 11 ++-- ...eOAuth2AuthorizationRequestRepository.java | 8 +-- .../entity/handler/KakaoResponseHandler.java | 4 +- .../entity/handler/NaverResponseHandler.java | 4 +- .../OAuth2AuthenticationFailureHandler.java | 3 +- .../OAuth2AuthenticationSuccessHandler.java | 62 ++++++++++++++----- .../entity/handler/OAuth2ResponseHandler.java | 6 +- 10 files changed, 73 insertions(+), 39 deletions(-) diff --git a/src/main/java/com/example/api/auth/dto/AuthTokenRequest.java b/src/main/java/com/example/api/auth/dto/AuthTokenRequest.java index 48ca4b32..af76d146 100644 --- a/src/main/java/com/example/api/auth/dto/AuthTokenRequest.java +++ b/src/main/java/com/example/api/auth/dto/AuthTokenRequest.java @@ -1,7 +1,9 @@ package com.example.api.auth.dto; +import jakarta.validation.constraints.NotBlank; + public record AuthTokenRequest( - String accessToken, - String refreshToken + @NotBlank String accessToken, + @NotBlank String refreshToken ) { } \ No newline at end of file diff --git a/src/main/java/com/example/api/oauth2/dto/KakaoResponse.java b/src/main/java/com/example/api/oauth2/dto/KakaoResponse.java index c9f572e1..4b05e99c 100644 --- a/src/main/java/com/example/api/oauth2/dto/KakaoResponse.java +++ b/src/main/java/com/example/api/oauth2/dto/KakaoResponse.java @@ -1,8 +1,10 @@ package com.example.api.oauth2.dto; +import jakarta.validation.constraints.NotNull; + import java.util.Map; -public record KakaoResponse(Map attributes) implements OAuth2Response { +public record KakaoResponse(@NotNull Map attributes) implements OAuth2Response { @Override public String getProvider() { diff --git a/src/main/java/com/example/api/oauth2/dto/NaverResponse.java b/src/main/java/com/example/api/oauth2/dto/NaverResponse.java index c2b7892f..061cd546 100644 --- a/src/main/java/com/example/api/oauth2/dto/NaverResponse.java +++ b/src/main/java/com/example/api/oauth2/dto/NaverResponse.java @@ -1,8 +1,10 @@ package com.example.api.oauth2.dto; +import jakarta.validation.constraints.NotNull; + import java.util.Map; -public record NaverResponse(Map attributes) implements OAuth2Response { +public record NaverResponse(@NotNull Map attributes) implements OAuth2Response { @Override public String getProvider() { diff --git a/src/main/java/com/example/api/oauth2/entity/CookieUtils.java b/src/main/java/com/example/api/oauth2/entity/CookieUtils.java index 124a032d..3dc0fb37 100644 --- a/src/main/java/com/example/api/oauth2/entity/CookieUtils.java +++ b/src/main/java/com/example/api/oauth2/entity/CookieUtils.java @@ -9,8 +9,7 @@ import java.util.Optional; public class CookieUtils { - - public static Optional getCookie(HttpServletRequest request, String name) { + public static Optional getCookie(final HttpServletRequest request, final String name) { Cookie[] cookies = request.getCookies(); if (cookies != null && cookies.length > 0) { @@ -24,7 +23,7 @@ public static Optional getCookie(HttpServletRequest request, String name return Optional.empty(); } - public static void addCookie(HttpServletResponse response, String name, String value, int maxAge) { + public static void addCookie(final HttpServletResponse response, final String name, final String value, final int maxAge) { Cookie cookie = new Cookie(name, value); cookie.setPath("/"); cookie.setHttpOnly(true); @@ -32,7 +31,7 @@ public static void addCookie(HttpServletResponse response, String name, String v response.addCookie(cookie); } - public static void deleteCookie(HttpServletRequest request, HttpServletResponse response, String name) { + public static void deleteCookie(final HttpServletRequest request, final HttpServletResponse response, final String name) { Cookie[] cookies = request.getCookies(); if (cookies != null && cookies.length > 0) { for (Cookie cookie: cookies) { @@ -46,12 +45,12 @@ public static void deleteCookie(HttpServletRequest request, HttpServletResponse } } - public static String serialize(Object object) { + public static String serialize(final Object object) { return Base64.getUrlEncoder() .encodeToString(SerializationUtils.serialize(object)); } - public static T deserialize(Cookie cookie, Class cls) { + public static T deserialize(final Cookie cookie, final Class cls) { return cls.cast(SerializationUtils.deserialize( Base64.getUrlDecoder().decode(cookie.getValue()))); } diff --git a/src/main/java/com/example/api/oauth2/entity/HttpCookieOAuth2AuthorizationRequestRepository.java b/src/main/java/com/example/api/oauth2/entity/HttpCookieOAuth2AuthorizationRequestRepository.java index 6e0599e9..df8c8272 100644 --- a/src/main/java/com/example/api/oauth2/entity/HttpCookieOAuth2AuthorizationRequestRepository.java +++ b/src/main/java/com/example/api/oauth2/entity/HttpCookieOAuth2AuthorizationRequestRepository.java @@ -14,14 +14,14 @@ public class HttpCookieOAuth2AuthorizationRequestRepository implements Authoriza private static final int cookieExpireSeconds = 180; @Override - public OAuth2AuthorizationRequest loadAuthorizationRequest(HttpServletRequest request) { + public OAuth2AuthorizationRequest loadAuthorizationRequest(final HttpServletRequest request) { return CookieUtils.getCookie(request, OAUTH2_AUTHORIZATION_REQUEST_COOKIE_NAME) .map(cookie -> CookieUtils.deserialize(cookie, OAuth2AuthorizationRequest.class)) .orElse(null); } @Override - public void saveAuthorizationRequest(OAuth2AuthorizationRequest authorizationRequest, HttpServletRequest request, HttpServletResponse response) { + public void saveAuthorizationRequest(final OAuth2AuthorizationRequest authorizationRequest, final HttpServletRequest request, final HttpServletResponse response) { if (authorizationRequest == null) { CookieUtils.deleteCookie(request, response, OAUTH2_AUTHORIZATION_REQUEST_COOKIE_NAME); CookieUtils.deleteCookie(request, response, REDIRECT_URI_PARAM_COOKIE_NAME); @@ -36,11 +36,11 @@ public void saveAuthorizationRequest(OAuth2AuthorizationRequest authorizationReq } @Override - public OAuth2AuthorizationRequest removeAuthorizationRequest(HttpServletRequest request ,HttpServletResponse response) { + public OAuth2AuthorizationRequest removeAuthorizationRequest(final HttpServletRequest request ,final HttpServletResponse response) { return this.loadAuthorizationRequest(request); } - public void removeAuthorizationRequestCookies(HttpServletRequest request, HttpServletResponse response) { + public void removeAuthorizationRequestCookies(final HttpServletRequest request, final HttpServletResponse response) { CookieUtils.deleteCookie(request, response, OAUTH2_AUTHORIZATION_REQUEST_COOKIE_NAME); CookieUtils.deleteCookie(request, response, REDIRECT_URI_PARAM_COOKIE_NAME); } diff --git a/src/main/java/com/example/api/oauth2/entity/handler/KakaoResponseHandler.java b/src/main/java/com/example/api/oauth2/entity/handler/KakaoResponseHandler.java index 4b5ac006..09919962 100644 --- a/src/main/java/com/example/api/oauth2/entity/handler/KakaoResponseHandler.java +++ b/src/main/java/com/example/api/oauth2/entity/handler/KakaoResponseHandler.java @@ -13,12 +13,12 @@ @Slf4j public class KakaoResponseHandler implements OAuth2ResponseHandler { @Override - public boolean supports(String registrationId) { + public boolean supports(final String registrationId) { return "kakao".equalsIgnoreCase(registrationId); } @Override - public OAuth2Response createResponse( Map attributes) { + public OAuth2Response createResponse(final Map attributes) { log.info("Attributes: {}", attributes); return new KakaoResponse(attributes); } diff --git a/src/main/java/com/example/api/oauth2/entity/handler/NaverResponseHandler.java b/src/main/java/com/example/api/oauth2/entity/handler/NaverResponseHandler.java index e18a6144..8f216501 100644 --- a/src/main/java/com/example/api/oauth2/entity/handler/NaverResponseHandler.java +++ b/src/main/java/com/example/api/oauth2/entity/handler/NaverResponseHandler.java @@ -10,12 +10,12 @@ public class NaverResponseHandler implements OAuth2ResponseHandler { @Override - public boolean supports(String registrationId) { + public boolean supports(final String registrationId) { return "naver".equalsIgnoreCase(registrationId); } @Override - public OAuth2Response createResponse(Map attributes) { + public OAuth2Response createResponse(final Map attributes) { return new NaverResponse((Map) attributes.get("response")); } } diff --git a/src/main/java/com/example/api/oauth2/entity/handler/OAuth2AuthenticationFailureHandler.java b/src/main/java/com/example/api/oauth2/entity/handler/OAuth2AuthenticationFailureHandler.java index 19637c62..02752988 100644 --- a/src/main/java/com/example/api/oauth2/entity/handler/OAuth2AuthenticationFailureHandler.java +++ b/src/main/java/com/example/api/oauth2/entity/handler/OAuth2AuthenticationFailureHandler.java @@ -22,7 +22,7 @@ public class OAuth2AuthenticationFailureHandler extends SimpleUrlAuthenticationF private final HttpCookieOAuth2AuthorizationRequestRepository httpCookieOAuth2AuthorizationRequestRepository; @Override - public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException { + public void onAuthenticationFailure(final HttpServletRequest request, final HttpServletResponse response, final AuthenticationException exception) throws IOException, ServletException { String targetUrl = CookieUtils.getCookie(request, REDIRECT_URI_PARAM_COOKIE_NAME) .map(Cookie::getValue) .orElse(("/")); @@ -32,7 +32,6 @@ public void onAuthenticationFailure(HttpServletRequest request, HttpServletRespo .build().toUriString(); httpCookieOAuth2AuthorizationRequestRepository.removeAuthorizationRequestCookies(request, response); - getRedirectStrategy().sendRedirect(request, response, targetUrl); } } \ No newline at end of file diff --git a/src/main/java/com/example/api/oauth2/entity/handler/OAuth2AuthenticationSuccessHandler.java b/src/main/java/com/example/api/oauth2/entity/handler/OAuth2AuthenticationSuccessHandler.java index 1d3b3775..a5fdef92 100644 --- a/src/main/java/com/example/api/oauth2/entity/handler/OAuth2AuthenticationSuccessHandler.java +++ b/src/main/java/com/example/api/oauth2/entity/handler/OAuth2AuthenticationSuccessHandler.java @@ -2,6 +2,7 @@ import com.example.api.account.entity.UserRole; import com.example.api.account.repository.AccountRepository; +import com.example.api.auth.dto.AuthTokenRequest; import com.example.api.auth.dto.UserDetailRequest; import com.example.api.auth.entitiy.CustomUserDetails; import com.example.api.auth.entitiy.RefreshToken; @@ -10,6 +11,7 @@ import com.example.api.domain.Account; import com.example.api.exception.BusinessException; import com.example.api.exception.ErrorCode; +import com.example.api.global.properties.JwtProperties; import com.example.api.oauth2.entity.CookieUtils; import com.example.api.oauth2.entity.HttpCookieOAuth2AuthorizationRequestRepository; import jakarta.servlet.ServletException; @@ -17,6 +19,7 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; +import org.jetbrains.annotations.NotNull; import org.springframework.beans.factory.annotation.Value; import org.springframework.security.core.Authentication; import org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler; @@ -37,12 +40,13 @@ public class OAuth2AuthenticationSuccessHandler extends SimpleUrlAuthenticationS private final HttpCookieOAuth2AuthorizationRequestRepository httpCookieOAuth2AuthorizationRequestRepository; private final AccountRepository accountRepository; private final TokenRepository tokenRepository; + private final JwtProperties jwtProperties; @Value("app.oauth2. authorized-redirect-uris") List authorizedRedirectUris; @Override - public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { + public void onAuthenticationSuccess(final HttpServletRequest request, final HttpServletResponse response, final Authentication authentication) throws IOException, ServletException { String targetUrl = determineTargetUrl(request, response, authentication); if (response.isCommitted()) { @@ -51,37 +55,63 @@ public void onAuthenticationSuccess(HttpServletRequest request, HttpServletRespo } CustomUserDetails principal = (CustomUserDetails) authentication.getPrincipal(); UserDetailRequest userDetailRequest = new UserDetailRequest(principal.getUserId(), (Collection) authentication.getAuthorities()); - Account user = accountRepository.findById(principal.getUserId()).orElse(null); - RefreshToken token = new RefreshToken(user); - String accessToken = tokenProvider.generateAccessToken(userDetailRequest); - String refreshToken = tokenProvider.generateRefreshToken(userDetailRequest, token.getId() ); - token.putRefreshToken(refreshToken); - tokenRepository.save(token); + setResponse(request, response, userDetailRequest); + getRedirectStrategy().sendRedirect(request, response, targetUrl); + } + private void setResponse(final HttpServletRequest request, final HttpServletResponse response, final UserDetailRequest userDetailRequest) { + AuthTokenRequest authToken = generateAndSaveAuthToken(userDetailRequest); clearAuthenticationAttributes(request, response); - response.setHeader("Authorization", "Bearer " + accessToken); + Cookie accessTokenCookie = generateAccessCookie(authToken.accessToken()); + Cookie refreshTokenCookie = generateRefreshCookie(authToken.refreshToken()); + response.addCookie(accessTokenCookie); + response.addCookie(refreshTokenCookie); + } + + @NotNull + private Cookie generateAccessCookie(final String accessToken) { + Cookie accessTokenCookie = new Cookie("accessToken", accessToken); + accessTokenCookie.setHttpOnly(true); + accessTokenCookie.setPath("/"); + accessTokenCookie.setMaxAge(jwtProperties.getAccessTokenValidTime().intValue()); + return accessTokenCookie; + } + @NotNull + private Cookie generateRefreshCookie(final String refreshToken) { Cookie refreshTokenCookie = new Cookie("refreshToken", refreshToken); refreshTokenCookie.setHttpOnly(true); refreshTokenCookie.setPath("/"); - // secure 옵션 추가 필요 - response.addCookie(refreshTokenCookie); + refreshTokenCookie.setMaxAge(jwtProperties.getRefreshTokenValidTime().intValue()); + // https 설정 후 secure 옵션 추가 필요 + return refreshTokenCookie; + } + + @NotNull + private AuthTokenRequest generateAndSaveAuthToken(final UserDetailRequest userDetailRequest) { + Account user = accountRepository.findById(userDetailRequest.userId()).orElse(null); - getRedirectStrategy().sendRedirect(request, response, targetUrl); + RefreshToken token = new RefreshToken(user); + String accessToken = tokenProvider.generateAccessToken(userDetailRequest); + String refreshToken = tokenProvider.generateRefreshToken(userDetailRequest, token.getId()); + + token.putRefreshToken(refreshToken); + tokenRepository.save(token); + return new AuthTokenRequest(accessToken, refreshToken); } - protected String determineTargetUrl(HttpServletRequest request, HttpServletResponse response, Authentication authentication) { + protected String determineTargetUrl(final HttpServletRequest request, final HttpServletResponse response, final Authentication authentication) { Optional redirectUri = CookieUtils.getCookie(request, REDIRECT_URI_PARAM_COOKIE_NAME) .map(Cookie::getValue); if(redirectUri.isPresent() && !isAuthorizedRedirectUri(redirectUri.get())) { throw new BusinessException(ErrorCode.INVALID_REDIRECT_URI); } - return redirectUri.orElse("http://localhost:3000"); + return redirectUri.orElse("http://localhost:3000"); // 로그인 성공 후 리다이렉트 url } - private boolean isAuthorizedRedirectUri(String uri) { + private boolean isAuthorizedRedirectUri(final String uri) { URI clientRedirectUri = URI.create(uri); return authorizedRedirectUris @@ -95,8 +125,8 @@ private boolean isAuthorizedRedirectUri(String uri) { }); } - protected void clearAuthenticationAttributes(HttpServletRequest request, HttpServletResponse response) { + protected void clearAuthenticationAttributes(final HttpServletRequest request, final HttpServletResponse response) { super.clearAuthenticationAttributes(request); httpCookieOAuth2AuthorizationRequestRepository.removeAuthorizationRequestCookies(request, response); } -} +} \ No newline at end of file diff --git a/src/main/java/com/example/api/oauth2/entity/handler/OAuth2ResponseHandler.java b/src/main/java/com/example/api/oauth2/entity/handler/OAuth2ResponseHandler.java index f9fdf06f..c01b8b20 100644 --- a/src/main/java/com/example/api/oauth2/entity/handler/OAuth2ResponseHandler.java +++ b/src/main/java/com/example/api/oauth2/entity/handler/OAuth2ResponseHandler.java @@ -5,6 +5,6 @@ import java.util.Map; public interface OAuth2ResponseHandler { - public boolean supports(String registrationId); - public OAuth2Response createResponse(Map attributes); -} + boolean supports(final String registrationId); + OAuth2Response createResponse(final Map attributes); +} \ No newline at end of file From 13ce08b48ca96d850b82fc0cf1a56642d6a91331 Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Sun, 29 Dec 2024 01:20:37 +0900 Subject: [PATCH 196/276] =?UTF-8?q?#50=20@Validated=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/api/oauth2/service/CustomOauth2UserService.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/oauth2/service/CustomOauth2UserService.java b/src/main/java/com/example/api/oauth2/service/CustomOauth2UserService.java index fad44ac8..d040216b 100644 --- a/src/main/java/com/example/api/oauth2/service/CustomOauth2UserService.java +++ b/src/main/java/com/example/api/oauth2/service/CustomOauth2UserService.java @@ -15,6 +15,7 @@ import org.springframework.security.oauth2.core.OAuth2AuthenticationException; import org.springframework.security.oauth2.core.user.OAuth2User; import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; import java.util.Collections; import java.util.List; @@ -28,7 +29,7 @@ public class CustomOauth2UserService extends DefaultOAuth2UserService { @Override @Transactional - public OAuth2User loadUser(final OAuth2UserRequest request) throws OAuth2AuthenticationException { + public OAuth2User loadUser(@Validated final OAuth2UserRequest request) throws OAuth2AuthenticationException { OAuth2User oAuth2User = super.loadUser(request); log.info(String.valueOf(oAuth2User)); From af1b24062047590ae6706651f521796e929ba914 Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Mon, 30 Dec 2024 16:34:05 +0900 Subject: [PATCH 197/276] =?UTF-8?q?#50=20Oauth2UserService=20=EA=B0=9D?= =?UTF-8?q?=EC=B2=B4=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EA=B2=80=EC=A6=9D=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/chat/service/ChatServiceTest.java | 95 ----------- .../service/CustomOauth2UserServiceTest.java | 153 ++++++++++++++++++ 2 files changed, 153 insertions(+), 95 deletions(-) delete mode 100644 src/test/java/com/example/api/chat/service/ChatServiceTest.java create mode 100644 src/test/java/com/example/api/oauth2/service/CustomOauth2UserServiceTest.java diff --git a/src/test/java/com/example/api/chat/service/ChatServiceTest.java b/src/test/java/com/example/api/chat/service/ChatServiceTest.java deleted file mode 100644 index 536ac74d..00000000 --- a/src/test/java/com/example/api/chat/service/ChatServiceTest.java +++ /dev/null @@ -1,95 +0,0 @@ -//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 java.util.List; -// -// -//@SpringBootTest() -//@Transactional -//@Rollback(false) -//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); -// } -//} diff --git a/src/test/java/com/example/api/oauth2/service/CustomOauth2UserServiceTest.java b/src/test/java/com/example/api/oauth2/service/CustomOauth2UserServiceTest.java new file mode 100644 index 00000000..5690b59f --- /dev/null +++ b/src/test/java/com/example/api/oauth2/service/CustomOauth2UserServiceTest.java @@ -0,0 +1,153 @@ +package com.example.api.oauth2.service; + +import com.github.tomakehurst.wiremock.core.WireMockConfiguration; +import org.jetbrains.annotations.NotNull; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.security.oauth2.client.registration.ClientRegistration; +import org.springframework.security.oauth2.client.userinfo.OAuth2UserRequest; +import org.springframework.security.oauth2.core.AuthorizationGrantType; +import org.springframework.security.oauth2.core.ClientAuthenticationMethod; +import org.springframework.security.oauth2.core.OAuth2AccessToken; +import org.springframework.security.oauth2.core.user.OAuth2User; +import com.github.tomakehurst.wiremock.WireMockServer; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; + +import static com.github.tomakehurst.wiremock.client.WireMock.*; +import static org.junit.jupiter.api.Assertions.*; + +@SpringBootTest +class CustomOauth2UserServiceTest { + @Autowired + private CustomOauth2UserService customOauth2UserService; + private WireMockServer kakaoWireMockServer; + private WireMockServer naverWireMockServer; + + @BeforeEach + void setupWireMock() { + setKakaoWireMockServer(); + setNaverWireMockServer(); + } + + @AfterEach + void teardownWireMock() { + if (kakaoWireMockServer != null) { + kakaoWireMockServer.stop(); + } + + if (naverWireMockServer != null) { + naverWireMockServer.stop(); + } + } + + @Test + void loadUser_kakao() { + ClientRegistration clientRegistration = setKakaoClientRegistration(); + OAuth2AccessToken token = new OAuth2AccessToken( + OAuth2AccessToken.TokenType.BEARER, + "mock-access-token", + null, + null + ); + OAuth2UserRequest mockRequest = new OAuth2UserRequest(clientRegistration, token); + + OAuth2User result = customOauth2UserService.loadUser(mockRequest); + assertNotNull(result); + assertEquals("danpat@kakao.com", result.getAttribute("email")); + assertEquals("단팥", result.getAttribute("name")); + } + + @Test + void loadUser_naver() { + ClientRegistration clientRegistration = setNaverClientRegistration(); + OAuth2AccessToken token = new OAuth2AccessToken( + OAuth2AccessToken.TokenType.BEARER, + "mock-access-token", + null, + null + ); + OAuth2UserRequest mockRequest = new OAuth2UserRequest(clientRegistration, token); + + OAuth2User result = customOauth2UserService.loadUser(mockRequest); + assertNotNull(result); + assertEquals("danpat@naver.com", result.getAttribute("email")); + assertEquals("단팥", result.getAttribute("name")); + } + + private void setNaverWireMockServer() { + naverWireMockServer = new WireMockServer(8090); // 포트 설정 + naverWireMockServer.start(); + naverWireMockServer.stubFor(get(urlEqualTo("/v1/nid/me")) + .withHeader("Authorization", matching("Bearer .*")) // Bearer 토큰 매칭 + .willReturn(aResponse() + .withHeader("Content-Type", "application/json") + .withStatus(200) + .withBody(""" + { + "resultcode": "00", + "message": "success", + "response": { + "id": "1234567890", + "email": "danpat@naver.com", + "name": "단팥" + } + }"""))); + } + + private void setKakaoWireMockServer() { + kakaoWireMockServer = new WireMockServer( + WireMockConfiguration.wireMockConfig().port(8089) + ); + kakaoWireMockServer.start(); + kakaoWireMockServer.stubFor(get(urlEqualTo("/v2/user/me")) + .withHeader("Authorization", matching("Bearer .*")) + .willReturn(aResponse() + .withHeader("Content-Type", "application/json") + .withBody(""" + { + "id": "0000000000", + "properties": { + "nickname": "단팥" + }, + "kakao_account": { + "email": "danpat@kakao.com" + } + }"""))); + } + + @NotNull + private ClientRegistration setKakaoClientRegistration() { + return ClientRegistration.withRegistrationId("kakao") + .clientId("mock-client-id") + .clientSecret("mock-client-secret") + .clientAuthenticationMethod(ClientAuthenticationMethod.CLIENT_SECRET_POST) + .authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE) + .redirectUri("{baseUrl}/login/oauth2/code/kakao") + .scope("profile", "email") + .authorizationUri("http://localhost:8089/oauth/authorize") + .tokenUri("http://localhost:8089/oauth/token") + .userInfoUri("http://localhost:8089/v2/user/me") + .userNameAttributeName("id") + .clientName("Kakao Mock Client") + .build(); + } + + @NotNull + private ClientRegistration setNaverClientRegistration() { + return ClientRegistration.withRegistrationId("naver") + .clientId("mock-client-id") + .clientSecret("mock-client-secret") + .clientAuthenticationMethod(ClientAuthenticationMethod.CLIENT_SECRET_POST) + .authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE) + .redirectUri("{baseUrl}/login/oauth2/code/naver") + .scope("profile", "email") + .authorizationUri("http://localhost:8090/oauth/authorize") + .tokenUri("http://localhost:8090/oauth/token") + .userInfoUri("http://localhost:8090/v1/nid/me") + .userNameAttributeName("response") + .clientName("Kakao Mock Client") + .build(); + } +} From d3bbb99467d980276286047530cb04a0f4a371ab Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Mon, 30 Dec 2024 16:34:43 +0900 Subject: [PATCH 198/276] =?UTF-8?q?#50=20Mockito,=20wireMock=20=EC=9D=98?= =?UTF-8?q?=EC=A1=B4=EC=84=B1=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 02c72b9a..55c7fb2c 100644 --- a/build.gradle +++ b/build.gradle @@ -33,7 +33,6 @@ dependencies { testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' - // WEB SOCKET implementation 'org.springframework.boot:spring-boot-starter-websocket' @@ -69,6 +68,12 @@ dependencies { // OAUTH2 implementation 'org.springframework.boot:spring-boot-starter-oauth2-client' + + // MOCKITO + testImplementation "org.mockito:mockito-core:3.+" + + //WIREMOCK (외부 의존성 테스트용) + implementation 'org.wiremock.integrations:wiremock-spring-boot:3.3.0' } tasks.named('test') { From 84cbacf82b05ac1194b9674f3d3a75c0d65c040e Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Mon, 30 Dec 2024 16:35:36 +0900 Subject: [PATCH 199/276] =?UTF-8?q?#50=20=EC=B6=A9=EB=8F=8C=EB=82=98?= =?UTF-8?q?=EB=8A=94=20=EA=B3=B5=ED=86=B5=20=ED=81=B4=EB=9E=98=EC=8A=A4=20?= =?UTF-8?q?=EB=B3=91=ED=95=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/account/service/AccountService.java | 6 ++++++ .../api/board/service/BoardService.java | 5 +---- .../api/board/service/EmployeeService.java | 9 ++++---- .../service/CustomOauth2UserService.java | 21 ++++++++++--------- .../PossibleBoardRepository.java | 2 +- .../api/global/BaseIntegrationTest.java | 2 +- 6 files changed, 25 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/example/api/account/service/AccountService.java b/src/main/java/com/example/api/account/service/AccountService.java index f0ea86f7..12c19108 100644 --- a/src/main/java/com/example/api/account/service/AccountService.java +++ b/src/main/java/com/example/api/account/service/AccountService.java @@ -29,6 +29,7 @@ public class AccountService { private final CodeRepository codeRepository; private final PasswordEncoder passwordEncoder; private final MailSender mailSender; + private final AccountRepository accountRepository; public Code sendEmail(@Validated final EmailRequest request) throws BusinessException { // 이미 가입된 이메일인지 검증 @@ -102,4 +103,9 @@ private void validateDuplicateEmail(final EmailRequest emailRequest) { throw new BusinessException(ErrorCode.DUPLICATE_EMAIL); } } + + public Account loadAccount(final Long requestMemberId) { + return accountRepository.findById(requestMemberId) + .orElseThrow(() -> new BusinessException(ErrorCode.ACCOUNT_NOT_FOUND_EXCEPTION)); + } } \ No newline at end of file diff --git a/src/main/java/com/example/api/board/service/BoardService.java b/src/main/java/com/example/api/board/service/BoardService.java index 87f82ae1..7d9e967b 100644 --- a/src/main/java/com/example/api/board/service/BoardService.java +++ b/src/main/java/com/example/api/board/service/BoardService.java @@ -3,10 +3,7 @@ import com.example.api.board.controller.domain.request.EmployeeIdRequest; import com.example.api.board.controller.domain.response.MyInfoDTO; -import com.example.api.domain.repository.ExternalCareerRepository; -import com.example.api.domain.repository.FlavoredRepository; -import com.example.api.domain.repository.MyInfoRepository; -import com.example.api.domain.repository.OfferEmploymentRepository; +import com.example.api.domain.repository.*; import com.example.api.possbileboard.PossibleBoardRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; diff --git a/src/main/java/com/example/api/board/service/EmployeeService.java b/src/main/java/com/example/api/board/service/EmployeeService.java index a8d7e01d..f85d8444 100644 --- a/src/main/java/com/example/api/board/service/EmployeeService.java +++ b/src/main/java/com/example/api/board/service/EmployeeService.java @@ -14,13 +14,14 @@ import com.example.api.domain.repository.ExternalCareerRepository; import com.example.api.domain.repository.FlavoredRepository; import com.example.api.possbileboard.PossibleBoardRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; + import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.stream.Collectors; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Repository; -import org.springframework.transaction.annotation.Transactional; @Repository @RequiredArgsConstructor @@ -117,4 +118,4 @@ public void updatePossibleBoard(Account employee, List newPoss possibleBoardRepository.deleteAll(toDelete); possibleBoardRepository.saveAll(ToAdd); } -} +} \ No newline at end of file diff --git a/src/main/java/com/example/api/oauth2/service/CustomOauth2UserService.java b/src/main/java/com/example/api/oauth2/service/CustomOauth2UserService.java index d040216b..4702091e 100644 --- a/src/main/java/com/example/api/oauth2/service/CustomOauth2UserService.java +++ b/src/main/java/com/example/api/oauth2/service/CustomOauth2UserService.java @@ -30,8 +30,9 @@ public class CustomOauth2UserService extends DefaultOAuth2UserService { @Override @Transactional public OAuth2User loadUser(@Validated final OAuth2UserRequest request) throws OAuth2AuthenticationException { + log.info("OAuth2UserRequest: {}", request.getAdditionalParameters()); OAuth2User oAuth2User = super.loadUser(request); - log.info(String.valueOf(oAuth2User)); + log.info("OAuth2User : {} ", oAuth2User); String registrationId = request.getClientRegistration().getRegistrationId(); OAuth2Response oAuth2Response = createOAuth2Response(registrationId, oAuth2User); @@ -44,6 +45,15 @@ public OAuth2User loadUser(@Validated final OAuth2UserRequest request) throws OA return new CustomUserDetails(user.getAccountId(), user.getName(), user.getEmail(), user.getRoles()); } + private OAuth2Response createOAuth2Response(final String registrationId, final OAuth2User oAuth2User) { + for (OAuth2ResponseHandler oauth2ResponseHandler : oauth2ResponseHandlers) { + if(oauth2ResponseHandler.supports(registrationId)) { + return oauth2ResponseHandler.createResponse(oAuth2User.getAttributes()); + } + } + return null; + } + private CustomUserDetails saveOauth2Account(final Oauth2UserInfoRequest userInfo) { Account account = new Account( userInfo.name(), @@ -53,13 +63,4 @@ private CustomUserDetails saveOauth2Account(final Oauth2UserInfoRequest userInfo Account savedUser = accountRepository.save(account); return new CustomUserDetails(savedUser.getAccountId(), savedUser.getName(), savedUser.getEmail(), savedUser.getRoles()); } - - private OAuth2Response createOAuth2Response(final String registrationId, final OAuth2User oAuth2User) { - for (OAuth2ResponseHandler oauth2ResponseHandler : oauth2ResponseHandlers) { - if(oauth2ResponseHandler.supports(registrationId)) { - return oauth2ResponseHandler.createResponse(oAuth2User.getAttributes()); - } - } - return null; - } } \ No newline at end of file diff --git a/src/main/java/com/example/api/possbileboard/PossibleBoardRepository.java b/src/main/java/com/example/api/possbileboard/PossibleBoardRepository.java index e4c6c758..7bedfcb7 100644 --- a/src/main/java/com/example/api/possbileboard/PossibleBoardRepository.java +++ b/src/main/java/com/example/api/possbileboard/PossibleBoardRepository.java @@ -21,7 +21,7 @@ public interface PossibleBoardRepository extends JpaRepository Date: Mon, 6 Jan 2025 17:04:32 +0900 Subject: [PATCH 200/276] =?UTF-8?q?#50=20application-test.properties=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/account/service/AccountService.java | 11 ++---- .../possbileboard/dto/PossibleDetails.java | 2 +- .../resources/application-test.properties | 35 ++++++++++++++++++- 3 files changed, 38 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/example/api/account/service/AccountService.java b/src/main/java/com/example/api/account/service/AccountService.java index 12c19108..b121c6db 100644 --- a/src/main/java/com/example/api/account/service/AccountService.java +++ b/src/main/java/com/example/api/account/service/AccountService.java @@ -12,10 +12,11 @@ import com.example.api.domain.Account; import com.example.api.exception.BusinessException; import com.example.api.exception.ErrorCode; -import jakarta.transaction.Transactional; + import lombok.RequiredArgsConstructor; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import java.util.Collection; @@ -29,7 +30,6 @@ public class AccountService { private final CodeRepository codeRepository; private final PasswordEncoder passwordEncoder; private final MailSender mailSender; - private final AccountRepository accountRepository; public Code sendEmail(@Validated final EmailRequest request) throws BusinessException { // 이미 가입된 이메일인지 검증 @@ -70,7 +70,7 @@ public String signUp(@Validated final SignUpRequest request) { return "회원가입이 완료되었습니다"; } - @org.springframework.transaction.annotation.Transactional(readOnly = true) + @Transactional(readOnly = true) public Account loadAccount(final Long requestMemberId) { return accountRepository.findById(requestMemberId) .orElseThrow(() -> new BusinessException(ErrorCode.ACCOUNT_NOT_FOUND_EXCEPTION)); @@ -103,9 +103,4 @@ private void validateDuplicateEmail(final EmailRequest emailRequest) { throw new BusinessException(ErrorCode.DUPLICATE_EMAIL); } } - - public Account loadAccount(final Long requestMemberId) { - return accountRepository.findById(requestMemberId) - .orElseThrow(() -> new BusinessException(ErrorCode.ACCOUNT_NOT_FOUND_EXCEPTION)); - } } \ No newline at end of file diff --git a/src/main/java/com/example/api/possbileboard/dto/PossibleDetails.java b/src/main/java/com/example/api/possbileboard/dto/PossibleDetails.java index ccb3799f..4f878549 100644 --- a/src/main/java/com/example/api/possbileboard/dto/PossibleDetails.java +++ b/src/main/java/com/example/api/possbileboard/dto/PossibleDetails.java @@ -11,6 +11,6 @@ public record PossibleDetails( LocalDateTime possibleStartTime, LocalDateTime possibleEndTime, Long contractCount, - Double starPoint + Integer starPoint ) { } diff --git a/src/test/resources/application-test.properties b/src/test/resources/application-test.properties index 76657fc4..7b320cb3 100644 --- a/src/test/resources/application-test.properties +++ b/src/test/resources/application-test.properties @@ -1,2 +1,35 @@ +spring.config.import=optional:file:.env[.properties] + spring.jpa.hibernate.ddl-auto=create -spring.sql.init.mode=always \ No newline at end of file +spring.sql.init.mode=always + +# kakao Oauth2 ?? +spring.security.oauth2.client.registration.kakao.client-id=${KAKAO_CLIENT_ID} +spring.security.oauth2.client.registration.kakao.client-secret=${KAKAO_CLIENT_SECRET} +spring.security.oauth2.client.registration.kakao.redirect-uri={baseUrl}/oauth2/callback/{registrationId} +spring.security.oauth2.client.registration.kakao.authorization-grant-type=authorization_code +spring.security.oauth2.client.registration.kakao.client-authentication-method=client_secret_post +spring.security.oauth2.client.registration.kakao.scope=profile_nickname,account_email + +# kakao Oauth2 Provider ?? +spring.security.oauth2.client.provider.kakao.authorization-uri=https://kauth.kakao.com/oauth/authorize +spring.security.oauth2.client.provider.kakao.token-uri=https://kauth.kakao.com/oauth/token +spring.security.oauth2.client.provider.kakao.user-info-uri=https://kapi.kakao.com/v2/user/me +spring.security.oauth2.client.provider.kakao.user-name-attribute=id + +# naver Oauth2 ?? +spring.security.oauth2.client.registration.naver.client-id=${NAVER_CLIENT_ID} +spring.security.oauth2.client.registration.naver.client-secret=${NAVER_CLIENT_SECRET} +spring.security.oauth2.client.registration.naver.redirect-uri={baseUrl}/oauth2/callback/{registrationId} +spring.security.oauth2.client.registration.naver.authorization-grant-type=authorization_code +spring.security.oauth2.client.registration.naver.client-authentication-method=client_secret_basic +spring.security.oauth2.client.registration.naver.scope=name,email + +# naver Oauth2 Provider ?? +spring.security.oauth2.client.provider.naver.authorization-uri=https://nid.naver.com/oauth2.0/authorize +spring.security.oauth2.client.provider.naver.token-uri=https://nid.naver.com/oauth2.0/token +spring.security.oauth2.client.provider.naver.user-info-uri=https://openapi.naver.com/v1/nid/me +spring.security.oauth2.client.provider.naver.user-name-attribute=response + +# redirect allow path +app.oauth2.authorized-redirect-uris=* \ No newline at end of file From a998a78110b5e40f48747fa637f3208e7836b21c Mon Sep 17 00:00:00 2001 From: huhdy32 Date: Sat, 11 Jan 2025 18:29:33 +0900 Subject: [PATCH 201/276] =?UTF-8?q?78=20feat:=20=EA=B0=80=EA=B2=8C=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=20=EC=88=98=EC=A0=95=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/business/BusinessController.java | 38 +++++++++++++++ .../api/business/BusinessRepository.java | 4 +- .../example/api/business/BusinessService.java | 12 +++++ .../business/dto/ModifyBusinessCommand.java | 14 ++++++ .../update/BusinessUpdateHandler.java | 8 ++++ .../update/BusinessUpdateManager.java | 18 +++++++ .../UpdateBusinessCategoriesHandlerImpl.java | 48 +++++++++++++++++++ .../update/UpdateBusinessLocationHandler.java | 19 ++++++++ .../update/UpdateBusinessNameHandler.java | 19 ++++++++ ...dateBusinessRepresentationNameHandler.java | 19 ++++++++ .../java/com/example/api/domain/Business.java | 7 +++ .../example/api/domain/BusinessCategory.java | 7 +++ .../com/example/api/exception/ErrorCode.java | 4 +- 13 files changed, 213 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/example/api/business/BusinessController.java create mode 100644 src/main/java/com/example/api/business/dto/ModifyBusinessCommand.java create mode 100644 src/main/java/com/example/api/business/update/BusinessUpdateHandler.java create mode 100644 src/main/java/com/example/api/business/update/BusinessUpdateManager.java create mode 100644 src/main/java/com/example/api/business/update/UpdateBusinessCategoriesHandlerImpl.java create mode 100644 src/main/java/com/example/api/business/update/UpdateBusinessLocationHandler.java create mode 100644 src/main/java/com/example/api/business/update/UpdateBusinessNameHandler.java create mode 100644 src/main/java/com/example/api/business/update/UpdateBusinessRepresentationNameHandler.java diff --git a/src/main/java/com/example/api/business/BusinessController.java b/src/main/java/com/example/api/business/BusinessController.java new file mode 100644 index 00000000..a628d1d4 --- /dev/null +++ b/src/main/java/com/example/api/business/BusinessController.java @@ -0,0 +1,38 @@ +package com.example.api.business; + +import com.example.api.business.dto.ModifyBusinessCommand; +import jakarta.validation.constraints.NotNull; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +public class BusinessController { + private final BusinessService businessService; + + @PutMapping("/api/v1/business") + public ResponseEntity modifyMyBusiness( + @RequestBody final ModifyBusinessRequest request + ) { + final ModifyBusinessCommand command = request.toCommand(); + businessService.updateBusiness(command); + return ResponseEntity.ok().build(); + } + + record ModifyBusinessRequest( + @NotNull + Long businessId, + String businessName, + String location, + String representationName, + List categoryId + ) { + ModifyBusinessCommand toCommand() { + return new ModifyBusinessCommand(businessId, businessName, location, representationName, categoryId); + } + } +} diff --git a/src/main/java/com/example/api/business/BusinessRepository.java b/src/main/java/com/example/api/business/BusinessRepository.java index 19d6a104..8462c084 100644 --- a/src/main/java/com/example/api/business/BusinessRepository.java +++ b/src/main/java/com/example/api/business/BusinessRepository.java @@ -1,11 +1,9 @@ package com.example.api.business; import com.example.api.domain.Business; -import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; +@Repository public interface BusinessRepository extends JpaRepository { } diff --git a/src/main/java/com/example/api/business/BusinessService.java b/src/main/java/com/example/api/business/BusinessService.java index bdb9ad58..3a59be10 100644 --- a/src/main/java/com/example/api/business/BusinessService.java +++ b/src/main/java/com/example/api/business/BusinessService.java @@ -1,5 +1,7 @@ package com.example.api.business; +import com.example.api.business.dto.ModifyBusinessCommand; +import com.example.api.business.update.BusinessUpdateManager; import com.example.api.domain.repository.BusinessCategoryRepository; import com.example.api.domain.Account; import com.example.api.domain.Business; @@ -9,6 +11,8 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; @Service @Slf4j @@ -17,6 +21,7 @@ public class BusinessService { private final BusinessRepository businessRepository; private final BusinessCategoryRepository categoryRepository; + private final BusinessUpdateManager businessUpdateManager; // @Transactional(readOnly = true) // public BusinessDetailsResponse loadDetails(@Validated final QueryBusinessDetailCommand queryBusinessDetailCommand) { @@ -28,4 +33,11 @@ public class BusinessService { // final BusinessOwner owner = new BusinessOwner(account.getAccountId(), account.getName()); // return new BusinessDetailsResponse(business.getBusinessName(), business.getBusinessId(), owner, business.getLocation(), categoryInfos); // } + + @Transactional + public void updateBusiness(@Validated final ModifyBusinessCommand command) { + final Business targetBusiness = businessRepository.findById(command.businessId()) + .orElseThrow(); + businessUpdateManager.update(targetBusiness, command); + } } diff --git a/src/main/java/com/example/api/business/dto/ModifyBusinessCommand.java b/src/main/java/com/example/api/business/dto/ModifyBusinessCommand.java new file mode 100644 index 00000000..87b4efc4 --- /dev/null +++ b/src/main/java/com/example/api/business/dto/ModifyBusinessCommand.java @@ -0,0 +1,14 @@ +package com.example.api.business.dto; + +import jakarta.validation.constraints.NotNull; +import java.util.List; + +public record ModifyBusinessCommand( + @NotNull + Long businessId, + String businessName, + String location, + String representationName, + List categoryIds +) { +} diff --git a/src/main/java/com/example/api/business/update/BusinessUpdateHandler.java b/src/main/java/com/example/api/business/update/BusinessUpdateHandler.java new file mode 100644 index 00000000..cc6de5d1 --- /dev/null +++ b/src/main/java/com/example/api/business/update/BusinessUpdateHandler.java @@ -0,0 +1,8 @@ +package com.example.api.business.update; + +import com.example.api.business.dto.ModifyBusinessCommand; +import com.example.api.domain.Business; + +interface BusinessUpdateHandler { + void update(final Business business, final ModifyBusinessCommand command); +} diff --git a/src/main/java/com/example/api/business/update/BusinessUpdateManager.java b/src/main/java/com/example/api/business/update/BusinessUpdateManager.java new file mode 100644 index 00000000..0ea7849e --- /dev/null +++ b/src/main/java/com/example/api/business/update/BusinessUpdateManager.java @@ -0,0 +1,18 @@ +package com.example.api.business.update; + +import com.example.api.business.dto.ModifyBusinessCommand; +import com.example.api.domain.Business; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class BusinessUpdateManager { + private final List updateHandlers; + + public void update(final Business business, final ModifyBusinessCommand command) { + updateHandlers.stream() + .forEach(businessUpdateHandler -> businessUpdateHandler.update(business, command)); + } +} diff --git a/src/main/java/com/example/api/business/update/UpdateBusinessCategoriesHandlerImpl.java b/src/main/java/com/example/api/business/update/UpdateBusinessCategoriesHandlerImpl.java new file mode 100644 index 00000000..bd8a9a92 --- /dev/null +++ b/src/main/java/com/example/api/business/update/UpdateBusinessCategoriesHandlerImpl.java @@ -0,0 +1,48 @@ +package com.example.api.business.update; + +import com.example.api.business.dto.ModifyBusinessCommand; +import com.example.api.domain.Business; +import com.example.api.domain.BusinessCategory; +import com.example.api.domain.Category; +import com.example.api.domain.repository.BusinessCategoryRepository; +import com.example.api.domain.repository.CategoryRepository; +import com.example.api.exception.BusinessException; +import com.example.api.exception.ErrorCode; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +@Service +@Transactional(propagation = Propagation.MANDATORY) +@RequiredArgsConstructor +public class UpdateBusinessCategoriesHandlerImpl implements BusinessUpdateHandler { + private final CategoryRepository categoryRepository; + private final BusinessCategoryRepository businessCategoryRepository; + + @Override + public void update(Business business, ModifyBusinessCommand command) { + if (Objects.isNull(command.categoryIds())) { + return; + } + final List businessCategories = findRelatedCategories(command.categoryIds()).stream() + .map(category -> new BusinessCategory(business, category)) + .collect(Collectors.toList()); + businessCategoryRepository.saveAll(businessCategories); + } + + private List findRelatedCategories(final List categoryIds) { + final List categories = categoryRepository.findAllById(categoryIds); + validate(categories.size(), categoryIds.size()); + return categories; + } + + private void validate(final int requestCategorySize, final int foundedSize) { + if (foundedSize != requestCategorySize) { + throw new BusinessException("카테고리를 찾을 수 없습니다.", ErrorCode.CATEGORY_EXCEPTION); + } + } +} diff --git a/src/main/java/com/example/api/business/update/UpdateBusinessLocationHandler.java b/src/main/java/com/example/api/business/update/UpdateBusinessLocationHandler.java new file mode 100644 index 00000000..0cab29af --- /dev/null +++ b/src/main/java/com/example/api/business/update/UpdateBusinessLocationHandler.java @@ -0,0 +1,19 @@ +package com.example.api.business.update; + +import com.example.api.business.dto.ModifyBusinessCommand; +import com.example.api.domain.Business; +import java.util.Objects; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +@Service +@Transactional(propagation = Propagation.MANDATORY) +class UpdateBusinessLocationHandler implements BusinessUpdateHandler{ + @Override + public void update(Business business, ModifyBusinessCommand command) { + if (Objects.nonNull(command.location())) { + business.setLocation(command.location()); + } + } +} diff --git a/src/main/java/com/example/api/business/update/UpdateBusinessNameHandler.java b/src/main/java/com/example/api/business/update/UpdateBusinessNameHandler.java new file mode 100644 index 00000000..01d81ac2 --- /dev/null +++ b/src/main/java/com/example/api/business/update/UpdateBusinessNameHandler.java @@ -0,0 +1,19 @@ +package com.example.api.business.update; + +import com.example.api.business.dto.ModifyBusinessCommand; +import com.example.api.domain.Business; +import java.util.Objects; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +@Service +@Transactional(propagation = Propagation.MANDATORY) +class UpdateBusinessNameHandler implements BusinessUpdateHandler { + @Override + public void update(Business business, ModifyBusinessCommand command) { + if (Objects.nonNull(command.businessName())) { + business.setBusinessName(command.businessName()); + } + } +} diff --git a/src/main/java/com/example/api/business/update/UpdateBusinessRepresentationNameHandler.java b/src/main/java/com/example/api/business/update/UpdateBusinessRepresentationNameHandler.java new file mode 100644 index 00000000..08f8dbef --- /dev/null +++ b/src/main/java/com/example/api/business/update/UpdateBusinessRepresentationNameHandler.java @@ -0,0 +1,19 @@ +package com.example.api.business.update; + +import com.example.api.business.dto.ModifyBusinessCommand; +import com.example.api.domain.Business; +import java.util.Objects; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +@Service +@Transactional(propagation = Propagation.MANDATORY) +public class UpdateBusinessRepresentationNameHandler implements BusinessUpdateHandler { + @Override + public void update(Business business, ModifyBusinessCommand command) { + if (Objects.nonNull(command.representationName())) { + business.setRepresentationName(command.representationName()); + } + } +} diff --git a/src/main/java/com/example/api/domain/Business.java b/src/main/java/com/example/api/domain/Business.java index a2a77e08..ac8236ff 100644 --- a/src/main/java/com/example/api/domain/Business.java +++ b/src/main/java/com/example/api/domain/Business.java @@ -42,4 +42,11 @@ public class Business extends BaseEntity { @Column(name = "BUSINESS_REGISTRATION_NUMBER") private String registrationNumber; + public void setBusinessName(String businessName) { + this.businessName = businessName; + } + + public void setLocation(String location) { + this.location = location; + } } diff --git a/src/main/java/com/example/api/domain/BusinessCategory.java b/src/main/java/com/example/api/domain/BusinessCategory.java index 9141e0a9..b052014d 100644 --- a/src/main/java/com/example/api/domain/BusinessCategory.java +++ b/src/main/java/com/example/api/domain/BusinessCategory.java @@ -3,6 +3,7 @@ import jakarta.persistence.*; import lombok.EqualsAndHashCode; import lombok.Getter; +import lombok.NoArgsConstructor; import lombok.Setter; import java.util.List; @@ -14,6 +15,7 @@ @Setter @EqualsAndHashCode(callSuper = false) @Table(name = "BUSINESS_CATEGORY") +@NoArgsConstructor public class BusinessCategory extends BaseEntity{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -27,5 +29,10 @@ public class BusinessCategory extends BaseEntity{ @ManyToOne(fetch = LAZY) @JoinColumn(name = "CATEGOREY_ID") private Category category; + + public BusinessCategory(Business business, Category category) { + this.business = business; + this.category = category; + } } diff --git a/src/main/java/com/example/api/exception/ErrorCode.java b/src/main/java/com/example/api/exception/ErrorCode.java index 2b5bc142..96e739bb 100644 --- a/src/main/java/com/example/api/exception/ErrorCode.java +++ b/src/main/java/com/example/api/exception/ErrorCode.java @@ -30,7 +30,9 @@ public enum ErrorCode { ACCOUNT_NOT_FOUND_EXCEPTION(HttpStatus.BAD_REQUEST, "-101", "찾을 수 없는 계정"), - POSSIBLE_TIME_REGISTER_EXCEPTION(HttpStatus.BAD_REQUEST, "-401", "알바 가능 시간 등록 에러"); + POSSIBLE_TIME_REGISTER_EXCEPTION(HttpStatus.BAD_REQUEST, "-401", "알바 가능 시간 등록 에러"), + + CATEGORY_EXCEPTION(HttpStatus.BAD_REQUEST, "-601", "카테고리 에러"); private final HttpStatus httpStatus; private final String errorCode; From 035db07404f5ba072be405a3847ef4beac749a23 Mon Sep 17 00:00:00 2001 From: huhdy32 Date: Mon, 13 Jan 2025 10:29:05 +0900 Subject: [PATCH 202/276] =?UTF-8?q?#78=20feat:=20=EA=B0=80=EA=B2=8C=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=20=EC=B6=94=EA=B0=80=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/api/business/BusinessService.java | 40 +++++++++++-------- .../{ => controller}/BusinessController.java | 30 +++++++++++++- .../api/business/domain/BusinessLocation.java | 12 ++++++ .../api/business/domain/BusinessName.java | 26 ++++++++++++ .../domain/BusinessRepresentationName.java | 12 ++++++ .../api/business/dto/AddBusinessCommand.java | 15 +++++++ .../update/UpdateBusinessLocationHandler.java | 4 +- .../update/UpdateBusinessNameHandler.java | 4 +- ...dateBusinessRepresentationNameHandler.java | 4 +- .../java/com/example/api/domain/Business.java | 8 ++++ .../com/example/api/exception/ErrorCode.java | 3 +- 11 files changed, 135 insertions(+), 23 deletions(-) rename src/main/java/com/example/api/business/{ => controller}/BusinessController.java (54%) create mode 100644 src/main/java/com/example/api/business/domain/BusinessLocation.java create mode 100644 src/main/java/com/example/api/business/domain/BusinessName.java create mode 100644 src/main/java/com/example/api/business/domain/BusinessRepresentationName.java create mode 100644 src/main/java/com/example/api/business/dto/AddBusinessCommand.java diff --git a/src/main/java/com/example/api/business/BusinessService.java b/src/main/java/com/example/api/business/BusinessService.java index 3a59be10..cf98a7be 100644 --- a/src/main/java/com/example/api/business/BusinessService.java +++ b/src/main/java/com/example/api/business/BusinessService.java @@ -1,13 +1,15 @@ package com.example.api.business; +import com.example.api.business.dto.AddBusinessCommand; import com.example.api.business.dto.ModifyBusinessCommand; import com.example.api.business.update.BusinessUpdateManager; -import com.example.api.domain.repository.BusinessCategoryRepository; -import com.example.api.domain.Account; import com.example.api.domain.Business; -import com.example.api.exception.BusinessException; -import com.example.api.exception.ErrorCode; +import com.example.api.domain.BusinessCategory; +import com.example.api.domain.Category; +import com.example.api.domain.repository.BusinessCategoryRepository; +import com.example.api.domain.repository.CategoryRepository; import java.util.List; +import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -18,21 +20,10 @@ @Slf4j @RequiredArgsConstructor public class BusinessService { - private final BusinessRepository businessRepository; - private final BusinessCategoryRepository categoryRepository; + private final BusinessCategoryRepository businessCategoryRepository; private final BusinessUpdateManager businessUpdateManager; - -// @Transactional(readOnly = true) -// public BusinessDetailsResponse loadDetails(@Validated final QueryBusinessDetailCommand queryBusinessDetailCommand) { -// final Business business = businessRepository.findById(queryBusinessDetailCommand.businessId()) -// .orElseThrow(() -> new BusinessException(ErrorCode.NO_SUCH_BUSINESS_EXCEPTION)); -// final Account account = business.getEmployer(); -// -// final List categoryInfos = categoryRepository.queryBusinessCategoriesById(queryBusinessDetailCommand.businessId()); -// final BusinessOwner owner = new BusinessOwner(account.getAccountId(), account.getName()); -// return new BusinessDetailsResponse(business.getBusinessName(), business.getBusinessId(), owner, business.getLocation(), categoryInfos); -// } + private final CategoryRepository categoryRepository; @Transactional public void updateBusiness(@Validated final ModifyBusinessCommand command) { @@ -40,4 +31,19 @@ public void updateBusiness(@Validated final ModifyBusinessCommand command) { .orElseThrow(); businessUpdateManager.update(targetBusiness, command); } + + @Transactional + public void addBusiness(@Validated final AddBusinessCommand command) { + final Business business = new Business(command.businessName(), command.location(), command.representationName()); + final List businessCategories = loadCategories(command.categoryIds(), business); + businessRepository.save(business); + businessCategoryRepository.saveAll(businessCategories); + } + + private List loadCategories(final List categoryIds, final Business business) { + final List categories = categoryRepository.findAllById(categoryIds); + return categories.stream() + .map(category -> new BusinessCategory(business, category)) + .toList(); + } } diff --git a/src/main/java/com/example/api/business/BusinessController.java b/src/main/java/com/example/api/business/controller/BusinessController.java similarity index 54% rename from src/main/java/com/example/api/business/BusinessController.java rename to src/main/java/com/example/api/business/controller/BusinessController.java index a628d1d4..f19e4003 100644 --- a/src/main/java/com/example/api/business/BusinessController.java +++ b/src/main/java/com/example/api/business/controller/BusinessController.java @@ -1,20 +1,25 @@ -package com.example.api.business; +package com.example.api.business.controller; +import com.example.api.business.BusinessService; +import com.example.api.business.dto.AddBusinessCommand; import com.example.api.business.dto.ModifyBusinessCommand; import jakarta.validation.constraints.NotNull; import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; +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.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController +@RequestMapping("/api/v1/business") @RequiredArgsConstructor public class BusinessController { private final BusinessService businessService; - @PutMapping("/api/v1/business") + @PutMapping public ResponseEntity modifyMyBusiness( @RequestBody final ModifyBusinessRequest request ) { @@ -23,6 +28,27 @@ public ResponseEntity modifyMyBusiness( return ResponseEntity.ok().build(); } + @PostMapping + public ResponseEntity addBusiness( + @RequestBody final AddBusinessRequest request + ) { + final AddBusinessCommand command = request.toCommand(); + businessService.addBusiness(command); + return ResponseEntity.ok().build(); + } + + record AddBusinessRequest( + Long requestMemberId, + String businessName, + String location, + List categoryIds, + String representationName + ) { + AddBusinessCommand toCommand() { + return new AddBusinessCommand(requestMemberId, businessName, location, categoryIds, representationName); + } + } + record ModifyBusinessRequest( @NotNull Long businessId, diff --git a/src/main/java/com/example/api/business/domain/BusinessLocation.java b/src/main/java/com/example/api/business/domain/BusinessLocation.java new file mode 100644 index 00000000..38236a0f --- /dev/null +++ b/src/main/java/com/example/api/business/domain/BusinessLocation.java @@ -0,0 +1,12 @@ +package com.example.api.business.domain; + +import lombok.Getter; + +@Getter +public class BusinessLocation { + private final String location; + + public BusinessLocation(String location) { + this.location = location; + } +} diff --git a/src/main/java/com/example/api/business/domain/BusinessName.java b/src/main/java/com/example/api/business/domain/BusinessName.java new file mode 100644 index 00000000..d1432f8c --- /dev/null +++ b/src/main/java/com/example/api/business/domain/BusinessName.java @@ -0,0 +1,26 @@ +package com.example.api.business.domain; + +import com.example.api.exception.BusinessException; +import com.example.api.exception.ErrorCode; +import lombok.Getter; + +@Getter +public class BusinessName { + private static final int NAME_MAX_LENGTH = 20; + private static final int NAME_MIN_LENGTH = 1; + private final String name; + + public BusinessName(final String name) { + validateLength(name); + this.name = name; + } + + private void validateLength(final String name) { + if (NAME_MIN_LENGTH > name.length()) { + throw new BusinessException(NAME_MIN_LENGTH + " 이상이여야 합니다.", ErrorCode.BUSINESS_DOMAIN_EXCEPTION); + } + if (NAME_MAX_LENGTH < name.length()) { + throw new BusinessException(NAME_MAX_LENGTH + " 이히이여야 합니다.", ErrorCode.BUSINESS_DOMAIN_EXCEPTION); + } + } +} diff --git a/src/main/java/com/example/api/business/domain/BusinessRepresentationName.java b/src/main/java/com/example/api/business/domain/BusinessRepresentationName.java new file mode 100644 index 00000000..e5cd05ab --- /dev/null +++ b/src/main/java/com/example/api/business/domain/BusinessRepresentationName.java @@ -0,0 +1,12 @@ +package com.example.api.business.domain; + +import lombok.Getter; + +@Getter +public class BusinessRepresentationName { + private final String representationName; + + public BusinessRepresentationName(String representationName) { + this.representationName = representationName; + } +} diff --git a/src/main/java/com/example/api/business/dto/AddBusinessCommand.java b/src/main/java/com/example/api/business/dto/AddBusinessCommand.java new file mode 100644 index 00000000..0c7cc344 --- /dev/null +++ b/src/main/java/com/example/api/business/dto/AddBusinessCommand.java @@ -0,0 +1,15 @@ +package com.example.api.business.dto; + +import jakarta.validation.constraints.NotNull; +import java.util.List; + +public record AddBusinessCommand( + @NotNull + Long requestMemberId, + String businessName, + String location, + List categoryIds, + String representationName + +) { +} diff --git a/src/main/java/com/example/api/business/update/UpdateBusinessLocationHandler.java b/src/main/java/com/example/api/business/update/UpdateBusinessLocationHandler.java index 0cab29af..3ae94cc7 100644 --- a/src/main/java/com/example/api/business/update/UpdateBusinessLocationHandler.java +++ b/src/main/java/com/example/api/business/update/UpdateBusinessLocationHandler.java @@ -1,5 +1,6 @@ package com.example.api.business.update; +import com.example.api.business.domain.BusinessLocation; import com.example.api.business.dto.ModifyBusinessCommand; import com.example.api.domain.Business; import java.util.Objects; @@ -13,7 +14,8 @@ class UpdateBusinessLocationHandler implements BusinessUpdateHandler{ @Override public void update(Business business, ModifyBusinessCommand command) { if (Objects.nonNull(command.location())) { - business.setLocation(command.location()); + final BusinessLocation location = new BusinessLocation(command.location()); + business.setLocation(location.getLocation()); } } } diff --git a/src/main/java/com/example/api/business/update/UpdateBusinessNameHandler.java b/src/main/java/com/example/api/business/update/UpdateBusinessNameHandler.java index 01d81ac2..a4b116f2 100644 --- a/src/main/java/com/example/api/business/update/UpdateBusinessNameHandler.java +++ b/src/main/java/com/example/api/business/update/UpdateBusinessNameHandler.java @@ -1,5 +1,6 @@ package com.example.api.business.update; +import com.example.api.business.domain.BusinessName; import com.example.api.business.dto.ModifyBusinessCommand; import com.example.api.domain.Business; import java.util.Objects; @@ -13,7 +14,8 @@ class UpdateBusinessNameHandler implements BusinessUpdateHandler { @Override public void update(Business business, ModifyBusinessCommand command) { if (Objects.nonNull(command.businessName())) { - business.setBusinessName(command.businessName()); + final BusinessName businessName = new BusinessName(command.businessName()); + business.setBusinessName(businessName.getName()); } } } diff --git a/src/main/java/com/example/api/business/update/UpdateBusinessRepresentationNameHandler.java b/src/main/java/com/example/api/business/update/UpdateBusinessRepresentationNameHandler.java index 08f8dbef..079406ec 100644 --- a/src/main/java/com/example/api/business/update/UpdateBusinessRepresentationNameHandler.java +++ b/src/main/java/com/example/api/business/update/UpdateBusinessRepresentationNameHandler.java @@ -1,5 +1,6 @@ package com.example.api.business.update; +import com.example.api.business.domain.BusinessRepresentationName; import com.example.api.business.dto.ModifyBusinessCommand; import com.example.api.domain.Business; import java.util.Objects; @@ -13,7 +14,8 @@ public class UpdateBusinessRepresentationNameHandler implements BusinessUpdateHa @Override public void update(Business business, ModifyBusinessCommand command) { if (Objects.nonNull(command.representationName())) { - business.setRepresentationName(command.representationName()); + final BusinessRepresentationName representationName = new BusinessRepresentationName(command.representationName()); + business.setRepresentationName(representationName.getRepresentationName()); } } } diff --git a/src/main/java/com/example/api/domain/Business.java b/src/main/java/com/example/api/domain/Business.java index ac8236ff..230e6bc5 100644 --- a/src/main/java/com/example/api/domain/Business.java +++ b/src/main/java/com/example/api/domain/Business.java @@ -3,6 +3,7 @@ import jakarta.persistence.*; import lombok.EqualsAndHashCode; import lombok.Getter; +import lombok.NoArgsConstructor; import lombok.Setter; import java.time.LocalDate; @@ -16,6 +17,7 @@ @Setter @EqualsAndHashCode(callSuper = false) @Table(name = "BUSINESS") +@NoArgsConstructor public class Business extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -49,4 +51,10 @@ public void setBusinessName(String businessName) { public void setLocation(String location) { this.location = location; } + + public Business(String businessName, String location, String representationName) { + this.businessName = businessName; + this.location = location; + this.representationName = representationName; + } } diff --git a/src/main/java/com/example/api/exception/ErrorCode.java b/src/main/java/com/example/api/exception/ErrorCode.java index 96e739bb..eca05bfa 100644 --- a/src/main/java/com/example/api/exception/ErrorCode.java +++ b/src/main/java/com/example/api/exception/ErrorCode.java @@ -32,7 +32,8 @@ public enum ErrorCode { POSSIBLE_TIME_REGISTER_EXCEPTION(HttpStatus.BAD_REQUEST, "-401", "알바 가능 시간 등록 에러"), - CATEGORY_EXCEPTION(HttpStatus.BAD_REQUEST, "-601", "카테고리 에러"); + CATEGORY_EXCEPTION(HttpStatus.BAD_REQUEST, "-601", "카테고리 에러"), + BUSINESS_DOMAIN_EXCEPTION(HttpStatus.BAD_REQUEST, "-700", "비즈니스 도메인 에러"); private final HttpStatus httpStatus; private final String errorCode; From 2500051f74aa605abbcc8263db386c8720e4b57a Mon Sep 17 00:00:00 2001 From: huhdy32 Date: Mon, 13 Jan 2025 10:39:53 +0900 Subject: [PATCH 203/276] =?UTF-8?q?#78=20feat:=20=EA=B0=80=EA=B2=8C=20?= =?UTF-8?q?=EC=84=B8=EB=B6=80=EC=A0=95=EB=B3=B4=20=EC=A1=B0=ED=9A=8C=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 --- .../api/business/BusinessQueryService.java | 35 +++++++++++++++++++ .../api/business/BusinessRepository.java | 7 ++++ .../controller/BusinessController.java | 12 +++++++ .../business/dto/BusinessDetailsResponse.java | 11 ++++++ .../api/business/dto/BusinessOwner.java | 7 ++++ .../api/business/dto/CategoryInfo.java | 7 ++++ .../dto/QueryBusinessDetailCommand.java | 6 ++++ .../com/example/api/exception/ErrorCode.java | 2 ++ 8 files changed, 87 insertions(+) create mode 100644 src/main/java/com/example/api/business/BusinessQueryService.java create mode 100644 src/main/java/com/example/api/business/dto/BusinessDetailsResponse.java create mode 100644 src/main/java/com/example/api/business/dto/BusinessOwner.java create mode 100644 src/main/java/com/example/api/business/dto/CategoryInfo.java create mode 100644 src/main/java/com/example/api/business/dto/QueryBusinessDetailCommand.java diff --git a/src/main/java/com/example/api/business/BusinessQueryService.java b/src/main/java/com/example/api/business/BusinessQueryService.java new file mode 100644 index 00000000..daf1337a --- /dev/null +++ b/src/main/java/com/example/api/business/BusinessQueryService.java @@ -0,0 +1,35 @@ +package com.example.api.business; + +import com.example.api.business.dto.BusinessDetailsResponse; +import com.example.api.business.dto.BusinessOwner; +import com.example.api.business.dto.CategoryInfo; +import com.example.api.business.dto.QueryBusinessDetailCommand; +import com.example.api.domain.Account; +import com.example.api.domain.Business; +import com.example.api.domain.BusinessCategory; +import com.example.api.exception.BusinessException; +import com.example.api.exception.ErrorCode; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +@Service +@Transactional(readOnly = true) +@RequiredArgsConstructor +public class BusinessQueryService { + private final BusinessRepository businessRepository; + + public BusinessDetailsResponse loadDetails(@Validated final QueryBusinessDetailCommand queryBusinessDetailCommand) { + final Business business = businessRepository.getDetails(queryBusinessDetailCommand.businessId()) + .orElseThrow(() -> new BusinessException("해당 비즈니스를 찾을 수 없습니다.", ErrorCode.BUSINESS_DOMAIN_EXCEPTION)); + final Account account = business.getEmployer(); + final List categoryInfos = business.getBusinessCategories().stream() + .map(BusinessCategory::getCategory) + .map(category -> new CategoryInfo(category.getCategoryId(), category.getCategoryName())) + .toList(); + final BusinessOwner owner = new BusinessOwner(account.getAccountId(), account.getName()); + return new BusinessDetailsResponse(business.getBusinessName(), business.getBusinessId(), owner, business.getLocation(), categoryInfos); + } +} diff --git a/src/main/java/com/example/api/business/BusinessRepository.java b/src/main/java/com/example/api/business/BusinessRepository.java index 8462c084..eb4c4851 100644 --- a/src/main/java/com/example/api/business/BusinessRepository.java +++ b/src/main/java/com/example/api/business/BusinessRepository.java @@ -1,9 +1,16 @@ package com.example.api.business; import com.example.api.domain.Business; +import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; @Repository public interface BusinessRepository extends JpaRepository { + + @Query("SELECT b FROM Business b JOIN FETCH b.employer JOIN FETCH b.businessCategories WHERE b.businessId = :businessId") + Optional getDetails(@Param("businessId") final Long businessId); + } diff --git a/src/main/java/com/example/api/business/controller/BusinessController.java b/src/main/java/com/example/api/business/controller/BusinessController.java index f19e4003..d08ec3c2 100644 --- a/src/main/java/com/example/api/business/controller/BusinessController.java +++ b/src/main/java/com/example/api/business/controller/BusinessController.java @@ -1,16 +1,20 @@ package com.example.api.business.controller; +import com.example.api.business.BusinessQueryService; import com.example.api.business.BusinessService; import com.example.api.business.dto.AddBusinessCommand; import com.example.api.business.dto.ModifyBusinessCommand; +import com.example.api.business.dto.QueryBusinessDetailCommand; import jakarta.validation.constraints.NotNull; import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; 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.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController @@ -18,6 +22,14 @@ @RequiredArgsConstructor public class BusinessController { private final BusinessService businessService; + private final BusinessQueryService businessQueryService; + + @GetMapping + public ResponseEntity getMyBusiness( + @RequestParam final Long businessId + ) { + return ResponseEntity.ok(businessQueryService.loadDetails(new QueryBusinessDetailCommand(businessId))); + } @PutMapping public ResponseEntity modifyMyBusiness( diff --git a/src/main/java/com/example/api/business/dto/BusinessDetailsResponse.java b/src/main/java/com/example/api/business/dto/BusinessDetailsResponse.java new file mode 100644 index 00000000..1aaaa8c9 --- /dev/null +++ b/src/main/java/com/example/api/business/dto/BusinessDetailsResponse.java @@ -0,0 +1,11 @@ +package com.example.api.business.dto; + +import java.util.List; + +public record BusinessDetailsResponse( + String businessName, + Long businessId, + BusinessOwner owner, + String location, + List categoryInfos) { +} diff --git a/src/main/java/com/example/api/business/dto/BusinessOwner.java b/src/main/java/com/example/api/business/dto/BusinessOwner.java new file mode 100644 index 00000000..d1d66d72 --- /dev/null +++ b/src/main/java/com/example/api/business/dto/BusinessOwner.java @@ -0,0 +1,7 @@ +package com.example.api.business.dto; + +public record BusinessOwner( + Long accountId, + String name +) { +} diff --git a/src/main/java/com/example/api/business/dto/CategoryInfo.java b/src/main/java/com/example/api/business/dto/CategoryInfo.java new file mode 100644 index 00000000..0c11c0c5 --- /dev/null +++ b/src/main/java/com/example/api/business/dto/CategoryInfo.java @@ -0,0 +1,7 @@ +package com.example.api.business.dto; + +public record CategoryInfo( + Long categoryid, + String categoryname +) { +} diff --git a/src/main/java/com/example/api/business/dto/QueryBusinessDetailCommand.java b/src/main/java/com/example/api/business/dto/QueryBusinessDetailCommand.java new file mode 100644 index 00000000..4f8e9eae --- /dev/null +++ b/src/main/java/com/example/api/business/dto/QueryBusinessDetailCommand.java @@ -0,0 +1,6 @@ +package com.example.api.business.dto; + +public record QueryBusinessDetailCommand( + Long businessId +) { +} diff --git a/src/main/java/com/example/api/exception/ErrorCode.java b/src/main/java/com/example/api/exception/ErrorCode.java index eca05bfa..c436a834 100644 --- a/src/main/java/com/example/api/exception/ErrorCode.java +++ b/src/main/java/com/example/api/exception/ErrorCode.java @@ -33,8 +33,10 @@ public enum ErrorCode { POSSIBLE_TIME_REGISTER_EXCEPTION(HttpStatus.BAD_REQUEST, "-401", "알바 가능 시간 등록 에러"), CATEGORY_EXCEPTION(HttpStatus.BAD_REQUEST, "-601", "카테고리 에러"), + BUSINESS_DOMAIN_EXCEPTION(HttpStatus.BAD_REQUEST, "-700", "비즈니스 도메인 에러"); + private final HttpStatus httpStatus; private final String errorCode; private final String errorDescription; From 206243a3a8f9ef3147094f84c94860e355acba98 Mon Sep 17 00:00:00 2001 From: huhdy32 Date: Mon, 13 Jan 2025 10:54:12 +0900 Subject: [PATCH 204/276] =?UTF-8?q?#78=20feat:=20=EC=9D=B4=EB=A9=94?= =?UTF-8?q?=EC=9D=BC=20=EC=88=98=EC=8B=A0=20=EB=8F=99=EC=9D=98=20=EC=97=AC?= =?UTF-8?q?=EB=B6=80=20=ED=99=95=EC=9D=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/generated/com/example/api/domain/QAccount.java | 2 ++ src/main/java/com/example/api/account/dto/SignUpRequest.java | 4 +++- .../java/com/example/api/account/service/AccountService.java | 3 ++- src/main/java/com/example/api/domain/Account.java | 5 ++++- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/main/generated/com/example/api/domain/QAccount.java b/src/main/generated/com/example/api/domain/QAccount.java index da010cca..bebfa199 100644 --- a/src/main/generated/com/example/api/domain/QAccount.java +++ b/src/main/generated/com/example/api/domain/QAccount.java @@ -33,6 +33,8 @@ public class QAccount extends EntityPathBase { public final StringPath email = createString("email"); + public final BooleanPath emailReceivable = createBoolean("emailReceivable"); + public final StringPath loginId = createString("loginId"); public final StringPath name = createString("name"); diff --git a/src/main/java/com/example/api/account/dto/SignUpRequest.java b/src/main/java/com/example/api/account/dto/SignUpRequest.java index b7ed9c04..bbd37f5d 100644 --- a/src/main/java/com/example/api/account/dto/SignUpRequest.java +++ b/src/main/java/com/example/api/account/dto/SignUpRequest.java @@ -23,6 +23,8 @@ public record SignUpRequest( @NotNull UserRole role, @NotBlank - String phoneNumber + String phoneNumber, + @NotNull + Boolean emailReceivable ) { } \ No newline at end of file diff --git a/src/main/java/com/example/api/account/service/AccountService.java b/src/main/java/com/example/api/account/service/AccountService.java index b121c6db..a04240d5 100644 --- a/src/main/java/com/example/api/account/service/AccountService.java +++ b/src/main/java/com/example/api/account/service/AccountService.java @@ -86,7 +86,8 @@ private void saveAccount(final SignUpRequest request) { request.email(), request.phoneNumber(), request.nationality(), - roles + roles, + request.emailReceivable() ); accountRepository.save(account); diff --git a/src/main/java/com/example/api/domain/Account.java b/src/main/java/com/example/api/domain/Account.java index bb074d8b..09f556e1 100644 --- a/src/main/java/com/example/api/domain/Account.java +++ b/src/main/java/com/example/api/domain/Account.java @@ -55,6 +55,8 @@ public class Account extends BaseEntity { private boolean openStatus; @Column(name = "ACCOUNT_DELETED", columnDefinition = "BOOLEAN DEFAULT false") private boolean deleted = false; + @Column(name = "ACCOUNT_EMAIL_RECEIVABLE", columnDefinition = "BOOLEAN DEFAULT false") + private boolean emailReceivable = false; public Account() { } @@ -65,7 +67,7 @@ public Account(String name, String email, Collection roles) { this.roles = roles; } - public Account(String loginId, String password, String name, String nickname, String phoneNumber, String email, Nationality nationality, Collection roles) { + public Account(String loginId, String password, String name, String nickname, String phoneNumber, String email, Nationality nationality, Collection roles, final Boolean emailReceivable) { this.loginId = loginId; this.password = password; this.name = name; @@ -77,6 +79,7 @@ public Account(String loginId, String password, String name, String nickname, St this.starPoint = 0.0f; this.workCount = 0; this.openStatus = true; + this.emailReceivable = emailReceivable; } public LoginUserRequest getLoginUser(){ From 1d246eb0881bc99d588eb1b191c4281c5514fe0f Mon Sep 17 00:00:00 2001 From: huhdy32 Date: Mon, 13 Jan 2025 11:05:02 +0900 Subject: [PATCH 205/276] =?UTF-8?q?#78=20feat:=20=EB=B3=B8=EC=9D=B8=20?= =?UTF-8?q?=EA=B3=84=EC=A0=95=20=EC=82=AD=EC=A0=9C=20API=20=EA=B5=AC?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/account/controller/AccountController.java | 15 +++++++++++++++ .../api/account/service/AccountService.java | 7 +++++++ 2 files changed, 22 insertions(+) diff --git a/src/main/java/com/example/api/account/controller/AccountController.java b/src/main/java/com/example/api/account/controller/AccountController.java index 630bd8b5..4604cf6f 100644 --- a/src/main/java/com/example/api/account/controller/AccountController.java +++ b/src/main/java/com/example/api/account/controller/AccountController.java @@ -9,6 +9,7 @@ import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.*; @RestController @@ -16,6 +17,7 @@ @RequiredArgsConstructor public class AccountController { private final AccountService signUpService; + private final AccountService accountService; @PostMapping("/email/code") public ResponseEntity sendEmailCode(@Valid @RequestBody final EmailRequest request) { @@ -35,4 +37,17 @@ public ResponseEntity signUp(@Valid @RequestBody final SignUpRequest req String successMessage = signUpService.signUp(request); return ResponseEntity.status(HttpStatus.CREATED).body(successMessage); } + + /** + * @param memberId + * 현재, 로그인된 사용자에 대해서만 계정 삭제 요청이 가능하도록 구현 + * @return + */ + @DeleteMapping("/my") + public ResponseEntity deleteAccount( + @AuthenticationPrincipal final Long memberId + ) { + accountService.deleteAccount(memberId); + return ResponseEntity.ok("delete account"); + } } \ No newline at end of file diff --git a/src/main/java/com/example/api/account/service/AccountService.java b/src/main/java/com/example/api/account/service/AccountService.java index a04240d5..c2810c56 100644 --- a/src/main/java/com/example/api/account/service/AccountService.java +++ b/src/main/java/com/example/api/account/service/AccountService.java @@ -76,6 +76,13 @@ public Account loadAccount(final Long requestMemberId) { .orElseThrow(() -> new BusinessException(ErrorCode.ACCOUNT_NOT_FOUND_EXCEPTION)); } + @org.springframework.transaction.annotation.Transactional + public void deleteAccount(final Long requestMemberId) { + final Account account = accountRepository.findById(requestMemberId) + .orElseThrow(() -> new BusinessException(ErrorCode.ACCOUNT_NOT_FOUND_EXCEPTION)); + account.setDeleted(true); + } + private void saveAccount(final SignUpRequest request) { Collection roles = List.of(request.role()); Account account = new Account( From ec71db7bbd4452e597848994f30083d2edca01dd Mon Sep 17 00:00:00 2001 From: huhdy32 Date: Mon, 13 Jan 2025 12:23:41 +0900 Subject: [PATCH 206/276] =?UTF-8?q?#78=20feat:=20=EA=B3=84=EC=95=BD=20?= =?UTF-8?q?=ED=9B=84=20=EB=A6=AC=EB=B7=B0=20=EC=9E=91=EC=84=B1=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/ContractRepository.java | 4 ++ .../example/api/contracts/ReviewService.java | 35 +++++++++++++++ .../controller/ReviewController.java | 43 +++++++++++++++++++ .../api/contracts/dto/AddReviewCommand.java | 9 ++++ .../java/com/example/api/domain/Review.java | 10 ++++- .../com/example/api/exception/ErrorCode.java | 4 +- 6 files changed, 103 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/example/api/contracts/ReviewService.java create mode 100644 src/main/java/com/example/api/contracts/controller/ReviewController.java create mode 100644 src/main/java/com/example/api/contracts/dto/AddReviewCommand.java diff --git a/src/main/java/com/example/api/contracts/ContractRepository.java b/src/main/java/com/example/api/contracts/ContractRepository.java index 1b231235..05c7b172 100644 --- a/src/main/java/com/example/api/contracts/ContractRepository.java +++ b/src/main/java/com/example/api/contracts/ContractRepository.java @@ -3,6 +3,7 @@ import com.example.api.contracts.dto.BusinessInfoDTO; import com.example.api.contracts.dto.EmployeeInfoDTO; import com.example.api.domain.Contract; +import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; @@ -24,4 +25,7 @@ public interface ContractRepository extends JpaRepository { "join oe.employee e " + "where c.contractId = :contractId") EmployeeInfoDTO findEmployeeDTOByContractId(@Param("contractId") long contractId); + + @Query("SELECT c FROM Contract c JOIN FETCH c.offerEmployment JOIN FETCH c.offerEmployment.business.employer WHERE c.contractId = :contractId") + Optional loadContractWithOfferEmployment(@Param("contractId") final Long contractId); } diff --git a/src/main/java/com/example/api/contracts/ReviewService.java b/src/main/java/com/example/api/contracts/ReviewService.java new file mode 100644 index 00000000..db019fc3 --- /dev/null +++ b/src/main/java/com/example/api/contracts/ReviewService.java @@ -0,0 +1,35 @@ +package com.example.api.contracts; + +import com.example.api.contracts.dto.AddReviewCommand; +import com.example.api.domain.Business; +import com.example.api.domain.Contract; +import com.example.api.domain.Review; +import com.example.api.domain.repository.ReviewRepository; +import com.example.api.exception.BusinessException; +import com.example.api.exception.ErrorCode; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +@Service +@RequiredArgsConstructor +public class ReviewService { + private final ContractRepository contractRepository; + private final ReviewRepository reviewRepository; + + @Transactional + public void saveReview(@Validated final AddReviewCommand command) { + final Contract contract = contractRepository.loadContractWithOfferEmployment(command.contractId()) + .orElseThrow(); + validateContractOwner(command.requestMemberId(), contract.getOfferEmployment().getBusiness()); + final Review review = new Review(command.reviewScore(), command.reviewContent(), contract); + reviewRepository.save(review); + } + + private void validateContractOwner(final Long requestMemberId, final Business business) { + if (!business.getEmployer().getAccountId().equals(requestMemberId)) { + throw new BusinessException("본인의 계약에만 리뷰가 가능합니다", ErrorCode.CONTRACT_EXCEPTION); + } + } +} diff --git a/src/main/java/com/example/api/contracts/controller/ReviewController.java b/src/main/java/com/example/api/contracts/controller/ReviewController.java new file mode 100644 index 00000000..7cbb7ddb --- /dev/null +++ b/src/main/java/com/example/api/contracts/controller/ReviewController.java @@ -0,0 +1,43 @@ +package com.example.api.contracts.controller; + +import com.example.api.contracts.ReviewService; +import com.example.api.contracts.dto.AddReviewCommand; +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +import org.hibernate.validator.constraints.Range; +import org.springframework.http.ResponseEntity; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/v1/contracts") +public class ReviewController { + private final ReviewService reviewService; + + @PostMapping("/review") + public ResponseEntity addReview( + @RequestBody @Valid final AddReviewRequest request, + @AuthenticationPrincipal final Long memberId + ) { + final AddReviewCommand command = request.toCommand(memberId); + reviewService.saveReview(command); + return ResponseEntity.ok(null); + } + + record AddReviewRequest( + @NotNull + Long contractId, + @Range(min = 0, max = 5) + Integer reviewScore, + String reviewContent + ) { + AddReviewCommand toCommand(final Long requestMemberId) { + return new AddReviewCommand(requestMemberId, contractId, reviewContent, reviewScore); + } + } +} diff --git a/src/main/java/com/example/api/contracts/dto/AddReviewCommand.java b/src/main/java/com/example/api/contracts/dto/AddReviewCommand.java new file mode 100644 index 00000000..fbec28cf --- /dev/null +++ b/src/main/java/com/example/api/contracts/dto/AddReviewCommand.java @@ -0,0 +1,9 @@ +package com.example.api.contracts.dto; + +public record AddReviewCommand( + Long requestMemberId, + Long contractId, + String reviewContent, + Integer reviewScore +) { +} diff --git a/src/main/java/com/example/api/domain/Review.java b/src/main/java/com/example/api/domain/Review.java index f3e89840..73615a2a 100644 --- a/src/main/java/com/example/api/domain/Review.java +++ b/src/main/java/com/example/api/domain/Review.java @@ -11,7 +11,6 @@ @Getter @Setter @Table(name = "REVIEW") -@AllArgsConstructor @EqualsAndHashCode(callSuper = true) @NoArgsConstructor public class Review extends BaseEntity { @@ -25,5 +24,14 @@ public class Review extends BaseEntity { @Column(name = "REVIEW_CONTENT") private String reviewContent; + + @OneToOne(fetch = FetchType.LAZY) + private Contract contract; + + public Review(int reviewStarPoint, String reviewContent, Contract contract) { + this.reviewStarPoint = reviewStarPoint; + this.reviewContent = reviewContent; + this.contract = contract; + } } diff --git a/src/main/java/com/example/api/exception/ErrorCode.java b/src/main/java/com/example/api/exception/ErrorCode.java index c436a834..3936d1c8 100644 --- a/src/main/java/com/example/api/exception/ErrorCode.java +++ b/src/main/java/com/example/api/exception/ErrorCode.java @@ -34,8 +34,10 @@ public enum ErrorCode { CATEGORY_EXCEPTION(HttpStatus.BAD_REQUEST, "-601", "카테고리 에러"), - BUSINESS_DOMAIN_EXCEPTION(HttpStatus.BAD_REQUEST, "-700", "비즈니스 도메인 에러"); + BUSINESS_DOMAIN_EXCEPTION(HttpStatus.BAD_REQUEST, "-700", "비즈니스 도메인 에러"), + + CONTRACT_EXCEPTION(HttpStatus.BAD_REQUEST, "-800", "계약 도메인 에러"); private final HttpStatus httpStatus; private final String errorCode; From d1ba1a7a404a632b32612cce065016ee2ef9bb82 Mon Sep 17 00:00:00 2001 From: huhdy32 Date: Mon, 13 Jan 2025 12:39:44 +0900 Subject: [PATCH 207/276] =?UTF-8?q?#78=20feat:=20=EA=B3=A0=EC=9A=A9?= =?UTF-8?q?=EC=A3=BC=EA=B0=80=20=EC=9E=91=EC=84=B1=ED=95=9C=20=EB=A6=AC?= =?UTF-8?q?=EB=B7=B0=20=EC=A1=B0=ED=9A=8C=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/api/domain/QReview.java | 20 +++++++++++-- .../api/contracts/ReviewQueryService.java | 28 +++++++++++++++++++ .../controller/ReviewController.java | 19 +++++++++++++ .../dto/QueryEmployersReviewCommand.java | 6 ++++ .../api/contracts/dto/ReviewResponse.java | 9 ++++++ .../domain/repository/ReviewRepository.java | 6 ++++ 6 files changed, 85 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/example/api/contracts/ReviewQueryService.java create mode 100644 src/main/java/com/example/api/contracts/dto/QueryEmployersReviewCommand.java create mode 100644 src/main/java/com/example/api/contracts/dto/ReviewResponse.java diff --git a/src/main/generated/com/example/api/domain/QReview.java b/src/main/generated/com/example/api/domain/QReview.java index 6fbd36d7..a393fb0b 100644 --- a/src/main/generated/com/example/api/domain/QReview.java +++ b/src/main/generated/com/example/api/domain/QReview.java @@ -7,6 +7,7 @@ import com.querydsl.core.types.PathMetadata; import javax.annotation.processing.Generated; import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; /** @@ -17,10 +18,14 @@ public class QReview extends EntityPathBase { private static final long serialVersionUID = 731127133L; + private static final PathInits INITS = PathInits.DIRECT2; + public static final QReview review = new QReview("review"); public final QBaseEntity _super = new QBaseEntity(this); + public final QContract contract; + //inherited public final DateTimePath createdDate = _super.createdDate; @@ -34,15 +39,24 @@ public class QReview extends EntityPathBase { public final DateTimePath updatedDate = _super.updatedDate; public QReview(String variable) { - super(Review.class, forVariable(variable)); + this(Review.class, forVariable(variable), INITS); } public QReview(Path path) { - super(path.getType(), path.getMetadata()); + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); } public QReview(PathMetadata metadata) { - super(Review.class, metadata); + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QReview(PathMetadata metadata, PathInits inits) { + this(Review.class, metadata, inits); + } + + public QReview(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.contract = inits.isInitialized("contract") ? new QContract(forProperty("contract"), inits.get("contract")) : null; } } diff --git a/src/main/java/com/example/api/contracts/ReviewQueryService.java b/src/main/java/com/example/api/contracts/ReviewQueryService.java new file mode 100644 index 00000000..af57f159 --- /dev/null +++ b/src/main/java/com/example/api/contracts/ReviewQueryService.java @@ -0,0 +1,28 @@ +package com.example.api.contracts; + +import com.example.api.contracts.dto.QueryEmployersReviewCommand; +import com.example.api.contracts.dto.ReviewResponse; +import com.example.api.domain.Review; +import com.example.api.domain.repository.ReviewRepository; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +public class ReviewQueryService { + private final ReviewRepository reviewRepository; + + @Transactional(readOnly = true) + public List loadReviewsWithEmployerId(final QueryEmployersReviewCommand command) { + final List reviews = reviewRepository.loadReviewsByEmployerId(command.employerId()); + return reviews.stream() + .map(review -> new ReviewResponse( + review.getSuggestId(), + review.getContract().getContractId(), + review.getReviewContent(), + review.getReviewStarPoint())) + .toList(); + } +} diff --git a/src/main/java/com/example/api/contracts/controller/ReviewController.java b/src/main/java/com/example/api/contracts/controller/ReviewController.java index 7cbb7ddb..e897da32 100644 --- a/src/main/java/com/example/api/contracts/controller/ReviewController.java +++ b/src/main/java/com/example/api/contracts/controller/ReviewController.java @@ -1,13 +1,18 @@ package com.example.api.contracts.controller; +import com.example.api.contracts.ReviewQueryService; import com.example.api.contracts.ReviewService; import com.example.api.contracts.dto.AddReviewCommand; +import com.example.api.contracts.dto.QueryEmployersReviewCommand; +import com.example.api.contracts.dto.ReviewResponse; import jakarta.validation.Valid; import jakarta.validation.constraints.NotNull; +import java.util.List; import lombok.RequiredArgsConstructor; import org.hibernate.validator.constraints.Range; import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -18,6 +23,20 @@ @RequestMapping("/api/v1/contracts") public class ReviewController { private final ReviewService reviewService; + private final ReviewQueryService reviewQueryService; + + + /** + * @param requestMemberId 고용자 ( employer ID ) 가 본인이 작성한 리뷰 목록 가져오기 + * @return + */ + @GetMapping("/review/my") + public ResponseEntity> getMyReview( + @AuthenticationPrincipal final Long requestMemberId + ) { + final QueryEmployersReviewCommand command = new QueryEmployersReviewCommand(requestMemberId); + return ResponseEntity.ok(reviewQueryService.loadReviewsWithEmployerId(command)); + } @PostMapping("/review") public ResponseEntity addReview( diff --git a/src/main/java/com/example/api/contracts/dto/QueryEmployersReviewCommand.java b/src/main/java/com/example/api/contracts/dto/QueryEmployersReviewCommand.java new file mode 100644 index 00000000..5fdd9775 --- /dev/null +++ b/src/main/java/com/example/api/contracts/dto/QueryEmployersReviewCommand.java @@ -0,0 +1,6 @@ +package com.example.api.contracts.dto; + +public record QueryEmployersReviewCommand( + Long employerId +) { +} diff --git a/src/main/java/com/example/api/contracts/dto/ReviewResponse.java b/src/main/java/com/example/api/contracts/dto/ReviewResponse.java new file mode 100644 index 00000000..60b87883 --- /dev/null +++ b/src/main/java/com/example/api/contracts/dto/ReviewResponse.java @@ -0,0 +1,9 @@ +package com.example.api.contracts.dto; + +public record ReviewResponse( + Long reviewId, + Long contractId, + String reviewContent, + Integer reviewScore +) { +} diff --git a/src/main/java/com/example/api/domain/repository/ReviewRepository.java b/src/main/java/com/example/api/domain/repository/ReviewRepository.java index 43004aca..d8ef51af 100644 --- a/src/main/java/com/example/api/domain/repository/ReviewRepository.java +++ b/src/main/java/com/example/api/domain/repository/ReviewRepository.java @@ -1,9 +1,15 @@ package com.example.api.domain.repository; import com.example.api.domain.Review; +import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; @Repository public interface ReviewRepository extends JpaRepository { + + @Query("SELECT r FROM Review r JOIN FETCH r.contract WHERE r.contract.offerEmployment.business.employer.accountId = :employerId") + List loadReviewsByEmployerId(@Param("employerId") Long employerId); } From 6f5f69bba40dfe2903d1b93c69a95965a4661f2b Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Tue, 19 Nov 2024 13:05:33 +0900 Subject: [PATCH 208/276] =?UTF-8?q?#26=20=EC=B1=84=ED=8C=85=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=EC=9D=84=20=EC=9C=84=ED=95=9C=20=EB=AA=BD=EA=B3=A0=20?= =?UTF-8?q?DB=20=EC=9D=98=EC=A1=B4=EC=84=B1=20=EB=B0=8F=20=EC=9B=B9=20?= =?UTF-8?q?=EC=86=8C=EC=BC=93=20=EC=9D=98=EC=A1=B4=EC=84=B1=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 3 +++ .../java/com/example/api/chat/repository/ChatRepository.java | 5 +---- src/main/java/com/example/api/chat/service/ChatService.java | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/build.gradle b/build.gradle index 55c7fb2c..4a804a9a 100644 --- a/build.gradle +++ b/build.gradle @@ -26,6 +26,9 @@ 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' + implementation 'org.springframework.boot:spring-boot-starter-websocket' + compileOnly 'org.projectlombok:lombok' // runtimeOnly 'com.mysql:mysql-connector-j' runtimeOnly 'com.h2database:h2' diff --git a/src/main/java/com/example/api/chat/repository/ChatRepository.java b/src/main/java/com/example/api/chat/repository/ChatRepository.java index ab3f83ad..197c67e8 100644 --- a/src/main/java/com/example/api/chat/repository/ChatRepository.java +++ b/src/main/java/com/example/api/chat/repository/ChatRepository.java @@ -1,12 +1,9 @@ package com.example.api.chat.repository; -import com.example.api.chat.domain.ChatSummary; import com.example.api.domain.Chat; import org.springframework.data.mongodb.repository.MongoRepository; import org.springframework.stereotype.Repository; -import java.util.List; - @Repository public interface ChatRepository extends MongoRepository, CustomChatRepository { -} +} \ No newline at end of file diff --git a/src/main/java/com/example/api/chat/service/ChatService.java b/src/main/java/com/example/api/chat/service/ChatService.java index 25e3205f..7e9bae85 100644 --- a/src/main/java/com/example/api/chat/service/ChatService.java +++ b/src/main/java/com/example/api/chat/service/ChatService.java @@ -58,4 +58,4 @@ public List getChats(Long chatRoomId, String lastChatId) { public List getChatRooms(Long userId) { return chatRoomRepository.findByUserId(userId); } -} +} \ No newline at end of file From 03e15d8a914842d9eb9a89551c279cf2c50b5275 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Tue, 19 Nov 2024 22:04:44 +0900 Subject: [PATCH 209/276] =?UTF-8?q?#26=20=EC=9A=94=EC=B2=AD=20=EC=88=98?= =?UTF-8?q?=EB=9D=BD=20=EC=84=9C=EB=B9=84=EC=8A=A4=EC=97=90=20=EC=B1=84?= =?UTF-8?q?=ED=8C=85=EB=B0=A9=20=EC=83=9D=EC=84=B1=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/api/chat/controller/ChatController.java | 2 +- .../com/example/api/contracts/ChatRoomRepository.java | 9 +++++++++ .../com/example/api/contracts/ContractService.java | 10 ++++++++++ .../api/contracts/controller/ContractController.java | 11 ++--------- .../api/contracts/dto/AcceptSuggestCommand.java | 6 +++++- src/main/java/com/example/api/domain/ChatRoom.java | 4 ++++ 6 files changed, 31 insertions(+), 11 deletions(-) create mode 100644 src/main/java/com/example/api/contracts/ChatRoomRepository.java diff --git a/src/main/java/com/example/api/chat/controller/ChatController.java b/src/main/java/com/example/api/chat/controller/ChatController.java index 6785dae0..5840f583 100644 --- a/src/main/java/com/example/api/chat/controller/ChatController.java +++ b/src/main/java/com/example/api/chat/controller/ChatController.java @@ -39,4 +39,4 @@ public ResponseEntity> getMessages(@PathVariable("roomId") Long chatR @RequestParam(value = "lastChatId", required = false) String chatId) { return ResponseEntity.ok(chatService.getChats(chatRoomId,chatId)); } -} +} \ No newline at end of file diff --git a/src/main/java/com/example/api/contracts/ChatRoomRepository.java b/src/main/java/com/example/api/contracts/ChatRoomRepository.java new file mode 100644 index 00000000..d7123396 --- /dev/null +++ b/src/main/java/com/example/api/contracts/ChatRoomRepository.java @@ -0,0 +1,9 @@ +package com.example.api.contracts; + +import com.example.api.domain.ChatRoom; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface ChatRoomRepository extends JpaRepository { +} diff --git a/src/main/java/com/example/api/contracts/ContractService.java b/src/main/java/com/example/api/contracts/ContractService.java index e1537494..867dfa5b 100644 --- a/src/main/java/com/example/api/contracts/ContractService.java +++ b/src/main/java/com/example/api/contracts/ContractService.java @@ -1,7 +1,9 @@ package com.example.api.contracts; +import com.example.api.chat.repository.ChatRoomRepository; 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 java.util.List; @@ -16,6 +18,7 @@ public class ContractService { private final OfferRepository offerRepository; private final ContractRepository contractRepository; private final ContractMapper contractMapper; + private final ChatRoomRepository chatRoomRepository; private final UpdateContractConditionManager updateContractConditionManager; @Transactional(readOnly = true) @@ -30,6 +33,8 @@ public void acceptSuggest(@Validated final AcceptSuggestCommand acceptSuggestCom final Contract contract = contractMapper.notYetSucceeded(offerEmployment); contractRepository.save(contract); + + createChatRoom(offerEmployment); } @Transactional @@ -54,6 +59,11 @@ private OfferEmployment loadOffer(final Long offerId) { .orElseThrow(); } + private void createChatRoom(final OfferEmployment offer) { + ChatRoom chatRoom = new ChatRoom(offer); + chatRoomRepository.save(chatRoom); + } + @Transactional(readOnly = true) public ContractDTO getContractInfo(final AcceptContractCommand contractStatusCommand) { BusinessInfoDTO businessDTO = contractRepository.findBusinessDTOByContractId(contractStatusCommand.contractId()); 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 0f2a4548..ab340f51 100644 --- a/src/main/java/com/example/api/contracts/controller/ContractController.java +++ b/src/main/java/com/example/api/contracts/controller/ContractController.java @@ -11,13 +11,7 @@ import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; -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; +import org.springframework.web.bind.annotation.*; @RestController @RequiredArgsConstructor @@ -36,9 +30,8 @@ public ResponseEntity> getAllSuggest( @PostMapping("/api/v1/contracts/suggests/{suggestId}/accept") public ResponseEntity acceptContractContact( - @PathVariable(required = true) final Long suggestId + @RequestBody final AcceptSuggestCommand acceptSuggestCommand ) { - final AcceptSuggestCommand acceptSuggestCommand = new AcceptSuggestCommand(suggestId); contractService.acceptSuggest(acceptSuggestCommand); return ResponseEntity.ok(null); } diff --git a/src/main/java/com/example/api/contracts/dto/AcceptSuggestCommand.java b/src/main/java/com/example/api/contracts/dto/AcceptSuggestCommand.java index 1578b90c..8ae2e568 100644 --- a/src/main/java/com/example/api/contracts/dto/AcceptSuggestCommand.java +++ b/src/main/java/com/example/api/contracts/dto/AcceptSuggestCommand.java @@ -4,6 +4,10 @@ public record AcceptSuggestCommand( @NonNull - Long suggestId + Long suggestId, + @NonNull + Long businessId, + @NonNull + Long employeeId ) { } diff --git a/src/main/java/com/example/api/domain/ChatRoom.java b/src/main/java/com/example/api/domain/ChatRoom.java index 4760b7c5..8a6a487b 100644 --- a/src/main/java/com/example/api/domain/ChatRoom.java +++ b/src/main/java/com/example/api/domain/ChatRoom.java @@ -32,5 +32,9 @@ protected void onCreate() { this.suggestGeneratedDate = LocalDateTime.now(); } + public ChatRoom(OfferEmployment offerEmployment) { + this.offerEmployment = offerEmployment; + this.suggestGeneratedDate = LocalDateTime.now(); + } } From 7a2a295ebd9566caff962260cc25fb067c38be9f Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Thu, 21 Nov 2024 13:25:37 +0900 Subject: [PATCH 210/276] =?UTF-8?q?#26=20=EC=9A=94=EC=B2=AD=20=EC=88=98?= =?UTF-8?q?=EB=9D=BD=20=ED=9B=84=20=EC=B1=84=ED=8C=85=EB=B0=A9=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20test=20=EC=84=B1=EA=B3=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../contracts/dto/AcceptSuggestCommand.java | 6 +- .../api/contracts/ContractServiceTest.java | 58 +++++++++++++++++++ 2 files changed, 59 insertions(+), 5 deletions(-) create mode 100644 src/test/java/com/example/api/contracts/ContractServiceTest.java diff --git a/src/main/java/com/example/api/contracts/dto/AcceptSuggestCommand.java b/src/main/java/com/example/api/contracts/dto/AcceptSuggestCommand.java index 8ae2e568..1578b90c 100644 --- a/src/main/java/com/example/api/contracts/dto/AcceptSuggestCommand.java +++ b/src/main/java/com/example/api/contracts/dto/AcceptSuggestCommand.java @@ -4,10 +4,6 @@ public record AcceptSuggestCommand( @NonNull - Long suggestId, - @NonNull - Long businessId, - @NonNull - Long employeeId + Long suggestId ) { } diff --git a/src/test/java/com/example/api/contracts/ContractServiceTest.java b/src/test/java/com/example/api/contracts/ContractServiceTest.java new file mode 100644 index 00000000..e92cae3e --- /dev/null +++ b/src/test/java/com/example/api/contracts/ContractServiceTest.java @@ -0,0 +1,58 @@ +package com.example.api.contracts; + +import com.example.api.JpaTestWithInitData; +import com.example.api.contracts.dto.AcceptSuggestCommand; +import com.example.api.domain.ChatRoom; +import com.example.api.domain.Contract; +import com.example.api.domain.OfferEmployment; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ActiveProfiles; + +import static org.assertj.core.api.Assertions.*; + +@ActiveProfiles("test") +@JpaTestWithInitData +class ContractServiceTest{ + @Autowired + OfferRepository offerRepository; + @Autowired + ChatRoomRepository chatRoomRepository; + + @Test + @DisplayName("요청 수락 및 채팅방 생성") + void shouldAcceptSuggestAndCreateChatRoom() { + AcceptSuggestCommand acceptSuggestCommand = new AcceptSuggestCommand(1L); + + // 요청 수락 + final OfferEmployment offerEmployment = loadOffer(acceptSuggestCommand.suggestId()); + offerEmployment.succeeded(); + // 채팅방 생성 + createChatRoom(offerEmployment); + + OfferEmployment findOfferEmployment = offerRepository.findById(1L) + .orElseThrow(() -> new AssertionError("요청이 존재하지 않습니다.")); + + assertThat(findOfferEmployment.isSuggestSucceeded()) + .as("요청 수락으로 변경") + .isTrue(); + + // Assert: 채팅방 생성 여부 검증 + assertThat(chatRoomRepository.findById(1L)) + .as("채팅방이 존재하지 않음") + .isPresent(); + } + + private OfferEmployment loadOffer(final Long offerId) { + return offerRepository.findById(offerId) + .orElseThrow(); + } + + private void createChatRoom(final OfferEmployment offer) { + ChatRoom chatRoom = new ChatRoom(offer); + chatRoomRepository.save(chatRoom); + } + + +} \ No newline at end of file From 9832996e748b74dae93458839a5106c367fc1759 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Tue, 14 Jan 2025 13:51:33 +0900 Subject: [PATCH 211/276] =?UTF-8?q?#26=20=EC=95=8C=EB=B0=94=20=EC=A0=9C?= =?UTF-8?q?=EC=95=88=20=EC=9A=94=EC=B2=AD=20=EC=88=98=EB=9D=BD=EA=B3=BC=20?= =?UTF-8?q?=EC=B1=84=ED=8C=85=EB=B0=A9=20=EC=83=9D=EC=84=B1=20api=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/api/contracts/ContractService.java | 4 ++++ .../api/contracts/controller/ContractController.java | 10 +++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/contracts/ContractService.java b/src/main/java/com/example/api/contracts/ContractService.java index 867dfa5b..1001f920 100644 --- a/src/main/java/com/example/api/contracts/ContractService.java +++ b/src/main/java/com/example/api/contracts/ContractService.java @@ -33,7 +33,11 @@ public void acceptSuggest(@Validated final AcceptSuggestCommand acceptSuggestCom final Contract contract = contractMapper.notYetSucceeded(offerEmployment); contractRepository.save(contract); + } + @Transactional + public void createChatRoom(@Validated final AcceptSuggestCommand acceptSuggestCommand) { + final OfferEmployment offerEmployment = loadOffer(acceptSuggestCommand.suggestId()); createChatRoom(offerEmployment); } 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 ab340f51..72a29a02 100644 --- a/src/main/java/com/example/api/contracts/controller/ContractController.java +++ b/src/main/java/com/example/api/contracts/controller/ContractController.java @@ -36,6 +36,14 @@ public ResponseEntity acceptContractContact( return ResponseEntity.ok(null); } + @PostMapping("/api/v1/contracts/suggests/{suggestId}/chatroom") + public ResponseEntity createChatRoom( + @RequestBody final AcceptSuggestCommand acceptSuggestCommand + ) { + contractService.createChatRoom(acceptSuggestCommand); + return ResponseEntity.ok(null); + } + @PutMapping("/api/v1/contracts/{contractId}") public ResponseEntity updateContractCondition( @PathVariable(required = true) final Long contractId, @@ -61,4 +69,4 @@ public ResponseEntity getContractInfo(@PathVariable(required = true ContractDTO contractDTO = contractService.getContractInfo(contractStatusCommand); return ResponseEntity.ok(contractDTO); } -} +} \ No newline at end of file From 3587e231b7e20eb72a9609b3671fd1b4a965a372 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Tue, 14 Jan 2025 14:09:56 +0900 Subject: [PATCH 212/276] rebase develop --- .../com/example/api/contracts/ChatRoomRepository.java | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 src/main/java/com/example/api/contracts/ChatRoomRepository.java diff --git a/src/main/java/com/example/api/contracts/ChatRoomRepository.java b/src/main/java/com/example/api/contracts/ChatRoomRepository.java deleted file mode 100644 index d7123396..00000000 --- a/src/main/java/com/example/api/contracts/ChatRoomRepository.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.example.api.contracts; - -import com.example.api.domain.ChatRoom; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface ChatRoomRepository extends JpaRepository { -} From 5298fdf7e966329cb952b2e1f87554d980a97fc5 Mon Sep 17 00:00:00 2001 From: yuna83 Date: Wed, 27 Nov 2024 02:26:41 +0900 Subject: [PATCH 213/276] =?UTF-8?q?#38=20feat(InquiryService):=20=EB=AC=B8?= =?UTF-8?q?=EC=9D=98=20=EC=83=9D=EC=84=B1,=20=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/example/api/domain/Inquiry.java | 30 +++++++++ .../api/inquiry/InquiryController.java | 63 +++++++++++++++++++ .../api/inquiry/InquiryRepository.java | 9 +++ .../example/api/inquiry/InquiryService.java | 48 ++++++++++++++ .../example/api/inquiry/dto/RequestDTO.java | 15 +++++ .../example/api/inquiry/dto/ResponseDTO.java | 19 ++++++ 6 files changed, 184 insertions(+) create mode 100644 src/main/java/com/example/api/domain/Inquiry.java create mode 100644 src/main/java/com/example/api/inquiry/InquiryController.java create mode 100644 src/main/java/com/example/api/inquiry/InquiryRepository.java create mode 100644 src/main/java/com/example/api/inquiry/InquiryService.java create mode 100644 src/main/java/com/example/api/inquiry/dto/RequestDTO.java create mode 100644 src/main/java/com/example/api/inquiry/dto/ResponseDTO.java diff --git a/src/main/java/com/example/api/domain/Inquiry.java b/src/main/java/com/example/api/domain/Inquiry.java new file mode 100644 index 00000000..04d23c14 --- /dev/null +++ b/src/main/java/com/example/api/domain/Inquiry.java @@ -0,0 +1,30 @@ +package com.example.api.domain; + +import jakarta.persistence.*; +import lombok.Getter; +import lombok.Setter; + +@Entity +@Getter +@Setter +@Table(name = "INQUIRY") +public class Inquiry extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long inquiryId; + + private String inquiryType; + private String subInquiryType; + private String title; + private String content; + private int responseStatus; + + private String createdBy; + + private String processStatus; + + @Column(name = "answer_date") + private String answerDate; + +} diff --git a/src/main/java/com/example/api/inquiry/InquiryController.java b/src/main/java/com/example/api/inquiry/InquiryController.java new file mode 100644 index 00000000..0e83b5ee --- /dev/null +++ b/src/main/java/com/example/api/inquiry/InquiryController.java @@ -0,0 +1,63 @@ +package com.example.api.inquiry; + + +import com.example.api.domain.Inquiry; +import com.example.api.inquiry.dto.RequestDTO; +import com.example.api.inquiry.dto.ResponseDTO; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.stream.Collectors; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/v1/support") +public class InquiryController { + private final InquiryService inquiryService; + + + @PostMapping("/inquiry") + public ResponseEntity createInquiry(@RequestBody RequestDTO RequestDTO) { + Inquiry inquiry = inquiryService.saveInquiry(RequestDTO); + ResponseDTO responseDTO = mapToResponseDTO(inquiry); + return ResponseEntity.ok(responseDTO); + } + + + @GetMapping("/my-inquiries") + public ResponseEntity> getMyInquiries(@RequestParam String createdBy) { + List inquiries = inquiryService.getInquiriesByUser(createdBy); + List responseDTOs = inquiries.stream() + .map(this::mapToResponseDTO) + .collect(Collectors.toList()); + return ResponseEntity.ok(responseDTOs); + } + + + @PutMapping("/inquiry/{inquiryId}/response") + public ResponseEntity updateResponseStatus( + @PathVariable Long inquiryId, + @RequestParam int responseStatus, + @RequestParam String processStatus) { + + Inquiry inquiry = inquiryService.updateResponseStatus(inquiryId, responseStatus, processStatus); + ResponseDTO responseDTO = mapToResponseDTO(inquiry); + return ResponseEntity.ok(responseDTO); + } + + private ResponseDTO mapToResponseDTO(Inquiry inquiry) { + ResponseDTO responseDTO = new ResponseDTO(); + responseDTO.setInquiryId(inquiry.getInquiryId()); + responseDTO.setInquiryType(inquiry.getInquiryType()); + responseDTO.setSubInquiryType(inquiry.getSubInquiryType()); + responseDTO.setTitle(inquiry.getTitle()); + responseDTO.setContent(inquiry.getContent()); + responseDTO.setResponseStatus(inquiry.getResponseStatus()); + responseDTO.setProcessStatus(inquiry.getProcessStatus()); + responseDTO.setAnswerDate(inquiry.getAnswerDate()); + responseDTO.setCreatedBy(inquiry.getCreatedBy()); + return responseDTO; + } +} diff --git a/src/main/java/com/example/api/inquiry/InquiryRepository.java b/src/main/java/com/example/api/inquiry/InquiryRepository.java new file mode 100644 index 00000000..60207149 --- /dev/null +++ b/src/main/java/com/example/api/inquiry/InquiryRepository.java @@ -0,0 +1,9 @@ +package com.example.api.inquiry; + +import com.example.api.domain.Inquiry; +import org.springframework.data.jpa.repository.JpaRepository; +import java.util.List; + +public interface InquiryRepository extends JpaRepository { + List findByCreatedBy(String createdBy); +} diff --git a/src/main/java/com/example/api/inquiry/InquiryService.java b/src/main/java/com/example/api/inquiry/InquiryService.java new file mode 100644 index 00000000..efee9ab6 --- /dev/null +++ b/src/main/java/com/example/api/inquiry/InquiryService.java @@ -0,0 +1,48 @@ +package com.example.api.inquiry; + + +import com.example.api.domain.Inquiry; +import com.example.api.inquiry.dto.RequestDTO; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.List; + +@Service +@RequiredArgsConstructor +public class InquiryService { + private final InquiryRepository inquiryRepository; + + public Inquiry saveInquiry(RequestDTO inquiryRequestDTO) { + Inquiry inquiry = new Inquiry(); + inquiry.setInquiryType(inquiryRequestDTO.getInquiryType()); + inquiry.setSubInquiryType(inquiryRequestDTO.getSubInquiryType()); + inquiry.setTitle(inquiryRequestDTO.getTitle()); + inquiry.setContent(inquiryRequestDTO.getContent()); + inquiry.setResponseStatus(0); + inquiry.setCreatedBy(inquiryRequestDTO.getCreatedBy()); + inquiry.setProcessStatus("처리중"); + inquiry.setAnswerDate(null); + + return inquiryRepository.save(inquiry); + } + + + public List getInquiriesByUser(String createdBy) { + return inquiryRepository.findByCreatedBy(createdBy); + } + + + public Inquiry updateResponseStatus(Long inquiryId, int responseStatus, String processStatus) { + Inquiry inquiry = inquiryRepository.findById(inquiryId) + .orElseThrow(() -> new RuntimeException("문의가 없습니다.")); + inquiry.setResponseStatus(responseStatus); + inquiry.setProcessStatus(processStatus); + inquiry.setAnswerDate(LocalDateTime.now().toString()); + return inquiryRepository.save(inquiry); + } +} + + + diff --git a/src/main/java/com/example/api/inquiry/dto/RequestDTO.java b/src/main/java/com/example/api/inquiry/dto/RequestDTO.java new file mode 100644 index 00000000..1f5a67b8 --- /dev/null +++ b/src/main/java/com/example/api/inquiry/dto/RequestDTO.java @@ -0,0 +1,15 @@ +package com.example.api.inquiry.dto; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class RequestDTO { + + private String inquiryType; + private String subInquiryType; + private String title; + private String content; + private String createdBy; +} diff --git a/src/main/java/com/example/api/inquiry/dto/ResponseDTO.java b/src/main/java/com/example/api/inquiry/dto/ResponseDTO.java new file mode 100644 index 00000000..64fc1f97 --- /dev/null +++ b/src/main/java/com/example/api/inquiry/dto/ResponseDTO.java @@ -0,0 +1,19 @@ +package com.example.api.inquiry.dto; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class ResponseDTO { + + private Long inquiryId; + private String inquiryType; + private String subInquiryType; + private String title; + private String content; + private int responseStatus; + private String processStatus; + private String answerDate; + private String createdBy; +} From cbdaa06f30c48f2d5d195411c6022291fea556a7 Mon Sep 17 00:00:00 2001 From: yuna83 Date: Thu, 28 Nov 2024 01:43:44 +0900 Subject: [PATCH 214/276] =?UTF-8?q?#38=20refactor(InquiryService):Model=20?= =?UTF-8?q?Mapper=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 4 +++ .../java/com/example/api/domain/Inquiry.java | 10 +++++-- .../example/api/inquiry/InquiryConfig.java | 14 +++++++++ .../api/inquiry/InquiryController.java | 30 ++++--------------- .../example/api/inquiry/InquiryService.java | 22 +++----------- .../example/api/inquiry/dto/ResponseDTO.java | 2 +- 6 files changed, 36 insertions(+), 46 deletions(-) create mode 100644 src/main/java/com/example/api/inquiry/InquiryConfig.java diff --git a/build.gradle b/build.gradle index 4a804a9a..c1e038b7 100644 --- a/build.gradle +++ b/build.gradle @@ -77,6 +77,10 @@ dependencies { //WIREMOCK (외부 의존성 테스트용) implementation 'org.wiremock.integrations:wiremock-spring-boot:3.3.0' + + // ModelMapper 사용 + implementation 'org.modelmapper:modelmapper:3.1.0' + } tasks.named('test') { diff --git a/src/main/java/com/example/api/domain/Inquiry.java b/src/main/java/com/example/api/domain/Inquiry.java index 04d23c14..58db9c6c 100644 --- a/src/main/java/com/example/api/domain/Inquiry.java +++ b/src/main/java/com/example/api/domain/Inquiry.java @@ -3,6 +3,7 @@ import jakarta.persistence.*; import lombok.Getter; import lombok.Setter; +import java.time.LocalDate; @Entity @Getter @@ -18,7 +19,9 @@ public class Inquiry extends BaseEntity { private String subInquiryType; private String title; private String content; - private int responseStatus; + + @Enumerated(EnumType.STRING) + private InquiryStatus inquiryStatus; private String createdBy; @@ -26,5 +29,8 @@ public class Inquiry extends BaseEntity { @Column(name = "answer_date") private String answerDate; - + + public enum InquiryStatus { + WAITING, COMPLETED + } } diff --git a/src/main/java/com/example/api/inquiry/InquiryConfig.java b/src/main/java/com/example/api/inquiry/InquiryConfig.java new file mode 100644 index 00000000..3e86f78b --- /dev/null +++ b/src/main/java/com/example/api/inquiry/InquiryConfig.java @@ -0,0 +1,14 @@ +package com.example.api.inquiry; + +import org.modelmapper.ModelMapper; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class InquiryConfig { + + @Bean + public ModelMapper modelMapper() { + return new ModelMapper(); + } +} diff --git a/src/main/java/com/example/api/inquiry/InquiryController.java b/src/main/java/com/example/api/inquiry/InquiryController.java index 0e83b5ee..100cad58 100644 --- a/src/main/java/com/example/api/inquiry/InquiryController.java +++ b/src/main/java/com/example/api/inquiry/InquiryController.java @@ -5,6 +5,7 @@ import com.example.api.inquiry.dto.RequestDTO; import com.example.api.inquiry.dto.ResponseDTO; import lombok.RequiredArgsConstructor; +import org.modelmapper.ModelMapper; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -16,11 +17,12 @@ @RequestMapping("/api/v1/support") public class InquiryController { private final InquiryService inquiryService; + private final ModelMapper modelMapper; @PostMapping("/inquiry") - public ResponseEntity createInquiry(@RequestBody RequestDTO RequestDTO) { - Inquiry inquiry = inquiryService.saveInquiry(RequestDTO); + public ResponseEntity createInquiry(@RequestBody RequestDTO requestDTO) { + Inquiry inquiry = inquiryService.saveInquiry(requestDTO); ResponseDTO responseDTO = mapToResponseDTO(inquiry); return ResponseEntity.ok(responseDTO); } @@ -35,29 +37,7 @@ public ResponseEntity> getMyInquiries(@RequestParam String cre return ResponseEntity.ok(responseDTOs); } - - @PutMapping("/inquiry/{inquiryId}/response") - public ResponseEntity updateResponseStatus( - @PathVariable Long inquiryId, - @RequestParam int responseStatus, - @RequestParam String processStatus) { - - Inquiry inquiry = inquiryService.updateResponseStatus(inquiryId, responseStatus, processStatus); - ResponseDTO responseDTO = mapToResponseDTO(inquiry); - return ResponseEntity.ok(responseDTO); - } - private ResponseDTO mapToResponseDTO(Inquiry inquiry) { - ResponseDTO responseDTO = new ResponseDTO(); - responseDTO.setInquiryId(inquiry.getInquiryId()); - responseDTO.setInquiryType(inquiry.getInquiryType()); - responseDTO.setSubInquiryType(inquiry.getSubInquiryType()); - responseDTO.setTitle(inquiry.getTitle()); - responseDTO.setContent(inquiry.getContent()); - responseDTO.setResponseStatus(inquiry.getResponseStatus()); - responseDTO.setProcessStatus(inquiry.getProcessStatus()); - responseDTO.setAnswerDate(inquiry.getAnswerDate()); - responseDTO.setCreatedBy(inquiry.getCreatedBy()); - return responseDTO; + return modelMapper.map(inquiry, ResponseDTO.class); } } diff --git a/src/main/java/com/example/api/inquiry/InquiryService.java b/src/main/java/com/example/api/inquiry/InquiryService.java index efee9ab6..cdef1204 100644 --- a/src/main/java/com/example/api/inquiry/InquiryService.java +++ b/src/main/java/com/example/api/inquiry/InquiryService.java @@ -1,27 +1,22 @@ package com.example.api.inquiry; - import com.example.api.domain.Inquiry; import com.example.api.inquiry.dto.RequestDTO; import lombok.RequiredArgsConstructor; +import org.modelmapper.ModelMapper; import org.springframework.stereotype.Service; -import java.time.LocalDateTime; import java.util.List; @Service @RequiredArgsConstructor public class InquiryService { private final InquiryRepository inquiryRepository; + private final ModelMapper modelMapper; public Inquiry saveInquiry(RequestDTO inquiryRequestDTO) { - Inquiry inquiry = new Inquiry(); - inquiry.setInquiryType(inquiryRequestDTO.getInquiryType()); - inquiry.setSubInquiryType(inquiryRequestDTO.getSubInquiryType()); - inquiry.setTitle(inquiryRequestDTO.getTitle()); - inquiry.setContent(inquiryRequestDTO.getContent()); - inquiry.setResponseStatus(0); - inquiry.setCreatedBy(inquiryRequestDTO.getCreatedBy()); + Inquiry inquiry = modelMapper.map(inquiryRequestDTO, Inquiry.class); + inquiry.setInquiryStatus(Inquiry.InquiryStatus.WAITING); inquiry.setProcessStatus("처리중"); inquiry.setAnswerDate(null); @@ -33,15 +28,6 @@ public List getInquiriesByUser(String createdBy) { return inquiryRepository.findByCreatedBy(createdBy); } - - public Inquiry updateResponseStatus(Long inquiryId, int responseStatus, String processStatus) { - Inquiry inquiry = inquiryRepository.findById(inquiryId) - .orElseThrow(() -> new RuntimeException("문의가 없습니다.")); - inquiry.setResponseStatus(responseStatus); - inquiry.setProcessStatus(processStatus); - inquiry.setAnswerDate(LocalDateTime.now().toString()); - return inquiryRepository.save(inquiry); - } } diff --git a/src/main/java/com/example/api/inquiry/dto/ResponseDTO.java b/src/main/java/com/example/api/inquiry/dto/ResponseDTO.java index 64fc1f97..57c4e4b0 100644 --- a/src/main/java/com/example/api/inquiry/dto/ResponseDTO.java +++ b/src/main/java/com/example/api/inquiry/dto/ResponseDTO.java @@ -12,7 +12,7 @@ public class ResponseDTO { private String subInquiryType; private String title; private String content; - private int responseStatus; + private String inquiryStatus; private String processStatus; private String answerDate; private String createdBy; From 8b9241d1aad91e03570a25320fe16e1e7b483855 Mon Sep 17 00:00:00 2001 From: yuna83 Date: Wed, 4 Dec 2024 16:56:42 +0900 Subject: [PATCH 215/276] =?UTF-8?q?Account=20=EC=97=94=ED=8B=B0=ED=8B=B0?= =?UTF-8?q?=EC=99=80=EC=9D=98=20=EC=97=B0=EA=B4=80=EA=B4=80=EA=B3=84=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/example/api/domain/Inquiry.java | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/example/api/domain/Inquiry.java b/src/main/java/com/example/api/domain/Inquiry.java index 58db9c6c..588a97ee 100644 --- a/src/main/java/com/example/api/domain/Inquiry.java +++ b/src/main/java/com/example/api/domain/Inquiry.java @@ -3,7 +3,10 @@ import jakarta.persistence.*; import lombok.Getter; import lombok.Setter; -import java.time.LocalDate; + +import java.time.LocalDateTime; + +import static jakarta.persistence.FetchType.LAZY; @Entity @Getter @@ -15,6 +18,10 @@ public class Inquiry extends BaseEntity { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long inquiryId; + @ManyToOne(fetch = LAZY) + @JoinColumn(name = "ACCOUNT_UNIQUE_ID") + private Account account; + private String inquiryType; private String subInquiryType; private String title; @@ -23,12 +30,7 @@ public class Inquiry extends BaseEntity { @Enumerated(EnumType.STRING) private InquiryStatus inquiryStatus; - private String createdBy; - - private String processStatus; - - @Column(name = "answer_date") - private String answerDate; + private LocalDateTime answerDate; public enum InquiryStatus { WAITING, COMPLETED From 79a6a51b2ba9281565a7656425d0b26009ded05a Mon Sep 17 00:00:00 2001 From: yuna83 Date: Tue, 31 Dec 2024 13:51:52 +0900 Subject: [PATCH 216/276] =?UTF-8?q?#36=20refactor(InquiryCommand):=20DTO?= =?UTF-8?q?=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 1 + .../java/com/example/api/domain/Inquiry.java | 7 ++++--- .../example/api/inquiry/InquiryConfig.java | 14 ------------- .../example/api/inquiry/InquiryService.java | 4 ++-- .../{ => controller}/InquiryController.java | 19 +++++++++--------- .../api/inquiry/dto/InquiryCommand.java | 19 ++++++++++++++++++ .../api/inquiry/dto/InquiryRequest.java | 13 ++++++++++++ .../api/inquiry/dto/InquiryResponse.java | 20 +++++++++++++++++++ .../example/api/inquiry/dto/RequestDTO.java | 15 -------------- .../example/api/inquiry/dto/ResponseDTO.java | 19 ------------------ 10 files changed, 69 insertions(+), 62 deletions(-) delete mode 100644 src/main/java/com/example/api/inquiry/InquiryConfig.java rename src/main/java/com/example/api/inquiry/{ => controller}/InquiryController.java (58%) create mode 100644 src/main/java/com/example/api/inquiry/dto/InquiryCommand.java create mode 100644 src/main/java/com/example/api/inquiry/dto/InquiryRequest.java create mode 100644 src/main/java/com/example/api/inquiry/dto/InquiryResponse.java delete mode 100644 src/main/java/com/example/api/inquiry/dto/RequestDTO.java delete mode 100644 src/main/java/com/example/api/inquiry/dto/ResponseDTO.java diff --git a/build.gradle b/build.gradle index c1e038b7..de13760b 100644 --- a/build.gradle +++ b/build.gradle @@ -79,6 +79,7 @@ dependencies { implementation 'org.wiremock.integrations:wiremock-spring-boot:3.3.0' // ModelMapper 사용 + //객체 간 매핑 처리 implementation 'org.modelmapper:modelmapper:3.1.0' } diff --git a/src/main/java/com/example/api/domain/Inquiry.java b/src/main/java/com/example/api/domain/Inquiry.java index 588a97ee..137e9103 100644 --- a/src/main/java/com/example/api/domain/Inquiry.java +++ b/src/main/java/com/example/api/domain/Inquiry.java @@ -13,25 +13,26 @@ @Setter @Table(name = "INQUIRY") public class Inquiry extends BaseEntity { - @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long inquiryId; @ManyToOne(fetch = LAZY) @JoinColumn(name = "ACCOUNT_UNIQUE_ID") - private Account account; + private Account createdBy; private String inquiryType; + private String subInquiryType; + private String title; + private String content; @Enumerated(EnumType.STRING) private InquiryStatus inquiryStatus; private LocalDateTime answerDate; - public enum InquiryStatus { WAITING, COMPLETED } diff --git a/src/main/java/com/example/api/inquiry/InquiryConfig.java b/src/main/java/com/example/api/inquiry/InquiryConfig.java deleted file mode 100644 index 3e86f78b..00000000 --- a/src/main/java/com/example/api/inquiry/InquiryConfig.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.example.api.inquiry; - -import org.modelmapper.ModelMapper; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@Configuration -public class InquiryConfig { - - @Bean - public ModelMapper modelMapper() { - return new ModelMapper(); - } -} diff --git a/src/main/java/com/example/api/inquiry/InquiryService.java b/src/main/java/com/example/api/inquiry/InquiryService.java index cdef1204..1404d5ab 100644 --- a/src/main/java/com/example/api/inquiry/InquiryService.java +++ b/src/main/java/com/example/api/inquiry/InquiryService.java @@ -1,7 +1,7 @@ package com.example.api.inquiry; import com.example.api.domain.Inquiry; -import com.example.api.inquiry.dto.RequestDTO; +import com.example.api.inquiry.dto.InquiryRequest; import lombok.RequiredArgsConstructor; import org.modelmapper.ModelMapper; import org.springframework.stereotype.Service; @@ -14,7 +14,7 @@ public class InquiryService { private final InquiryRepository inquiryRepository; private final ModelMapper modelMapper; - public Inquiry saveInquiry(RequestDTO inquiryRequestDTO) { + public Inquiry saveInquiry(InquiryRequest inquiryRequestDTO) { Inquiry inquiry = modelMapper.map(inquiryRequestDTO, Inquiry.class); inquiry.setInquiryStatus(Inquiry.InquiryStatus.WAITING); inquiry.setProcessStatus("처리중"); diff --git a/src/main/java/com/example/api/inquiry/InquiryController.java b/src/main/java/com/example/api/inquiry/controller/InquiryController.java similarity index 58% rename from src/main/java/com/example/api/inquiry/InquiryController.java rename to src/main/java/com/example/api/inquiry/controller/InquiryController.java index 100cad58..8cfbf7b0 100644 --- a/src/main/java/com/example/api/inquiry/InquiryController.java +++ b/src/main/java/com/example/api/inquiry/controller/InquiryController.java @@ -1,9 +1,10 @@ -package com.example.api.inquiry; +package com.example.api.inquiry.controller; import com.example.api.domain.Inquiry; -import com.example.api.inquiry.dto.RequestDTO; -import com.example.api.inquiry.dto.ResponseDTO; +import com.example.api.inquiry.InquiryService; +import com.example.api.inquiry.dto.InquiryRequest; +import com.example.api.inquiry.dto.InquiryCommand; import lombok.RequiredArgsConstructor; import org.modelmapper.ModelMapper; import org.springframework.http.ResponseEntity; @@ -21,23 +22,23 @@ public class InquiryController { @PostMapping("/inquiry") - public ResponseEntity createInquiry(@RequestBody RequestDTO requestDTO) { + public ResponseEntity createInquiry(@RequestBody InquiryRequest requestDTO) { Inquiry inquiry = inquiryService.saveInquiry(requestDTO); - ResponseDTO responseDTO = mapToResponseDTO(inquiry); + InquiryCommand responseDTO = mapToResponseDTO(inquiry); return ResponseEntity.ok(responseDTO); } @GetMapping("/my-inquiries") - public ResponseEntity> getMyInquiries(@RequestParam String createdBy) { + public ResponseEntity> getMyInquiries(@RequestParam String createdBy) { List inquiries = inquiryService.getInquiriesByUser(createdBy); - List responseDTOs = inquiries.stream() + List responseDTOs = inquiries.stream() .map(this::mapToResponseDTO) .collect(Collectors.toList()); return ResponseEntity.ok(responseDTOs); } - private ResponseDTO mapToResponseDTO(Inquiry inquiry) { - return modelMapper.map(inquiry, ResponseDTO.class); + private InquiryCommand mapToResponseDTO(Inquiry inquiry) { + return modelMapper.map(inquiry, InquiryCommand.class); } } diff --git a/src/main/java/com/example/api/inquiry/dto/InquiryCommand.java b/src/main/java/com/example/api/inquiry/dto/InquiryCommand.java new file mode 100644 index 00000000..52410d8c --- /dev/null +++ b/src/main/java/com/example/api/inquiry/dto/InquiryCommand.java @@ -0,0 +1,19 @@ +package com.example.api.inquiry.dto; + +import org.springframework.lang.NonNull; +import java.time.LocalDateTime; + +public record InquiryCommand( + @NonNull + Long inquiryId, + String inquiryType, + String subInquiryType, + String title, + String content, + String inquiryStatus, + String processStatus, + LocalDateTime answerDate, + @NonNull + Long accountId +) { +} diff --git a/src/main/java/com/example/api/inquiry/dto/InquiryRequest.java b/src/main/java/com/example/api/inquiry/dto/InquiryRequest.java new file mode 100644 index 00000000..56001a26 --- /dev/null +++ b/src/main/java/com/example/api/inquiry/dto/InquiryRequest.java @@ -0,0 +1,13 @@ +package com.example.api.inquiry.dto; + +import org.springframework.lang.NonNull; + +public record InquiryRequest( + String inquiryType, + String subInquiryType, + String title, + String content, + @NonNull + Long accountId +) { +} diff --git a/src/main/java/com/example/api/inquiry/dto/InquiryResponse.java b/src/main/java/com/example/api/inquiry/dto/InquiryResponse.java new file mode 100644 index 00000000..8490ccba --- /dev/null +++ b/src/main/java/com/example/api/inquiry/dto/InquiryResponse.java @@ -0,0 +1,20 @@ +package com.example.api.inquiry.dto; + +import org.springframework.lang.NonNull; + +import java.time.LocalDateTime; + +public record InquiryResponse( + @NonNull + Long inquiryId, + String inquiryType, + String subInquiryType, + String title, + String content, + String inquiryStatus, + String processStatus, + LocalDateTime answerDate, + @NonNull + Long accountId +) { +} diff --git a/src/main/java/com/example/api/inquiry/dto/RequestDTO.java b/src/main/java/com/example/api/inquiry/dto/RequestDTO.java deleted file mode 100644 index 1f5a67b8..00000000 --- a/src/main/java/com/example/api/inquiry/dto/RequestDTO.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.example.api.inquiry.dto; - -import lombok.Getter; -import lombok.Setter; - -@Getter -@Setter -public class RequestDTO { - - private String inquiryType; - private String subInquiryType; - private String title; - private String content; - private String createdBy; -} diff --git a/src/main/java/com/example/api/inquiry/dto/ResponseDTO.java b/src/main/java/com/example/api/inquiry/dto/ResponseDTO.java deleted file mode 100644 index 57c4e4b0..00000000 --- a/src/main/java/com/example/api/inquiry/dto/ResponseDTO.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.example.api.inquiry.dto; - -import lombok.Getter; -import lombok.Setter; - -@Getter -@Setter -public class ResponseDTO { - - private Long inquiryId; - private String inquiryType; - private String subInquiryType; - private String title; - private String content; - private String inquiryStatus; - private String processStatus; - private String answerDate; - private String createdBy; -} From d1ec1e916087c7aa189ce13efac79e672fef553d Mon Sep 17 00:00:00 2001 From: yuna83 Date: Tue, 31 Dec 2024 14:48:07 +0900 Subject: [PATCH 217/276] =?UTF-8?q?#38=20refactor(InquiryService):=20?= =?UTF-8?q?=EC=84=9C=EB=B9=84=EC=8A=A4=20=EB=A6=AC=ED=8C=A9=ED=86=A0?= =?UTF-8?q?=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/inquiry/InquiryRepository.java | 3 +- .../example/api/inquiry/InquiryService.java | 57 ++++++++++++++----- .../api/inquiry/dto/InquiryCommand.java | 4 +- .../api/inquiry/dto/InquiryRequest.java | 17 +++++- .../api/inquiry/dto/InquiryResponse.java | 4 +- 5 files changed, 65 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/example/api/inquiry/InquiryRepository.java b/src/main/java/com/example/api/inquiry/InquiryRepository.java index 60207149..5e61865a 100644 --- a/src/main/java/com/example/api/inquiry/InquiryRepository.java +++ b/src/main/java/com/example/api/inquiry/InquiryRepository.java @@ -1,9 +1,10 @@ package com.example.api.inquiry; +import com.example.api.domain.Account; import com.example.api.domain.Inquiry; import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; public interface InquiryRepository extends JpaRepository { - List findByCreatedBy(String createdBy); + List findByCreatedBy(Account createdBy); } diff --git a/src/main/java/com/example/api/inquiry/InquiryService.java b/src/main/java/com/example/api/inquiry/InquiryService.java index 1404d5ab..b74e5354 100644 --- a/src/main/java/com/example/api/inquiry/InquiryService.java +++ b/src/main/java/com/example/api/inquiry/InquiryService.java @@ -1,34 +1,63 @@ package com.example.api.inquiry; +import com.example.api.domain.Account; import com.example.api.domain.Inquiry; +import com.example.api.inquiry.dto.InquiryCommand; import com.example.api.inquiry.dto.InquiryRequest; +import com.example.api.inquiry.dto.InquiryResponse; import lombok.RequiredArgsConstructor; -import org.modelmapper.ModelMapper; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; import java.util.List; +import java.util.stream.Collectors; @Service @RequiredArgsConstructor public class InquiryService { private final InquiryRepository inquiryRepository; - private final ModelMapper modelMapper; - - public Inquiry saveInquiry(InquiryRequest inquiryRequestDTO) { - Inquiry inquiry = modelMapper.map(inquiryRequestDTO, Inquiry.class); - inquiry.setInquiryStatus(Inquiry.InquiryStatus.WAITING); - inquiry.setProcessStatus("처리중"); - inquiry.setAnswerDate(null); + @Transactional + public Inquiry saveInquiry( + @Validated final InquiryRequest inquiryRequest, + @Validated final Account account + ) { + final InquiryCommand command = inquiryRequest.toCommand(account); + final Inquiry inquiry = mapToInquiry(command); return inquiryRepository.save(inquiry); } - - public List getInquiriesByUser(String createdBy) { - return inquiryRepository.findByCreatedBy(createdBy); + @Transactional(readOnly = true) + public List getInquiriesByUser(@Validated final Account account) { + final List inquiries = inquiryRepository.findByCreatedBy(account); + return inquiries.stream() + .map(this::mapToInquiryResponse) + .collect(Collectors.toList()); } -} - - + private Inquiry mapToInquiry(@Validated final InquiryCommand command) { + final Inquiry inquiry = new Inquiry(); + inquiry.setInquiryType(command.inquiryType()); + inquiry.setSubInquiryType(command.subInquiryType()); + inquiry.setTitle(command.title()); + inquiry.setContent(command.content()); + inquiry.setInquiryStatus(Inquiry.InquiryStatus.valueOf(command.inquiryStatus())); + inquiry.setAnswerDate(command.answerDate()); + inquiry.setCreatedBy(command.createdBy()); + return inquiry; + } + private InquiryResponse mapToInquiryResponse(@Validated final Inquiry inquiry) { + return new InquiryResponse( + inquiry.getInquiryId(), + inquiry.getInquiryType(), + inquiry.getSubInquiryType(), + inquiry.getTitle(), + inquiry.getContent(), + inquiry.getInquiryStatus().name(), + inquiry.getAnswerDate(), + inquiry.getCreatedBy() + ); + } +} \ No newline at end of file diff --git a/src/main/java/com/example/api/inquiry/dto/InquiryCommand.java b/src/main/java/com/example/api/inquiry/dto/InquiryCommand.java index 52410d8c..e3908ad9 100644 --- a/src/main/java/com/example/api/inquiry/dto/InquiryCommand.java +++ b/src/main/java/com/example/api/inquiry/dto/InquiryCommand.java @@ -1,5 +1,6 @@ package com.example.api.inquiry.dto; +import com.example.api.domain.Account; import org.springframework.lang.NonNull; import java.time.LocalDateTime; @@ -11,9 +12,8 @@ public record InquiryCommand( String title, String content, String inquiryStatus, - String processStatus, LocalDateTime answerDate, @NonNull - Long accountId + Account createdBy ) { } diff --git a/src/main/java/com/example/api/inquiry/dto/InquiryRequest.java b/src/main/java/com/example/api/inquiry/dto/InquiryRequest.java index 56001a26..5331728f 100644 --- a/src/main/java/com/example/api/inquiry/dto/InquiryRequest.java +++ b/src/main/java/com/example/api/inquiry/dto/InquiryRequest.java @@ -1,13 +1,28 @@ package com.example.api.inquiry.dto; +import com.example.api.domain.Account; import org.springframework.lang.NonNull; public record InquiryRequest( + @NonNull String inquiryType, String subInquiryType, String title, String content, @NonNull - Long accountId + Account createdBy ) { + + public InquiryCommand toCommand(final Account account) { + return new InquiryCommand( + null, + inquiryType, + subInquiryType, + title, + content, + "WAITING", + null, + account + ); + } } diff --git a/src/main/java/com/example/api/inquiry/dto/InquiryResponse.java b/src/main/java/com/example/api/inquiry/dto/InquiryResponse.java index 8490ccba..0c66be7b 100644 --- a/src/main/java/com/example/api/inquiry/dto/InquiryResponse.java +++ b/src/main/java/com/example/api/inquiry/dto/InquiryResponse.java @@ -1,5 +1,6 @@ package com.example.api.inquiry.dto; +import com.example.api.domain.Account; import org.springframework.lang.NonNull; import java.time.LocalDateTime; @@ -12,9 +13,8 @@ public record InquiryResponse( String title, String content, String inquiryStatus, - String processStatus, LocalDateTime answerDate, @NonNull - Long accountId + Account createdBy ) { } From 728aa07ab23e8ccda9936b788f71502929831178 Mon Sep 17 00:00:00 2001 From: yuna83 Date: Tue, 31 Dec 2024 15:53:40 +0900 Subject: [PATCH 218/276] =?UTF-8?q?#38=20refactor(InquiryController):=20?= =?UTF-8?q?=EC=BB=A8=ED=8A=B8=EB=A1=A4=EB=9F=AC=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/inquiry/InquiryRepository.java | 2 +- .../example/api/inquiry/InquiryService.java | 4 +- .../inquiry/controller/InquiryController.java | 47 +++++++++++-------- 3 files changed, 30 insertions(+), 23 deletions(-) diff --git a/src/main/java/com/example/api/inquiry/InquiryRepository.java b/src/main/java/com/example/api/inquiry/InquiryRepository.java index 5e61865a..f42eec40 100644 --- a/src/main/java/com/example/api/inquiry/InquiryRepository.java +++ b/src/main/java/com/example/api/inquiry/InquiryRepository.java @@ -6,5 +6,5 @@ import java.util.List; public interface InquiryRepository extends JpaRepository { - List findByCreatedBy(Account createdBy); + List findByCreatedByAccountId(Long accountId); } diff --git a/src/main/java/com/example/api/inquiry/InquiryService.java b/src/main/java/com/example/api/inquiry/InquiryService.java index b74e5354..0b75df31 100644 --- a/src/main/java/com/example/api/inquiry/InquiryService.java +++ b/src/main/java/com/example/api/inquiry/InquiryService.java @@ -29,8 +29,8 @@ public Inquiry saveInquiry( } @Transactional(readOnly = true) - public List getInquiriesByUser(@Validated final Account account) { - final List inquiries = inquiryRepository.findByCreatedBy(account); + public List getInquiriesByAccountId(final Long accountId) { + final List inquiries = inquiryRepository.findByCreatedByAccountId(accountId); return inquiries.stream() .map(this::mapToInquiryResponse) .collect(Collectors.toList()); diff --git a/src/main/java/com/example/api/inquiry/controller/InquiryController.java b/src/main/java/com/example/api/inquiry/controller/InquiryController.java index 8cfbf7b0..0967f0e1 100644 --- a/src/main/java/com/example/api/inquiry/controller/InquiryController.java +++ b/src/main/java/com/example/api/inquiry/controller/InquiryController.java @@ -1,44 +1,51 @@ package com.example.api.inquiry.controller; - +import com.example.api.domain.Account; import com.example.api.domain.Inquiry; import com.example.api.inquiry.InquiryService; import com.example.api.inquiry.dto.InquiryRequest; -import com.example.api.inquiry.dto.InquiryCommand; +import com.example.api.inquiry.dto.InquiryResponse; import lombok.RequiredArgsConstructor; -import org.modelmapper.ModelMapper; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; - import java.util.List; -import java.util.stream.Collectors; @RestController @RequiredArgsConstructor @RequestMapping("/api/v1/support") public class InquiryController { private final InquiryService inquiryService; - private final ModelMapper modelMapper; - @PostMapping("/inquiry") - public ResponseEntity createInquiry(@RequestBody InquiryRequest requestDTO) { - Inquiry inquiry = inquiryService.saveInquiry(requestDTO); - InquiryCommand responseDTO = mapToResponseDTO(inquiry); - return ResponseEntity.ok(responseDTO); + public ResponseEntity createInquiry( + @RequestBody final InquiryRequest inquiryRequest + ) { + final Inquiry inquiry = inquiryService.saveInquiry( + inquiryRequest, + inquiryRequest.createdBy() + ); + final InquiryResponse inquiryResponse = mapToResponse(inquiry); + return ResponseEntity.ok(inquiryResponse); } - @GetMapping("/my-inquiries") - public ResponseEntity> getMyInquiries(@RequestParam String createdBy) { - List inquiries = inquiryService.getInquiriesByUser(createdBy); - List responseDTOs = inquiries.stream() - .map(this::mapToResponseDTO) - .collect(Collectors.toList()); - return ResponseEntity.ok(responseDTOs); + public ResponseEntity> getMyInquiries( + @RequestParam(required = true) final Long accountId + ) { + final List inquiryResponses = inquiryService.getInquiriesByAccountId(accountId); + return ResponseEntity.ok(inquiryResponses); } - private InquiryCommand mapToResponseDTO(Inquiry inquiry) { - return modelMapper.map(inquiry, InquiryCommand.class); + private InquiryResponse mapToResponse(Inquiry inquiry) { + return new InquiryResponse( + inquiry.getInquiryId(), + inquiry.getInquiryType(), + inquiry.getSubInquiryType(), + inquiry.getTitle(), + inquiry.getContent(), + inquiry.getInquiryStatus().name(), + inquiry.getAnswerDate(), + inquiry.getCreatedBy() + ); } } From 40000738af361d9d1fffaff2d0e87adb6ef4906f Mon Sep 17 00:00:00 2001 From: yuna83 Date: Wed, 15 Jan 2025 12:43:18 +0900 Subject: [PATCH 219/276] =?UTF-8?q?#38=20refactor(inquiryService):?= =?UTF-8?q?=EC=9C=A0=ED=98=B8=EC=84=B1=20=EA=B2=80=EC=82=AC=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/api/inquiry/InquiryService.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/inquiry/InquiryService.java b/src/main/java/com/example/api/inquiry/InquiryService.java index 0b75df31..77b49595 100644 --- a/src/main/java/com/example/api/inquiry/InquiryService.java +++ b/src/main/java/com/example/api/inquiry/InquiryService.java @@ -29,7 +29,9 @@ public Inquiry saveInquiry( } @Transactional(readOnly = true) - public List getInquiriesByAccountId(final Long accountId) { + public List getInquiriesByAccountId( + @Validated final Long accountId + ) { final List inquiries = inquiryRepository.findByCreatedByAccountId(accountId); return inquiries.stream() .map(this::mapToInquiryResponse) From 4fdc5702ab3d7b71993e68283a15abc4fb3f74ca Mon Sep 17 00:00:00 2001 From: yuna83 Date: Wed, 15 Jan 2025 13:10:43 +0900 Subject: [PATCH 220/276] =?UTF-8?q?#38=20test(InquiryServiceTest):=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/inquiry/InquiryServiceTest.java | 114 ++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 src/test/java/com/example/api/inquiry/InquiryServiceTest.java diff --git a/src/test/java/com/example/api/inquiry/InquiryServiceTest.java b/src/test/java/com/example/api/inquiry/InquiryServiceTest.java new file mode 100644 index 00000000..5fada952 --- /dev/null +++ b/src/test/java/com/example/api/inquiry/InquiryServiceTest.java @@ -0,0 +1,114 @@ +package com.example.api.inquiry; + +import com.example.api.account.repository.AccountRepository; +import com.example.api.domain.Account; +import com.example.api.domain.Inquiry; +import com.example.api.inquiry.dto.InquiryRequest; +import com.example.api.inquiry.dto.InquiryResponse; +import jakarta.annotation.PostConstruct; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.MethodOrderer; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestMethodOrder; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.time.LocalDateTime; +import java.util.List; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +@SpringBootTest +class InquiryServiceTest { + @Autowired + private InquiryService inquiryService; + + @Autowired + private InquiryRepository inquiryRepository; + + @Autowired + private AccountRepository accountRepository; + + @PostConstruct + void setUp() { + accountRepository.deleteAll(); + inquiryRepository.deleteAll(); + + Account account = new Account(); + account.setAccountId(1L); + account.setName("Alice"); + account.setEmail("alice@example.com"); + account.setAge(25); + account.setSex("F"); + account.setPhoneNumber("010-1234-5678"); + account.setProfileImage("user-uploads/1/profile.png"); + account.setStarPoint(4.5f); + account.setWorkCount(10); + account.setOpenStatus(true); + account.setDeleted(false); + accountRepository.save(account); + } + + @Test + @DisplayName("문의 저장 및 저장된 문의 반환 테스트") + void saveInquiry_shouldSaveAndReturnInquiry() { + Account account = accountRepository.findById(1L).orElseThrow(); + InquiryRequest inquiryRequest = new InquiryRequest( + "General", + "Question", + "Test Title", + "Test Content", + account + ); + Inquiry result = inquiryService.saveInquiry(inquiryRequest, account); + assertThat(result).isNotNull(); + assertThat(result.getTitle()).isEqualTo("Test Title"); + } + + @Test + @DisplayName("계정 ID로 문의 조회 테스트") + void getInquiriesByAccountId_shouldReturnListOfInquiries() { + Account account = accountRepository.findById(1L).orElseThrow(); + Inquiry inquiry1 = new Inquiry(); + inquiry1.setInquiryId(1L); + inquiry1.setCreatedBy(account); + inquiry1.setInquiryType("General"); + inquiry1.setSubInquiryType("Question"); + inquiry1.setTitle("Inquiry 1"); + inquiry1.setContent("Content 1"); + inquiry1.setInquiryStatus(Inquiry.InquiryStatus.WAITING); + inquiry1.setAnswerDate(LocalDateTime.now()); + inquiryRepository.save(inquiry1); + + Inquiry inquiry2 = new Inquiry(); + inquiry2.setInquiryId(2L); + inquiry2.setCreatedBy(account); + inquiry2.setInquiryType("General"); + inquiry2.setSubInquiryType("Question"); + inquiry2.setTitle("Inquiry 2"); + inquiry2.setContent("Content 2"); + inquiry2.setInquiryStatus(Inquiry.InquiryStatus.COMPLETED); + inquiry2.setAnswerDate(LocalDateTime.now()); + inquiryRepository.save(inquiry2); + List result = inquiryService.getInquiriesByAccountId(account.getAccountId()); + assertThat(result.get(0).title()).isEqualTo("Inquiry 1"); + assertThat(result.get(1).title()).isEqualTo("Inquiry 2"); + } + + @Test + @DisplayName("문의 명령을 엔티티로 매핑 테스트") + void mapToInquiry_shouldMapCommandToInquiry() { + Account account = accountRepository.findById(1L).orElseThrow(); + InquiryRequest inquiryRequest = new InquiryRequest( + "General", + "Question", + "Test Title", + "Test Content", + account + ); + Inquiry inquiry = inquiryService.saveInquiry(inquiryRequest, account); + assertThat(inquiry).isNotNull(); + assertThat(inquiry.getTitle()).isEqualTo("Test Title"); + } +} From 0836d9933dc7bc5d92f332ebc81e9d54151ae400 Mon Sep 17 00:00:00 2001 From: huhdy32 Date: Sat, 4 Jan 2025 14:29:59 +0900 Subject: [PATCH 221/276] =?UTF-8?q?#60=20feat:=20pr=20test,=20=EB=B0=8F=20?= =?UTF-8?q?develop=20=EB=B8=8C=EB=9E=9C=EC=B9=98=20=EC=9E=90=EB=8F=99=20?= =?UTF-8?q?=EB=B0=B0=ED=8F=AC=20=EB=A1=9C=EC=A7=81=20=EA=B5=AC=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/deploy.yml | 45 ++++++++++++++++++++++++++++++++++++ .github/workflows/prtest.yml | 21 +++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 .github/workflows/deploy.yml create mode 100644 .github/workflows/prtest.yml diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 00000000..0db21d0b --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,45 @@ +name: Deploy to Amazon EC2 + +on: + push: + branches: [ "develop" ] + +jobs: + deploy: + name: deploy + runs-on: ubuntu-latest + environment: production + + steps: + - name: setting-jdk17 + uses: actions/setup-java@v3 + with: + java-version: '17' + distribution: 'zulu' + + - name: checkout + uses: actions/checkout@v2 + + - name: test + run: ./gradlew clean test + + - name : build + run: ./gradlew build + + - name: copy file to Develop server via ssh key + uses: appleboy/scp-action@v0.1.7 + with: + host: ${{ secrets.AWS_HOST }} + username: ${{ secrets.AWS_USERNAME }} + key: ${{ secrets.AWS_SSH_KEY }} + source: "build/libs/*" + target: "/home/ubuntu/apiserver" + + - name: deploy + uses: appleboy/ssh-action@master + with: + host: ${{ secrets.AWS_HOST }} + username: ${{ secrets.AWS_USERNAME }} + key: ${{ secrets.AWS_SSH_KEY }} + script: | + sudo systemctl restart apiserver.service diff --git a/.github/workflows/prtest.yml b/.github/workflows/prtest.yml new file mode 100644 index 00000000..2b5ea150 --- /dev/null +++ b/.github/workflows/prtest.yml @@ -0,0 +1,21 @@ +name: PR TEST + +on: + pull_request: + branches: [ "develop", "main" ] + +jobs: + test: + runs-on: ubuntu-latest + steps: + - name: setting-jdk17 + uses: actions/setup-java@v3 + with: + java-version: '17' + distribution: 'zulu' + + - name: checkout + uses: actions/checkout@v2 + + - name: execute TestCode + run: ./gradlew clean test \ No newline at end of file From 001155a2d3a1ff10a373dafad8233f63416b23a5 Mon Sep 17 00:00:00 2001 From: huhdy32 Date: Wed, 15 Jan 2025 18:29:12 +0900 Subject: [PATCH 222/276] =?UTF-8?q?hotfix:=20=EB=B9=8C=EB=93=9C=20?= =?UTF-8?q?=EC=8B=9C=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=8B=A4=ED=96=89=ED=95=98=EC=A7=80=20=EC=95=8A=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 0db21d0b..f09732ec 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -24,7 +24,7 @@ jobs: run: ./gradlew clean test - name : build - run: ./gradlew build + run: ./gradlew build -x test - name: copy file to Develop server via ssh key uses: appleboy/scp-action@v0.1.7 From 04a70cd7fcf159f4a8f2e919a66ee201110ad9b0 Mon Sep 17 00:00:00 2001 From: huhdy32 Date: Wed, 15 Jan 2025 18:32:26 +0900 Subject: [PATCH 223/276] =?UTF-8?q?hotfix:=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=20=EC=8A=A4=ED=85=8C=EC=9D=B4=EC=A7=80=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/deploy.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index f09732ec..73cab569 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -19,9 +19,9 @@ jobs: - name: checkout uses: actions/checkout@v2 - - - name: test - run: ./gradlew clean test +# +# - name: test +# run: ./gradlew clean test - name : build run: ./gradlew build -x test From c038b0de438a53322b248f76527091f0f6cff56b Mon Sep 17 00:00:00 2001 From: huhdy32 Date: Wed, 15 Jan 2025 18:41:15 +0900 Subject: [PATCH 224/276] hotfix: missing Qclass Added --- .../com/example/api/domain/QInquiry.java | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 src/main/generated/com/example/api/domain/QInquiry.java diff --git a/src/main/generated/com/example/api/domain/QInquiry.java b/src/main/generated/com/example/api/domain/QInquiry.java new file mode 100644 index 00000000..b1d0cfbb --- /dev/null +++ b/src/main/generated/com/example/api/domain/QInquiry.java @@ -0,0 +1,71 @@ +package com.example.api.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QInquiry is a Querydsl query type for Inquiry + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QInquiry extends EntityPathBase { + + private static final long serialVersionUID = 2045912162L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QInquiry inquiry = new QInquiry("inquiry"); + + public final QBaseEntity _super = new QBaseEntity(this); + + public final DateTimePath answerDate = createDateTime("answerDate", java.time.LocalDateTime.class); + + public final StringPath content = createString("content"); + + public final QAccount createdBy; + + //inherited + public final DateTimePath createdDate = _super.createdDate; + + public final NumberPath inquiryId = createNumber("inquiryId", Long.class); + + public final EnumPath inquiryStatus = createEnum("inquiryStatus", Inquiry.InquiryStatus.class); + + public final StringPath inquiryType = createString("inquiryType"); + + public final StringPath subInquiryType = createString("subInquiryType"); + + public final StringPath title = createString("title"); + + //inherited + public final DateTimePath updatedDate = _super.updatedDate; + + public QInquiry(String variable) { + this(Inquiry.class, forVariable(variable), INITS); + } + + public QInquiry(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QInquiry(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QInquiry(PathMetadata metadata, PathInits inits) { + this(Inquiry.class, metadata, inits); + } + + public QInquiry(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.createdBy = inits.isInitialized("createdBy") ? new QAccount(forProperty("createdBy")) : null; + } + +} + From 7d774e5fe7c2b5310d41140610f6905f0920eb7b Mon Sep 17 00:00:00 2001 From: huhdy32 Date: Wed, 15 Jan 2025 19:04:50 +0900 Subject: [PATCH 225/276] =?UTF-8?q?hotfix:=20=ED=81=90=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EC=83=9D=EC=84=B1=20=EC=9C=84=EC=B9=98=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 2 +- .../api/auth/entitiy/QRefreshToken.java | 57 ------ .../com/example/api/domain/QAccount.java | 78 -------- .../com/example/api/domain/QAnnouncement.java | 53 ------ .../com/example/api/domain/QBaseEntity.java | 39 ---- .../com/example/api/domain/QBusiness.java | 71 -------- .../example/api/domain/QBusinessCategory.java | 62 ------- .../com/example/api/domain/QCategory.java | 47 ----- .../com/example/api/domain/QChatRoom.java | 53 ------ .../com/example/api/domain/QContract.java | 67 ------- .../example/api/domain/QExternalCareer.java | 63 ------- .../com/example/api/domain/QFlavored.java | 62 ------- .../com/example/api/domain/QInquiry.java | 71 -------- .../example/api/domain/QOfferEmployment.java | 69 -------- .../example/api/domain/QPossibleBoard.java | 63 ------- .../com/example/api/domain/QReview.java | 63 ------- .../com/example/api/domain/QScrap.java | 62 ------- .../api/contracts/ContractServiceTest.java | 1 + .../api/global/BaseIntegrationTest.java | 166 ------------------ 19 files changed, 2 insertions(+), 1147 deletions(-) delete mode 100644 src/main/generated/com/example/api/auth/entitiy/QRefreshToken.java delete mode 100644 src/main/generated/com/example/api/domain/QAccount.java delete mode 100644 src/main/generated/com/example/api/domain/QAnnouncement.java delete mode 100644 src/main/generated/com/example/api/domain/QBaseEntity.java delete mode 100644 src/main/generated/com/example/api/domain/QBusiness.java delete mode 100644 src/main/generated/com/example/api/domain/QBusinessCategory.java delete mode 100644 src/main/generated/com/example/api/domain/QCategory.java delete mode 100644 src/main/generated/com/example/api/domain/QChatRoom.java delete mode 100644 src/main/generated/com/example/api/domain/QContract.java delete mode 100644 src/main/generated/com/example/api/domain/QExternalCareer.java delete mode 100644 src/main/generated/com/example/api/domain/QFlavored.java delete mode 100644 src/main/generated/com/example/api/domain/QInquiry.java delete mode 100644 src/main/generated/com/example/api/domain/QOfferEmployment.java delete mode 100644 src/main/generated/com/example/api/domain/QPossibleBoard.java delete mode 100644 src/main/generated/com/example/api/domain/QReview.java delete mode 100644 src/main/generated/com/example/api/domain/QScrap.java delete mode 100644 src/test/java/com/example/api/global/BaseIntegrationTest.java diff --git a/build.gradle b/build.gradle index de13760b..b263ba38 100644 --- a/build.gradle +++ b/build.gradle @@ -88,7 +88,7 @@ tasks.named('test') { useJUnitPlatform() } -def querydslDir = "src/main/generated" +def querydslDir = "build/generated/querydsl" sourceSets { main.java.srcDirs += [ querydslDir ] diff --git a/src/main/generated/com/example/api/auth/entitiy/QRefreshToken.java b/src/main/generated/com/example/api/auth/entitiy/QRefreshToken.java deleted file mode 100644 index ae3f4b01..00000000 --- a/src/main/generated/com/example/api/auth/entitiy/QRefreshToken.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.example.api.auth.entitiy; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; - - -/** - * QRefreshToken is a Querydsl query type for RefreshToken - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QRefreshToken extends EntityPathBase { - - private static final long serialVersionUID = -1655386265L; - - private static final PathInits INITS = PathInits.DIRECT2; - - public static final QRefreshToken refreshToken1 = new QRefreshToken("refreshToken1"); - - public final NumberPath id = createNumber("id", Long.class); - - public final BooleanPath isExpired = createBoolean("isExpired"); - - public final DateTimePath recentLogin = createDateTime("recentLogin", java.time.LocalDateTime.class); - - public final StringPath refreshToken = createString("refreshToken"); - - public final com.example.api.domain.QAccount user; - - public QRefreshToken(String variable) { - this(RefreshToken.class, forVariable(variable), INITS); - } - - public QRefreshToken(Path path) { - this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); - } - - public QRefreshToken(PathMetadata metadata) { - this(metadata, PathInits.getFor(metadata, INITS)); - } - - public QRefreshToken(PathMetadata metadata, PathInits inits) { - this(RefreshToken.class, metadata, inits); - } - - public QRefreshToken(Class type, PathMetadata metadata, PathInits inits) { - super(type, metadata, inits); - this.user = inits.isInitialized("user") ? new com.example.api.domain.QAccount(forProperty("user")) : null; - } - -} - diff --git a/src/main/generated/com/example/api/domain/QAccount.java b/src/main/generated/com/example/api/domain/QAccount.java deleted file mode 100644 index bebfa199..00000000 --- a/src/main/generated/com/example/api/domain/QAccount.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.example.api.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; - - -/** - * QAccount is a Querydsl query type for Account - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QAccount extends EntityPathBase { - - private static final long serialVersionUID = -1087167288L; - - public static final QAccount account = new QAccount("account"); - - public final QBaseEntity _super = new QBaseEntity(this); - - public final NumberPath accountId = createNumber("accountId", Long.class); - - public final NumberPath age = createNumber("age", Integer.class); - - //inherited - public final DateTimePath createdDate = _super.createdDate; - - public final BooleanPath deleted = createBoolean("deleted"); - - public final StringPath email = createString("email"); - - public final BooleanPath emailReceivable = createBoolean("emailReceivable"); - - public final StringPath loginId = createString("loginId"); - - public final StringPath name = createString("name"); - - public final EnumPath nationality = createEnum("nationality", com.example.api.account.entity.Nationality.class); - - public final StringPath nickname = createString("nickname"); - - public final BooleanPath openStatus = createBoolean("openStatus"); - - public final StringPath password = createString("password"); - - public final StringPath phoneNumber = createString("phoneNumber"); - - public final StringPath profileImage = createString("profileImage"); - - public final CollectionPath> roles = this.>createCollection("roles", com.example.api.account.entity.UserRole.class, EnumPath.class, PathInits.DIRECT2); - - public final StringPath sex = createString("sex"); - - public final NumberPath starPoint = createNumber("starPoint", Float.class); - - //inherited - public final DateTimePath updatedDate = _super.updatedDate; - - public final NumberPath workCount = createNumber("workCount", Integer.class); - - public QAccount(String variable) { - super(Account.class, forVariable(variable)); - } - - public QAccount(Path path) { - super(path.getType(), path.getMetadata()); - } - - public QAccount(PathMetadata metadata) { - super(Account.class, metadata); - } - -} - diff --git a/src/main/generated/com/example/api/domain/QAnnouncement.java b/src/main/generated/com/example/api/domain/QAnnouncement.java deleted file mode 100644 index 2280f648..00000000 --- a/src/main/generated/com/example/api/domain/QAnnouncement.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.example.api.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; - - -/** - * QAnnouncement is a Querydsl query type for Announcement - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QAnnouncement extends EntityPathBase { - - private static final long serialVersionUID = 1512577932L; - - public static final QAnnouncement announcement = new QAnnouncement("announcement"); - - public final QBaseEntity _super = new QBaseEntity(this); - - public final StringPath announcementContent = createString("announcementContent"); - - public final NumberPath announcementId = createNumber("announcementId", Long.class); - - public final StringPath announcementTitle = createString("announcementTitle"); - - public final StringPath announcementType = createString("announcementType"); - - //inherited - public final DateTimePath createdDate = _super.createdDate; - - //inherited - public final DateTimePath updatedDate = _super.updatedDate; - - public final NumberPath viewCount = createNumber("viewCount", Integer.class); - - public QAnnouncement(String variable) { - super(Announcement.class, forVariable(variable)); - } - - public QAnnouncement(Path path) { - super(path.getType(), path.getMetadata()); - } - - public QAnnouncement(PathMetadata metadata) { - super(Announcement.class, metadata); - } - -} - diff --git a/src/main/generated/com/example/api/domain/QBaseEntity.java b/src/main/generated/com/example/api/domain/QBaseEntity.java deleted file mode 100644 index 09c42891..00000000 --- a/src/main/generated/com/example/api/domain/QBaseEntity.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.example.api.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; - - -/** - * QBaseEntity is a Querydsl query type for BaseEntity - */ -@Generated("com.querydsl.codegen.DefaultSupertypeSerializer") -public class QBaseEntity extends EntityPathBase { - - private static final long serialVersionUID = 127095193L; - - public static final QBaseEntity baseEntity = new QBaseEntity("baseEntity"); - - public final DateTimePath createdDate = createDateTime("createdDate", java.time.LocalDateTime.class); - - public final DateTimePath updatedDate = createDateTime("updatedDate", java.time.LocalDateTime.class); - - public QBaseEntity(String variable) { - super(BaseEntity.class, forVariable(variable)); - } - - public QBaseEntity(Path path) { - super(path.getType(), path.getMetadata()); - } - - public QBaseEntity(PathMetadata metadata) { - super(BaseEntity.class, metadata); - } - -} - diff --git a/src/main/generated/com/example/api/domain/QBusiness.java b/src/main/generated/com/example/api/domain/QBusiness.java deleted file mode 100644 index 8cc945d1..00000000 --- a/src/main/generated/com/example/api/domain/QBusiness.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.example.api.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; - - -/** - * QBusiness is a Querydsl query type for Business - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QBusiness extends EntityPathBase { - - private static final long serialVersionUID = 1647868037L; - - private static final PathInits INITS = PathInits.DIRECT2; - - public static final QBusiness business = new QBusiness("business"); - - public final QBaseEntity _super = new QBaseEntity(this); - - public final ListPath businessCategories = this.createList("businessCategories", BusinessCategory.class, QBusinessCategory.class, PathInits.DIRECT2); - - public final NumberPath businessId = createNumber("businessId", Long.class); - - public final StringPath businessName = createString("businessName"); - - //inherited - public final DateTimePath createdDate = _super.createdDate; - - public final QAccount employer; - - public final StringPath location = createString("location"); - - public final DatePath openDate = createDate("openDate", java.time.LocalDate.class); - - public final StringPath registrationNumber = createString("registrationNumber"); - - public final StringPath representationName = createString("representationName"); - - //inherited - public final DateTimePath updatedDate = _super.updatedDate; - - public QBusiness(String variable) { - this(Business.class, forVariable(variable), INITS); - } - - public QBusiness(Path path) { - this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); - } - - public QBusiness(PathMetadata metadata) { - this(metadata, PathInits.getFor(metadata, INITS)); - } - - public QBusiness(PathMetadata metadata, PathInits inits) { - this(Business.class, metadata, inits); - } - - public QBusiness(Class type, PathMetadata metadata, PathInits inits) { - super(type, metadata, inits); - this.employer = inits.isInitialized("employer") ? new QAccount(forProperty("employer")) : null; - } - -} - diff --git a/src/main/generated/com/example/api/domain/QBusinessCategory.java b/src/main/generated/com/example/api/domain/QBusinessCategory.java deleted file mode 100644 index 975e63bc..00000000 --- a/src/main/generated/com/example/api/domain/QBusinessCategory.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.example.api.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; - - -/** - * QBusinessCategory is a Querydsl query type for BusinessCategory - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QBusinessCategory extends EntityPathBase { - - private static final long serialVersionUID = -861191005L; - - private static final PathInits INITS = PathInits.DIRECT2; - - public static final QBusinessCategory businessCategory = new QBusinessCategory("businessCategory"); - - public final QBaseEntity _super = new QBaseEntity(this); - - public final QBusiness business; - - public final QCategory category; - - //inherited - public final DateTimePath createdDate = _super.createdDate; - - public final NumberPath id = createNumber("id", Long.class); - - //inherited - public final DateTimePath updatedDate = _super.updatedDate; - - public QBusinessCategory(String variable) { - this(BusinessCategory.class, forVariable(variable), INITS); - } - - public QBusinessCategory(Path path) { - this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); - } - - public QBusinessCategory(PathMetadata metadata) { - this(metadata, PathInits.getFor(metadata, INITS)); - } - - public QBusinessCategory(PathMetadata metadata, PathInits inits) { - this(BusinessCategory.class, metadata, inits); - } - - public QBusinessCategory(Class type, PathMetadata metadata, PathInits inits) { - super(type, metadata, inits); - this.business = inits.isInitialized("business") ? new QBusiness(forProperty("business"), inits.get("business")) : null; - this.category = inits.isInitialized("category") ? new QCategory(forProperty("category")) : null; - } - -} - diff --git a/src/main/generated/com/example/api/domain/QCategory.java b/src/main/generated/com/example/api/domain/QCategory.java deleted file mode 100644 index 5065ce4c..00000000 --- a/src/main/generated/com/example/api/domain/QCategory.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.example.api.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; - - -/** - * QCategory is a Querydsl query type for Category - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QCategory extends EntityPathBase { - - private static final long serialVersionUID = -1449757245L; - - public static final QCategory category = new QCategory("category"); - - public final QBaseEntity _super = new QBaseEntity(this); - - public final NumberPath categoryId = createNumber("categoryId", Long.class); - - public final StringPath categoryName = createString("categoryName"); - - //inherited - public final DateTimePath createdDate = _super.createdDate; - - //inherited - public final DateTimePath updatedDate = _super.updatedDate; - - public QCategory(String variable) { - super(Category.class, forVariable(variable)); - } - - public QCategory(Path path) { - super(path.getType(), path.getMetadata()); - } - - public QCategory(PathMetadata metadata) { - super(Category.class, metadata); - } - -} - diff --git a/src/main/generated/com/example/api/domain/QChatRoom.java b/src/main/generated/com/example/api/domain/QChatRoom.java deleted file mode 100644 index b8542ca3..00000000 --- a/src/main/generated/com/example/api/domain/QChatRoom.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.example.api.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; - - -/** - * QChatRoom is a Querydsl query type for ChatRoom - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QChatRoom extends EntityPathBase { - - private static final long serialVersionUID = -62925544L; - - private static final PathInits INITS = PathInits.DIRECT2; - - public static final QChatRoom chatRoom = new QChatRoom("chatRoom"); - - public final NumberPath chatRoomId = createNumber("chatRoomId", Long.class); - - public final QOfferEmployment offerEmployment; - - public final DateTimePath suggestGeneratedDate = createDateTime("suggestGeneratedDate", java.time.LocalDateTime.class); - - public QChatRoom(String variable) { - this(ChatRoom.class, forVariable(variable), INITS); - } - - public QChatRoom(Path path) { - this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); - } - - public QChatRoom(PathMetadata metadata) { - this(metadata, PathInits.getFor(metadata, INITS)); - } - - public QChatRoom(PathMetadata metadata, PathInits inits) { - this(ChatRoom.class, metadata, inits); - } - - public QChatRoom(Class type, PathMetadata metadata, PathInits inits) { - super(type, metadata, inits); - this.offerEmployment = inits.isInitialized("offerEmployment") ? new QOfferEmployment(forProperty("offerEmployment"), inits.get("offerEmployment")) : null; - } - -} - diff --git a/src/main/generated/com/example/api/domain/QContract.java b/src/main/generated/com/example/api/domain/QContract.java deleted file mode 100644 index 59932355..00000000 --- a/src/main/generated/com/example/api/domain/QContract.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.example.api.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; - - -/** - * QContract is a Querydsl query type for Contract - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QContract extends EntityPathBase { - - private static final long serialVersionUID = -2067215913L; - - private static final PathInits INITS = PathInits.DIRECT2; - - public static final QContract contract = new QContract("contract"); - - public final QBaseEntity _super = new QBaseEntity(this); - - public final DateTimePath contractEndTime = createDateTime("contractEndTime", java.time.LocalDateTime.class); - - public final NumberPath contractHourlyPay = createNumber("contractHourlyPay", Integer.class); - - public final NumberPath contractId = createNumber("contractId", Long.class); - - public final DateTimePath contractStartTime = createDateTime("contractStartTime", java.time.LocalDateTime.class); - - public final BooleanPath contractSucceeded = createBoolean("contractSucceeded"); - - //inherited - public final DateTimePath createdDate = _super.createdDate; - - public final QOfferEmployment offerEmployment; - - //inherited - public final DateTimePath updatedDate = _super.updatedDate; - - public QContract(String variable) { - this(Contract.class, forVariable(variable), INITS); - } - - public QContract(Path path) { - this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); - } - - public QContract(PathMetadata metadata) { - this(metadata, PathInits.getFor(metadata, INITS)); - } - - public QContract(PathMetadata metadata, PathInits inits) { - this(Contract.class, metadata, inits); - } - - public QContract(Class type, PathMetadata metadata, PathInits inits) { - super(type, metadata, inits); - this.offerEmployment = inits.isInitialized("offerEmployment") ? new QOfferEmployment(forProperty("offerEmployment"), inits.get("offerEmployment")) : null; - } - -} - diff --git a/src/main/generated/com/example/api/domain/QExternalCareer.java b/src/main/generated/com/example/api/domain/QExternalCareer.java deleted file mode 100644 index 0c112002..00000000 --- a/src/main/generated/com/example/api/domain/QExternalCareer.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.example.api.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; - - -/** - * QExternalCareer is a Querydsl query type for ExternalCareer - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QExternalCareer extends EntityPathBase { - - private static final long serialVersionUID = 606757934L; - - private static final PathInits INITS = PathInits.DIRECT2; - - public static final QExternalCareer externalCareer = new QExternalCareer("externalCareer"); - - public final QBaseEntity _super = new QBaseEntity(this); - - //inherited - public final DateTimePath createdDate = _super.createdDate; - - public final QAccount employee; - - public final NumberPath id = createNumber("id", Long.class); - - public final StringPath Name = createString("Name"); - - public final StringPath period = createString("period"); - - //inherited - public final DateTimePath updatedDate = _super.updatedDate; - - public QExternalCareer(String variable) { - this(ExternalCareer.class, forVariable(variable), INITS); - } - - public QExternalCareer(Path path) { - this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); - } - - public QExternalCareer(PathMetadata metadata) { - this(metadata, PathInits.getFor(metadata, INITS)); - } - - public QExternalCareer(PathMetadata metadata, PathInits inits) { - this(ExternalCareer.class, metadata, inits); - } - - public QExternalCareer(Class type, PathMetadata metadata, PathInits inits) { - super(type, metadata, inits); - this.employee = inits.isInitialized("employee") ? new QAccount(forProperty("employee")) : null; - } - -} - diff --git a/src/main/generated/com/example/api/domain/QFlavored.java b/src/main/generated/com/example/api/domain/QFlavored.java deleted file mode 100644 index 5c0a13db..00000000 --- a/src/main/generated/com/example/api/domain/QFlavored.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.example.api.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; - - -/** - * QFlavored is a Querydsl query type for Flavored - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QFlavored extends EntityPathBase { - - private static final long serialVersionUID = 128299138L; - - private static final PathInits INITS = PathInits.DIRECT2; - - public static final QFlavored flavored = new QFlavored("flavored"); - - public final QBaseEntity _super = new QBaseEntity(this); - - public final QCategory category; - - //inherited - public final DateTimePath createdDate = _super.createdDate; - - public final QAccount employee; - - public final NumberPath flavoredId = createNumber("flavoredId", Long.class); - - //inherited - public final DateTimePath updatedDate = _super.updatedDate; - - public QFlavored(String variable) { - this(Flavored.class, forVariable(variable), INITS); - } - - public QFlavored(Path path) { - this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); - } - - public QFlavored(PathMetadata metadata) { - this(metadata, PathInits.getFor(metadata, INITS)); - } - - public QFlavored(PathMetadata metadata, PathInits inits) { - this(Flavored.class, metadata, inits); - } - - public QFlavored(Class type, PathMetadata metadata, PathInits inits) { - super(type, metadata, inits); - this.category = inits.isInitialized("category") ? new QCategory(forProperty("category")) : null; - this.employee = inits.isInitialized("employee") ? new QAccount(forProperty("employee")) : null; - } - -} - diff --git a/src/main/generated/com/example/api/domain/QInquiry.java b/src/main/generated/com/example/api/domain/QInquiry.java deleted file mode 100644 index b1d0cfbb..00000000 --- a/src/main/generated/com/example/api/domain/QInquiry.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.example.api.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; - - -/** - * QInquiry is a Querydsl query type for Inquiry - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QInquiry extends EntityPathBase { - - private static final long serialVersionUID = 2045912162L; - - private static final PathInits INITS = PathInits.DIRECT2; - - public static final QInquiry inquiry = new QInquiry("inquiry"); - - public final QBaseEntity _super = new QBaseEntity(this); - - public final DateTimePath answerDate = createDateTime("answerDate", java.time.LocalDateTime.class); - - public final StringPath content = createString("content"); - - public final QAccount createdBy; - - //inherited - public final DateTimePath createdDate = _super.createdDate; - - public final NumberPath inquiryId = createNumber("inquiryId", Long.class); - - public final EnumPath inquiryStatus = createEnum("inquiryStatus", Inquiry.InquiryStatus.class); - - public final StringPath inquiryType = createString("inquiryType"); - - public final StringPath subInquiryType = createString("subInquiryType"); - - public final StringPath title = createString("title"); - - //inherited - public final DateTimePath updatedDate = _super.updatedDate; - - public QInquiry(String variable) { - this(Inquiry.class, forVariable(variable), INITS); - } - - public QInquiry(Path path) { - this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); - } - - public QInquiry(PathMetadata metadata) { - this(metadata, PathInits.getFor(metadata, INITS)); - } - - public QInquiry(PathMetadata metadata, PathInits inits) { - this(Inquiry.class, metadata, inits); - } - - public QInquiry(Class type, PathMetadata metadata, PathInits inits) { - super(type, metadata, inits); - this.createdBy = inits.isInitialized("createdBy") ? new QAccount(forProperty("createdBy")) : null; - } - -} - diff --git a/src/main/generated/com/example/api/domain/QOfferEmployment.java b/src/main/generated/com/example/api/domain/QOfferEmployment.java deleted file mode 100644 index a6634fba..00000000 --- a/src/main/generated/com/example/api/domain/QOfferEmployment.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.example.api.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; - - -/** - * QOfferEmployment is a Querydsl query type for OfferEmployment - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QOfferEmployment extends EntityPathBase { - - private static final long serialVersionUID = -82696445L; - - private static final PathInits INITS = PathInits.DIRECT2; - - public static final QOfferEmployment offerEmployment = new QOfferEmployment("offerEmployment"); - - public final QBusiness business; - - public final QContract contract; - - public final QAccount employee; - - public final DateTimePath suggestEndTime = createDateTime("suggestEndTime", java.time.LocalDateTime.class); - - public final NumberPath suggestHourlyPay = createNumber("suggestHourlyPay", Integer.class); - - public final NumberPath suggestId = createNumber("suggestId", Long.class); - - public final BooleanPath suggestReaded = createBoolean("suggestReaded"); - - public final DateTimePath suggestRegisterTime = createDateTime("suggestRegisterTime", java.time.LocalDateTime.class); - - public final DateTimePath suggestStartTime = createDateTime("suggestStartTime", java.time.LocalDateTime.class); - - public final BooleanPath suggestSucceeded = createBoolean("suggestSucceeded"); - - public QOfferEmployment(String variable) { - this(OfferEmployment.class, forVariable(variable), INITS); - } - - public QOfferEmployment(Path path) { - this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); - } - - public QOfferEmployment(PathMetadata metadata) { - this(metadata, PathInits.getFor(metadata, INITS)); - } - - public QOfferEmployment(PathMetadata metadata, PathInits inits) { - this(OfferEmployment.class, metadata, inits); - } - - public QOfferEmployment(Class type, PathMetadata metadata, PathInits inits) { - super(type, metadata, inits); - this.business = inits.isInitialized("business") ? new QBusiness(forProperty("business"), inits.get("business")) : null; - this.contract = inits.isInitialized("contract") ? new QContract(forProperty("contract"), inits.get("contract")) : null; - this.employee = inits.isInitialized("employee") ? new QAccount(forProperty("employee")) : null; - } - -} - diff --git a/src/main/generated/com/example/api/domain/QPossibleBoard.java b/src/main/generated/com/example/api/domain/QPossibleBoard.java deleted file mode 100644 index 23743abc..00000000 --- a/src/main/generated/com/example/api/domain/QPossibleBoard.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.example.api.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; - - -/** - * QPossibleBoard is a Querydsl query type for PossibleBoard - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QPossibleBoard extends EntityPathBase { - - private static final long serialVersionUID = -1378693552L; - - private static final PathInits INITS = PathInits.DIRECT2; - - public static final QPossibleBoard possibleBoard = new QPossibleBoard("possibleBoard"); - - public final QBaseEntity _super = new QBaseEntity(this); - - //inherited - public final DateTimePath createdDate = _super.createdDate; - - public final QAccount employee; - - public final DateTimePath endTime = createDateTime("endTime", java.time.LocalDateTime.class); - - public final NumberPath possibleId = createNumber("possibleId", Long.class); - - public final DateTimePath startTime = createDateTime("startTime", java.time.LocalDateTime.class); - - //inherited - public final DateTimePath updatedDate = _super.updatedDate; - - public QPossibleBoard(String variable) { - this(PossibleBoard.class, forVariable(variable), INITS); - } - - public QPossibleBoard(Path path) { - this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); - } - - public QPossibleBoard(PathMetadata metadata) { - this(metadata, PathInits.getFor(metadata, INITS)); - } - - public QPossibleBoard(PathMetadata metadata, PathInits inits) { - this(PossibleBoard.class, metadata, inits); - } - - public QPossibleBoard(Class type, PathMetadata metadata, PathInits inits) { - super(type, metadata, inits); - this.employee = inits.isInitialized("employee") ? new QAccount(forProperty("employee")) : null; - } - -} - diff --git a/src/main/generated/com/example/api/domain/QReview.java b/src/main/generated/com/example/api/domain/QReview.java deleted file mode 100644 index a393fb0b..00000000 --- a/src/main/generated/com/example/api/domain/QReview.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.example.api.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; - - -/** - * QReview is a Querydsl query type for Review - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QReview extends EntityPathBase { - - private static final long serialVersionUID = 731127133L; - - private static final PathInits INITS = PathInits.DIRECT2; - - public static final QReview review = new QReview("review"); - - public final QBaseEntity _super = new QBaseEntity(this); - - public final QContract contract; - - //inherited - public final DateTimePath createdDate = _super.createdDate; - - public final StringPath reviewContent = createString("reviewContent"); - - public final NumberPath reviewStarPoint = createNumber("reviewStarPoint", Integer.class); - - public final NumberPath suggestId = createNumber("suggestId", Long.class); - - //inherited - public final DateTimePath updatedDate = _super.updatedDate; - - public QReview(String variable) { - this(Review.class, forVariable(variable), INITS); - } - - public QReview(Path path) { - this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); - } - - public QReview(PathMetadata metadata) { - this(metadata, PathInits.getFor(metadata, INITS)); - } - - public QReview(PathMetadata metadata, PathInits inits) { - this(Review.class, metadata, inits); - } - - public QReview(Class type, PathMetadata metadata, PathInits inits) { - super(type, metadata, inits); - this.contract = inits.isInitialized("contract") ? new QContract(forProperty("contract"), inits.get("contract")) : null; - } - -} - diff --git a/src/main/generated/com/example/api/domain/QScrap.java b/src/main/generated/com/example/api/domain/QScrap.java deleted file mode 100644 index 6caf4631..00000000 --- a/src/main/generated/com/example/api/domain/QScrap.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.example.api.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; - - -/** - * QScrap is a Querydsl query type for Scrap - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QScrap extends EntityPathBase { - - private static final long serialVersionUID = -391197396L; - - private static final PathInits INITS = PathInits.DIRECT2; - - public static final QScrap scrap = new QScrap("scrap"); - - public final QBaseEntity _super = new QBaseEntity(this); - - //inherited - public final DateTimePath createdDate = _super.createdDate; - - public final QAccount employee; - - public final QAccount employer; - - public final NumberPath scrapId = createNumber("scrapId", Long.class); - - //inherited - public final DateTimePath updatedDate = _super.updatedDate; - - public QScrap(String variable) { - this(Scrap.class, forVariable(variable), INITS); - } - - public QScrap(Path path) { - this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); - } - - public QScrap(PathMetadata metadata) { - this(metadata, PathInits.getFor(metadata, INITS)); - } - - public QScrap(PathMetadata metadata, PathInits inits) { - this(Scrap.class, metadata, inits); - } - - public QScrap(Class type, PathMetadata metadata, PathInits inits) { - super(type, metadata, inits); - this.employee = inits.isInitialized("employee") ? new QAccount(forProperty("employee")) : null; - this.employer = inits.isInitialized("employer") ? new QAccount(forProperty("employer")) : null; - } - -} - diff --git a/src/test/java/com/example/api/contracts/ContractServiceTest.java b/src/test/java/com/example/api/contracts/ContractServiceTest.java index e92cae3e..e2c43b3a 100644 --- a/src/test/java/com/example/api/contracts/ContractServiceTest.java +++ b/src/test/java/com/example/api/contracts/ContractServiceTest.java @@ -1,6 +1,7 @@ package com.example.api.contracts; import com.example.api.JpaTestWithInitData; +import com.example.api.chat.repository.ChatRoomRepository; import com.example.api.contracts.dto.AcceptSuggestCommand; import com.example.api.domain.ChatRoom; import com.example.api.domain.Contract; diff --git a/src/test/java/com/example/api/global/BaseIntegrationTest.java b/src/test/java/com/example/api/global/BaseIntegrationTest.java deleted file mode 100644 index f6dd0068..00000000 --- a/src/test/java/com/example/api/global/BaseIntegrationTest.java +++ /dev/null @@ -1,166 +0,0 @@ -package com.example.api.global; - -import com.example.api.board.controller.domain.response.CategoryDTO; -import com.example.api.board.controller.domain.response.ExternalCareerDTO; -import com.example.api.board.controller.domain.response.InnerCareerDTO; -import com.example.api.board.controller.domain.response.PossibleBoardDTO; -import com.example.api.business.BusinessRepository; -import com.example.api.contracts.ContractRepository; -import com.example.api.possbileboard.PossibleBoardRepository; -import com.example.api.domain.Account; -import com.example.api.domain.Business; -import com.example.api.domain.BusinessCategory; -import com.example.api.domain.Category; -import com.example.api.domain.Contract; -import com.example.api.domain.ExternalCareer; -import com.example.api.domain.OfferEmployment; -import com.example.api.domain.PossibleBoard; -import com.example.api.domain.Review; -import com.example.api.domain.repository.CategoryRepository; -import com.example.api.domain.repository.EmployeeRepository; -import com.example.api.domain.repository.EmployerRepository; -import com.example.api.domain.repository.ExternalCareerRepository; -import com.example.api.domain.repository.FlavoredRepository; -import com.example.api.domain.repository.MyInfoRepository; -import com.example.api.domain.repository.OfferEmploymentRepository; -import com.example.api.domain.repository.ReviewRepository; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; -import org.junit.jupiter.api.BeforeEach; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.annotation.Rollback; -import org.springframework.test.context.ActiveProfiles; - -@SpringBootTest -@ActiveProfiles("test") -@Rollback(false) -public class BaseIntegrationTest { - - @Autowired - private BusinessRepository businessRepository; - @Autowired - private CategoryRepository categoryRepository; - @Autowired - private FlavoredRepository flavoredRepository; - @Autowired - private ContractRepository contractRepository; - @Autowired - private EmployeeRepository employeeRepository; - @Autowired - private EmployerRepository employerRepository; - @Autowired - private MyInfoRepository myInfoRepository; - @Autowired - private OfferEmploymentRepository offerEmploymentRepository; - @Autowired - private PossibleBoardRepository possibleBoardRepository; - @Autowired - private ReviewRepository reviewRepository; - @Autowired - private ExternalCareerRepository externalCareerRepository; - - protected List externalCareerList; - protected List possibleBoardList; - protected List innerCareerList; - protected List flavoredCategoryList; - - protected Category category1, category2; - - - @BeforeEach - void setUpData() { - Account employee = new Account(); - employee.setAge(30); - employee.setEmail("johndoe@example.com"); - employee.setName("John Doe"); - employee.setSex("Male"); - employee.setPhoneNumber("123-456-7890"); - employee.setNickname("Johnny"); - employee.setStarPoint(3.5f); - employee.setWorkCount(3); - employeeRepository.save(employee); - - Account employer = new Account(); - employer.setNickname("EmployerOne"); - employerRepository.save(employer); - - category1 = new Category(); - category1.setCategoryName("IT Services"); - categoryRepository.save(category1); - - category2 = new Category(); - category2.setCategoryName("Consulting"); - categoryRepository.save(category2); - - Business business = new Business(); - business.setBusinessName("Tech Solutions Inc."); - business.setLocation("Seoul, South Korea"); - business.setRepresentationName("James"); - business.setOpenDate(LocalDate.now()); - business.setRegistrationNumber("123-456-789"); - business.setEmployer(employer); // 다대일 관계 설정 - - BusinessCategory businessCategory1 = new BusinessCategory(); - businessCategory1.setBusiness(business); - businessCategory1.setCategory(category1); - - BusinessCategory businessCategory2 = new BusinessCategory(); - businessCategory2.setBusiness(business); - businessCategory2.setCategory(category2); - - business.setBusinessCategories(List.of(businessCategory1, businessCategory2)); - businessRepository.save(business); - - OfferEmployment offerEmployment = new OfferEmployment(); - offerEmployment.setBusiness(business); - offerEmployment.setEmployee(employee); - offerEmployment.setSuggestStartTime(LocalDateTime.of(2024, 11, 5, 9, 0)); - offerEmployment.setSuggestEndTime(LocalDateTime.of(2024, 11, 5, 17, 0)); - offerEmployment.setSuggestHourlyPay(20000); - offerEmployment.setSuggestSucceeded(false); - offerEmploymentRepository.save(offerEmployment); - - Contract contract = new Contract(offerEmployment, - LocalDateTime.of(2024, 11, 10, 9, 0), - LocalDateTime.of(2024, 11, 10, 18, 0), - 22000, - true); - - contractRepository.save(contract); - - ExternalCareer externalCareer1 = new ExternalCareer(employee, "Consultant", "24-10-01"); - ExternalCareer externalCareer2 = new ExternalCareer(employee, "Architect", "24-10-08"); - externalCareerRepository.save(externalCareer1); - externalCareerRepository.save(externalCareer2); - - externalCareerList = new ArrayList<>(); - externalCareerList.add(new ExternalCareerDTO(employee.getAccountId(), externalCareer1.getName(), externalCareer1.getPeriod())); - externalCareerList.add(new ExternalCareerDTO(employee.getAccountId(), externalCareer2.getName(), externalCareer2.getPeriod())); - - Review review1 = new Review(1L, 4, "Good work experience"); - reviewRepository.save(review1); - - innerCareerList = new ArrayList<>(); - innerCareerList.add(new InnerCareerDTO(business.getBusinessName(), contract.getContractStartTime(), business.getRepresentationName(), review1)); - - PossibleBoard possibleBoard1 = new PossibleBoard(employee, LocalDateTime.of(2024, 11, 5, 12, 0), LocalDateTime.of(2024, 11, 5, 18, 0)); - PossibleBoard possibleBoard2 = new PossibleBoard(employee, LocalDateTime.of(2024, 11, 6, 12, 0), LocalDateTime.of(2024, 11, 6, 18, 0)); - possibleBoardRepository.save(possibleBoard1); - possibleBoardRepository.save(possibleBoard2); - - possibleBoardList = new ArrayList<>(); - possibleBoardList.add(new PossibleBoardDTO(employee.getAccountId(), possibleBoard1.getStartTime(), possibleBoard1.getEndTime())); - possibleBoardList.add(new PossibleBoardDTO(employee.getAccountId(), possibleBoard2.getStartTime(), possibleBoard2.getEndTime())); - -// Flavored flavored = new Flavored(); -// flavored.setCategory(categoryRepository.findById(1L).get()); -// flavored.setEmployee(employeeRepository.findById(1L).get()); -// flavoredRepository.save(flavored); - - flavoredCategoryList = new ArrayList<>(); - flavoredCategoryList.addAll(flavoredRepository.findAllCategoryDTOByEmployeeId(1L)); - } -} \ No newline at end of file From 204f563edb3f68595fc9633190fd8b88b8af3fc6 Mon Sep 17 00:00:00 2001 From: huhdy32 Date: Wed, 15 Jan 2025 18:41:15 +0900 Subject: [PATCH 226/276] hotfix: missing Qclass Added --- .../com/example/api/domain/QInquiry.java | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 src/main/generated/com/example/api/domain/QInquiry.java diff --git a/src/main/generated/com/example/api/domain/QInquiry.java b/src/main/generated/com/example/api/domain/QInquiry.java new file mode 100644 index 00000000..b1d0cfbb --- /dev/null +++ b/src/main/generated/com/example/api/domain/QInquiry.java @@ -0,0 +1,71 @@ +package com.example.api.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QInquiry is a Querydsl query type for Inquiry + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QInquiry extends EntityPathBase { + + private static final long serialVersionUID = 2045912162L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QInquiry inquiry = new QInquiry("inquiry"); + + public final QBaseEntity _super = new QBaseEntity(this); + + public final DateTimePath answerDate = createDateTime("answerDate", java.time.LocalDateTime.class); + + public final StringPath content = createString("content"); + + public final QAccount createdBy; + + //inherited + public final DateTimePath createdDate = _super.createdDate; + + public final NumberPath inquiryId = createNumber("inquiryId", Long.class); + + public final EnumPath inquiryStatus = createEnum("inquiryStatus", Inquiry.InquiryStatus.class); + + public final StringPath inquiryType = createString("inquiryType"); + + public final StringPath subInquiryType = createString("subInquiryType"); + + public final StringPath title = createString("title"); + + //inherited + public final DateTimePath updatedDate = _super.updatedDate; + + public QInquiry(String variable) { + this(Inquiry.class, forVariable(variable), INITS); + } + + public QInquiry(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QInquiry(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QInquiry(PathMetadata metadata, PathInits inits) { + this(Inquiry.class, metadata, inits); + } + + public QInquiry(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.createdBy = inits.isInitialized("createdBy") ? new QAccount(forProperty("createdBy")) : null; + } + +} + From 7b17287e732ad50d1b479514eeb89d4930032eab Mon Sep 17 00:00:00 2001 From: huhdy32 Date: Wed, 15 Jan 2025 19:04:50 +0900 Subject: [PATCH 227/276] =?UTF-8?q?hotfix:=20=ED=81=90=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EC=83=9D=EC=84=B1=20=EC=9C=84=EC=B9=98=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/api/domain/QInquiry.java | 71 ------------------- 1 file changed, 71 deletions(-) delete mode 100644 src/main/generated/com/example/api/domain/QInquiry.java diff --git a/src/main/generated/com/example/api/domain/QInquiry.java b/src/main/generated/com/example/api/domain/QInquiry.java deleted file mode 100644 index b1d0cfbb..00000000 --- a/src/main/generated/com/example/api/domain/QInquiry.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.example.api.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; - - -/** - * QInquiry is a Querydsl query type for Inquiry - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QInquiry extends EntityPathBase { - - private static final long serialVersionUID = 2045912162L; - - private static final PathInits INITS = PathInits.DIRECT2; - - public static final QInquiry inquiry = new QInquiry("inquiry"); - - public final QBaseEntity _super = new QBaseEntity(this); - - public final DateTimePath answerDate = createDateTime("answerDate", java.time.LocalDateTime.class); - - public final StringPath content = createString("content"); - - public final QAccount createdBy; - - //inherited - public final DateTimePath createdDate = _super.createdDate; - - public final NumberPath inquiryId = createNumber("inquiryId", Long.class); - - public final EnumPath inquiryStatus = createEnum("inquiryStatus", Inquiry.InquiryStatus.class); - - public final StringPath inquiryType = createString("inquiryType"); - - public final StringPath subInquiryType = createString("subInquiryType"); - - public final StringPath title = createString("title"); - - //inherited - public final DateTimePath updatedDate = _super.updatedDate; - - public QInquiry(String variable) { - this(Inquiry.class, forVariable(variable), INITS); - } - - public QInquiry(Path path) { - this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); - } - - public QInquiry(PathMetadata metadata) { - this(metadata, PathInits.getFor(metadata, INITS)); - } - - public QInquiry(PathMetadata metadata, PathInits inits) { - this(Inquiry.class, metadata, inits); - } - - public QInquiry(Class type, PathMetadata metadata, PathInits inits) { - super(type, metadata, inits); - this.createdBy = inits.isInitialized("createdBy") ? new QAccount(forProperty("createdBy")) : null; - } - -} - From 5e55ebd33b07d02e3a9ad8f3085386a81130570b Mon Sep 17 00:00:00 2001 From: huhdy32 Date: Wed, 15 Jan 2025 19:54:42 +0900 Subject: [PATCH 228/276] =?UTF-8?q?feat:=20swagger-ui=20=EC=9D=98=EC=A1=B4?= =?UTF-8?q?=EC=84=B1=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 2 ++ src/main/java/com/example/api/global/config/SecurityConfig.java | 1 + 2 files changed, 3 insertions(+) diff --git a/build.gradle b/build.gradle index b263ba38..d8135831 100644 --- a/build.gradle +++ b/build.gradle @@ -82,6 +82,8 @@ dependencies { //객체 간 매핑 처리 implementation 'org.modelmapper:modelmapper:3.1.0' + + implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.4' } tasks.named('test') { 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 f92ca385..0d3eabd6 100644 --- a/src/main/java/com/example/api/global/config/SecurityConfig.java +++ b/src/main/java/com/example/api/global/config/SecurityConfig.java @@ -53,6 +53,7 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti exceptionHandling.authenticationEntryPoint(new FailedAuthenticationEntryPoint())) .authorizeHttpRequests(authorize -> authorize .requestMatchers("/oauth2/**", "/api/v1/**").permitAll() + .requestMatchers("/swagger-ui/**", "/v3/api-docs/**", "/webjars/**", "/swagger-resources/**", "/swagger-ui.html", "/actuator/**").permitAll() .anyRequest().authenticated() ) .oauth2Login(oauth2 -> oauth2 From 7f12d694649fb941f49e674c9b5326f95020cb35 Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Thu, 9 Jan 2025 12:30:36 +0900 Subject: [PATCH 229/276] =?UTF-8?q?#67=20=EB=8F=84=EB=A9=94=EC=9D=B8=20?= =?UTF-8?q?=EC=99=B8=EB=9E=98=ED=82=A4=20=EC=A0=9C=EC=95=BD=EC=A1=B0?= =?UTF-8?q?=EA=B1=B4=20=EB=AC=B4=ED=9A=A8=ED=99=94=20=EC=88=98=EC=A0=95=20?= =?UTF-8?q?=EB=B0=8F=20=EC=BB=A8=EB=B2=A4=EC=85=98=20=EB=A7=9E=EA=B2=8C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/api/auth/entitiy/RefreshToken.java | 2 +- .../controller/dto/response/ChatSummaryResponse.java | 2 +- .../api/chat/{domain => dto}/ChatSummary.java | 2 +- .../api/chat/repository/CustomChatRepository.java | 2 +- .../chat/repository/CustomChatRepositoryImpl.java | 2 +- .../com/example/api/chat/service/ChatService.java | 2 +- src/main/java/com/example/api/domain/Account.java | 3 +-- .../java/com/example/api/domain/Announcement.java | 6 +----- src/main/java/com/example/api/domain/BaseEntity.java | 2 +- src/main/java/com/example/api/domain/Business.java | 3 +-- .../com/example/api/domain/BusinessCategory.java | 11 +++-------- src/main/java/com/example/api/domain/Category.java | 4 +--- src/main/java/com/example/api/domain/Chat.java | 2 +- src/main/java/com/example/api/domain/ChatRoom.java | 8 ++------ src/main/java/com/example/api/domain/Contract.java | 6 ++---- .../java/com/example/api/domain/ExternalCareer.java | 6 ++---- src/main/java/com/example/api/domain/Flavored.java | 7 +++---- .../java/com/example/api/domain/OfferEmployment.java | 5 ++--- .../java/com/example/api/domain/PossibleBoard.java | 3 +-- src/main/java/com/example/api/domain/Review.java | 12 ++++++------ src/main/java/com/example/api/domain/Scrap.java | 7 +++---- 21 files changed, 36 insertions(+), 61 deletions(-) rename src/main/java/com/example/api/chat/{domain => dto}/ChatSummary.java (79%) diff --git a/src/main/java/com/example/api/auth/entitiy/RefreshToken.java b/src/main/java/com/example/api/auth/entitiy/RefreshToken.java index 2940ecad..d461e29c 100644 --- a/src/main/java/com/example/api/auth/entitiy/RefreshToken.java +++ b/src/main/java/com/example/api/auth/entitiy/RefreshToken.java @@ -22,7 +22,7 @@ public class RefreshToken { private LocalDateTime recentLogin = LocalDateTime.now(); @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "ACCOUNT_UNIQUE_ID") + @JoinColumn(name = "ACCOUNT_UNIQUE_ID", nullable = true, foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) private Account user; protected RefreshToken() { diff --git a/src/main/java/com/example/api/chat/controller/dto/response/ChatSummaryResponse.java b/src/main/java/com/example/api/chat/controller/dto/response/ChatSummaryResponse.java index 230af4e8..29c669bc 100644 --- a/src/main/java/com/example/api/chat/controller/dto/response/ChatSummaryResponse.java +++ b/src/main/java/com/example/api/chat/controller/dto/response/ChatSummaryResponse.java @@ -1,6 +1,6 @@ package com.example.api.chat.controller.dto.response; -import com.example.api.chat.domain.ChatSummary; +import com.example.api.chat.dto.ChatSummary; import com.example.api.domain.ChatRoom; import java.util.List; diff --git a/src/main/java/com/example/api/chat/domain/ChatSummary.java b/src/main/java/com/example/api/chat/dto/ChatSummary.java similarity index 79% rename from src/main/java/com/example/api/chat/domain/ChatSummary.java rename to src/main/java/com/example/api/chat/dto/ChatSummary.java index d641a695..f23f3896 100644 --- a/src/main/java/com/example/api/chat/domain/ChatSummary.java +++ b/src/main/java/com/example/api/chat/dto/ChatSummary.java @@ -1,4 +1,4 @@ -package com.example.api.chat.domain; +package com.example.api.chat.dto; import java.util.Date; diff --git a/src/main/java/com/example/api/chat/repository/CustomChatRepository.java b/src/main/java/com/example/api/chat/repository/CustomChatRepository.java index d5206d47..2468694a 100644 --- a/src/main/java/com/example/api/chat/repository/CustomChatRepository.java +++ b/src/main/java/com/example/api/chat/repository/CustomChatRepository.java @@ -1,6 +1,6 @@ package com.example.api.chat.repository; -import com.example.api.chat.domain.ChatSummary; +import com.example.api.chat.dto.ChatSummary; import com.example.api.domain.Chat; import java.util.List; diff --git a/src/main/java/com/example/api/chat/repository/CustomChatRepositoryImpl.java b/src/main/java/com/example/api/chat/repository/CustomChatRepositoryImpl.java index d12a6baa..a3deda94 100644 --- a/src/main/java/com/example/api/chat/repository/CustomChatRepositoryImpl.java +++ b/src/main/java/com/example/api/chat/repository/CustomChatRepositoryImpl.java @@ -1,6 +1,6 @@ package com.example.api.chat.repository; -import com.example.api.chat.domain.ChatSummary; +import com.example.api.chat.dto.ChatSummary; import com.example.api.domain.Chat; import lombok.RequiredArgsConstructor; import org.bson.types.ObjectId; diff --git a/src/main/java/com/example/api/chat/service/ChatService.java b/src/main/java/com/example/api/chat/service/ChatService.java index 7e9bae85..4dd73ed4 100644 --- a/src/main/java/com/example/api/chat/service/ChatService.java +++ b/src/main/java/com/example/api/chat/service/ChatService.java @@ -4,7 +4,7 @@ import com.example.api.chat.controller.dto.request.ChatSendRequest; import com.example.api.chat.controller.dto.request.ReadRequest; import com.example.api.chat.controller.dto.response.ChatSummaryResponse; -import com.example.api.chat.domain.ChatSummary; +import com.example.api.chat.dto.ChatSummary; import com.example.api.chat.repository.ChatRepository; import com.example.api.chat.repository.ChatRoomRepository; import com.example.api.chat.service.model.ChatSender; diff --git a/src/main/java/com/example/api/domain/Account.java b/src/main/java/com/example/api/domain/Account.java index 09f556e1..35133bc4 100644 --- a/src/main/java/com/example/api/domain/Account.java +++ b/src/main/java/com/example/api/domain/Account.java @@ -13,7 +13,6 @@ @Entity @Getter -@Setter @AttributeOverride(name = "createdDate", column = @Column(name = "ACCOUNT_REGISTERED_DATETIME")) @Table(name = "ACCOUNT") public class Account extends BaseEntity { @@ -38,7 +37,7 @@ public class Account extends BaseEntity { @Enumerated(EnumType.STRING) private Nationality nationality; @ElementCollection(targetClass = UserRole.class) - @CollectionTable(name = "AUTHORITY", joinColumns = @JoinColumn(name = "ACCOUNT_UNIQUE_ID")) + @CollectionTable(name = "AUTHORITY", joinColumns = @JoinColumn(name = "ACCOUNT_UNIQUE_ID"), foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) @Enumerated(EnumType.STRING) private Collection roles; @Column(name = "ACCOUNT_SEX") diff --git a/src/main/java/com/example/api/domain/Announcement.java b/src/main/java/com/example/api/domain/Announcement.java index 90bacf08..a76d0e27 100644 --- a/src/main/java/com/example/api/domain/Announcement.java +++ b/src/main/java/com/example/api/domain/Announcement.java @@ -7,20 +7,16 @@ @Entity @Getter -@Setter @EqualsAndHashCode(callSuper = false) @Table(name = "ANNOUNCEMENT") public class Announcement extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long announcementId; - private String announcementTitle; private String announcementType; private String announcementContent; @Column(columnDefinition = "int DEFAULT 0") private int viewCount; - -} - +} \ No newline at end of file diff --git a/src/main/java/com/example/api/domain/BaseEntity.java b/src/main/java/com/example/api/domain/BaseEntity.java index eb354548..25f3a19f 100644 --- a/src/main/java/com/example/api/domain/BaseEntity.java +++ b/src/main/java/com/example/api/domain/BaseEntity.java @@ -23,4 +23,4 @@ public class BaseEntity { @LastModifiedDate @Column(name = "UPDATED_AT") private LocalDateTime updatedDate; -} +} \ No newline at end of file diff --git a/src/main/java/com/example/api/domain/Business.java b/src/main/java/com/example/api/domain/Business.java index 230e6bc5..17054b86 100644 --- a/src/main/java/com/example/api/domain/Business.java +++ b/src/main/java/com/example/api/domain/Business.java @@ -14,7 +14,6 @@ @Entity @Getter -@Setter @EqualsAndHashCode(callSuper = false) @Table(name = "BUSINESS") @NoArgsConstructor @@ -24,7 +23,7 @@ public class Business extends BaseEntity { private Long businessId; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "BUSINESS_EMPLOYER_ID") + @JoinColumn(name = "BUSINESS_EMPLOYER_ID", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) private Account employer; @OneToMany(mappedBy = "business") diff --git a/src/main/java/com/example/api/domain/BusinessCategory.java b/src/main/java/com/example/api/domain/BusinessCategory.java index b052014d..ce7f1bb0 100644 --- a/src/main/java/com/example/api/domain/BusinessCategory.java +++ b/src/main/java/com/example/api/domain/BusinessCategory.java @@ -4,15 +4,11 @@ import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; -import lombok.Setter; - -import java.util.List; import static jakarta.persistence.FetchType.*; @Entity @Getter -@Setter @EqualsAndHashCode(callSuper = false) @Table(name = "BUSINESS_CATEGORY") @NoArgsConstructor @@ -23,16 +19,15 @@ public class BusinessCategory extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "BUSINESS_ID") + @JoinColumn(name = "BUSINESS_ID", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) private Business business; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "CATEGOREY_ID") + @JoinColumn(name = "CATEGOREY_ID", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) private Category category; public BusinessCategory(Business business, Category category) { this.business = business; this.category = category; } -} - +} \ No newline at end of file diff --git a/src/main/java/com/example/api/domain/Category.java b/src/main/java/com/example/api/domain/Category.java index 17586854..07cac85a 100644 --- a/src/main/java/com/example/api/domain/Category.java +++ b/src/main/java/com/example/api/domain/Category.java @@ -10,7 +10,6 @@ @Entity @Getter -@Setter @EqualsAndHashCode(callSuper = false) @Table(name = "CATEGORY") public class Category extends BaseEntity{ @@ -29,5 +28,4 @@ public Category(Long categoryId, String categoryName) { this.categoryId = categoryId; this.categoryName = categoryName; } -} - +} \ No newline at end of file diff --git a/src/main/java/com/example/api/domain/Chat.java b/src/main/java/com/example/api/domain/Chat.java index 62c506b7..3f4f6658 100644 --- a/src/main/java/com/example/api/domain/Chat.java +++ b/src/main/java/com/example/api/domain/Chat.java @@ -47,4 +47,4 @@ public String toString() { ", isRead=" + isRead + '}'; } -} +} \ 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 8a6a487b..9f063c48 100644 --- a/src/main/java/com/example/api/domain/ChatRoom.java +++ b/src/main/java/com/example/api/domain/ChatRoom.java @@ -3,7 +3,6 @@ import jakarta.persistence.*; import lombok.EqualsAndHashCode; import lombok.Getter; -import lombok.Setter; import java.time.LocalDateTime; @@ -11,17 +10,15 @@ @Entity @Getter -@Setter @EqualsAndHashCode @Table(name = "CHAT_ROOM") public class ChatRoom { - @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long chatRoomId; @OneToOne(fetch = LAZY) - @JoinColumn(name = "SUGGEST_ID") + @JoinColumn(name = "SUGGEST_ID", nullable = true, foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) private OfferEmployment offerEmployment; @Column(name = "SUGGEST_GENERATED_DATE") @@ -36,5 +33,4 @@ public ChatRoom(OfferEmployment offerEmployment) { this.offerEmployment = offerEmployment; this.suggestGeneratedDate = LocalDateTime.now(); } -} - +} \ No newline at end of file diff --git a/src/main/java/com/example/api/domain/Contract.java b/src/main/java/com/example/api/domain/Contract.java index 53bcd85a..c26d15db 100644 --- a/src/main/java/com/example/api/domain/Contract.java +++ b/src/main/java/com/example/api/domain/Contract.java @@ -14,12 +14,11 @@ @NoArgsConstructor public class Contract extends BaseEntity { @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name ="CONTRACT_ID") private Long contractId; @OneToOne(fetch = FetchType.LAZY) - @PrimaryKeyJoinColumn(name = "CONTRACT_ID", referencedColumnName = "SUGGEST_ID") + @PrimaryKeyJoinColumn(name = "CONTRACT_ID", referencedColumnName = "SUGGEST_ID", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) private OfferEmployment offerEmployment; @Column(name = "CONTRACT_START_TIME") @@ -64,5 +63,4 @@ public boolean isValidContractRangeTime() { public void succeed() { this.contractSucceeded = true; } -} - +} \ No newline at end of file diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 3342e0ef..ed7f513e 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -11,7 +11,6 @@ @Entity @Getter -@Setter @EqualsAndHashCode(callSuper = false) @Table(name = "EXTERANL_CARRER") public class ExternalCareer extends BaseEntity{ @@ -20,7 +19,7 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "employee_id") + @JoinColumn(name = "employee_id", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) @JsonIgnore private Account employee; @@ -39,5 +38,4 @@ public ExternalCareer(Account employee, String name, String period) { public ExternalCareer() { } -} - +} \ No newline at end of file diff --git a/src/main/java/com/example/api/domain/Flavored.java b/src/main/java/com/example/api/domain/Flavored.java index e3becf35..83db3fa2 100644 --- a/src/main/java/com/example/api/domain/Flavored.java +++ b/src/main/java/com/example/api/domain/Flavored.java @@ -9,7 +9,6 @@ @Entity @Getter -@Setter @EqualsAndHashCode(callSuper = false) @Table(name = "flavored", uniqueConstraints = { @UniqueConstraint(columnNames = {"employee_id", "category_id"}) @@ -21,11 +20,11 @@ public class Flavored extends BaseEntity{ private Long flavoredId; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "category_id") + @JoinColumn(name = "category_id", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) private Category category; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "employee_id") + @JoinColumn(name = "employee_id", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) private Account employee; public Flavored() { @@ -35,4 +34,4 @@ public Flavored(Category category, Account employee) { this.category = category; this.employee = employee; } -} +} \ No newline at end of file diff --git a/src/main/java/com/example/api/domain/OfferEmployment.java b/src/main/java/com/example/api/domain/OfferEmployment.java index 3ea6162e..801cb25d 100644 --- a/src/main/java/com/example/api/domain/OfferEmployment.java +++ b/src/main/java/com/example/api/domain/OfferEmployment.java @@ -11,7 +11,6 @@ @Entity @Getter -@Setter @EqualsAndHashCode @Table(name = "OFFER_EMPLOYMENT") public class OfferEmployment { @@ -20,10 +19,10 @@ public class OfferEmployment { private Long suggestId; @OneToOne(fetch = LAZY) - @JoinColumn(name = "BUSINESS_ID") + @JoinColumn(name = "BUSINESS_ID", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) private Business business; @OneToOne(fetch = LAZY) - @JoinColumn(name = "EMPLOYEE_ID") + @JoinColumn(name = "EMPLOYEE_ID", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) private Account employee; @OneToOne(mappedBy = "offerEmployment", cascade = CascadeType.ALL) private Contract contract; diff --git a/src/main/java/com/example/api/domain/PossibleBoard.java b/src/main/java/com/example/api/domain/PossibleBoard.java index 1d417190..3684b7c9 100644 --- a/src/main/java/com/example/api/domain/PossibleBoard.java +++ b/src/main/java/com/example/api/domain/PossibleBoard.java @@ -9,7 +9,6 @@ @Entity @Getter -@Setter @AllArgsConstructor @EqualsAndHashCode(callSuper = false) @NoArgsConstructor @@ -19,7 +18,7 @@ public class PossibleBoard extends BaseEntity{ private Long possibleId; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "EMPLOYEE_ID") + @JoinColumn(name = "EMPLOYEE_ID", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) private Account employee; @Column(name = "POSSIBLE_START_TIME") diff --git a/src/main/java/com/example/api/domain/Review.java b/src/main/java/com/example/api/domain/Review.java index 73615a2a..fb099251 100644 --- a/src/main/java/com/example/api/domain/Review.java +++ b/src/main/java/com/example/api/domain/Review.java @@ -1,23 +1,23 @@ package com.example.api.domain; import jakarta.persistence.*; -import lombok.AllArgsConstructor; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; -import lombok.Setter; @Entity @Getter -@Setter @Table(name = "REVIEW") @EqualsAndHashCode(callSuper = true) @NoArgsConstructor public class Review extends BaseEntity { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long suggestId; + @Column(name ="REVIEW_ID") + private Long reviewId; + + @OneToOne(fetch = FetchType.LAZY) + @PrimaryKeyJoinColumn(name = "REVIEW_ID", referencedColumnName = "SUGGEST_ID", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) + private OfferEmployment offerEmployment; @Column(name = "REVIEW_STAR_POINT") private int reviewStarPoint; diff --git a/src/main/java/com/example/api/domain/Scrap.java b/src/main/java/com/example/api/domain/Scrap.java index 8a9da7c1..3182db1b 100644 --- a/src/main/java/com/example/api/domain/Scrap.java +++ b/src/main/java/com/example/api/domain/Scrap.java @@ -9,7 +9,6 @@ @Entity @Getter -@Setter @EqualsAndHashCode(callSuper = false) @Table(name = "SCRAP") public class Scrap extends BaseEntity { @@ -18,9 +17,9 @@ public class Scrap extends BaseEntity { private Long scrapId; @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "EMPLOYER_ID") + @JoinColumn(name = "EMPLOYER_ID", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) private Account employer; @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "EMPLOYEE_ID") + @JoinColumn(name = "EMPLOYEE_ID", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) private Account employee; -} +} \ No newline at end of file From 64001abd5e6b81c01335e2fcd8faa5c00a5ba288 Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Wed, 15 Jan 2025 14:37:17 +0900 Subject: [PATCH 230/276] . --- .../com/example/api/domain/QReview.java | 59 +++++++++++++++++++ .../example/api/account/entity/UserRole.java | 2 +- .../api/auth/controller/AuthController.java | 18 +++--- .../api/auth/dto/AuthTokenRequest.java | 9 --- .../api/auth/dto/LoginSuccessResponse.java | 9 +++ .../example/api/auth/service/AuthService.java | 14 ++--- .../api/board/controller/BoardController.java | 8 +-- .../domain/request/EmployeeIdRequest.java | 4 -- .../board/dto/request/EmployeeIdRequest.java | 4 ++ .../request/QueryPossibleEmployerRequest.java | 2 +- .../domain => dto}/response/Board.java | 2 +- .../domain => dto}/response/CategoryDTO.java | 2 +- .../response/ExternalCareerDTO.java | 2 +- .../response/InnerCareerDTO.java | 2 +- .../domain => dto}/response/MyInfoDTO.java | 2 +- .../response/PossibleBoardDTO.java | 2 +- .../response/PossibleEmployeeResponse.java | 2 +- .../update/UpdateAccountConditionCommand.java | 4 ++ .../dto/update/UpdateOpenStatusRequest.java | 6 ++ .../dto/update/UpdateUserInfoRequest.java | 11 ++++ .../update/UpdateAccountConditionHandler.java | 9 +++ .../update/UpdateAccountConditionManager.java | 26 ++++++++ .../update/UpdateOpenStatusHandler.java | 19 ++++++ .../entitiy/update/UpdateUserInfoHandler.java | 17 ++++++ .../api/board/service/BoardService.java | 14 ++--- .../api/board/service/CategoryService.java | 2 +- .../api/board/service/EmployeeService.java | 35 ++++++----- .../java/com/example/api/domain/Account.java | 15 +++++ .../repository/ExternalCareerRepository.java | 4 +- .../domain/repository/FlavoredRepository.java | 4 +- .../domain/repository/MyInfoRepository.java | 4 +- .../repository/OfferEmploymentRepository.java | 6 +- .../controller/EmployerController.java | 2 +- .../controller/dto/LikeEmployeeDTO.java | 4 +- .../api/employer/service/EmployerService.java | 2 +- .../PossibleBoardRepository.java | 13 ++-- .../possbileboard/PossibleBoardService.java | 4 +- .../possbileboard/dto/PossibleDetails.java | 2 +- .../api/global/BaseIntegrationTest.java | 0 39 files changed, 258 insertions(+), 88 deletions(-) create mode 100644 src/main/generated/com/example/api/domain/QReview.java create mode 100644 src/main/java/com/example/api/auth/dto/LoginSuccessResponse.java delete mode 100644 src/main/java/com/example/api/board/controller/domain/request/EmployeeIdRequest.java create mode 100644 src/main/java/com/example/api/board/dto/request/EmployeeIdRequest.java rename src/main/java/com/example/api/board/{controller/domain => dto}/request/QueryPossibleEmployerRequest.java (78%) rename src/main/java/com/example/api/board/{controller/domain => dto}/response/Board.java (83%) rename src/main/java/com/example/api/board/{controller/domain => dto}/response/CategoryDTO.java (76%) rename src/main/java/com/example/api/board/{controller/domain => dto}/response/ExternalCareerDTO.java (77%) rename src/main/java/com/example/api/board/{controller/domain => dto}/response/InnerCareerDTO.java (92%) rename src/main/java/com/example/api/board/{controller/domain => dto}/response/MyInfoDTO.java (94%) rename src/main/java/com/example/api/board/{controller/domain => dto}/response/PossibleBoardDTO.java (85%) rename src/main/java/com/example/api/board/{controller/domain => dto}/response/PossibleEmployeeResponse.java (81%) create mode 100644 src/main/java/com/example/api/board/dto/update/UpdateAccountConditionCommand.java create mode 100644 src/main/java/com/example/api/board/dto/update/UpdateOpenStatusRequest.java create mode 100644 src/main/java/com/example/api/board/dto/update/UpdateUserInfoRequest.java create mode 100644 src/main/java/com/example/api/board/entitiy/update/UpdateAccountConditionHandler.java create mode 100644 src/main/java/com/example/api/board/entitiy/update/UpdateAccountConditionManager.java create mode 100644 src/main/java/com/example/api/board/entitiy/update/UpdateOpenStatusHandler.java create mode 100644 src/main/java/com/example/api/board/entitiy/update/UpdateUserInfoHandler.java create mode 100644 src/test/java/com/example/api/global/BaseIntegrationTest.java diff --git a/src/main/generated/com/example/api/domain/QReview.java b/src/main/generated/com/example/api/domain/QReview.java new file mode 100644 index 00000000..b13b584a --- /dev/null +++ b/src/main/generated/com/example/api/domain/QReview.java @@ -0,0 +1,59 @@ +package com.example.api.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + +/** + * QReview is a Querydsl query type for Review + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QReview extends EntityPathBase { + + private static final long serialVersionUID = 731127133L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QReview review = new QReview("review"); + + public final QBaseEntity _super = new QBaseEntity(this); + + //inherited + public final DateTimePath createdDate = _super.createdDate; + + public final QOfferEmployment offerEmployment; + + public final StringPath reviewContent = createString("reviewContent"); + + public final NumberPath reviewId = createNumber("reviewId", Long.class); + + public final NumberPath reviewStarPoint = createNumber("reviewStarPoint", Integer.class); + + //inherited + public final DateTimePath updatedDate = _super.updatedDate; + + public QReview(String variable) { + this(Review.class, forVariable(variable), INITS); + } + + public QReview(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QReview(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QReview(PathMetadata metadata, PathInits inits) { + this(Review.class, metadata, inits); + } + + public QReview(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.offerEmployment = inits.isInitialized("offerEmployment") ? new QOfferEmployment(forProperty("offerEmployment"), inits.get("offerEmployment")) : null; + } +} \ No newline at end of file diff --git a/src/main/java/com/example/api/account/entity/UserRole.java b/src/main/java/com/example/api/account/entity/UserRole.java index 0c30472a..9848f010 100644 --- a/src/main/java/com/example/api/account/entity/UserRole.java +++ b/src/main/java/com/example/api/account/entity/UserRole.java @@ -45,6 +45,6 @@ public String getDescription() { } public String getAuthority() { - return "ROLE_" + this.name(); // ROLE_EMPLOYEE, ROLE_EMPLOYER 형식 + return this.name(); } } \ No newline at end of file diff --git a/src/main/java/com/example/api/auth/controller/AuthController.java b/src/main/java/com/example/api/auth/controller/AuthController.java index 2fc12fd9..6e77fc74 100644 --- a/src/main/java/com/example/api/auth/controller/AuthController.java +++ b/src/main/java/com/example/api/auth/controller/AuthController.java @@ -22,21 +22,21 @@ public class AuthController { private final AuthenticationManager authenticationManager; @PostMapping("/login") - public ResponseEntity login(@Valid @RequestBody final LoginRequest loginRequest) { - AuthTokenRequest authTokenRequest = authService.login(loginRequest); - return ResponseEntity.ok(authTokenRequest); + public ResponseEntity login(@Valid @RequestBody final LoginRequest loginRequest) { + LoginSuccessResponse loginSuccessResponse = authService.login(loginRequest); + return ResponseEntity.ok(loginSuccessResponse); } @PostMapping("/refresh") - public ResponseEntity refresh(@Valid @RequestBody final RefreshTokenRequest refreshTokenRequest) { - AuthTokenRequest authTokenRequest = authService.refreshAuthToken(refreshTokenRequest); - return ResponseEntity.ok(authTokenRequest); + public ResponseEntity refresh(@Valid @RequestBody final RefreshTokenRequest refreshTokenRequest) { + LoginSuccessResponse loginSuccessResponse = authService.refreshAuthToken(refreshTokenRequest); + return ResponseEntity.ok(loginSuccessResponse); } @PostMapping("/logout") - public ResponseEntity logout(@AuthenticationPrincipal final Object principal) { + public ResponseEntity logout(@AuthenticationPrincipal final Object principal) { Long userId = Long.parseLong(principal.toString()); - AuthTokenRequest authTokenRequest = authService.logout(new LoginUserRequest(userId)); - return ResponseEntity.ok(authTokenRequest); + LoginSuccessResponse loginSuccessResponse = authService.logout(new LoginUserRequest(userId)); + return ResponseEntity.ok(loginSuccessResponse); } } \ No newline at end of file diff --git a/src/main/java/com/example/api/auth/dto/AuthTokenRequest.java b/src/main/java/com/example/api/auth/dto/AuthTokenRequest.java index af76d146..e69de29b 100644 --- a/src/main/java/com/example/api/auth/dto/AuthTokenRequest.java +++ b/src/main/java/com/example/api/auth/dto/AuthTokenRequest.java @@ -1,9 +0,0 @@ -package com.example.api.auth.dto; - -import jakarta.validation.constraints.NotBlank; - -public record AuthTokenRequest( - @NotBlank String accessToken, - @NotBlank String refreshToken -) { -} \ No newline at end of file diff --git a/src/main/java/com/example/api/auth/dto/LoginSuccessResponse.java b/src/main/java/com/example/api/auth/dto/LoginSuccessResponse.java new file mode 100644 index 00000000..75aaa111 --- /dev/null +++ b/src/main/java/com/example/api/auth/dto/LoginSuccessResponse.java @@ -0,0 +1,9 @@ +package com.example.api.auth.dto; + +public record LoginSuccessResponse( + String accessToken, + String refreshToken, + String userId, + String userRole +) { +} \ No newline at end of file diff --git a/src/main/java/com/example/api/auth/service/AuthService.java b/src/main/java/com/example/api/auth/service/AuthService.java index 284d22e4..8c250aa9 100644 --- a/src/main/java/com/example/api/auth/service/AuthService.java +++ b/src/main/java/com/example/api/auth/service/AuthService.java @@ -22,7 +22,7 @@ public class AuthService { private final TokenRepository tokenRepository; @Transactional - public AuthTokenRequest login(@Validated final LoginRequest request) { + public LoginSuccessResponse login(@Validated final LoginRequest request) { final Account user = getUserByLoginId(request.loginId()); checkPassword(request, user); return generateAuthToken(user); @@ -44,11 +44,11 @@ private void checkPassword(final LoginRequest request, final Account user) { } } - private AuthTokenRequest generateAuthToken(final Account user) { + private LoginSuccessResponse generateAuthToken(final Account user) { String accessToken = jwtTokenProvider.generateAccessToken(new UserDetailRequest(user.getAccountId(), user.getRoles())); String refreshToken = generateRefreshToken(user); - - return new AuthTokenRequest(accessToken,refreshToken); + String role = user.getRoles().stream().findFirst().get().getAuthority(); // 회원가입 시에 무조건 역할이 들어가기에 바로 get으로 꺼냄 + return new LoginSuccessResponse(accessToken,refreshToken, user.getAccountId().toString(), role); } private String generateRefreshToken(final Account user) { @@ -66,7 +66,7 @@ private String generateRefreshToken(final Account user) { } @Transactional - public AuthTokenRequest refreshAuthToken(@Validated final RefreshTokenRequest request){ + public LoginSuccessResponse refreshAuthToken(@Validated final RefreshTokenRequest request){ if(!jwtTokenProvider.isNotExpiredToken(request.refreshToken())){ throw new BusinessException(ErrorCode.EXPIRED_REFRESH_TOKEN); } @@ -77,10 +77,10 @@ public AuthTokenRequest refreshAuthToken(@Validated final RefreshTokenRequest re } @Transactional - public AuthTokenRequest logout(@Validated final LoginUserRequest loginUserRequest) { + public LoginSuccessResponse logout(@Validated final LoginUserRequest loginUserRequest) { Account user = getUserById(loginUserRequest.userId()); tokenRepository.deleteAllByUser(user); - return new AuthTokenRequest(null, null); + return new LoginSuccessResponse(null, null, null, null); } private Account getUserById(final Long userId) { diff --git a/src/main/java/com/example/api/board/controller/BoardController.java b/src/main/java/com/example/api/board/controller/BoardController.java index a5cbe63e..69acca3c 100644 --- a/src/main/java/com/example/api/board/controller/BoardController.java +++ b/src/main/java/com/example/api/board/controller/BoardController.java @@ -1,9 +1,9 @@ package com.example.api.board.controller; -import com.example.api.board.controller.domain.request.EmployeeIdRequest; -import com.example.api.board.controller.domain.response.Board; -import com.example.api.board.controller.domain.response.CategoryDTO; -import com.example.api.board.controller.domain.response.MyInfoDTO; +import com.example.api.board.dto.request.EmployeeIdRequest; +import com.example.api.board.dto.response.Board; +import com.example.api.board.dto.response.CategoryDTO; +import com.example.api.board.dto.response.MyInfoDTO; import com.example.api.board.service.BoardService; import com.example.api.board.service.CategoryService; import com.example.api.board.service.EmployeeService; diff --git a/src/main/java/com/example/api/board/controller/domain/request/EmployeeIdRequest.java b/src/main/java/com/example/api/board/controller/domain/request/EmployeeIdRequest.java deleted file mode 100644 index b4dad1de..00000000 --- a/src/main/java/com/example/api/board/controller/domain/request/EmployeeIdRequest.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.example.api.board.controller.domain.request; - -public record EmployeeIdRequest(Long employeeId) { -} diff --git a/src/main/java/com/example/api/board/dto/request/EmployeeIdRequest.java b/src/main/java/com/example/api/board/dto/request/EmployeeIdRequest.java new file mode 100644 index 00000000..c51f8a71 --- /dev/null +++ b/src/main/java/com/example/api/board/dto/request/EmployeeIdRequest.java @@ -0,0 +1,4 @@ +package com.example.api.board.dto.request; + +public record EmployeeIdRequest(Long employeeId) { +} diff --git a/src/main/java/com/example/api/board/controller/domain/request/QueryPossibleEmployerRequest.java b/src/main/java/com/example/api/board/dto/request/QueryPossibleEmployerRequest.java similarity index 78% rename from src/main/java/com/example/api/board/controller/domain/request/QueryPossibleEmployerRequest.java rename to src/main/java/com/example/api/board/dto/request/QueryPossibleEmployerRequest.java index f1c2fc01..0a811a1d 100644 --- a/src/main/java/com/example/api/board/controller/domain/request/QueryPossibleEmployerRequest.java +++ b/src/main/java/com/example/api/board/dto/request/QueryPossibleEmployerRequest.java @@ -1,4 +1,4 @@ -package com.example.api.board.controller.domain.request; +package com.example.api.board.dto.request; import java.time.LocalDateTime; diff --git a/src/main/java/com/example/api/board/controller/domain/response/Board.java b/src/main/java/com/example/api/board/dto/response/Board.java similarity index 83% rename from src/main/java/com/example/api/board/controller/domain/response/Board.java rename to src/main/java/com/example/api/board/dto/response/Board.java index 5b7514d6..78c77aa0 100644 --- a/src/main/java/com/example/api/board/controller/domain/response/Board.java +++ b/src/main/java/com/example/api/board/dto/response/Board.java @@ -1,4 +1,4 @@ -package com.example.api.board.controller.domain.response; +package com.example.api.board.dto.response; import lombok.AllArgsConstructor; import lombok.EqualsAndHashCode; diff --git a/src/main/java/com/example/api/board/controller/domain/response/CategoryDTO.java b/src/main/java/com/example/api/board/dto/response/CategoryDTO.java similarity index 76% rename from src/main/java/com/example/api/board/controller/domain/response/CategoryDTO.java rename to src/main/java/com/example/api/board/dto/response/CategoryDTO.java index 9ab150df..19d99dc4 100644 --- a/src/main/java/com/example/api/board/controller/domain/response/CategoryDTO.java +++ b/src/main/java/com/example/api/board/dto/response/CategoryDTO.java @@ -1,4 +1,4 @@ -package com.example.api.board.controller.domain.response; +package com.example.api.board.dto.response; import lombok.*; diff --git a/src/main/java/com/example/api/board/controller/domain/response/ExternalCareerDTO.java b/src/main/java/com/example/api/board/dto/response/ExternalCareerDTO.java similarity index 77% rename from src/main/java/com/example/api/board/controller/domain/response/ExternalCareerDTO.java rename to src/main/java/com/example/api/board/dto/response/ExternalCareerDTO.java index 917de039..25d3d279 100644 --- a/src/main/java/com/example/api/board/controller/domain/response/ExternalCareerDTO.java +++ b/src/main/java/com/example/api/board/dto/response/ExternalCareerDTO.java @@ -1,4 +1,4 @@ -package com.example.api.board.controller.domain.response; +package com.example.api.board.dto.response; import lombok.*; diff --git a/src/main/java/com/example/api/board/controller/domain/response/InnerCareerDTO.java b/src/main/java/com/example/api/board/dto/response/InnerCareerDTO.java similarity index 92% rename from src/main/java/com/example/api/board/controller/domain/response/InnerCareerDTO.java rename to src/main/java/com/example/api/board/dto/response/InnerCareerDTO.java index c183e11a..d4e854df 100644 --- a/src/main/java/com/example/api/board/controller/domain/response/InnerCareerDTO.java +++ b/src/main/java/com/example/api/board/dto/response/InnerCareerDTO.java @@ -1,4 +1,4 @@ -package com.example.api.board.controller.domain.response; +package com.example.api.board.dto.response; import com.example.api.domain.Review; diff --git a/src/main/java/com/example/api/board/controller/domain/response/MyInfoDTO.java b/src/main/java/com/example/api/board/dto/response/MyInfoDTO.java similarity index 94% rename from src/main/java/com/example/api/board/controller/domain/response/MyInfoDTO.java rename to src/main/java/com/example/api/board/dto/response/MyInfoDTO.java index dfbff862..441a1263 100644 --- a/src/main/java/com/example/api/board/controller/domain/response/MyInfoDTO.java +++ b/src/main/java/com/example/api/board/dto/response/MyInfoDTO.java @@ -1,4 +1,4 @@ -package com.example.api.board.controller.domain.response; +package com.example.api.board.dto.response; import lombok.*; diff --git a/src/main/java/com/example/api/board/controller/domain/response/PossibleBoardDTO.java b/src/main/java/com/example/api/board/dto/response/PossibleBoardDTO.java similarity index 85% rename from src/main/java/com/example/api/board/controller/domain/response/PossibleBoardDTO.java rename to src/main/java/com/example/api/board/dto/response/PossibleBoardDTO.java index dad2a7fa..b042af55 100644 --- a/src/main/java/com/example/api/board/controller/domain/response/PossibleBoardDTO.java +++ b/src/main/java/com/example/api/board/dto/response/PossibleBoardDTO.java @@ -1,4 +1,4 @@ -package com.example.api.board.controller.domain.response; +package com.example.api.board.dto.response; import lombok.*; import java.time.LocalDateTime; diff --git a/src/main/java/com/example/api/board/controller/domain/response/PossibleEmployeeResponse.java b/src/main/java/com/example/api/board/dto/response/PossibleEmployeeResponse.java similarity index 81% rename from src/main/java/com/example/api/board/controller/domain/response/PossibleEmployeeResponse.java rename to src/main/java/com/example/api/board/dto/response/PossibleEmployeeResponse.java index bb7420a7..551e6f92 100644 --- a/src/main/java/com/example/api/board/controller/domain/response/PossibleEmployeeResponse.java +++ b/src/main/java/com/example/api/board/dto/response/PossibleEmployeeResponse.java @@ -1,4 +1,4 @@ -package com.example.api.board.controller.domain.response; +package com.example.api.board.dto.response; import java.time.LocalDateTime; diff --git a/src/main/java/com/example/api/board/dto/update/UpdateAccountConditionCommand.java b/src/main/java/com/example/api/board/dto/update/UpdateAccountConditionCommand.java new file mode 100644 index 00000000..04519732 --- /dev/null +++ b/src/main/java/com/example/api/board/dto/update/UpdateAccountConditionCommand.java @@ -0,0 +1,4 @@ +package com.example.api.board.dto.update; + +public interface UpdateAccountConditionCommand { +} diff --git a/src/main/java/com/example/api/board/dto/update/UpdateOpenStatusRequest.java b/src/main/java/com/example/api/board/dto/update/UpdateOpenStatusRequest.java new file mode 100644 index 00000000..a7b85c19 --- /dev/null +++ b/src/main/java/com/example/api/board/dto/update/UpdateOpenStatusRequest.java @@ -0,0 +1,6 @@ +package com.example.api.board.dto.update; + +import jakarta.validation.constraints.NotNull; + +public record UpdateOpenStatusRequest(@NotNull boolean openStatus) implements UpdateAccountConditionCommand { +} diff --git a/src/main/java/com/example/api/board/dto/update/UpdateUserInfoRequest.java b/src/main/java/com/example/api/board/dto/update/UpdateUserInfoRequest.java new file mode 100644 index 00000000..424cd813 --- /dev/null +++ b/src/main/java/com/example/api/board/dto/update/UpdateUserInfoRequest.java @@ -0,0 +1,11 @@ +package com.example.api.board.dto.update; + +public record UpdateUserInfoRequest( + String name, + String sex, + Integer age, + String phoneNumber, + String email, + String nickname +) implements UpdateAccountConditionCommand{ +} diff --git a/src/main/java/com/example/api/board/entitiy/update/UpdateAccountConditionHandler.java b/src/main/java/com/example/api/board/entitiy/update/UpdateAccountConditionHandler.java new file mode 100644 index 00000000..0cd26c13 --- /dev/null +++ b/src/main/java/com/example/api/board/entitiy/update/UpdateAccountConditionHandler.java @@ -0,0 +1,9 @@ +package com.example.api.board.entitiy.update; + +import com.example.api.board.dto.update.UpdateAccountConditionCommand; +import com.example.api.domain.Account; + +public interface UpdateAccountConditionHandler { + void update(final Account account, final UpdateAccountConditionCommand updateAccountConditionCommand); + boolean supports(final UpdateAccountConditionCommand updateAccountConditionCommand); +} diff --git a/src/main/java/com/example/api/board/entitiy/update/UpdateAccountConditionManager.java b/src/main/java/com/example/api/board/entitiy/update/UpdateAccountConditionManager.java new file mode 100644 index 00000000..dbd855a3 --- /dev/null +++ b/src/main/java/com/example/api/board/entitiy/update/UpdateAccountConditionManager.java @@ -0,0 +1,26 @@ +package com.example.api.board.entitiy.update; + +import com.example.api.board.dto.update.UpdateAccountConditionCommand; +import com.example.api.domain.Account; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Service +@RequiredArgsConstructor +public class UpdateAccountConditionManager { + private final List updateAccountConditionHandlers; + + @Transactional(propagation = Propagation.MANDATORY) + public void updateAccount(final Account account, final UpdateAccountConditionCommand command) { + UpdateAccountConditionHandler handler = updateAccountConditionHandlers.stream() + .filter(h -> h.supports(command)) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException("적합한 핸들러가 없음")); + + handler.update(account, command); + } +} \ No newline at end of file diff --git a/src/main/java/com/example/api/board/entitiy/update/UpdateOpenStatusHandler.java b/src/main/java/com/example/api/board/entitiy/update/UpdateOpenStatusHandler.java new file mode 100644 index 00000000..45efb00a --- /dev/null +++ b/src/main/java/com/example/api/board/entitiy/update/UpdateOpenStatusHandler.java @@ -0,0 +1,19 @@ +package com.example.api.board.entitiy.update; + +import com.example.api.board.dto.update.UpdateAccountConditionCommand; +import com.example.api.board.dto.update.UpdateOpenStatusRequest; +import com.example.api.domain.Account; +import org.springframework.stereotype.Service; + +@Service +public class UpdateOpenStatusHandler implements UpdateAccountConditionHandler { + @Override + public void update(Account account, UpdateAccountConditionCommand updateAccountConditionCommand) { + account.updateOpenStatus((UpdateOpenStatusRequest) updateAccountConditionCommand); + } + + @Override + public boolean supports(UpdateAccountConditionCommand command) { + return command instanceof UpdateOpenStatusRequest; + } +} diff --git a/src/main/java/com/example/api/board/entitiy/update/UpdateUserInfoHandler.java b/src/main/java/com/example/api/board/entitiy/update/UpdateUserInfoHandler.java new file mode 100644 index 00000000..06717203 --- /dev/null +++ b/src/main/java/com/example/api/board/entitiy/update/UpdateUserInfoHandler.java @@ -0,0 +1,17 @@ +package com.example.api.board.entitiy.update; + +import com.example.api.board.dto.update.UpdateAccountConditionCommand; +import com.example.api.board.dto.update.UpdateUserInfoRequest; +import com.example.api.domain.Account; + +public class UpdateUserInfoHandler implements UpdateAccountConditionHandler { + @Override + public void update(Account account, UpdateAccountConditionCommand updateAccountConditionCommand) { + account.updateUserInfo((UpdateUserInfoRequest) updateAccountConditionCommand); + } + + @Override + public boolean supports(UpdateAccountConditionCommand command) { + return command instanceof UpdateUserInfoRequest; + } +} diff --git a/src/main/java/com/example/api/board/service/BoardService.java b/src/main/java/com/example/api/board/service/BoardService.java index 7d9e967b..682966e0 100644 --- a/src/main/java/com/example/api/board/service/BoardService.java +++ b/src/main/java/com/example/api/board/service/BoardService.java @@ -1,15 +1,19 @@ package com.example.api.board.service; - import com.example.api.board.controller.domain.request.EmployeeIdRequest; import com.example.api.board.controller.domain.response.MyInfoDTO; import com.example.api.domain.repository.*; +import com.example.api.board.dto.request.EmployeeIdRequest; +import com.example.api.board.dto.response.MyInfoDTO; +import com.example.api.domain.repository.ExternalCareerRepository; +import com.example.api.domain.repository.FlavoredRepository; +import com.example.api.domain.repository.MyInfoRepository; +import com.example.api.domain.repository.OfferEmploymentRepository; import com.example.api.possbileboard.PossibleBoardRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; - @Service @RequiredArgsConstructor public class BoardService { @@ -26,10 +30,6 @@ public MyInfoDTO findMyInfoById(final EmployeeIdRequest employeeIdRequest) { myInfoDTOById.setExternalCareerList(externalCareerRepository.findAllDTOByEmployeeAccountId(employeeIdRequest.employeeId())); myInfoDTOById.setPossibleBoardList(possibleBoardRepository.findAllDTOByEmployeeAccountId(employeeIdRequest.employeeId())); myInfoDTOById.setFlavoredCategoryList(flavoredRepository.findAllCategoryDTOByEmployeeId(employeeIdRequest.employeeId())); - return myInfoDTOById; } - - -} - +} \ No newline at end of file diff --git a/src/main/java/com/example/api/board/service/CategoryService.java b/src/main/java/com/example/api/board/service/CategoryService.java index 8ee263e2..acc14687 100644 --- a/src/main/java/com/example/api/board/service/CategoryService.java +++ b/src/main/java/com/example/api/board/service/CategoryService.java @@ -1,6 +1,6 @@ package com.example.api.board.service; -import com.example.api.board.controller.domain.response.CategoryDTO; +import com.example.api.board.dto.response.CategoryDTO; import com.example.api.domain.repository.CategoryRepository; import com.example.api.domain.Category; import lombok.RequiredArgsConstructor; diff --git a/src/main/java/com/example/api/board/service/EmployeeService.java b/src/main/java/com/example/api/board/service/EmployeeService.java index f85d8444..4f6615a9 100644 --- a/src/main/java/com/example/api/board/service/EmployeeService.java +++ b/src/main/java/com/example/api/board/service/EmployeeService.java @@ -1,10 +1,13 @@ package com.example.api.board.service; -import com.example.api.board.controller.domain.request.EmployeeIdRequest; -import com.example.api.board.controller.domain.response.CategoryDTO; -import com.example.api.board.controller.domain.response.ExternalCareerDTO; -import com.example.api.board.controller.domain.response.MyInfoDTO; -import com.example.api.board.controller.domain.response.PossibleBoardDTO; +import com.example.api.board.dto.request.EmployeeIdRequest; +import com.example.api.board.dto.response.CategoryDTO; +import com.example.api.board.dto.response.ExternalCareerDTO; +import com.example.api.board.dto.response.MyInfoDTO; +import com.example.api.board.dto.response.PossibleBoardDTO; +import com.example.api.board.dto.update.UpdateOpenStatusRequest; +import com.example.api.board.dto.update.UpdateUserInfoRequest; +import com.example.api.board.entitiy.update.UpdateAccountConditionManager; import com.example.api.domain.Account; import com.example.api.domain.Category; import com.example.api.domain.ExternalCareer; @@ -30,11 +33,12 @@ public class EmployeeService { private final ExternalCareerRepository externalCareerRepository; private final FlavoredRepository flavoredRepository; private final PossibleBoardRepository possibleBoardRepository; + private final UpdateAccountConditionManager updateAccountConditionManager; @Transactional public Boolean changeOpenStatus(final EmployeeIdRequest employeeIdRequest, boolean openStatus) { return employeeRepository.findByAccountId(employeeIdRequest.employeeId()).map(employee -> { - employee.setOpenStatus(openStatus); + updateAccountConditionManager.updateAccount(employee, new UpdateOpenStatusRequest(openStatus)); employeeRepository.save(employee); return true; }).orElse(false); @@ -43,7 +47,15 @@ public Boolean changeOpenStatus(final EmployeeIdRequest employeeIdRequest, boole @Transactional public boolean updateUserInfo(final EmployeeIdRequest employeeIdRequest, MyInfoDTO myInfo) { return employeeRepository.findByAccountId(employeeIdRequest.employeeId()).map(employee -> { - setUserInfo(employee, myInfo); + updateAccountConditionManager.updateAccount(employee, new UpdateUserInfoRequest( + myInfo.getName(), + myInfo.getSex(), + myInfo.getAge(), + myInfo.getPhone(), + myInfo.getEmail(), + myInfo.getNickname() + ) + ); employeeRepository.save(employee); updateExternalCareer(employee, myInfo.getExternalCareerList()); @@ -52,14 +64,7 @@ public boolean updateUserInfo(final EmployeeIdRequest employeeIdRequest, MyInfoD return true; }).orElse(false); } - void setUserInfo(Account employee, MyInfoDTO myInfo) { - employee.setName(myInfo.getName()); - employee.setSex(myInfo.getSex()); - employee.setAge(myInfo.getAge()); - employee.setPhoneNumber(myInfo.getPhone()); - employee.setEmail(myInfo.getEmail()); - employee.setNickname(myInfo.getNickname()); - } + public void updateExternalCareer(Account employee, List newExternalCareerList) { List existList = externalCareerRepository.findAllByEmployeeAccountId(employee.getAccountId()); Set newSet = new HashSet<>(newExternalCareerList); diff --git a/src/main/java/com/example/api/domain/Account.java b/src/main/java/com/example/api/domain/Account.java index 35133bc4..4be7ae7f 100644 --- a/src/main/java/com/example/api/domain/Account.java +++ b/src/main/java/com/example/api/domain/Account.java @@ -3,6 +3,8 @@ import com.example.api.account.entity.Nationality; import com.example.api.account.entity.UserRole; import com.example.api.auth.dto.LoginUserRequest; +import com.example.api.board.dto.update.UpdateOpenStatusRequest; +import com.example.api.board.dto.update.UpdateUserInfoRequest; import jakarta.persistence.*; import lombok.EqualsAndHashCode; import lombok.Getter; @@ -84,4 +86,17 @@ public Account(String loginId, String password, String name, String nickname, St public LoginUserRequest getLoginUser(){ return new LoginUserRequest(accountId); } + + public void updateOpenStatus(UpdateOpenStatusRequest request){ + this.openStatus = request.openStatus(); + } + + public void updateUserInfo(UpdateUserInfoRequest request){ + this.name = request.name(); + this.sex = request.sex(); + this.age = request.age(); + this.phoneNumber = request.phoneNumber(); + this.email = request.email(); + this.nickname = request.nickname(); + } } \ No newline at end of file diff --git a/src/main/java/com/example/api/domain/repository/ExternalCareerRepository.java b/src/main/java/com/example/api/domain/repository/ExternalCareerRepository.java index 1b69c4ef..18449a97 100644 --- a/src/main/java/com/example/api/domain/repository/ExternalCareerRepository.java +++ b/src/main/java/com/example/api/domain/repository/ExternalCareerRepository.java @@ -1,6 +1,6 @@ package com.example.api.domain.repository; -import com.example.api.board.controller.domain.response.ExternalCareerDTO; +import com.example.api.board.dto.response.ExternalCareerDTO; import com.example.api.domain.ExternalCareer; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; @@ -11,7 +11,7 @@ @Repository public interface ExternalCareerRepository extends JpaRepository { - @Query("select new com.example.api.board.controller.domain.response.ExternalCareerDTO(e.id, e.Name, e.period) " + + @Query("select new com.example.api.board.dto.response.ExternalCareerDTO(e.id, e.Name, e.period) " + "from ExternalCareer e where e.employee.accountId = :employeeId") List findAllDTOByEmployeeAccountId(@Param("employeeId") Long employeeId); diff --git a/src/main/java/com/example/api/domain/repository/FlavoredRepository.java b/src/main/java/com/example/api/domain/repository/FlavoredRepository.java index 3d860e3a..752fd5a4 100644 --- a/src/main/java/com/example/api/domain/repository/FlavoredRepository.java +++ b/src/main/java/com/example/api/domain/repository/FlavoredRepository.java @@ -1,6 +1,6 @@ package com.example.api.domain.repository; -import com.example.api.board.controller.domain.response.CategoryDTO; +import com.example.api.board.dto.response.CategoryDTO; import com.example.api.domain.Flavored; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; @@ -11,7 +11,7 @@ @Repository public interface FlavoredRepository extends JpaRepository { - @Query("select distinct new com.example.api.board.controller.domain.response.CategoryDTO(c.categoryId, c.categoryName) " + + @Query("select distinct new com.example.api.board.dto.response.CategoryDTO(c.categoryId, c.categoryName) " + "from Flavored f join Category c on f.category.categoryId = c.categoryId where f.employee.accountId = :employeeId") List findAllCategoryDTOByEmployeeId(@Param("employeeId") long employeeId); diff --git a/src/main/java/com/example/api/domain/repository/MyInfoRepository.java b/src/main/java/com/example/api/domain/repository/MyInfoRepository.java index 0a68ab64..d6d9555d 100644 --- a/src/main/java/com/example/api/domain/repository/MyInfoRepository.java +++ b/src/main/java/com/example/api/domain/repository/MyInfoRepository.java @@ -1,6 +1,6 @@ package com.example.api.domain.repository; -import com.example.api.board.controller.domain.response.MyInfoDTO; +import com.example.api.board.dto.response.MyInfoDTO; import com.example.api.domain.Account; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; @@ -9,7 +9,7 @@ @Repository public interface MyInfoRepository extends JpaRepository { - @Query("select new com.example.api.board.controller.domain.response." + + @Query("select new com.example.api.board.dto.response." + "MyInfoDTO(a.name, a.nickname, a.age, a.sex, a.email, a.phoneNumber, a.starPoint, a.workCount) " + "from Account a " + "where a.accountId = :EmployeeId") diff --git a/src/main/java/com/example/api/domain/repository/OfferEmploymentRepository.java b/src/main/java/com/example/api/domain/repository/OfferEmploymentRepository.java index bebf713e..89382a52 100644 --- a/src/main/java/com/example/api/domain/repository/OfferEmploymentRepository.java +++ b/src/main/java/com/example/api/domain/repository/OfferEmploymentRepository.java @@ -1,6 +1,6 @@ package com.example.api.domain.repository; -import com.example.api.board.controller.domain.response.InnerCareerDTO; +import com.example.api.board.dto.response.InnerCareerDTO; import com.example.api.domain.OfferEmployment; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; @@ -11,11 +11,11 @@ @Repository public interface OfferEmploymentRepository extends JpaRepository { - @Query("select new com.example.api.board.controller.domain.response.InnerCareerDTO(b.businessName, c.contractStartTime, b.representationName, r) " + + @Query("select new com.example.api.board.dto.response.InnerCareerDTO(b.businessName, c.contractStartTime, b.representationName, r) " + "from OfferEmployment o " + "join Contract c on o.suggestId = c.contractId " + "join Business b on o.business.businessId = b.businessId "+ - "join Review r on o.suggestId = r.suggestId " + + "join Review r on o.suggestId = r.reviewId " + "where o.employee.accountId = :employeeId") List findAllDTOByEmployeeId(@Param("employeeId") long employeeId); diff --git a/src/main/java/com/example/api/employer/controller/EmployerController.java b/src/main/java/com/example/api/employer/controller/EmployerController.java index 78a1026b..61ceb56b 100644 --- a/src/main/java/com/example/api/employer/controller/EmployerController.java +++ b/src/main/java/com/example/api/employer/controller/EmployerController.java @@ -1,6 +1,6 @@ package com.example.api.employer.controller; -import com.example.api.board.controller.domain.request.EmployeeIdRequest; +import com.example.api.board.dto.request.EmployeeIdRequest; import com.example.api.employer.controller.dto.LikeEmployeeDTO; import com.example.api.employer.service.EmployerService; import lombok.RequiredArgsConstructor; diff --git a/src/main/java/com/example/api/employer/controller/dto/LikeEmployeeDTO.java b/src/main/java/com/example/api/employer/controller/dto/LikeEmployeeDTO.java index eb8a92bb..8243278e 100644 --- a/src/main/java/com/example/api/employer/controller/dto/LikeEmployeeDTO.java +++ b/src/main/java/com/example/api/employer/controller/dto/LikeEmployeeDTO.java @@ -1,7 +1,7 @@ package com.example.api.employer.controller.dto; -import com.example.api.board.controller.domain.response.CategoryDTO; -import com.example.api.board.controller.domain.response.ExternalCareerDTO; +import com.example.api.board.dto.response.CategoryDTO; +import com.example.api.board.dto.response.ExternalCareerDTO; import lombok.AllArgsConstructor; import lombok.EqualsAndHashCode; import lombok.Getter; diff --git a/src/main/java/com/example/api/employer/service/EmployerService.java b/src/main/java/com/example/api/employer/service/EmployerService.java index 7421f926..982411a6 100644 --- a/src/main/java/com/example/api/employer/service/EmployerService.java +++ b/src/main/java/com/example/api/employer/service/EmployerService.java @@ -1,6 +1,6 @@ package com.example.api.employer.service; -import com.example.api.board.controller.domain.request.EmployeeIdRequest; +import com.example.api.board.dto.request.EmployeeIdRequest; import com.example.api.domain.repository.EmployeeRepository; import com.example.api.domain.repository.ExternalCareerRepository; import com.example.api.domain.repository.FlavoredRepository; diff --git a/src/main/java/com/example/api/possbileboard/PossibleBoardRepository.java b/src/main/java/com/example/api/possbileboard/PossibleBoardRepository.java index 7bedfcb7..0eefac4a 100644 --- a/src/main/java/com/example/api/possbileboard/PossibleBoardRepository.java +++ b/src/main/java/com/example/api/possbileboard/PossibleBoardRepository.java @@ -1,6 +1,6 @@ package com.example.api.possbileboard; -import com.example.api.board.controller.domain.response.PossibleBoardDTO; +import com.example.api.board.dto.response.PossibleBoardDTO; import com.example.api.domain.Category; import com.example.api.domain.Contract; import com.example.api.domain.ExternalCareer; @@ -21,22 +21,21 @@ public interface PossibleBoardRepository extends JpaRepository queryFlavoredCategories(@Param("possibleId") final Long possibleId); @Query("SELECT ex FROM ExternalCareer ex JOIN PossibleBoard p ON ex.employee.accountId = p.employee.accountId WHERE p.possibleId = :possibleId") - List queryExternalCareeors(@Param("possibleId") final Long possibleId); + List queryExternalCareers(@Param("possibleId") final Long possibleId); @Query("SELECT c FROM Contract c JOIN PossibleBoard p ON p.employee.accountId = c.offerEmployment.employee.accountId WHERE c.offerEmployment.employee.accountId = :possibleId AND c.contractSucceeded = TRUE ") - List queryInternalCareeors(@Param("possibleId") final Long possibleId); + List queryInternalCareers(@Param("possibleId") final Long possibleId); List findAllByEmployeeAccountId(Long employeeId); - @Query("select new com.example.api.board.controller.domain.response.PossibleBoardDTO(p.possibleId, p.startTime, p.endTime) " + + @Query("select new com.example.api.board.dto.response.PossibleBoardDTO(p.possibleId, p.startTime, p.endTime) " + "from PossibleBoard p where p.employee.accountId = :employeeId") List findAllDTOByEmployeeAccountId(@Param("employeeId")Long employeeId); - -} +} \ No newline at end of file diff --git a/src/main/java/com/example/api/possbileboard/PossibleBoardService.java b/src/main/java/com/example/api/possbileboard/PossibleBoardService.java index 4ad25752..36864f10 100644 --- a/src/main/java/com/example/api/possbileboard/PossibleBoardService.java +++ b/src/main/java/com/example/api/possbileboard/PossibleBoardService.java @@ -37,8 +37,8 @@ public void addPossibleBoard(final AddPossibleTimeCommand addPossibleTimeCommand public PossibleDetailsResponse queryPossibleDetails(final QueryPossibleDetailsCommand queryPossibleDetailsCommand) { final PossibleDetails possibleDetails = possibleBoardRepository.queryPossibleDetails(queryPossibleDetailsCommand.possibleId()); final List categories = possibleBoardRepository.queryFlavoredCategories(queryPossibleDetailsCommand.possibleId()); - final List externalCareers = possibleBoardRepository.queryExternalCareeors(queryPossibleDetailsCommand.possibleId()); - final List contracts = possibleBoardRepository.queryInternalCareeors(queryPossibleDetailsCommand.possibleId()); + final List externalCareers = possibleBoardRepository.queryExternalCareers(queryPossibleDetailsCommand.possibleId()); + final List contracts = possibleBoardRepository.queryInternalCareers(queryPossibleDetailsCommand.possibleId()); return possibleMapper.toPossibleDetailsResponse(possibleDetails, categories, externalCareers, contracts); } diff --git a/src/main/java/com/example/api/possbileboard/dto/PossibleDetails.java b/src/main/java/com/example/api/possbileboard/dto/PossibleDetails.java index 4f878549..2ad8f49e 100644 --- a/src/main/java/com/example/api/possbileboard/dto/PossibleDetails.java +++ b/src/main/java/com/example/api/possbileboard/dto/PossibleDetails.java @@ -11,6 +11,6 @@ public record PossibleDetails( LocalDateTime possibleStartTime, LocalDateTime possibleEndTime, Long contractCount, - Integer starPoint + Float starPoint ) { } diff --git a/src/test/java/com/example/api/global/BaseIntegrationTest.java b/src/test/java/com/example/api/global/BaseIntegrationTest.java new file mode 100644 index 00000000..e69de29b From ea21f3f1170f9d486eb46df499db068cec882ade Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Wed, 15 Jan 2025 20:36:01 +0900 Subject: [PATCH 231/276] =?UTF-8?q?=EB=8F=84=EB=A9=94=EC=9D=B8=20=EB=B3=91?= =?UTF-8?q?=ED=95=A9=20=EC=B6=A9=EB=8F=8C=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/auth/entitiy/QRefreshToken.java | 57 ++++++++++++++ .../com/example/api/domain/QAccount.java | 78 +++++++++++++++++++ .../com/example/api/domain/QAnnouncement.java | 53 +++++++++++++ .../com/example/api/domain/QBaseEntity.java | 39 ++++++++++ .../com/example/api/domain/QBusiness.java | 71 +++++++++++++++++ .../example/api/domain/QBusinessCategory.java | 62 +++++++++++++++ .../com/example/api/domain/QCategory.java | 47 +++++++++++ .../com/example/api/domain/QChatRoom.java | 53 +++++++++++++ .../com/example/api/domain/QContract.java | 67 ++++++++++++++++ .../example/api/domain/QExternalCareer.java | 63 +++++++++++++++ .../com/example/api/domain/QFlavored.java | 62 +++++++++++++++ .../com/example/api/domain/QInquiry.java | 71 +++++++++++++++++ .../example/api/domain/QOfferEmployment.java | 69 ++++++++++++++++ .../example/api/domain/QPossibleBoard.java | 63 +++++++++++++++ .../com/example/api/domain/QReview.java | 9 ++- .../com/example/api/domain/QScrap.java | 62 +++++++++++++++ .../api/account/service/AccountService.java | 2 +- .../api/auth/controller/AuthController.java | 4 +- .../api/auth/dto/AuthTokenRequest.java | 7 ++ .../api/board/service/BoardService.java | 3 - .../api/contracts/ReviewQueryService.java | 2 +- .../java/com/example/api/domain/Account.java | 4 + .../java/com/example/api/domain/Business.java | 4 + .../OAuth2AuthenticationSuccessHandler.java | 6 +- 24 files changed, 946 insertions(+), 12 deletions(-) create mode 100644 src/main/generated/com/example/api/auth/entitiy/QRefreshToken.java create mode 100644 src/main/generated/com/example/api/domain/QAccount.java create mode 100644 src/main/generated/com/example/api/domain/QAnnouncement.java create mode 100644 src/main/generated/com/example/api/domain/QBaseEntity.java create mode 100644 src/main/generated/com/example/api/domain/QBusiness.java create mode 100644 src/main/generated/com/example/api/domain/QBusinessCategory.java create mode 100644 src/main/generated/com/example/api/domain/QCategory.java create mode 100644 src/main/generated/com/example/api/domain/QChatRoom.java create mode 100644 src/main/generated/com/example/api/domain/QContract.java create mode 100644 src/main/generated/com/example/api/domain/QExternalCareer.java create mode 100644 src/main/generated/com/example/api/domain/QFlavored.java create mode 100644 src/main/generated/com/example/api/domain/QInquiry.java create mode 100644 src/main/generated/com/example/api/domain/QOfferEmployment.java create mode 100644 src/main/generated/com/example/api/domain/QPossibleBoard.java create mode 100644 src/main/generated/com/example/api/domain/QScrap.java diff --git a/src/main/generated/com/example/api/auth/entitiy/QRefreshToken.java b/src/main/generated/com/example/api/auth/entitiy/QRefreshToken.java new file mode 100644 index 00000000..ae3f4b01 --- /dev/null +++ b/src/main/generated/com/example/api/auth/entitiy/QRefreshToken.java @@ -0,0 +1,57 @@ +package com.example.api.auth.entitiy; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QRefreshToken is a Querydsl query type for RefreshToken + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QRefreshToken extends EntityPathBase { + + private static final long serialVersionUID = -1655386265L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QRefreshToken refreshToken1 = new QRefreshToken("refreshToken1"); + + public final NumberPath id = createNumber("id", Long.class); + + public final BooleanPath isExpired = createBoolean("isExpired"); + + public final DateTimePath recentLogin = createDateTime("recentLogin", java.time.LocalDateTime.class); + + public final StringPath refreshToken = createString("refreshToken"); + + public final com.example.api.domain.QAccount user; + + public QRefreshToken(String variable) { + this(RefreshToken.class, forVariable(variable), INITS); + } + + public QRefreshToken(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QRefreshToken(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QRefreshToken(PathMetadata metadata, PathInits inits) { + this(RefreshToken.class, metadata, inits); + } + + public QRefreshToken(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.user = inits.isInitialized("user") ? new com.example.api.domain.QAccount(forProperty("user")) : null; + } + +} + diff --git a/src/main/generated/com/example/api/domain/QAccount.java b/src/main/generated/com/example/api/domain/QAccount.java new file mode 100644 index 00000000..bebfa199 --- /dev/null +++ b/src/main/generated/com/example/api/domain/QAccount.java @@ -0,0 +1,78 @@ +package com.example.api.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QAccount is a Querydsl query type for Account + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QAccount extends EntityPathBase { + + private static final long serialVersionUID = -1087167288L; + + public static final QAccount account = new QAccount("account"); + + public final QBaseEntity _super = new QBaseEntity(this); + + public final NumberPath accountId = createNumber("accountId", Long.class); + + public final NumberPath age = createNumber("age", Integer.class); + + //inherited + public final DateTimePath createdDate = _super.createdDate; + + public final BooleanPath deleted = createBoolean("deleted"); + + public final StringPath email = createString("email"); + + public final BooleanPath emailReceivable = createBoolean("emailReceivable"); + + public final StringPath loginId = createString("loginId"); + + public final StringPath name = createString("name"); + + public final EnumPath nationality = createEnum("nationality", com.example.api.account.entity.Nationality.class); + + public final StringPath nickname = createString("nickname"); + + public final BooleanPath openStatus = createBoolean("openStatus"); + + public final StringPath password = createString("password"); + + public final StringPath phoneNumber = createString("phoneNumber"); + + public final StringPath profileImage = createString("profileImage"); + + public final CollectionPath> roles = this.>createCollection("roles", com.example.api.account.entity.UserRole.class, EnumPath.class, PathInits.DIRECT2); + + public final StringPath sex = createString("sex"); + + public final NumberPath starPoint = createNumber("starPoint", Float.class); + + //inherited + public final DateTimePath updatedDate = _super.updatedDate; + + public final NumberPath workCount = createNumber("workCount", Integer.class); + + public QAccount(String variable) { + super(Account.class, forVariable(variable)); + } + + public QAccount(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QAccount(PathMetadata metadata) { + super(Account.class, metadata); + } + +} + diff --git a/src/main/generated/com/example/api/domain/QAnnouncement.java b/src/main/generated/com/example/api/domain/QAnnouncement.java new file mode 100644 index 00000000..2280f648 --- /dev/null +++ b/src/main/generated/com/example/api/domain/QAnnouncement.java @@ -0,0 +1,53 @@ +package com.example.api.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QAnnouncement is a Querydsl query type for Announcement + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QAnnouncement extends EntityPathBase { + + private static final long serialVersionUID = 1512577932L; + + public static final QAnnouncement announcement = new QAnnouncement("announcement"); + + public final QBaseEntity _super = new QBaseEntity(this); + + public final StringPath announcementContent = createString("announcementContent"); + + public final NumberPath announcementId = createNumber("announcementId", Long.class); + + public final StringPath announcementTitle = createString("announcementTitle"); + + public final StringPath announcementType = createString("announcementType"); + + //inherited + public final DateTimePath createdDate = _super.createdDate; + + //inherited + public final DateTimePath updatedDate = _super.updatedDate; + + public final NumberPath viewCount = createNumber("viewCount", Integer.class); + + public QAnnouncement(String variable) { + super(Announcement.class, forVariable(variable)); + } + + public QAnnouncement(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QAnnouncement(PathMetadata metadata) { + super(Announcement.class, metadata); + } + +} + diff --git a/src/main/generated/com/example/api/domain/QBaseEntity.java b/src/main/generated/com/example/api/domain/QBaseEntity.java new file mode 100644 index 00000000..09c42891 --- /dev/null +++ b/src/main/generated/com/example/api/domain/QBaseEntity.java @@ -0,0 +1,39 @@ +package com.example.api.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QBaseEntity is a Querydsl query type for BaseEntity + */ +@Generated("com.querydsl.codegen.DefaultSupertypeSerializer") +public class QBaseEntity extends EntityPathBase { + + private static final long serialVersionUID = 127095193L; + + public static final QBaseEntity baseEntity = new QBaseEntity("baseEntity"); + + public final DateTimePath createdDate = createDateTime("createdDate", java.time.LocalDateTime.class); + + public final DateTimePath updatedDate = createDateTime("updatedDate", java.time.LocalDateTime.class); + + public QBaseEntity(String variable) { + super(BaseEntity.class, forVariable(variable)); + } + + public QBaseEntity(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QBaseEntity(PathMetadata metadata) { + super(BaseEntity.class, metadata); + } + +} + diff --git a/src/main/generated/com/example/api/domain/QBusiness.java b/src/main/generated/com/example/api/domain/QBusiness.java new file mode 100644 index 00000000..8cc945d1 --- /dev/null +++ b/src/main/generated/com/example/api/domain/QBusiness.java @@ -0,0 +1,71 @@ +package com.example.api.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QBusiness is a Querydsl query type for Business + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QBusiness extends EntityPathBase { + + private static final long serialVersionUID = 1647868037L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QBusiness business = new QBusiness("business"); + + public final QBaseEntity _super = new QBaseEntity(this); + + public final ListPath businessCategories = this.createList("businessCategories", BusinessCategory.class, QBusinessCategory.class, PathInits.DIRECT2); + + public final NumberPath businessId = createNumber("businessId", Long.class); + + public final StringPath businessName = createString("businessName"); + + //inherited + public final DateTimePath createdDate = _super.createdDate; + + public final QAccount employer; + + public final StringPath location = createString("location"); + + public final DatePath openDate = createDate("openDate", java.time.LocalDate.class); + + public final StringPath registrationNumber = createString("registrationNumber"); + + public final StringPath representationName = createString("representationName"); + + //inherited + public final DateTimePath updatedDate = _super.updatedDate; + + public QBusiness(String variable) { + this(Business.class, forVariable(variable), INITS); + } + + public QBusiness(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QBusiness(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QBusiness(PathMetadata metadata, PathInits inits) { + this(Business.class, metadata, inits); + } + + public QBusiness(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.employer = inits.isInitialized("employer") ? new QAccount(forProperty("employer")) : null; + } + +} + diff --git a/src/main/generated/com/example/api/domain/QBusinessCategory.java b/src/main/generated/com/example/api/domain/QBusinessCategory.java new file mode 100644 index 00000000..975e63bc --- /dev/null +++ b/src/main/generated/com/example/api/domain/QBusinessCategory.java @@ -0,0 +1,62 @@ +package com.example.api.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QBusinessCategory is a Querydsl query type for BusinessCategory + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QBusinessCategory extends EntityPathBase { + + private static final long serialVersionUID = -861191005L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QBusinessCategory businessCategory = new QBusinessCategory("businessCategory"); + + public final QBaseEntity _super = new QBaseEntity(this); + + public final QBusiness business; + + public final QCategory category; + + //inherited + public final DateTimePath createdDate = _super.createdDate; + + public final NumberPath id = createNumber("id", Long.class); + + //inherited + public final DateTimePath updatedDate = _super.updatedDate; + + public QBusinessCategory(String variable) { + this(BusinessCategory.class, forVariable(variable), INITS); + } + + public QBusinessCategory(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QBusinessCategory(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QBusinessCategory(PathMetadata metadata, PathInits inits) { + this(BusinessCategory.class, metadata, inits); + } + + public QBusinessCategory(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.business = inits.isInitialized("business") ? new QBusiness(forProperty("business"), inits.get("business")) : null; + this.category = inits.isInitialized("category") ? new QCategory(forProperty("category")) : null; + } + +} + diff --git a/src/main/generated/com/example/api/domain/QCategory.java b/src/main/generated/com/example/api/domain/QCategory.java new file mode 100644 index 00000000..5065ce4c --- /dev/null +++ b/src/main/generated/com/example/api/domain/QCategory.java @@ -0,0 +1,47 @@ +package com.example.api.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QCategory is a Querydsl query type for Category + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QCategory extends EntityPathBase { + + private static final long serialVersionUID = -1449757245L; + + public static final QCategory category = new QCategory("category"); + + public final QBaseEntity _super = new QBaseEntity(this); + + public final NumberPath categoryId = createNumber("categoryId", Long.class); + + public final StringPath categoryName = createString("categoryName"); + + //inherited + public final DateTimePath createdDate = _super.createdDate; + + //inherited + public final DateTimePath updatedDate = _super.updatedDate; + + public QCategory(String variable) { + super(Category.class, forVariable(variable)); + } + + public QCategory(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QCategory(PathMetadata metadata) { + super(Category.class, metadata); + } + +} + diff --git a/src/main/generated/com/example/api/domain/QChatRoom.java b/src/main/generated/com/example/api/domain/QChatRoom.java new file mode 100644 index 00000000..b8542ca3 --- /dev/null +++ b/src/main/generated/com/example/api/domain/QChatRoom.java @@ -0,0 +1,53 @@ +package com.example.api.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QChatRoom is a Querydsl query type for ChatRoom + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QChatRoom extends EntityPathBase { + + private static final long serialVersionUID = -62925544L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QChatRoom chatRoom = new QChatRoom("chatRoom"); + + public final NumberPath chatRoomId = createNumber("chatRoomId", Long.class); + + public final QOfferEmployment offerEmployment; + + public final DateTimePath suggestGeneratedDate = createDateTime("suggestGeneratedDate", java.time.LocalDateTime.class); + + public QChatRoom(String variable) { + this(ChatRoom.class, forVariable(variable), INITS); + } + + public QChatRoom(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QChatRoom(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QChatRoom(PathMetadata metadata, PathInits inits) { + this(ChatRoom.class, metadata, inits); + } + + public QChatRoom(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.offerEmployment = inits.isInitialized("offerEmployment") ? new QOfferEmployment(forProperty("offerEmployment"), inits.get("offerEmployment")) : null; + } + +} + diff --git a/src/main/generated/com/example/api/domain/QContract.java b/src/main/generated/com/example/api/domain/QContract.java new file mode 100644 index 00000000..59932355 --- /dev/null +++ b/src/main/generated/com/example/api/domain/QContract.java @@ -0,0 +1,67 @@ +package com.example.api.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QContract is a Querydsl query type for Contract + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QContract extends EntityPathBase { + + private static final long serialVersionUID = -2067215913L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QContract contract = new QContract("contract"); + + public final QBaseEntity _super = new QBaseEntity(this); + + public final DateTimePath contractEndTime = createDateTime("contractEndTime", java.time.LocalDateTime.class); + + public final NumberPath contractHourlyPay = createNumber("contractHourlyPay", Integer.class); + + public final NumberPath contractId = createNumber("contractId", Long.class); + + public final DateTimePath contractStartTime = createDateTime("contractStartTime", java.time.LocalDateTime.class); + + public final BooleanPath contractSucceeded = createBoolean("contractSucceeded"); + + //inherited + public final DateTimePath createdDate = _super.createdDate; + + public final QOfferEmployment offerEmployment; + + //inherited + public final DateTimePath updatedDate = _super.updatedDate; + + public QContract(String variable) { + this(Contract.class, forVariable(variable), INITS); + } + + public QContract(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QContract(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QContract(PathMetadata metadata, PathInits inits) { + this(Contract.class, metadata, inits); + } + + public QContract(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.offerEmployment = inits.isInitialized("offerEmployment") ? new QOfferEmployment(forProperty("offerEmployment"), inits.get("offerEmployment")) : null; + } + +} + diff --git a/src/main/generated/com/example/api/domain/QExternalCareer.java b/src/main/generated/com/example/api/domain/QExternalCareer.java new file mode 100644 index 00000000..0c112002 --- /dev/null +++ b/src/main/generated/com/example/api/domain/QExternalCareer.java @@ -0,0 +1,63 @@ +package com.example.api.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QExternalCareer is a Querydsl query type for ExternalCareer + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QExternalCareer extends EntityPathBase { + + private static final long serialVersionUID = 606757934L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QExternalCareer externalCareer = new QExternalCareer("externalCareer"); + + public final QBaseEntity _super = new QBaseEntity(this); + + //inherited + public final DateTimePath createdDate = _super.createdDate; + + public final QAccount employee; + + public final NumberPath id = createNumber("id", Long.class); + + public final StringPath Name = createString("Name"); + + public final StringPath period = createString("period"); + + //inherited + public final DateTimePath updatedDate = _super.updatedDate; + + public QExternalCareer(String variable) { + this(ExternalCareer.class, forVariable(variable), INITS); + } + + public QExternalCareer(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QExternalCareer(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QExternalCareer(PathMetadata metadata, PathInits inits) { + this(ExternalCareer.class, metadata, inits); + } + + public QExternalCareer(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.employee = inits.isInitialized("employee") ? new QAccount(forProperty("employee")) : null; + } + +} + diff --git a/src/main/generated/com/example/api/domain/QFlavored.java b/src/main/generated/com/example/api/domain/QFlavored.java new file mode 100644 index 00000000..5c0a13db --- /dev/null +++ b/src/main/generated/com/example/api/domain/QFlavored.java @@ -0,0 +1,62 @@ +package com.example.api.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QFlavored is a Querydsl query type for Flavored + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QFlavored extends EntityPathBase { + + private static final long serialVersionUID = 128299138L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QFlavored flavored = new QFlavored("flavored"); + + public final QBaseEntity _super = new QBaseEntity(this); + + public final QCategory category; + + //inherited + public final DateTimePath createdDate = _super.createdDate; + + public final QAccount employee; + + public final NumberPath flavoredId = createNumber("flavoredId", Long.class); + + //inherited + public final DateTimePath updatedDate = _super.updatedDate; + + public QFlavored(String variable) { + this(Flavored.class, forVariable(variable), INITS); + } + + public QFlavored(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QFlavored(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QFlavored(PathMetadata metadata, PathInits inits) { + this(Flavored.class, metadata, inits); + } + + public QFlavored(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.category = inits.isInitialized("category") ? new QCategory(forProperty("category")) : null; + this.employee = inits.isInitialized("employee") ? new QAccount(forProperty("employee")) : null; + } + +} + diff --git a/src/main/generated/com/example/api/domain/QInquiry.java b/src/main/generated/com/example/api/domain/QInquiry.java new file mode 100644 index 00000000..b1d0cfbb --- /dev/null +++ b/src/main/generated/com/example/api/domain/QInquiry.java @@ -0,0 +1,71 @@ +package com.example.api.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QInquiry is a Querydsl query type for Inquiry + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QInquiry extends EntityPathBase { + + private static final long serialVersionUID = 2045912162L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QInquiry inquiry = new QInquiry("inquiry"); + + public final QBaseEntity _super = new QBaseEntity(this); + + public final DateTimePath answerDate = createDateTime("answerDate", java.time.LocalDateTime.class); + + public final StringPath content = createString("content"); + + public final QAccount createdBy; + + //inherited + public final DateTimePath createdDate = _super.createdDate; + + public final NumberPath inquiryId = createNumber("inquiryId", Long.class); + + public final EnumPath inquiryStatus = createEnum("inquiryStatus", Inquiry.InquiryStatus.class); + + public final StringPath inquiryType = createString("inquiryType"); + + public final StringPath subInquiryType = createString("subInquiryType"); + + public final StringPath title = createString("title"); + + //inherited + public final DateTimePath updatedDate = _super.updatedDate; + + public QInquiry(String variable) { + this(Inquiry.class, forVariable(variable), INITS); + } + + public QInquiry(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QInquiry(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QInquiry(PathMetadata metadata, PathInits inits) { + this(Inquiry.class, metadata, inits); + } + + public QInquiry(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.createdBy = inits.isInitialized("createdBy") ? new QAccount(forProperty("createdBy")) : null; + } + +} + diff --git a/src/main/generated/com/example/api/domain/QOfferEmployment.java b/src/main/generated/com/example/api/domain/QOfferEmployment.java new file mode 100644 index 00000000..a6634fba --- /dev/null +++ b/src/main/generated/com/example/api/domain/QOfferEmployment.java @@ -0,0 +1,69 @@ +package com.example.api.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QOfferEmployment is a Querydsl query type for OfferEmployment + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QOfferEmployment extends EntityPathBase { + + private static final long serialVersionUID = -82696445L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QOfferEmployment offerEmployment = new QOfferEmployment("offerEmployment"); + + public final QBusiness business; + + public final QContract contract; + + public final QAccount employee; + + public final DateTimePath suggestEndTime = createDateTime("suggestEndTime", java.time.LocalDateTime.class); + + public final NumberPath suggestHourlyPay = createNumber("suggestHourlyPay", Integer.class); + + public final NumberPath suggestId = createNumber("suggestId", Long.class); + + public final BooleanPath suggestReaded = createBoolean("suggestReaded"); + + public final DateTimePath suggestRegisterTime = createDateTime("suggestRegisterTime", java.time.LocalDateTime.class); + + public final DateTimePath suggestStartTime = createDateTime("suggestStartTime", java.time.LocalDateTime.class); + + public final BooleanPath suggestSucceeded = createBoolean("suggestSucceeded"); + + public QOfferEmployment(String variable) { + this(OfferEmployment.class, forVariable(variable), INITS); + } + + public QOfferEmployment(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QOfferEmployment(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QOfferEmployment(PathMetadata metadata, PathInits inits) { + this(OfferEmployment.class, metadata, inits); + } + + public QOfferEmployment(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.business = inits.isInitialized("business") ? new QBusiness(forProperty("business"), inits.get("business")) : null; + this.contract = inits.isInitialized("contract") ? new QContract(forProperty("contract"), inits.get("contract")) : null; + this.employee = inits.isInitialized("employee") ? new QAccount(forProperty("employee")) : null; + } + +} + diff --git a/src/main/generated/com/example/api/domain/QPossibleBoard.java b/src/main/generated/com/example/api/domain/QPossibleBoard.java new file mode 100644 index 00000000..23743abc --- /dev/null +++ b/src/main/generated/com/example/api/domain/QPossibleBoard.java @@ -0,0 +1,63 @@ +package com.example.api.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QPossibleBoard is a Querydsl query type for PossibleBoard + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QPossibleBoard extends EntityPathBase { + + private static final long serialVersionUID = -1378693552L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QPossibleBoard possibleBoard = new QPossibleBoard("possibleBoard"); + + public final QBaseEntity _super = new QBaseEntity(this); + + //inherited + public final DateTimePath createdDate = _super.createdDate; + + public final QAccount employee; + + public final DateTimePath endTime = createDateTime("endTime", java.time.LocalDateTime.class); + + public final NumberPath possibleId = createNumber("possibleId", Long.class); + + public final DateTimePath startTime = createDateTime("startTime", java.time.LocalDateTime.class); + + //inherited + public final DateTimePath updatedDate = _super.updatedDate; + + public QPossibleBoard(String variable) { + this(PossibleBoard.class, forVariable(variable), INITS); + } + + public QPossibleBoard(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QPossibleBoard(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QPossibleBoard(PathMetadata metadata, PathInits inits) { + this(PossibleBoard.class, metadata, inits); + } + + public QPossibleBoard(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.employee = inits.isInitialized("employee") ? new QAccount(forProperty("employee")) : null; + } + +} + diff --git a/src/main/generated/com/example/api/domain/QReview.java b/src/main/generated/com/example/api/domain/QReview.java index b13b584a..a3f7677d 100644 --- a/src/main/generated/com/example/api/domain/QReview.java +++ b/src/main/generated/com/example/api/domain/QReview.java @@ -3,11 +3,13 @@ import static com.querydsl.core.types.PathMetadataFactory.*; import com.querydsl.core.types.dsl.*; + import com.querydsl.core.types.PathMetadata; import javax.annotation.processing.Generated; import com.querydsl.core.types.Path; import com.querydsl.core.types.dsl.PathInits; + /** * QReview is a Querydsl query type for Review */ @@ -22,6 +24,8 @@ public class QReview extends EntityPathBase { public final QBaseEntity _super = new QBaseEntity(this); + public final QContract contract; + //inherited public final DateTimePath createdDate = _super.createdDate; @@ -54,6 +58,9 @@ public QReview(PathMetadata metadata, PathInits inits) { public QReview(Class type, PathMetadata metadata, PathInits inits) { super(type, metadata, inits); + this.contract = inits.isInitialized("contract") ? new QContract(forProperty("contract"), inits.get("contract")) : null; this.offerEmployment = inits.isInitialized("offerEmployment") ? new QOfferEmployment(forProperty("offerEmployment"), inits.get("offerEmployment")) : null; } -} \ No newline at end of file + +} + diff --git a/src/main/generated/com/example/api/domain/QScrap.java b/src/main/generated/com/example/api/domain/QScrap.java new file mode 100644 index 00000000..6caf4631 --- /dev/null +++ b/src/main/generated/com/example/api/domain/QScrap.java @@ -0,0 +1,62 @@ +package com.example.api.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QScrap is a Querydsl query type for Scrap + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QScrap extends EntityPathBase { + + private static final long serialVersionUID = -391197396L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QScrap scrap = new QScrap("scrap"); + + public final QBaseEntity _super = new QBaseEntity(this); + + //inherited + public final DateTimePath createdDate = _super.createdDate; + + public final QAccount employee; + + public final QAccount employer; + + public final NumberPath scrapId = createNumber("scrapId", Long.class); + + //inherited + public final DateTimePath updatedDate = _super.updatedDate; + + public QScrap(String variable) { + this(Scrap.class, forVariable(variable), INITS); + } + + public QScrap(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QScrap(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QScrap(PathMetadata metadata, PathInits inits) { + this(Scrap.class, metadata, inits); + } + + public QScrap(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.employee = inits.isInitialized("employee") ? new QAccount(forProperty("employee")) : null; + this.employer = inits.isInitialized("employer") ? new QAccount(forProperty("employer")) : null; + } + +} + diff --git a/src/main/java/com/example/api/account/service/AccountService.java b/src/main/java/com/example/api/account/service/AccountService.java index c2810c56..b16b8cc5 100644 --- a/src/main/java/com/example/api/account/service/AccountService.java +++ b/src/main/java/com/example/api/account/service/AccountService.java @@ -76,7 +76,7 @@ public Account loadAccount(final Long requestMemberId) { .orElseThrow(() -> new BusinessException(ErrorCode.ACCOUNT_NOT_FOUND_EXCEPTION)); } - @org.springframework.transaction.annotation.Transactional + @Transactional public void deleteAccount(final Long requestMemberId) { final Account account = accountRepository.findById(requestMemberId) .orElseThrow(() -> new BusinessException(ErrorCode.ACCOUNT_NOT_FOUND_EXCEPTION)); diff --git a/src/main/java/com/example/api/auth/controller/AuthController.java b/src/main/java/com/example/api/auth/controller/AuthController.java index 6e77fc74..f130a770 100644 --- a/src/main/java/com/example/api/auth/controller/AuthController.java +++ b/src/main/java/com/example/api/auth/controller/AuthController.java @@ -1,17 +1,15 @@ package com.example.api.auth.controller; -import com.example.api.auth.dto.AuthTokenRequest; import com.example.api.auth.dto.LoginRequest; +import com.example.api.auth.dto.LoginSuccessResponse; import com.example.api.auth.dto.LoginUserRequest; import com.example.api.auth.dto.RefreshTokenRequest; import com.example.api.auth.service.AuthService; -import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.core.annotation.AuthenticationPrincipal; -import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.web.bind.annotation.*; @RestController diff --git a/src/main/java/com/example/api/auth/dto/AuthTokenRequest.java b/src/main/java/com/example/api/auth/dto/AuthTokenRequest.java index e69de29b..48ca4b32 100644 --- a/src/main/java/com/example/api/auth/dto/AuthTokenRequest.java +++ b/src/main/java/com/example/api/auth/dto/AuthTokenRequest.java @@ -0,0 +1,7 @@ +package com.example.api.auth.dto; + +public record AuthTokenRequest( + String accessToken, + String refreshToken +) { +} \ No newline at end of file diff --git a/src/main/java/com/example/api/board/service/BoardService.java b/src/main/java/com/example/api/board/service/BoardService.java index 682966e0..54c1b5eb 100644 --- a/src/main/java/com/example/api/board/service/BoardService.java +++ b/src/main/java/com/example/api/board/service/BoardService.java @@ -1,8 +1,5 @@ package com.example.api.board.service; -import com.example.api.board.controller.domain.request.EmployeeIdRequest; -import com.example.api.board.controller.domain.response.MyInfoDTO; -import com.example.api.domain.repository.*; import com.example.api.board.dto.request.EmployeeIdRequest; import com.example.api.board.dto.response.MyInfoDTO; import com.example.api.domain.repository.ExternalCareerRepository; diff --git a/src/main/java/com/example/api/contracts/ReviewQueryService.java b/src/main/java/com/example/api/contracts/ReviewQueryService.java index af57f159..18721029 100644 --- a/src/main/java/com/example/api/contracts/ReviewQueryService.java +++ b/src/main/java/com/example/api/contracts/ReviewQueryService.java @@ -19,7 +19,7 @@ public List loadReviewsWithEmployerId(final QueryEmployersReview final List reviews = reviewRepository.loadReviewsByEmployerId(command.employerId()); return reviews.stream() .map(review -> new ReviewResponse( - review.getSuggestId(), + review.getReviewId(), review.getContract().getContractId(), review.getReviewContent(), review.getReviewStarPoint())) diff --git a/src/main/java/com/example/api/domain/Account.java b/src/main/java/com/example/api/domain/Account.java index 4be7ae7f..2bd87a09 100644 --- a/src/main/java/com/example/api/domain/Account.java +++ b/src/main/java/com/example/api/domain/Account.java @@ -99,4 +99,8 @@ public void updateUserInfo(UpdateUserInfoRequest request){ this.email = request.email(); this.nickname = request.nickname(); } + + public void setDeleted(boolean deleted){ + this.deleted = deleted; + } } \ No newline at end of file diff --git a/src/main/java/com/example/api/domain/Business.java b/src/main/java/com/example/api/domain/Business.java index 17054b86..c6165acf 100644 --- a/src/main/java/com/example/api/domain/Business.java +++ b/src/main/java/com/example/api/domain/Business.java @@ -56,4 +56,8 @@ public Business(String businessName, String location, String representationName) this.location = location; this.representationName = representationName; } + + public void setRepresentationName(String representationName) { + this.representationName = representationName; + } } diff --git a/src/main/java/com/example/api/oauth2/entity/handler/OAuth2AuthenticationSuccessHandler.java b/src/main/java/com/example/api/oauth2/entity/handler/OAuth2AuthenticationSuccessHandler.java index a5fdef92..21dcd530 100644 --- a/src/main/java/com/example/api/oauth2/entity/handler/OAuth2AuthenticationSuccessHandler.java +++ b/src/main/java/com/example/api/oauth2/entity/handler/OAuth2AuthenticationSuccessHandler.java @@ -60,11 +60,11 @@ public void onAuthenticationSuccess(final HttpServletRequest request, final Http } private void setResponse(final HttpServletRequest request, final HttpServletResponse response, final UserDetailRequest userDetailRequest) { - AuthTokenRequest authToken = generateAndSaveAuthToken(userDetailRequest); + AuthTokenRequest authTokenRequest = generateAndSaveAuthToken(userDetailRequest); clearAuthenticationAttributes(request, response); - Cookie accessTokenCookie = generateAccessCookie(authToken.accessToken()); - Cookie refreshTokenCookie = generateRefreshCookie(authToken.refreshToken()); + Cookie accessTokenCookie = generateAccessCookie(authTokenRequest.accessToken()); + Cookie refreshTokenCookie = generateRefreshCookie(authTokenRequest.refreshToken()); response.addCookie(accessTokenCookie); response.addCookie(refreshTokenCookie); } From 2cc8d0e5a93750e2bb6094af154abbcc68024fd9 Mon Sep 17 00:00:00 2001 From: huhdy32 Date: Wed, 13 Nov 2024 13:23:27 +0900 Subject: [PATCH 232/276] =?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 cb6b042ed5b29ef288a98f530c91ab8bc430f681 Mon Sep 17 00:00:00 2001 From: huhdy32 Date: Wed, 13 Nov 2024 14:43:14 +0900 Subject: [PATCH 233/276] =?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 5c0ca16c4d26139cc89cc479be248fdbdd544945 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Mon, 18 Nov 2024 15:07:39 +0900 Subject: [PATCH 234/276] =?UTF-8?q?#20=20=EB=8D=B0=EC=9D=B4=ED=84=B0?= =?UTF-8?q?=EB=B2=A0=EC=9D=B4=EC=8A=A4=20=EC=86=8D=EC=84=B1=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=EC=9D=84=20employee,=20employer=EC=97=90=20=EB=A7=9E?= =?UTF-8?q?=EA=B2=8C=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 3b09c5562f88d431c701c72c66bae87310d20573 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Thu, 23 Jan 2025 14:08:45 +0900 Subject: [PATCH 235/276] =?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 db929f85dc4f2b4d9dd69dd82ab2d5f51cd415a8 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Fri, 24 Jan 2025 16:48:10 +0900 Subject: [PATCH 236/276] =?UTF-8?q?#94=20docker-compose=20application=20im?= =?UTF-8?q?age=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 5dbedd22ec6d9ee93b97ae85547848c4c38805b7 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Sun, 26 Jan 2025 10:27:09 +0900 Subject: [PATCH 237/276] 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 e42daf12961991975cdd6724d5b6ff5b7bfadaaf Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Sun, 26 Jan 2025 10:51:21 +0900 Subject: [PATCH 238/276] 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 From 7e0f70792cd0c3342507bed25e2fccaf7de851ae Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Fri, 31 Jan 2025 17:32:48 +0900 Subject: [PATCH 239/276] Revert "rebase develop" This reverts commit e42daf12961991975cdd6724d5b6ff5b7bfadaaf. --- .../api/contracts/ContractService.java | 2 ++ .../controller/ContractController.java | 25 +++++++++++++++++-- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/example/api/contracts/ContractService.java b/src/main/java/com/example/api/contracts/ContractService.java index a24688bf..2f80f4e3 100644 --- a/src/main/java/com/example/api/contracts/ContractService.java +++ b/src/main/java/com/example/api/contracts/ContractService.java @@ -23,6 +23,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 a2c97e89..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,13 +1,23 @@ package com.example.api.contracts.controller; import com.example.api.contracts.ContractService; -import com.example.api.contracts.dto.*; - +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.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 @@ -52,6 +62,7 @@ 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( @@ -61,6 +72,16 @@ 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 From 0a2f2cf7d0bf76706258100768d250e6852e4142 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Wed, 29 Jan 2025 17:39:43 +0900 Subject: [PATCH 240/276] =?UTF-8?q?#103=20=EC=9D=B4=EB=A0=A5=EC=84=9C=20ap?= =?UTF-8?q?i=206=EA=B0=9C=EB=A1=9C=20=EB=B6=84=EB=A6=AC=20=EB=B0=8F=20?= =?UTF-8?q?=EA=B7=B8=EC=97=90=20=EB=94=B0=EB=A5=B8=20crud=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1,=20=EB=8F=84=EB=A9=94=EC=9D=B8=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/QBusinessLocation.java} | 20 +- .../com/example/api/domain/QBusiness.java | 4 +- .../example/api/domain/QBusinessCategory.java | 2 +- .../com/example/api/domain/QCategory.java | 20 +- .../com/example/api/domain/QCityDistrict.java | 47 +++++ .../example/api/domain/QExternalCareer.java | 9 +- ...{QFlavored.java => QFlavoredCategory.java} | 26 +-- .../example/api/domain/QFlavoredDistrict.java | 62 ++++++ .../account/dto/SignUpEmployerRequest.java | 4 +- .../api/account/entity/CodeGenerator.java | 4 +- .../example/api/account/entity/Location.java | 46 ----- .../api/account/entity/MailSender.java | 4 +- .../example/api/account/entity/UserRole.java | 4 +- .../account/repository/AccountRepository.java | 5 +- .../repository/LocationRepository.java | 4 +- .../api/account/service/AccountService.java | 8 +- .../api/auth/controller/AuthController.java | 24 ++- .../api/auth/dto/LoginSuccessResponse.java | 10 +- .../auth/entitiy/CustomUserDetailService.java | 4 +- .../entitiy/JwtAuthenticationProvider.java | 4 +- .../example/api/auth/service/AuthService.java | 32 +++- .../api/auth/service/JwtTokenProvider.java | 4 +- .../example/api/aws/service/S3Service.java | 4 +- .../api/board/controller/BoardController.java | 118 +++++++++--- .../dto/request}/AddPossibleTimeCommand.java | 2 +- .../dto/request}/AddPossibleTimeRequest.java | 4 +- .../dto/request}/FlavoredCategory.java | 2 +- .../request}/QueryPossibleDetailsCommand.java | 2 +- .../request/QueryPossibleEmployerRequest.java | 11 -- .../example/api/board/dto/response/Board.java | 17 -- .../api/board/dto/response/CategoryDTO.java | 13 -- .../board/dto/response/ExternalCareerDTO.java | 15 -- .../dto/response/ExternalCareerResponse.java | 10 + .../response/FlavoredCategoryResponse.java | 7 + .../response/FlavoredDistrictResponse.java | 7 + .../board/dto/response/InnerCareerDTO.java | 29 --- .../dto/response}/InternalCareerResponse.java | 4 +- .../api/board/dto/response/MyInfoDTO.java | 36 ---- .../dto/response/PersonalInfoResponse.java | 27 +++ .../board/dto/response/PossibleBoardDTO.java | 19 -- .../response}/PossibleDetailsResponse.java | 6 +- .../response/PossibleEmployeeResponse.java | 13 -- .../board/dto/response/WorkHourResponse.java | 14 ++ .../update/UpdateExternalCareerRequest.java | 12 ++ ...st.java => UpdatePersonalInfoRequest.java} | 2 +- .../UpdatePreferredCategoriesRequest.java | 8 + .../UpdatePreferredDistrictsRequest.java | 8 + .../entitiy}/PossibleMapper.java | 32 ++-- .../entitiy}/PossibleTime.java | 8 +- .../entitiy/update/UpdateUserInfoHandler.java | 6 +- .../repository/PossibleBoardRepository.java | 28 +++ .../api/board/service/BoardService.java | 178 ++++++++++++++++-- .../api/board/service/CategoryService.java | 6 +- .../api/board/service/EmployeeService.java | 127 +++---------- .../api/business/BusinessQueryService.java | 4 +- .../api/business/BusinessRepository.java | 2 +- .../controller/BusinessController.java | 6 +- .../api/business/domain/BusinessLocation.java | 47 ++++- .../api/business/domain/BusinessName.java | 4 +- .../api/business/dto/AddBusinessCommand.java | 4 +- .../business/dto/BusinessDetailsResponse.java | 4 +- .../business/dto/ModifyBusinessCommand.java | 4 +- .../UpdateBusinessCategoriesHandlerImpl.java | 4 +- .../update/UpdateBusinessLocationHandler.java | 7 +- .../example/api/contracts/ContractMapper.java | 2 +- .../api/contracts/ContractRepository.java | 4 +- .../api/contracts/ContractReviewService.java | 6 +- .../api/contracts/ContractService.java | 31 --- .../api/contracts/ReviewQueryService.java | 2 +- .../controller/ContractController.java | 35 +--- .../api/contracts/dto/BusinessInfoDTO.java | 4 +- .../java/com/example/api/domain/Account.java | 4 +- .../java/com/example/api/domain/Business.java | 14 +- .../java/com/example/api/domain/Category.java | 16 +- .../com/example/api/domain/CityDistrict.java | 21 +++ .../example/api/domain/ExternalCareer.java | 25 ++- .../{Flavored.java => FlavoredCategory.java} | 22 +-- .../example/api/domain/FlavoredDistrict.java | 33 ++++ .../domain/repository/EmployeeRepository.java | 13 -- .../repository/ExternalCareerRepository.java | 8 +- .../FlavoredCategoryRepository.java | 34 ++++ .../FlavoredDistrictRepository.java | 32 ++++ .../domain/repository/FlavoredRepository.java | 19 -- .../domain/repository/MyInfoRepository.java | 6 +- .../repository/OfferEmploymentRepository.java | 8 +- .../controller/EmployerController.java | 17 +- .../dto/EmployerBusinessesRequest.java | 4 +- .../controller/dto/EmployerIdRequest.java | 4 + .../controller/dto/LikeEmployeeDTO.java | 8 +- .../api/employer/service/EmployerService.java | 24 +-- .../filter/JwtAuthenticationFilter.java | 4 +- .../exception/ApiExceptionHandler.java | 2 +- .../exception/BusinessException.java | 2 +- .../api/{ => global}/exception/ErrorCode.java | 2 +- .../exception/ExceptionResponseBody.java | 2 +- .../global/response/CustomResponseDto.java | 4 + .../api/global/response/SuccessResponse.java | 19 ++ .../response/success/AccountSuccess.java | 37 ++++ .../success/AnnouncementSuccessCode.java | 37 ++++ .../global/response/success/AuthSuccess.java | 34 ++++ .../global/response/success/BoardSuccess.java | 34 ++++ .../response/success/BusinessSuccess.java | 34 ++++ .../global/response/success/ChatSuccess.java | 35 ++++ .../success/ContractReviewSuccess.java | 33 ++++ .../response/success/ContractSuccess.java | 38 ++++ .../response/success/EmployerSuccess.java | 33 ++++ .../response/success/InquirySuccess.java | 33 ++++ .../success/OfferEmploymentSuccess.java | 33 ++++ .../success/PossibleBoardSuccess.java | 33 ++++ .../global/response/success/ReviewReport.java | 32 ++++ .../response/success/ReviewSuccess.java | 36 ++++ .../global/response/success/S3Success.java | 32 ++++ .../response/success/SearchSuccess.java | 32 ++++ .../global/response/success/SuccessCode.java | 9 + .../response/success/SuggestSuccess.java | 32 ++++ .../OAuth2AuthenticationSuccessHandler.java | 71 +++---- .../OfferEmploymentService.java | 2 +- .../PossibleBoardRepository.java | 41 ---- .../possbileboard/PossibleBoardService.java | 57 ------ .../controller/PossibleBoardController.java | 39 ---- .../dto/ExternalCareerResponse.java | 8 - .../possbileboard/dto/PossibleDetails.java | 16 -- .../review/controller/ReviewController.java | 13 +- .../dto/ReviewAvailableCommand.java | 5 +- .../dto/ReviewAvailableResponse.java | 5 +- .../example/api/review/dto/ReviewCommand.java | 3 +- .../{ => repository}/ReviewRepository.java | 9 +- .../review/{ => service}/ReviewService.java | 14 +- .../ReviewAvailableService.java | 22 --- .../controller/ReviewAvailableController.java | 30 --- .../example/api/search/SearchRepository.java | 10 +- .../suggest/controller/SuggestController.java | 33 +++- .../api/suggest/service/SuggestService.java | 44 +++++ src/main/resources/application.properties | 2 +- .../account/service/AccountServiceTest.java | 2 +- .../employer/service/EmployerServiceTest.java | 12 +- .../OfferEmploymentServiceTest.java | 4 +- .../service/ContractReviewServiceTest.java | 1 - 138 files changed, 1696 insertions(+), 973 deletions(-) rename src/main/generated/com/example/api/{account/entity/QLocation.java => business/domain/QBusinessLocation.java} (60%) create mode 100644 src/main/generated/com/example/api/domain/QCityDistrict.java rename src/main/generated/com/example/api/domain/{QFlavored.java => QFlavoredCategory.java} (56%) create mode 100644 src/main/generated/com/example/api/domain/QFlavoredDistrict.java delete mode 100644 src/main/java/com/example/api/account/entity/Location.java rename src/main/java/com/example/api/{possbileboard/dto => board/dto/request}/AddPossibleTimeCommand.java (87%) rename src/main/java/com/example/api/{possbileboard/dto => board/dto/request}/AddPossibleTimeRequest.java (87%) rename src/main/java/com/example/api/{possbileboard/dto => board/dto/request}/FlavoredCategory.java (68%) rename src/main/java/com/example/api/{possbileboard/dto => board/dto/request}/QueryPossibleDetailsCommand.java (63%) delete mode 100644 src/main/java/com/example/api/board/dto/request/QueryPossibleEmployerRequest.java delete mode 100644 src/main/java/com/example/api/board/dto/response/Board.java delete mode 100644 src/main/java/com/example/api/board/dto/response/CategoryDTO.java delete mode 100644 src/main/java/com/example/api/board/dto/response/ExternalCareerDTO.java create mode 100644 src/main/java/com/example/api/board/dto/response/ExternalCareerResponse.java create mode 100644 src/main/java/com/example/api/board/dto/response/FlavoredCategoryResponse.java create mode 100644 src/main/java/com/example/api/board/dto/response/FlavoredDistrictResponse.java delete mode 100644 src/main/java/com/example/api/board/dto/response/InnerCareerDTO.java rename src/main/java/com/example/api/{possbileboard/dto => board/dto/response}/InternalCareerResponse.java (69%) delete mode 100644 src/main/java/com/example/api/board/dto/response/MyInfoDTO.java create mode 100644 src/main/java/com/example/api/board/dto/response/PersonalInfoResponse.java delete mode 100644 src/main/java/com/example/api/board/dto/response/PossibleBoardDTO.java rename src/main/java/com/example/api/{possbileboard/dto => board/dto/response}/PossibleDetailsResponse.java (83%) delete mode 100644 src/main/java/com/example/api/board/dto/response/PossibleEmployeeResponse.java create mode 100644 src/main/java/com/example/api/board/dto/response/WorkHourResponse.java create mode 100644 src/main/java/com/example/api/board/dto/update/UpdateExternalCareerRequest.java rename src/main/java/com/example/api/board/dto/update/{UpdateUserInfoRequest.java => UpdatePersonalInfoRequest.java} (84%) create mode 100644 src/main/java/com/example/api/board/dto/update/UpdatePreferredCategoriesRequest.java create mode 100644 src/main/java/com/example/api/board/dto/update/UpdatePreferredDistrictsRequest.java rename src/main/java/com/example/api/{possbileboard => board/entitiy}/PossibleMapper.java (57%) rename src/main/java/com/example/api/{possbileboard => board/entitiy}/PossibleTime.java (83%) create mode 100644 src/main/java/com/example/api/board/repository/PossibleBoardRepository.java create mode 100644 src/main/java/com/example/api/domain/CityDistrict.java rename src/main/java/com/example/api/domain/{Flavored.java => FlavoredCategory.java} (51%) create mode 100644 src/main/java/com/example/api/domain/FlavoredDistrict.java delete mode 100644 src/main/java/com/example/api/domain/repository/EmployeeRepository.java create mode 100644 src/main/java/com/example/api/domain/repository/FlavoredCategoryRepository.java create mode 100644 src/main/java/com/example/api/domain/repository/FlavoredDistrictRepository.java delete mode 100644 src/main/java/com/example/api/domain/repository/FlavoredRepository.java create mode 100644 src/main/java/com/example/api/employer/controller/dto/EmployerIdRequest.java rename src/main/java/com/example/api/{ => global}/exception/ApiExceptionHandler.java (95%) rename src/main/java/com/example/api/{ => global}/exception/BusinessException.java (90%) rename src/main/java/com/example/api/{ => global}/exception/ErrorCode.java (98%) rename src/main/java/com/example/api/{ => global}/exception/ExceptionResponseBody.java (97%) create mode 100644 src/main/java/com/example/api/global/response/CustomResponseDto.java create mode 100644 src/main/java/com/example/api/global/response/SuccessResponse.java create mode 100644 src/main/java/com/example/api/global/response/success/AccountSuccess.java create mode 100644 src/main/java/com/example/api/global/response/success/AnnouncementSuccessCode.java create mode 100644 src/main/java/com/example/api/global/response/success/AuthSuccess.java create mode 100644 src/main/java/com/example/api/global/response/success/BoardSuccess.java create mode 100644 src/main/java/com/example/api/global/response/success/BusinessSuccess.java create mode 100644 src/main/java/com/example/api/global/response/success/ChatSuccess.java create mode 100644 src/main/java/com/example/api/global/response/success/ContractReviewSuccess.java create mode 100644 src/main/java/com/example/api/global/response/success/ContractSuccess.java create mode 100644 src/main/java/com/example/api/global/response/success/EmployerSuccess.java create mode 100644 src/main/java/com/example/api/global/response/success/InquirySuccess.java create mode 100644 src/main/java/com/example/api/global/response/success/OfferEmploymentSuccess.java create mode 100644 src/main/java/com/example/api/global/response/success/PossibleBoardSuccess.java create mode 100644 src/main/java/com/example/api/global/response/success/ReviewReport.java create mode 100644 src/main/java/com/example/api/global/response/success/ReviewSuccess.java create mode 100644 src/main/java/com/example/api/global/response/success/S3Success.java create mode 100644 src/main/java/com/example/api/global/response/success/SearchSuccess.java create mode 100644 src/main/java/com/example/api/global/response/success/SuccessCode.java create mode 100644 src/main/java/com/example/api/global/response/success/SuggestSuccess.java delete mode 100644 src/main/java/com/example/api/possbileboard/PossibleBoardRepository.java delete mode 100644 src/main/java/com/example/api/possbileboard/PossibleBoardService.java delete mode 100644 src/main/java/com/example/api/possbileboard/controller/PossibleBoardController.java delete mode 100644 src/main/java/com/example/api/possbileboard/dto/ExternalCareerResponse.java delete mode 100644 src/main/java/com/example/api/possbileboard/dto/PossibleDetails.java rename src/main/java/com/example/api/{reviewavailable => review}/dto/ReviewAvailableCommand.java (56%) rename src/main/java/com/example/api/{reviewavailable => review}/dto/ReviewAvailableResponse.java (65%) rename src/main/java/com/example/api/review/{ => repository}/ReviewRepository.java (90%) rename src/main/java/com/example/api/review/{ => service}/ReviewService.java (82%) delete mode 100644 src/main/java/com/example/api/reviewavailable/ReviewAvailableService.java delete mode 100644 src/main/java/com/example/api/reviewavailable/controller/ReviewAvailableController.java diff --git a/src/main/generated/com/example/api/account/entity/QLocation.java b/src/main/generated/com/example/api/business/domain/QBusinessLocation.java similarity index 60% rename from src/main/generated/com/example/api/account/entity/QLocation.java rename to src/main/generated/com/example/api/business/domain/QBusinessLocation.java index fde2527b..b8886256 100644 --- a/src/main/generated/com/example/api/account/entity/QLocation.java +++ b/src/main/generated/com/example/api/business/domain/QBusinessLocation.java @@ -1,4 +1,4 @@ -package com.example.api.account.entity; +package com.example.api.business.domain; import static com.querydsl.core.types.PathMetadataFactory.*; @@ -10,14 +10,14 @@ /** - * QLocation is a Querydsl query type for Location + * QBusinessLocation is a Querydsl query type for BusinessLocation */ @Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QLocation extends EntityPathBase { +public class QBusinessLocation extends EntityPathBase { - private static final long serialVersionUID = -590127238L; + private static final long serialVersionUID = 1235580438L; - public static final QLocation location = new QLocation("location"); + public static final QBusinessLocation businessLocation = new QBusinessLocation("businessLocation"); public final com.example.api.domain.QBaseEntity _super = new com.example.api.domain.QBaseEntity(this); @@ -35,16 +35,16 @@ public class QLocation extends EntityPathBase { public final StringPath zipcode = createString("zipcode"); - public QLocation(String variable) { - super(Location.class, forVariable(variable)); + public QBusinessLocation(String variable) { + super(BusinessLocation.class, forVariable(variable)); } - public QLocation(Path path) { + public QBusinessLocation(Path path) { super(path.getType(), path.getMetadata()); } - public QLocation(PathMetadata metadata) { - super(Location.class, metadata); + public QBusinessLocation(PathMetadata metadata) { + super(BusinessLocation.class, metadata); } } diff --git a/src/main/generated/com/example/api/domain/QBusiness.java b/src/main/generated/com/example/api/domain/QBusiness.java index e3b8979c..ab3b6da6 100644 --- a/src/main/generated/com/example/api/domain/QBusiness.java +++ b/src/main/generated/com/example/api/domain/QBusiness.java @@ -35,7 +35,7 @@ public class QBusiness extends EntityPathBase { public final QAccount employer; - public final com.example.api.account.entity.QLocation location; + public final com.example.api.business.domain.QBusinessLocation location; public final DatePath openDate = createDate("openDate", java.time.LocalDate.class); @@ -65,7 +65,7 @@ public QBusiness(PathMetadata metadata, PathInits inits) { public QBusiness(Class type, PathMetadata metadata, PathInits inits) { super(type, metadata, inits); this.employer = inits.isInitialized("employer") ? new QAccount(forProperty("employer")) : null; - this.location = inits.isInitialized("location") ? new com.example.api.account.entity.QLocation(forProperty("location")) : null; + this.location = inits.isInitialized("location") ? new com.example.api.business.domain.QBusinessLocation(forProperty("location")) : null; } } diff --git a/src/main/generated/com/example/api/domain/QBusinessCategory.java b/src/main/generated/com/example/api/domain/QBusinessCategory.java index 6654e604..975e63bc 100644 --- a/src/main/generated/com/example/api/domain/QBusinessCategory.java +++ b/src/main/generated/com/example/api/domain/QBusinessCategory.java @@ -55,7 +55,7 @@ public QBusinessCategory(PathMetadata metadata, PathInits inits) { public QBusinessCategory(Class type, PathMetadata metadata, PathInits inits) { super(type, metadata, inits); this.business = inits.isInitialized("business") ? new QBusiness(forProperty("business"), inits.get("business")) : null; - this.category = inits.isInitialized("category") ? new QCategory(forProperty("category"), inits.get("category")) : null; + this.category = inits.isInitialized("category") ? new QCategory(forProperty("category")) : null; } } diff --git a/src/main/generated/com/example/api/domain/QCategory.java b/src/main/generated/com/example/api/domain/QCategory.java index 0bf67e23..5065ce4c 100644 --- a/src/main/generated/com/example/api/domain/QCategory.java +++ b/src/main/generated/com/example/api/domain/QCategory.java @@ -7,7 +7,6 @@ import com.querydsl.core.types.PathMetadata; import javax.annotation.processing.Generated; import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; /** @@ -18,14 +17,10 @@ public class QCategory extends EntityPathBase { private static final long serialVersionUID = -1449757245L; - private static final PathInits INITS = PathInits.DIRECT2; - public static final QCategory category = new QCategory("category"); public final QBaseEntity _super = new QBaseEntity(this); - public final QAccount account; - public final NumberPath categoryId = createNumber("categoryId", Long.class); public final StringPath categoryName = createString("categoryName"); @@ -37,24 +32,15 @@ public class QCategory extends EntityPathBase { public final DateTimePath updatedDate = _super.updatedDate; public QCategory(String variable) { - this(Category.class, forVariable(variable), INITS); + super(Category.class, forVariable(variable)); } public QCategory(Path path) { - this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + super(path.getType(), path.getMetadata()); } public QCategory(PathMetadata metadata) { - this(metadata, PathInits.getFor(metadata, INITS)); - } - - public QCategory(PathMetadata metadata, PathInits inits) { - this(Category.class, metadata, inits); - } - - public QCategory(Class type, PathMetadata metadata, PathInits inits) { - super(type, metadata, inits); - this.account = inits.isInitialized("account") ? new QAccount(forProperty("account")) : null; + super(Category.class, metadata); } } diff --git a/src/main/generated/com/example/api/domain/QCityDistrict.java b/src/main/generated/com/example/api/domain/QCityDistrict.java new file mode 100644 index 00000000..ff7a1724 --- /dev/null +++ b/src/main/generated/com/example/api/domain/QCityDistrict.java @@ -0,0 +1,47 @@ +package com.example.api.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QCityDistrict is a Querydsl query type for CityDistrict + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QCityDistrict extends EntityPathBase { + + private static final long serialVersionUID = 922969182L; + + public static final QCityDistrict cityDistrict = new QCityDistrict("cityDistrict"); + + public final QBaseEntity _super = new QBaseEntity(this); + + //inherited + public final DateTimePath createdDate = _super.createdDate; + + public final StringPath district = createString("district"); + + public final NumberPath id = createNumber("id", Long.class); + + //inherited + public final DateTimePath updatedDate = _super.updatedDate; + + public QCityDistrict(String variable) { + super(CityDistrict.class, forVariable(variable)); + } + + public QCityDistrict(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QCityDistrict(PathMetadata metadata) { + super(CityDistrict.class, metadata); + } + +} + diff --git a/src/main/generated/com/example/api/domain/QExternalCareer.java b/src/main/generated/com/example/api/domain/QExternalCareer.java index 0c112002..56202e1f 100644 --- a/src/main/generated/com/example/api/domain/QExternalCareer.java +++ b/src/main/generated/com/example/api/domain/QExternalCareer.java @@ -24,6 +24,8 @@ public class QExternalCareer extends EntityPathBase { public final QBaseEntity _super = new QBaseEntity(this); + public final QCategory category; + //inherited public final DateTimePath createdDate = _super.createdDate; @@ -31,13 +33,11 @@ public class QExternalCareer extends EntityPathBase { public final NumberPath id = createNumber("id", Long.class); - public final StringPath Name = createString("Name"); - - public final StringPath period = createString("period"); - //inherited public final DateTimePath updatedDate = _super.updatedDate; + public final NumberPath workCount = createNumber("workCount", Integer.class); + public QExternalCareer(String variable) { this(ExternalCareer.class, forVariable(variable), INITS); } @@ -56,6 +56,7 @@ public QExternalCareer(PathMetadata metadata, PathInits inits) { public QExternalCareer(Class type, PathMetadata metadata, PathInits inits) { super(type, metadata, inits); + this.category = inits.isInitialized("category") ? new QCategory(forProperty("category")) : null; this.employee = inits.isInitialized("employee") ? new QAccount(forProperty("employee")) : null; } diff --git a/src/main/generated/com/example/api/domain/QFlavored.java b/src/main/generated/com/example/api/domain/QFlavoredCategory.java similarity index 56% rename from src/main/generated/com/example/api/domain/QFlavored.java rename to src/main/generated/com/example/api/domain/QFlavoredCategory.java index a29bd767..72e066cb 100644 --- a/src/main/generated/com/example/api/domain/QFlavored.java +++ b/src/main/generated/com/example/api/domain/QFlavoredCategory.java @@ -11,16 +11,16 @@ /** - * QFlavored is a Querydsl query type for Flavored + * QFlavoredCategory is a Querydsl query type for FlavoredCategory */ @Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QFlavored extends EntityPathBase { +public class QFlavoredCategory extends EntityPathBase { - private static final long serialVersionUID = 128299138L; + private static final long serialVersionUID = -258789472L; private static final PathInits INITS = PathInits.DIRECT2; - public static final QFlavored flavored = new QFlavored("flavored"); + public static final QFlavoredCategory flavoredCategory = new QFlavoredCategory("flavoredCategory"); public final QBaseEntity _super = new QBaseEntity(this); @@ -31,30 +31,30 @@ public class QFlavored extends EntityPathBase { public final QAccount employee; - public final NumberPath flavoredId = createNumber("flavoredId", Long.class); + public final NumberPath flavoredCategoryId = createNumber("flavoredCategoryId", Long.class); //inherited public final DateTimePath updatedDate = _super.updatedDate; - public QFlavored(String variable) { - this(Flavored.class, forVariable(variable), INITS); + public QFlavoredCategory(String variable) { + this(FlavoredCategory.class, forVariable(variable), INITS); } - public QFlavored(Path path) { + public QFlavoredCategory(Path path) { this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); } - public QFlavored(PathMetadata metadata) { + public QFlavoredCategory(PathMetadata metadata) { this(metadata, PathInits.getFor(metadata, INITS)); } - public QFlavored(PathMetadata metadata, PathInits inits) { - this(Flavored.class, metadata, inits); + public QFlavoredCategory(PathMetadata metadata, PathInits inits) { + this(FlavoredCategory.class, metadata, inits); } - public QFlavored(Class type, PathMetadata metadata, PathInits inits) { + public QFlavoredCategory(Class type, PathMetadata metadata, PathInits inits) { super(type, metadata, inits); - this.category = inits.isInitialized("category") ? new QCategory(forProperty("category"), inits.get("category")) : null; + this.category = inits.isInitialized("category") ? new QCategory(forProperty("category")) : null; this.employee = inits.isInitialized("employee") ? new QAccount(forProperty("employee")) : null; } diff --git a/src/main/generated/com/example/api/domain/QFlavoredDistrict.java b/src/main/generated/com/example/api/domain/QFlavoredDistrict.java new file mode 100644 index 00000000..ff735ae4 --- /dev/null +++ b/src/main/generated/com/example/api/domain/QFlavoredDistrict.java @@ -0,0 +1,62 @@ +package com.example.api.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QFlavoredDistrict is a Querydsl query type for FlavoredDistrict + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QFlavoredDistrict extends EntityPathBase { + + private static final long serialVersionUID = -20339152L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QFlavoredDistrict flavoredDistrict = new QFlavoredDistrict("flavoredDistrict"); + + public final QBaseEntity _super = new QBaseEntity(this); + + //inherited + public final DateTimePath createdDate = _super.createdDate; + + public final QCityDistrict district; + + public final QAccount employee; + + public final NumberPath id = createNumber("id", Long.class); + + //inherited + public final DateTimePath updatedDate = _super.updatedDate; + + public QFlavoredDistrict(String variable) { + this(FlavoredDistrict.class, forVariable(variable), INITS); + } + + public QFlavoredDistrict(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QFlavoredDistrict(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QFlavoredDistrict(PathMetadata metadata, PathInits inits) { + this(FlavoredDistrict.class, metadata, inits); + } + + public QFlavoredDistrict(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.district = inits.isInitialized("district") ? new QCityDistrict(forProperty("district")) : null; + this.employee = inits.isInitialized("employee") ? new QAccount(forProperty("employee")) : null; + } + +} + diff --git a/src/main/java/com/example/api/account/dto/SignUpEmployerRequest.java b/src/main/java/com/example/api/account/dto/SignUpEmployerRequest.java index 1c9fda8e..7461466b 100644 --- a/src/main/java/com/example/api/account/dto/SignUpEmployerRequest.java +++ b/src/main/java/com/example/api/account/dto/SignUpEmployerRequest.java @@ -1,6 +1,6 @@ package com.example.api.account.dto; -import com.example.api.account.entity.Location; +import com.example.api.business.domain.BusinessLocation; import com.example.api.account.entity.Nationality; import com.example.api.account.entity.UserRole; import com.example.api.global.config.resolver.ValidEmail; @@ -23,7 +23,7 @@ public record SignUpEmployerRequest( @NotBlank String businessOpenDate, // 개업연월일 @NotNull - Location location, + BusinessLocation location, @NotNull Nationality nationality, // 국적 @NotNull diff --git a/src/main/java/com/example/api/account/entity/CodeGenerator.java b/src/main/java/com/example/api/account/entity/CodeGenerator.java index 4b17243b..8cfb8e2c 100644 --- a/src/main/java/com/example/api/account/entity/CodeGenerator.java +++ b/src/main/java/com/example/api/account/entity/CodeGenerator.java @@ -1,7 +1,7 @@ package com.example.api.account.entity; -import com.example.api.exception.BusinessException; -import com.example.api.exception.ErrorCode; +import com.example.api.global.exception.BusinessException; +import com.example.api.global.exception.ErrorCode; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; diff --git a/src/main/java/com/example/api/account/entity/Location.java b/src/main/java/com/example/api/account/entity/Location.java deleted file mode 100644 index 41e7f595..00000000 --- a/src/main/java/com/example/api/account/entity/Location.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.example.api.account.entity; - -import com.example.api.domain.BaseEntity; -import jakarta.persistence.*; -import lombok.Getter; -import lombok.ToString; - -import java.util.Objects; - -@Entity -@Getter -@ToString -public class Location extends BaseEntity { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "LOCATION_UNIQUE_ID") - private Long id; - @Column(name = "LOCATION_ZIPCODE") - private String zipcode; - @Column(name = "LOCATION_ADDRESS") - private String address; - @Column(name = "LOCATION_DETAIL_ADDRESS") - private String detailAddress; - - public Location() { - } - - public Location(String zipcode, String address, String detailAddress) { - this.zipcode = zipcode; - this.address = address; - this.detailAddress = detailAddress; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - Location location = (Location) o; - return Objects.equals(id, location.id); - } - - @Override - public int hashCode() { - return Objects.hash(id); - } -} \ No newline at end of file diff --git a/src/main/java/com/example/api/account/entity/MailSender.java b/src/main/java/com/example/api/account/entity/MailSender.java index b7e3e079..ddbd50c6 100644 --- a/src/main/java/com/example/api/account/entity/MailSender.java +++ b/src/main/java/com/example/api/account/entity/MailSender.java @@ -1,8 +1,8 @@ package com.example.api.account.entity; import com.example.api.account.dto.EmailRequest; -import com.example.api.exception.BusinessException; -import com.example.api.exception.ErrorCode; +import com.example.api.global.exception.BusinessException; +import com.example.api.global.exception.ErrorCode; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Value; import org.springframework.mail.SimpleMailMessage; diff --git a/src/main/java/com/example/api/account/entity/UserRole.java b/src/main/java/com/example/api/account/entity/UserRole.java index 9848f010..cb7a2d1e 100644 --- a/src/main/java/com/example/api/account/entity/UserRole.java +++ b/src/main/java/com/example/api/account/entity/UserRole.java @@ -1,7 +1,7 @@ package com.example.api.account.entity; -import com.example.api.exception.BusinessException; -import com.example.api.exception.ErrorCode; +import com.example.api.global.exception.BusinessException; +import com.example.api.global.exception.ErrorCode; import com.fasterxml.jackson.annotation.JsonCreator; import org.springframework.security.core.GrantedAuthority; diff --git a/src/main/java/com/example/api/account/repository/AccountRepository.java b/src/main/java/com/example/api/account/repository/AccountRepository.java index 363aa6f5..812c571d 100644 --- a/src/main/java/com/example/api/account/repository/AccountRepository.java +++ b/src/main/java/com/example/api/account/repository/AccountRepository.java @@ -1,13 +1,11 @@ package com.example.api.account.repository; import com.example.api.domain.Account; -import com.example.api.offeremployment.dto.StarPointAndWorkCountRequest; import org.springframework.data.jpa.repository.EntityGraph; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.repository.query.Param; -import org.springframework.security.core.parameters.P; import java.util.Optional; @@ -35,4 +33,7 @@ public interface AccountRepository extends JpaRepository { "where a.accountId in " + "(select oe.employee.accountId From OfferEmployment oe where oe.suggestId = :suggestId)") void updateWorkCountAndStarPointBySuggestId(@Param("suggestId") Long suggestId, @Param("starPoint") Integer newStarPoint); + + @Query("select a from Account a where a.accountId = :employeeId") + Optional findByEmployeeId(@Param("employeeId") Long employeeId); } \ No newline at end of file diff --git a/src/main/java/com/example/api/account/repository/LocationRepository.java b/src/main/java/com/example/api/account/repository/LocationRepository.java index 80b9b8c3..4f2a6165 100644 --- a/src/main/java/com/example/api/account/repository/LocationRepository.java +++ b/src/main/java/com/example/api/account/repository/LocationRepository.java @@ -1,9 +1,9 @@ package com.example.api.account.repository; -import com.example.api.account.entity.Location; +import com.example.api.business.domain.BusinessLocation; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @Repository -public interface LocationRepository extends JpaRepository { +public interface LocationRepository extends JpaRepository { } diff --git a/src/main/java/com/example/api/account/service/AccountService.java b/src/main/java/com/example/api/account/service/AccountService.java index d0386ba4..722c195c 100644 --- a/src/main/java/com/example/api/account/service/AccountService.java +++ b/src/main/java/com/example/api/account/service/AccountService.java @@ -2,7 +2,7 @@ import com.example.api.account.dto.*; import com.example.api.account.entity.Code; -import com.example.api.account.entity.Location; +import com.example.api.business.domain.BusinessLocation; import com.example.api.account.entity.UserRole; import com.example.api.account.repository.AccountRepository; import com.example.api.account.repository.CodeRepository; @@ -11,8 +11,8 @@ import com.example.api.business.BusinessRepository; import com.example.api.domain.Account; import com.example.api.domain.Business; -import com.example.api.exception.BusinessException; -import com.example.api.exception.ErrorCode; +import com.example.api.global.exception.BusinessException; +import com.example.api.global.exception.ErrorCode; import com.example.api.global.properties.VendorProperties; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; @@ -132,7 +132,7 @@ private void saveEmployerAccount(final SignUpEmployerRequest request) { ); Account savedUser = accountRepository.save(account); - Location savedLocation = locationRepository.save(request.location()); + BusinessLocation savedLocation = locationRepository.save(request.location()); Business business = new Business( savedUser, request.businessRegistrationNumber(), diff --git a/src/main/java/com/example/api/auth/controller/AuthController.java b/src/main/java/com/example/api/auth/controller/AuthController.java index f130a770..53884e82 100644 --- a/src/main/java/com/example/api/auth/controller/AuthController.java +++ b/src/main/java/com/example/api/auth/controller/AuthController.java @@ -5,36 +5,44 @@ import com.example.api.auth.dto.LoginUserRequest; import com.example.api.auth.dto.RefreshTokenRequest; import com.example.api.auth.service.AuthService; +import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; -import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.*; +import java.util.Map; + @RestController @RequestMapping("/api/v1/auth") @RequiredArgsConstructor public class AuthController { private final AuthService authService; - private final AuthenticationManager authenticationManager; @PostMapping("/login") - public ResponseEntity login(@Valid @RequestBody final LoginRequest loginRequest) { + public ResponseEntity> login( + @Valid @RequestBody final LoginRequest loginRequest, + HttpServletResponse response + ) { LoginSuccessResponse loginSuccessResponse = authService.login(loginRequest); - return ResponseEntity.ok(loginSuccessResponse); + response.addCookie(loginSuccessResponse.refreshTokenCookie()); + return ResponseEntity.ok(loginSuccessResponse.responseBody()); } @PostMapping("/refresh") - public ResponseEntity refresh(@Valid @RequestBody final RefreshTokenRequest refreshTokenRequest) { + public ResponseEntity> refresh( + @Valid @RequestBody final RefreshTokenRequest refreshTokenRequest, + HttpServletResponse response) { LoginSuccessResponse loginSuccessResponse = authService.refreshAuthToken(refreshTokenRequest); - return ResponseEntity.ok(loginSuccessResponse); + response.addCookie(loginSuccessResponse.refreshTokenCookie()); + return ResponseEntity.ok(loginSuccessResponse.responseBody()); } @PostMapping("/logout") - public ResponseEntity logout(@AuthenticationPrincipal final Object principal) { + public ResponseEntity> logout(@AuthenticationPrincipal final Object principal) { Long userId = Long.parseLong(principal.toString()); LoginSuccessResponse loginSuccessResponse = authService.logout(new LoginUserRequest(userId)); - return ResponseEntity.ok(loginSuccessResponse); + return ResponseEntity.ok(loginSuccessResponse.responseBody()); } } \ No newline at end of file diff --git a/src/main/java/com/example/api/auth/dto/LoginSuccessResponse.java b/src/main/java/com/example/api/auth/dto/LoginSuccessResponse.java index 75aaa111..bc0feaf8 100644 --- a/src/main/java/com/example/api/auth/dto/LoginSuccessResponse.java +++ b/src/main/java/com/example/api/auth/dto/LoginSuccessResponse.java @@ -1,9 +1,11 @@ package com.example.api.auth.dto; +import jakarta.servlet.http.Cookie; + +import java.util.Map; + public record LoginSuccessResponse( - String accessToken, - String refreshToken, - String userId, - String userRole + Cookie refreshTokenCookie, + Map responseBody ) { } \ No newline at end of file diff --git a/src/main/java/com/example/api/auth/entitiy/CustomUserDetailService.java b/src/main/java/com/example/api/auth/entitiy/CustomUserDetailService.java index 2b7a51ef..e6ac42b3 100644 --- a/src/main/java/com/example/api/auth/entitiy/CustomUserDetailService.java +++ b/src/main/java/com/example/api/auth/entitiy/CustomUserDetailService.java @@ -2,8 +2,8 @@ import com.example.api.account.repository.AccountRepository; import com.example.api.domain.Account; -import com.example.api.exception.BusinessException; -import com.example.api.exception.ErrorCode; +import com.example.api.global.exception.BusinessException; +import com.example.api.global.exception.ErrorCode; import lombok.RequiredArgsConstructor; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.stereotype.Component; diff --git a/src/main/java/com/example/api/auth/entitiy/JwtAuthenticationProvider.java b/src/main/java/com/example/api/auth/entitiy/JwtAuthenticationProvider.java index f51080fe..ae54bbc5 100644 --- a/src/main/java/com/example/api/auth/entitiy/JwtAuthenticationProvider.java +++ b/src/main/java/com/example/api/auth/entitiy/JwtAuthenticationProvider.java @@ -1,8 +1,8 @@ package com.example.api.auth.entitiy; import com.example.api.auth.service.JwtTokenProvider; -import com.example.api.exception.BusinessException; -import com.example.api.exception.ErrorCode; +import com.example.api.global.exception.BusinessException; +import com.example.api.global.exception.ErrorCode; import io.jsonwebtoken.Claims; import lombok.RequiredArgsConstructor; import org.springframework.security.authentication.AuthenticationProvider; diff --git a/src/main/java/com/example/api/auth/service/AuthService.java b/src/main/java/com/example/api/auth/service/AuthService.java index 35bf5a05..c9541463 100644 --- a/src/main/java/com/example/api/auth/service/AuthService.java +++ b/src/main/java/com/example/api/auth/service/AuthService.java @@ -5,14 +5,20 @@ import com.example.api.auth.dto.*; import com.example.api.auth.repository.TokenRepository; import com.example.api.domain.Account; -import com.example.api.exception.BusinessException; -import com.example.api.exception.ErrorCode; +import com.example.api.global.exception.BusinessException; +import com.example.api.global.exception.ErrorCode; +import com.example.api.global.properties.JwtProperties; +import jakarta.servlet.http.Cookie; import jakarta.transaction.Transactional; import lombok.RequiredArgsConstructor; +import org.jetbrains.annotations.NotNull; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; +import java.util.HashMap; +import java.util.Map; + @Service @RequiredArgsConstructor public class AuthService { @@ -20,6 +26,7 @@ public class AuthService { private final PasswordEncoder passwordEncoder; private final JwtTokenProvider jwtTokenProvider; private final TokenRepository tokenRepository; + private final JwtProperties jwtProperties; @Transactional public LoginSuccessResponse login(@Validated final LoginRequest request) { @@ -47,13 +54,28 @@ private void checkPassword(final LoginRequest request, final Account user) { private LoginSuccessResponse generateAuthToken(final Account user) { String accessToken = jwtTokenProvider.generateAccessToken(new UserDetailRequest(user.getAccountId(), user.getRoles())); String refreshToken = generateRefreshToken(user); + Cookie refreshTokenCookie = genreateRefreshTokenCookie(refreshToken); + String role = user.getRoles().stream().findFirst().get().getAuthority(); // 회원가입 시에 무조건 역할이 들어가기에 바로 get으로 꺼냄 - return new LoginSuccessResponse(accessToken,refreshToken, user.getAccountId().toString(), role); + Map responseBody = new HashMap<>(); + responseBody.put("accessToken", accessToken); + responseBody.put("userId", String.valueOf(user.getAccountId())); + responseBody.put("userRole", role); + return new LoginSuccessResponse(refreshTokenCookie, responseBody); + } + + @NotNull + private Cookie genreateRefreshTokenCookie(String refreshToken) { + Cookie refreshTokenCookie = new Cookie("refreshToken", refreshToken); + refreshTokenCookie.setHttpOnly(true); + refreshTokenCookie.setSecure(true); + refreshTokenCookie.setPath("/"); + refreshTokenCookie.setMaxAge(Math.toIntExact(jwtProperties.getRefreshTokenValidTime())); + return refreshTokenCookie; } private String generateRefreshToken(final Account user) { RefreshToken token = new RefreshToken(user); - if(tokenRepository.findByUser(user).isPresent()) { tokenRepository.deleteAllByUser(user); } @@ -80,7 +102,7 @@ public LoginSuccessResponse refreshAuthToken(@Validated final RefreshTokenReques public LoginSuccessResponse logout(@Validated final LoginUserRequest loginUserRequest) { Account user = getUserById(loginUserRequest.userId()); tokenRepository.deleteAllByUser(user); - return new LoginSuccessResponse(null, null, null, null); + return new LoginSuccessResponse(null, null); } private Account getUserById(final Long userId) { diff --git a/src/main/java/com/example/api/auth/service/JwtTokenProvider.java b/src/main/java/com/example/api/auth/service/JwtTokenProvider.java index 9da5979f..ef24c590 100644 --- a/src/main/java/com/example/api/auth/service/JwtTokenProvider.java +++ b/src/main/java/com/example/api/auth/service/JwtTokenProvider.java @@ -1,8 +1,8 @@ package com.example.api.auth.service; import com.example.api.auth.dto.UserDetailRequest; -import com.example.api.exception.BusinessException; -import com.example.api.exception.ErrorCode; +import com.example.api.global.exception.BusinessException; +import com.example.api.global.exception.ErrorCode; import com.example.api.global.properties.JwtProperties; import io.jsonwebtoken.*; import io.jsonwebtoken.security.Keys; diff --git a/src/main/java/com/example/api/aws/service/S3Service.java b/src/main/java/com/example/api/aws/service/S3Service.java index 2e0037f6..b67b84a3 100644 --- a/src/main/java/com/example/api/aws/service/S3Service.java +++ b/src/main/java/com/example/api/aws/service/S3Service.java @@ -9,8 +9,8 @@ import com.example.api.aws.dto.OldKeyRequest; import com.example.api.aws.dto.UploadProfileRequest; import com.example.api.aws.dto.UploadProfileResponse; -import com.example.api.exception.BusinessException; -import com.example.api.exception.ErrorCode; +import com.example.api.global.exception.BusinessException; +import com.example.api.global.exception.ErrorCode; import com.example.api.global.config.AmazonConfig; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/com/example/api/board/controller/BoardController.java b/src/main/java/com/example/api/board/controller/BoardController.java index a0330352..1f46e325 100644 --- a/src/main/java/com/example/api/board/controller/BoardController.java +++ b/src/main/java/com/example/api/board/controller/BoardController.java @@ -1,19 +1,20 @@ package com.example.api.board.controller; -import com.example.api.board.dto.request.EmployeeIdRequest; -import com.example.api.board.dto.response.Board; -import com.example.api.board.dto.response.CategoryDTO; -import com.example.api.board.dto.response.MyInfoDTO; +import com.example.api.board.dto.request.*; +import com.example.api.board.dto.response.*; +import com.example.api.board.dto.update.UpdateExternalCareerRequest; +import com.example.api.board.dto.update.UpdatePersonalInfoRequest; +import com.example.api.board.dto.update.UpdatePreferredCategoriesRequest; +import com.example.api.board.dto.update.UpdatePreferredDistrictsRequest; import com.example.api.board.service.BoardService; import com.example.api.board.service.CategoryService; import com.example.api.board.service.EmployeeService; import java.util.List; + import lombok.RequiredArgsConstructor; -import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; 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.RequestBody; import org.springframework.web.bind.annotation.RequestParam; @@ -26,31 +27,92 @@ public class BoardController { private final CategoryService categoryService; private final EmployeeService employeeService; - @GetMapping("/api/v1/possible-board/form") - public Board findBoardByEmployeeId(@AuthenticationPrincipal final Long employeeId) { - EmployeeIdRequest employeeIdRequest = new EmployeeIdRequest(employeeId); - MyInfoDTO myInfoById = boardService.findMyInfoById(employeeIdRequest); - List categoryList = categoryService.getAllCategories(); - return new Board(myInfoById, categoryList); + /** + * 1. 회원 정보 + * 2. 희망 근무지 + * 2. 희망 카테고리 + * 3. 근무 가능 시간 (캘린더) + * 4. 외부 경력 + * 5. 내부 경력 + */ + @GetMapping("/api/v1/possible-board/personal-info") + public ResponseEntity getPersonalInfo(@AuthenticationPrincipal final Long employeeId){ + return ResponseEntity.ok(boardService.getPersonalInfoResponse(new EmployeeIdRequest(employeeId))); } - @PostMapping("/api/v1") - public ResponseEntity changeOpenStatus(@AuthenticationPrincipal final Long employeeId, @RequestParam ("openStatus") Boolean openStatus) { - EmployeeIdRequest employeeIdRequest = new EmployeeIdRequest(employeeId); - boolean updated = employeeService.changeOpenStatus(employeeIdRequest, openStatus); - if (updated) { - return ResponseEntity.ok("사용자 정보가 성공적으로 업데이트되었습니다."); - } else { - return ResponseEntity.status(HttpStatus.NOT_FOUND).body("사용자를 찾을 수 없습니다."); - } + @GetMapping("/api/v1/possible-board/work-preferences/districts") + public ResponseEntity> getPreferredDistricts(@AuthenticationPrincipal final Long employeeId){ + return ResponseEntity.ok(boardService.getPreferredDistricts(new EmployeeIdRequest(employeeId))); + } + + @GetMapping("/api/v1/possible-board/work-preferences/category") + public ResponseEntity> getPreferredCategories(@AuthenticationPrincipal final Long employeeId){ + return ResponseEntity.ok(boardService.getPreferredCategories(new EmployeeIdRequest(employeeId))); + } + + @GetMapping("/api/v1/possible-board/work-hours") + public ResponseEntity> getWorkHours(@AuthenticationPrincipal final Long employeeId){ + return ResponseEntity.ok(boardService.getWorkHours(new EmployeeIdRequest(employeeId))); + } + + @GetMapping("/api/v1/possible-board/external-career") + public ResponseEntity> getExternalCareers(@AuthenticationPrincipal final Long employeeId){ + return ResponseEntity.ok(boardService.getExternalCareers(new EmployeeIdRequest(employeeId))); + } + + @GetMapping("/api/v1/possible-board/internal-career") + public ResponseEntity> getInternalCareers(@AuthenticationPrincipal final Long employeeId){ + return ResponseEntity.ok(boardService.getInternalCareers(new EmployeeIdRequest(employeeId))); + } + + @PostMapping("/api/v1/possible-board/personal-info") + public ResponseEntity updatePersonalInfo( + @AuthenticationPrincipal final Long employeeId, + @RequestBody final UpdatePersonalInfoRequest request + ){ + employeeService.updatePersonalInfo(new EmployeeIdRequest(employeeId), request); + return ResponseEntity.ok(employeeService.updatePersonalInfo(new EmployeeIdRequest(employeeId), request)); + } + + @PostMapping("/api/v1/possible-board/work-preferences/districts") + public ResponseEntity> updatePreferredDistricts( + @AuthenticationPrincipal final Long employeeId, + @RequestBody final UpdatePreferredDistrictsRequest request + ){ + return ResponseEntity.ok(boardService.updatePreferredDistrict(new EmployeeIdRequest(employeeId), request)); + } + + @PostMapping("/api/v1/possible-board/work-preferences/category") + public ResponseEntity> updatePreferredCategories( + @AuthenticationPrincipal final Long employeeId, + @RequestBody final UpdatePreferredCategoriesRequest request){ + return ResponseEntity.ok(boardService.updatePreferredCategories(new EmployeeIdRequest(employeeId), request)); + } + + @PostMapping("/api/v1/possible-board/external-career") + public ResponseEntity> updateExternalCareers( + @AuthenticationPrincipal final Long employeeId, + @RequestBody final UpdateExternalCareerRequest request){ + return ResponseEntity.ok(boardService.updateExternalCareers(new EmployeeIdRequest(employeeId), request)); + } + + @PostMapping("/api/v1/possible-board/work-hours") + public ResponseEntity updatePossibleTimes( + @RequestBody final AddPossibleTimeRequest addPossibleTimeRequest, + final Long requestMemberId + ) { + final AddPossibleTimeCommand addPossibleTimeCommand = addPossibleTimeRequest.toCommand(requestMemberId); + boardService.addPossibleBoard(addPossibleTimeCommand); + return ResponseEntity.ok().build(); } - @PostMapping("/api/v1/possible-board/submit") - public ResponseEntity submitBoard(@AuthenticationPrincipal final Long employeeId, @RequestBody MyInfoDTO myInfo) { + @PostMapping("/api/v1/possible-board") + public ResponseEntity changeOpenStatus( + @AuthenticationPrincipal final Long employeeId, + @RequestParam("open-status") Boolean openStatus + ) { EmployeeIdRequest employeeIdRequest = new EmployeeIdRequest(employeeId); - employeeService.updateUserInfo(employeeIdRequest, myInfo); - MyInfoDTO myInfoById = boardService.findMyInfoById(employeeIdRequest); - List categoryList = categoryService.getAllCategories(); - return ResponseEntity.ok(new Board(myInfoById, categoryList)); + employeeService.changeOpenStatus(employeeIdRequest, openStatus); + return ResponseEntity.ok("사용자 정보가 성공적으로 업데이트되었습니다."); } -} +} \ No newline at end of file diff --git a/src/main/java/com/example/api/possbileboard/dto/AddPossibleTimeCommand.java b/src/main/java/com/example/api/board/dto/request/AddPossibleTimeCommand.java similarity index 87% rename from src/main/java/com/example/api/possbileboard/dto/AddPossibleTimeCommand.java rename to src/main/java/com/example/api/board/dto/request/AddPossibleTimeCommand.java index 7309ccfb..f49571ee 100644 --- a/src/main/java/com/example/api/possbileboard/dto/AddPossibleTimeCommand.java +++ b/src/main/java/com/example/api/board/dto/request/AddPossibleTimeCommand.java @@ -1,4 +1,4 @@ -package com.example.api.possbileboard.dto; +package com.example.api.board.dto.request; import java.time.LocalDateTime; import java.util.List; diff --git a/src/main/java/com/example/api/possbileboard/dto/AddPossibleTimeRequest.java b/src/main/java/com/example/api/board/dto/request/AddPossibleTimeRequest.java similarity index 87% rename from src/main/java/com/example/api/possbileboard/dto/AddPossibleTimeRequest.java rename to src/main/java/com/example/api/board/dto/request/AddPossibleTimeRequest.java index 2e911bfe..d48f07bf 100644 --- a/src/main/java/com/example/api/possbileboard/dto/AddPossibleTimeRequest.java +++ b/src/main/java/com/example/api/board/dto/request/AddPossibleTimeRequest.java @@ -1,6 +1,6 @@ -package com.example.api.possbileboard.dto; +package com.example.api.board.dto.request; -import com.example.api.possbileboard.dto.AddPossibleTimeCommand.PossibleTimeRange; +import com.example.api.board.dto.request.AddPossibleTimeCommand.PossibleTimeRange; import java.time.LocalDateTime; import java.util.List; import java.util.stream.Collectors; diff --git a/src/main/java/com/example/api/possbileboard/dto/FlavoredCategory.java b/src/main/java/com/example/api/board/dto/request/FlavoredCategory.java similarity index 68% rename from src/main/java/com/example/api/possbileboard/dto/FlavoredCategory.java rename to src/main/java/com/example/api/board/dto/request/FlavoredCategory.java index 29d51cce..905e328e 100644 --- a/src/main/java/com/example/api/possbileboard/dto/FlavoredCategory.java +++ b/src/main/java/com/example/api/board/dto/request/FlavoredCategory.java @@ -1,4 +1,4 @@ -package com.example.api.possbileboard.dto; +package com.example.api.board.dto.request; public record FlavoredCategory( Long categoryId, diff --git a/src/main/java/com/example/api/possbileboard/dto/QueryPossibleDetailsCommand.java b/src/main/java/com/example/api/board/dto/request/QueryPossibleDetailsCommand.java similarity index 63% rename from src/main/java/com/example/api/possbileboard/dto/QueryPossibleDetailsCommand.java rename to src/main/java/com/example/api/board/dto/request/QueryPossibleDetailsCommand.java index 4c78050a..7d096d9a 100644 --- a/src/main/java/com/example/api/possbileboard/dto/QueryPossibleDetailsCommand.java +++ b/src/main/java/com/example/api/board/dto/request/QueryPossibleDetailsCommand.java @@ -1,4 +1,4 @@ -package com.example.api.possbileboard.dto; +package com.example.api.board.dto.request; public record QueryPossibleDetailsCommand( Long possibleId diff --git a/src/main/java/com/example/api/board/dto/request/QueryPossibleEmployerRequest.java b/src/main/java/com/example/api/board/dto/request/QueryPossibleEmployerRequest.java deleted file mode 100644 index 0a811a1d..00000000 --- a/src/main/java/com/example/api/board/dto/request/QueryPossibleEmployerRequest.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.example.api.board.dto.request; - -import java.time.LocalDateTime; - -public record QueryPossibleEmployerRequest( - String name, - Integer age, - LocalDateTime possibleStartDateTime, - LocalDateTime possibleEndDateTime -) { -} diff --git a/src/main/java/com/example/api/board/dto/response/Board.java b/src/main/java/com/example/api/board/dto/response/Board.java deleted file mode 100644 index 78c77aa0..00000000 --- a/src/main/java/com/example/api/board/dto/response/Board.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.example.api.board.dto.response; - -import lombok.AllArgsConstructor; -import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.Setter; - -import java.util.List; - -@Getter -@Setter -@AllArgsConstructor -@EqualsAndHashCode -public class Board { - private MyInfoDTO myInfo; - private List categoryList; -} diff --git a/src/main/java/com/example/api/board/dto/response/CategoryDTO.java b/src/main/java/com/example/api/board/dto/response/CategoryDTO.java deleted file mode 100644 index 19d99dc4..00000000 --- a/src/main/java/com/example/api/board/dto/response/CategoryDTO.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.example.api.board.dto.response; - -import lombok.*; - -@Getter -@Setter -@AllArgsConstructor -@EqualsAndHashCode -@NoArgsConstructor -public class CategoryDTO { - private Long categoryId; - private String categoryName; -} diff --git a/src/main/java/com/example/api/board/dto/response/ExternalCareerDTO.java b/src/main/java/com/example/api/board/dto/response/ExternalCareerDTO.java deleted file mode 100644 index 25d3d279..00000000 --- a/src/main/java/com/example/api/board/dto/response/ExternalCareerDTO.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.example.api.board.dto.response; - - -import lombok.*; - -@Getter -@Setter -@AllArgsConstructor -@EqualsAndHashCode -@NoArgsConstructor -public class ExternalCareerDTO { - private long id; - private String Name; - private String period; -} diff --git a/src/main/java/com/example/api/board/dto/response/ExternalCareerResponse.java b/src/main/java/com/example/api/board/dto/response/ExternalCareerResponse.java new file mode 100644 index 00000000..dafe9fb4 --- /dev/null +++ b/src/main/java/com/example/api/board/dto/response/ExternalCareerResponse.java @@ -0,0 +1,10 @@ +package com.example.api.board.dto.response; + +import com.example.api.domain.Category; + +public record ExternalCareerResponse( + Long externalCareerId, + Category category, + Integer workCount +) { +} diff --git a/src/main/java/com/example/api/board/dto/response/FlavoredCategoryResponse.java b/src/main/java/com/example/api/board/dto/response/FlavoredCategoryResponse.java new file mode 100644 index 00000000..2eabe0c5 --- /dev/null +++ b/src/main/java/com/example/api/board/dto/response/FlavoredCategoryResponse.java @@ -0,0 +1,7 @@ +package com.example.api.board.dto.response; + +public record FlavoredCategoryResponse( + Long categoryId, + String categoryName +) { +} \ No newline at end of file diff --git a/src/main/java/com/example/api/board/dto/response/FlavoredDistrictResponse.java b/src/main/java/com/example/api/board/dto/response/FlavoredDistrictResponse.java new file mode 100644 index 00000000..14334884 --- /dev/null +++ b/src/main/java/com/example/api/board/dto/response/FlavoredDistrictResponse.java @@ -0,0 +1,7 @@ +package com.example.api.board.dto.response; + +public record FlavoredDistrictResponse( + Long districtId, + String districtName +) { +} \ No newline at end of file diff --git a/src/main/java/com/example/api/board/dto/response/InnerCareerDTO.java b/src/main/java/com/example/api/board/dto/response/InnerCareerDTO.java deleted file mode 100644 index d4e854df..00000000 --- a/src/main/java/com/example/api/board/dto/response/InnerCareerDTO.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.example.api.board.dto.response; - -import com.example.api.domain.Review; - -import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -import java.time.LocalDate; -import java.time.LocalDateTime; - -@Getter -@Setter -@EqualsAndHashCode -@NoArgsConstructor -public class InnerCareerDTO { - private String businessName; - private LocalDate workDate; - private String representationName; - private Review review; - - public InnerCareerDTO(String businessName, LocalDateTime startTime, String representationName, Review review) { - this.businessName = businessName; - this.workDate = startTime.toLocalDate(); - this.representationName = representationName; - this.review = review; - } -} diff --git a/src/main/java/com/example/api/possbileboard/dto/InternalCareerResponse.java b/src/main/java/com/example/api/board/dto/response/InternalCareerResponse.java similarity index 69% rename from src/main/java/com/example/api/possbileboard/dto/InternalCareerResponse.java rename to src/main/java/com/example/api/board/dto/response/InternalCareerResponse.java index 42e97c44..4096cf0f 100644 --- a/src/main/java/com/example/api/possbileboard/dto/InternalCareerResponse.java +++ b/src/main/java/com/example/api/board/dto/response/InternalCareerResponse.java @@ -1,10 +1,10 @@ -package com.example.api.possbileboard.dto; +package com.example.api.board.dto.response; import java.time.LocalDateTime; public record InternalCareerResponse( Long contractId, - Integer hourlyPayment, + String businessName, LocalDateTime startTime, LocalDateTime endTime ) { diff --git a/src/main/java/com/example/api/board/dto/response/MyInfoDTO.java b/src/main/java/com/example/api/board/dto/response/MyInfoDTO.java deleted file mode 100644 index 441a1263..00000000 --- a/src/main/java/com/example/api/board/dto/response/MyInfoDTO.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.example.api.board.dto.response; - -import lombok.*; - -import java.util.List; - -@EqualsAndHashCode -@AllArgsConstructor -@NoArgsConstructor -@Getter -@Setter -public class MyInfoDTO { - private String name; - private String nickname; - private int age; - private String sex; - private String email; - private String phone; - private List innerCarrerList; - private List externalCareerList; - private List possibleBoardList; - private List flavoredCategoryList; - private float starPoint; - private int workCount; - - public MyInfoDTO(String name, String nickname, int age, String sex, String email, String phone, float starPoint, int workCount) { - this.name = name; - this.nickname = nickname; - this.age = age; - this.sex = sex; - this.email = email; - this.phone = phone; - this.starPoint = starPoint; - this.workCount = workCount; - } -} \ No newline at end of file diff --git a/src/main/java/com/example/api/board/dto/response/PersonalInfoResponse.java b/src/main/java/com/example/api/board/dto/response/PersonalInfoResponse.java new file mode 100644 index 00000000..0934c646 --- /dev/null +++ b/src/main/java/com/example/api/board/dto/response/PersonalInfoResponse.java @@ -0,0 +1,27 @@ +package com.example.api.board.dto.response; + +import com.example.api.domain.Account; + +public record PersonalInfoResponse( + String name, + String nickname, + Integer age, + String sex, + String email, + String phoneNumber, + Float starPoint, + Integer workCount +) { + public static PersonalInfoResponse of(Account user){ + return new PersonalInfoResponse( + user.getName(), + user.getNickname(), + user.getAge(), + user.getSex(), + user.getEmail(), + user.getPhoneNumber(), + user.getStarPoint(), + user.getWorkCount() + ); + } +} \ No newline at end of file diff --git a/src/main/java/com/example/api/board/dto/response/PossibleBoardDTO.java b/src/main/java/com/example/api/board/dto/response/PossibleBoardDTO.java deleted file mode 100644 index b042af55..00000000 --- a/src/main/java/com/example/api/board/dto/response/PossibleBoardDTO.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.example.api.board.dto.response; - -import lombok.*; -import java.time.LocalDateTime; - -@Getter -@Setter -@AllArgsConstructor -@NoArgsConstructor -@EqualsAndHashCode(onlyExplicitlyIncluded = true) -public class PossibleBoardDTO { - private long id; - - @EqualsAndHashCode.Include - private LocalDateTime startTime; - - @EqualsAndHashCode.Include - private LocalDateTime endTime; -} diff --git a/src/main/java/com/example/api/possbileboard/dto/PossibleDetailsResponse.java b/src/main/java/com/example/api/board/dto/response/PossibleDetailsResponse.java similarity index 83% rename from src/main/java/com/example/api/possbileboard/dto/PossibleDetailsResponse.java rename to src/main/java/com/example/api/board/dto/response/PossibleDetailsResponse.java index a909c226..01b67242 100644 --- a/src/main/java/com/example/api/possbileboard/dto/PossibleDetailsResponse.java +++ b/src/main/java/com/example/api/board/dto/response/PossibleDetailsResponse.java @@ -1,4 +1,6 @@ -package com.example.api.possbileboard.dto; +package com.example.api.board.dto.response; + +import com.example.api.board.dto.request.FlavoredCategory; import java.time.LocalDateTime; import java.util.List; @@ -17,4 +19,4 @@ public record PossibleDetailsResponse( Long contractCount, Integer starPoint ) { -} +} \ No newline at end of file diff --git a/src/main/java/com/example/api/board/dto/response/PossibleEmployeeResponse.java b/src/main/java/com/example/api/board/dto/response/PossibleEmployeeResponse.java deleted file mode 100644 index 551e6f92..00000000 --- a/src/main/java/com/example/api/board/dto/response/PossibleEmployeeResponse.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.example.api.board.dto.response; - -import java.time.LocalDateTime; - -public record PossibleEmployeeResponse( - Long accountId, - String name, - Integer age, - String sex, - LocalDateTime possibleStartDateTime, - LocalDateTime possibleEndDateTime -) { -} diff --git a/src/main/java/com/example/api/board/dto/response/WorkHourResponse.java b/src/main/java/com/example/api/board/dto/response/WorkHourResponse.java new file mode 100644 index 00000000..dd8f6ed0 --- /dev/null +++ b/src/main/java/com/example/api/board/dto/response/WorkHourResponse.java @@ -0,0 +1,14 @@ +package com.example.api.board.dto.response; + +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; + +public record WorkHourResponse( + Long id, + @EqualsAndHashCode.Include + LocalDateTime startTime, + @EqualsAndHashCode.Include + LocalDateTime endTime +) { +} diff --git a/src/main/java/com/example/api/board/dto/update/UpdateExternalCareerRequest.java b/src/main/java/com/example/api/board/dto/update/UpdateExternalCareerRequest.java new file mode 100644 index 00000000..7690912d --- /dev/null +++ b/src/main/java/com/example/api/board/dto/update/UpdateExternalCareerRequest.java @@ -0,0 +1,12 @@ +package com.example.api.board.dto.update; + +import java.util.List; + +public record UpdateExternalCareerRequest( + List newExternalCareers +) { + public record ExternalCareerRequest( + Long categoryId, + Integer workCount + ){} +} \ No newline at end of file diff --git a/src/main/java/com/example/api/board/dto/update/UpdateUserInfoRequest.java b/src/main/java/com/example/api/board/dto/update/UpdatePersonalInfoRequest.java similarity index 84% rename from src/main/java/com/example/api/board/dto/update/UpdateUserInfoRequest.java rename to src/main/java/com/example/api/board/dto/update/UpdatePersonalInfoRequest.java index 424cd813..1d0e7590 100644 --- a/src/main/java/com/example/api/board/dto/update/UpdateUserInfoRequest.java +++ b/src/main/java/com/example/api/board/dto/update/UpdatePersonalInfoRequest.java @@ -1,6 +1,6 @@ package com.example.api.board.dto.update; -public record UpdateUserInfoRequest( +public record UpdatePersonalInfoRequest( String name, String sex, Integer age, diff --git a/src/main/java/com/example/api/board/dto/update/UpdatePreferredCategoriesRequest.java b/src/main/java/com/example/api/board/dto/update/UpdatePreferredCategoriesRequest.java new file mode 100644 index 00000000..cb0de88c --- /dev/null +++ b/src/main/java/com/example/api/board/dto/update/UpdatePreferredCategoriesRequest.java @@ -0,0 +1,8 @@ +package com.example.api.board.dto.update; + +import java.util.List; + +public record UpdatePreferredCategoriesRequest( + List categoryIds +) { +} diff --git a/src/main/java/com/example/api/board/dto/update/UpdatePreferredDistrictsRequest.java b/src/main/java/com/example/api/board/dto/update/UpdatePreferredDistrictsRequest.java new file mode 100644 index 00000000..ad5499a7 --- /dev/null +++ b/src/main/java/com/example/api/board/dto/update/UpdatePreferredDistrictsRequest.java @@ -0,0 +1,8 @@ +package com.example.api.board.dto.update; + +import java.util.List; + +public record UpdatePreferredDistrictsRequest( + List districtIds +) implements UpdateAccountConditionCommand { +} diff --git a/src/main/java/com/example/api/possbileboard/PossibleMapper.java b/src/main/java/com/example/api/board/entitiy/PossibleMapper.java similarity index 57% rename from src/main/java/com/example/api/possbileboard/PossibleMapper.java rename to src/main/java/com/example/api/board/entitiy/PossibleMapper.java index d3334b66..33c991b6 100644 --- a/src/main/java/com/example/api/possbileboard/PossibleMapper.java +++ b/src/main/java/com/example/api/board/entitiy/PossibleMapper.java @@ -1,27 +1,26 @@ -package com.example.api.possbileboard; +package com.example.api.board.entitiy; import com.example.api.domain.Account; import com.example.api.domain.Category; import com.example.api.domain.Contract; import com.example.api.domain.ExternalCareer; import com.example.api.domain.PossibleBoard; -import com.example.api.possbileboard.dto.ExternalCareerResponse; -import com.example.api.possbileboard.dto.FlavoredCategory; -import com.example.api.possbileboard.dto.InternalCareerResponse; -import com.example.api.possbileboard.dto.PossibleDetails; -import com.example.api.possbileboard.dto.PossibleDetailsResponse; +import com.example.api.board.dto.response.ExternalCareerResponse; +import com.example.api.board.dto.request.FlavoredCategory; +import com.example.api.board.dto.response.InternalCareerResponse; +import com.example.api.board.dto.response.PossibleDetailsResponse; import java.util.List; -import java.util.stream.Collectors; + import org.springframework.stereotype.Service; @Service -class PossibleMapper { +public class PossibleMapper { - PossibleBoard toBoard(final Account account, final PossibleTime possibleTime) { + public PossibleBoard toBoard(final Account account, final PossibleTime possibleTime) { return new PossibleBoard(account, possibleTime.getStartTime(), possibleTime.getEndTime()); } - PossibleDetailsResponse toPossibleDetailsResponse(final PossibleDetails possibleDetails, final List categories, final List externalCareers, final List internalCareeors) { + public PossibleDetailsResponse toPossibleDetailsResponse(final PossibleDetailsResponse possibleDetails, final List categories, final List externalCareers, final List internalCareeors) { return new PossibleDetailsResponse( possibleDetails.name(), possibleDetails.age(), @@ -44,15 +43,16 @@ PossibleDetailsResponse toPossibleDetailsResponse(final PossibleDetails possible ); } - ExternalCareerResponse toExternalCareerResponse(final ExternalCareer externalCareer) { - return new ExternalCareerResponse(externalCareer.getId(), externalCareer.getName(), externalCareer.getPeriod()); + public ExternalCareerResponse toExternalCareerResponse(final ExternalCareer externalCareer) { + return new ExternalCareerResponse(externalCareer.getId(), externalCareer.getCategory(), externalCareer.getWorkCount()); } - FlavoredCategory toFlavoredCategory(final Category category) { + public FlavoredCategory toFlavoredCategory(final Category category) { return new FlavoredCategory(category.getCategoryId(), category.getCategoryName()); } - InternalCareerResponse toInternalCareerResponse(final Contract contract) { - return new InternalCareerResponse(contract.getContractId(), contract.getContractHourlyPay(), contract.getContractStartTime(), contract.getContractEndTime()); + public InternalCareerResponse toInternalCareerResponse(final Contract contract) { + String businessName = contract.getOfferEmployment().getBusiness().getBusinessName(); + return new InternalCareerResponse(contract.getContractId(), businessName, contract.getContractStartTime(), contract.getContractEndTime()); } -} +} \ No newline at end of file diff --git a/src/main/java/com/example/api/possbileboard/PossibleTime.java b/src/main/java/com/example/api/board/entitiy/PossibleTime.java similarity index 83% rename from src/main/java/com/example/api/possbileboard/PossibleTime.java rename to src/main/java/com/example/api/board/entitiy/PossibleTime.java index c9195275..e716c37a 100644 --- a/src/main/java/com/example/api/possbileboard/PossibleTime.java +++ b/src/main/java/com/example/api/board/entitiy/PossibleTime.java @@ -1,12 +1,12 @@ -package com.example.api.possbileboard; +package com.example.api.board.entitiy; -import com.example.api.exception.BusinessException; -import com.example.api.exception.ErrorCode; +import com.example.api.global.exception.BusinessException; +import com.example.api.global.exception.ErrorCode; import java.time.LocalDateTime; import lombok.Getter; @Getter -class PossibleTime { +public class PossibleTime { private final LocalDateTime startTime; private final LocalDateTime endTime; diff --git a/src/main/java/com/example/api/board/entitiy/update/UpdateUserInfoHandler.java b/src/main/java/com/example/api/board/entitiy/update/UpdateUserInfoHandler.java index 06717203..84dc1c3d 100644 --- a/src/main/java/com/example/api/board/entitiy/update/UpdateUserInfoHandler.java +++ b/src/main/java/com/example/api/board/entitiy/update/UpdateUserInfoHandler.java @@ -1,17 +1,17 @@ package com.example.api.board.entitiy.update; import com.example.api.board.dto.update.UpdateAccountConditionCommand; -import com.example.api.board.dto.update.UpdateUserInfoRequest; +import com.example.api.board.dto.update.UpdatePersonalInfoRequest; import com.example.api.domain.Account; public class UpdateUserInfoHandler implements UpdateAccountConditionHandler { @Override public void update(Account account, UpdateAccountConditionCommand updateAccountConditionCommand) { - account.updateUserInfo((UpdateUserInfoRequest) updateAccountConditionCommand); + account.updateUserInfo((UpdatePersonalInfoRequest) updateAccountConditionCommand); } @Override public boolean supports(UpdateAccountConditionCommand command) { - return command instanceof UpdateUserInfoRequest; + return command instanceof UpdatePersonalInfoRequest; } } diff --git a/src/main/java/com/example/api/board/repository/PossibleBoardRepository.java b/src/main/java/com/example/api/board/repository/PossibleBoardRepository.java new file mode 100644 index 00000000..9ad6f06b --- /dev/null +++ b/src/main/java/com/example/api/board/repository/PossibleBoardRepository.java @@ -0,0 +1,28 @@ +package com.example.api.board.repository; + +import com.example.api.board.dto.response.WorkHourResponse; +import com.example.api.domain.Category; +import com.example.api.domain.Contract; +import com.example.api.domain.ExternalCareer; +import com.example.api.domain.PossibleBoard; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.List; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +@Repository +public interface PossibleBoardRepository extends JpaRepository { + @Modifying + @Query("DELETE FROM PossibleBoard possible WHERE (possible.startTime <= :endDateTime AND possible.endTime >= :startDateTime)") + Long deleteDuplicatedWorkTimeIncluded(@Param("startDateTime") final LocalDateTime startDateTimeIncluded, + @Param("endDateTime") final LocalDateTime endDateTimeIncluded); + + @Query("select new com.example.api.board.dto.response.WorkHourResponse(p.possibleId, p.startTime, p.endTime) " + + "from PossibleBoard p where p.employee.accountId = :employeeId and p.startTime >= :currentMonth") + List findScheduleFromCurrentMonth(@Param("employeeId")Long employeeId, @Param("currentMonth") LocalDate currentMonth); +} \ No newline at end of file diff --git a/src/main/java/com/example/api/board/service/BoardService.java b/src/main/java/com/example/api/board/service/BoardService.java index 54c1b5eb..4af533ac 100644 --- a/src/main/java/com/example/api/board/service/BoardService.java +++ b/src/main/java/com/example/api/board/service/BoardService.java @@ -1,32 +1,180 @@ package com.example.api.board.service; +import com.example.api.account.repository.AccountRepository; +import com.example.api.account.service.AccountService; +import com.example.api.board.dto.request.AddPossibleTimeCommand; import com.example.api.board.dto.request.EmployeeIdRequest; -import com.example.api.board.dto.response.MyInfoDTO; -import com.example.api.domain.repository.ExternalCareerRepository; -import com.example.api.domain.repository.FlavoredRepository; -import com.example.api.domain.repository.MyInfoRepository; -import com.example.api.domain.repository.OfferEmploymentRepository; -import com.example.api.possbileboard.PossibleBoardRepository; +import com.example.api.board.dto.update.UpdateExternalCareerRequest; +import com.example.api.board.dto.update.UpdatePreferredCategoriesRequest; +import com.example.api.board.dto.response.*; +import com.example.api.board.dto.update.UpdatePreferredDistrictsRequest; +import com.example.api.board.entitiy.PossibleMapper; +import com.example.api.board.entitiy.PossibleTime; +import com.example.api.domain.*; +import com.example.api.domain.repository.*; +import com.example.api.board.repository.PossibleBoardRepository; +import com.example.api.global.exception.BusinessException; +import com.example.api.global.exception.ErrorCode; +import com.fasterxml.jackson.databind.ObjectMapper; import lombok.RequiredArgsConstructor; +import org.jetbrains.annotations.NotNull; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDate; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + @Service @RequiredArgsConstructor public class BoardService { - private final MyInfoRepository myInfoRepository; + private final AccountRepository accountRepository; private final OfferEmploymentRepository offerEmploymentRepository; private final ExternalCareerRepository externalCareerRepository; private final PossibleBoardRepository possibleBoardRepository; - private final FlavoredRepository flavoredRepository; + private final FlavoredCategoryRepository flavoredCategoryRepository; + private final FlavoredDistrictRepository flavoredDistrictRepository; + private final AccountService accountService; + private final PossibleMapper possibleMapper; + private final ObjectMapper objectMapper; + private final CategoryRepository categoryRepository; + + @Transactional(readOnly = true) + public PersonalInfoResponse getPersonalInfoResponse(final EmployeeIdRequest employeeIdRequest){ + Account user = accountRepository.findByEmployeeId(employeeIdRequest.employeeId()).orElseThrow(() -> + new BusinessException(ErrorCode.NULL_USER)); + return PersonalInfoResponse.of(user); + } + + @Transactional(readOnly = true) + public List getPreferredDistricts(final EmployeeIdRequest employeeIdRequest) { + return flavoredDistrictRepository.findAllByEmployeeId(employeeIdRequest.employeeId()); + } + + @Transactional(readOnly = true) + public List getPreferredCategories(final EmployeeIdRequest employeeIdRequest) { + return flavoredCategoryRepository.findAllByEmployeeId(employeeIdRequest.employeeId()); + } @Transactional(readOnly = true) - public MyInfoDTO findMyInfoById(final EmployeeIdRequest employeeIdRequest) { - MyInfoDTO myInfoDTOById = myInfoRepository.findMyInfoDTOById(employeeIdRequest.employeeId()); - myInfoDTOById.setInnerCarrerList(offerEmploymentRepository.findAllDTOByEmployeeId(employeeIdRequest.employeeId())); - myInfoDTOById.setExternalCareerList(externalCareerRepository.findAllDTOByEmployeeAccountId(employeeIdRequest.employeeId())); - myInfoDTOById.setPossibleBoardList(possibleBoardRepository.findAllDTOByEmployeeAccountId(employeeIdRequest.employeeId())); - myInfoDTOById.setFlavoredCategoryList(flavoredRepository.findAllCategoryDTOByEmployeeId(employeeIdRequest.employeeId())); - return myInfoDTOById; + public List getWorkHours(final EmployeeIdRequest employeeIdRequest) { + return possibleBoardRepository.findScheduleFromCurrentMonth(employeeIdRequest.employeeId(), LocalDate.now().withDayOfMonth(1)); + } + + @Transactional(readOnly = true) + public List getExternalCareers(final EmployeeIdRequest employeeIdRequest) { + return externalCareerRepository.findAllByEmployeeId(employeeIdRequest.employeeId()); + } + + @Transactional(readOnly = true) + public List getInternalCareers(final EmployeeIdRequest employeeIdRequest) { + return offerEmploymentRepository.findAllByEmployeeId(employeeIdRequest.employeeId()); + } + + @Transactional + public void addPossibleBoard(final AddPossibleTimeCommand addPossibleTimeCommand) { + final List possibleTimes = addPossibleTimeCommand.possibleTimes().stream() + .map(possibleTimeRange -> new PossibleTime(possibleTimeRange.startTime(), possibleTimeRange.endTime())) + .collect(Collectors.toList()); + deleteDuplicatedPeriod(possibleTimes); + final Account account = accountService.loadAccount(addPossibleTimeCommand.requestMemberId()); + addNewPeriod(account, possibleTimes); + } + + private void deleteDuplicatedPeriod(final List possibleTimes) { + possibleTimes.stream() + .forEach(possibleTime -> possibleBoardRepository.deleteDuplicatedWorkTimeIncluded(possibleTime.getStartTime(), possibleTime.getEndTime())); + } + + private void addNewPeriod( + final Account account, + final List possibleTimes + ) { + final List possibleBoards = possibleTimes.stream() + .map(possibleTime -> possibleMapper.toBoard(account, possibleTime)) + .toList(); + possibleBoardRepository.saveAll(possibleBoards); + } + + @Transactional + public List updatePreferredDistrict( + final EmployeeIdRequest employeeIdRequest, + final UpdatePreferredDistrictsRequest request + ) { + flavoredDistrictRepository.deleteByNotInIds(employeeIdRequest.employeeId(), request.districtIds()); + flavoredDistrictRepository.saveDistrictIds(employeeIdRequest.employeeId(), request.districtIds().toString()); + return flavoredDistrictRepository.findAllByEmployeeId(employeeIdRequest.employeeId()); + } + + @Transactional + public List updatePreferredCategories( + final EmployeeIdRequest employeeIdRequest, + final UpdatePreferredCategoriesRequest request + ) { + flavoredCategoryRepository.deleteByNotInIds(employeeIdRequest.employeeId(), request.categoryIds()); + flavoredCategoryRepository.saveDistrictIds(employeeIdRequest.employeeId(), request.categoryIds().toString()); + return flavoredCategoryRepository.findAllByEmployeeId(employeeIdRequest.employeeId()); + } + + @Transactional + public List updateExternalCareers( + final EmployeeIdRequest employeeIdRequest, + final UpdateExternalCareerRequest request) { + + Account user = accountRepository.findByEmployeeId(employeeIdRequest.employeeId()) + .orElseThrow(() -> new BusinessException(ErrorCode.NULL_USER)); + + List allExternalCareer = externalCareerRepository.findAllByEmployeeId(user.getAccountId()); + + Set categoryIds = request.newExternalCareers().stream() + .map(UpdateExternalCareerRequest.ExternalCareerRequest::categoryId) + .collect(Collectors.toSet()); + + Map categoryMap = categoryRepository.findAllById(categoryIds).stream() + .collect(Collectors.toMap(Category::getCategoryId, category -> category)); + + List newList = filterNewExternalCareers(request, allExternalCareer, categoryMap, user); + List oldList = filterRemovableExternalCareers(request, allExternalCareer); + + if (!oldList.isEmpty()) { + externalCareerRepository.deleteAllById(oldList); + } + if (!newList.isEmpty()) { + externalCareerRepository.saveAll(newList); + } + + return externalCareerRepository.findAllByEmployeeId(user.getAccountId()); + } + + @NotNull + private static List filterRemovableExternalCareers(UpdateExternalCareerRequest request, List allExternalCareer) { + List oldList = allExternalCareer.stream() + .filter(savedAll -> request.newExternalCareers().stream() + .noneMatch(externalCareerRequest -> + savedAll.category().getCategoryId().equals(externalCareerRequest.categoryId()) && + savedAll.workCount().equals(externalCareerRequest.workCount()))) + .map(ExternalCareerResponse::externalCareerId) + .collect(Collectors.toList()); + return oldList; + } + + @NotNull + private static List filterNewExternalCareers(UpdateExternalCareerRequest request, List allExternalCareer, Map categoryMap, Account user) { + List newList = request.newExternalCareers().stream() + .filter(externalCareerRequest -> allExternalCareer.stream() + .noneMatch(savedAll -> + savedAll.category().getCategoryId().equals(externalCareerRequest.categoryId()) && + savedAll.workCount().equals(externalCareerRequest.workCount()))) + .map(updateRequest -> { + Category category = categoryMap.get(updateRequest.categoryId()); + if (category == null) { + throw new BusinessException(ErrorCode.CATEGORY_EXCEPTION); + } + return new ExternalCareer(user, category, updateRequest.workCount()); + }) + .collect(Collectors.toList()); + return newList; } } \ No newline at end of file diff --git a/src/main/java/com/example/api/board/service/CategoryService.java b/src/main/java/com/example/api/board/service/CategoryService.java index acc14687..a7f482ab 100644 --- a/src/main/java/com/example/api/board/service/CategoryService.java +++ b/src/main/java/com/example/api/board/service/CategoryService.java @@ -1,6 +1,6 @@ package com.example.api.board.service; -import com.example.api.board.dto.response.CategoryDTO; +import com.example.api.board.dto.response.FlavoredCategoryResponse; import com.example.api.domain.repository.CategoryRepository; import com.example.api.domain.Category; import lombok.RequiredArgsConstructor; @@ -16,10 +16,10 @@ public class CategoryService { private final CategoryRepository categoryRepository; @Transactional(readOnly = true) - public List getAllCategories() { + public List getAllCategories() { List categories = categoryRepository.findAll(); return categories.stream() - .map(category -> new CategoryDTO(category.getCategoryId(), category.getCategoryName())) + .map(category -> new FlavoredCategoryResponse(category.getCategoryId(), category.getCategoryName())) .collect(Collectors.toList()); } } diff --git a/src/main/java/com/example/api/board/service/EmployeeService.java b/src/main/java/com/example/api/board/service/EmployeeService.java index 08fbeda4..b7bedf9e 100644 --- a/src/main/java/com/example/api/board/service/EmployeeService.java +++ b/src/main/java/com/example/api/board/service/EmployeeService.java @@ -1,130 +1,55 @@ package com.example.api.board.service; +import com.example.api.account.repository.AccountRepository; import com.example.api.board.dto.request.EmployeeIdRequest; -import com.example.api.board.dto.response.CategoryDTO; -import com.example.api.board.dto.response.ExternalCareerDTO; -import com.example.api.board.dto.response.MyInfoDTO; -import com.example.api.board.dto.response.PossibleBoardDTO; -import com.example.api.board.dto.update.UpdateUserInfoRequest; +import com.example.api.board.dto.response.PersonalInfoResponse; +import com.example.api.board.dto.update.UpdatePersonalInfoRequest; import com.example.api.board.entitiy.update.UpdateAccountConditionManager; import com.example.api.domain.Account; -import com.example.api.domain.Category; -import com.example.api.domain.ExternalCareer; -import com.example.api.domain.Flavored; -import com.example.api.domain.PossibleBoard; -import com.example.api.domain.repository.EmployeeRepository; import com.example.api.domain.repository.ExternalCareerRepository; -import com.example.api.domain.repository.FlavoredRepository; -import com.example.api.exception.BusinessException; -import com.example.api.exception.ErrorCode; -import com.example.api.possbileboard.PossibleBoardRepository; +import com.example.api.domain.repository.FlavoredCategoryRepository; +import com.example.api.board.repository.PossibleBoardRepository; +import com.example.api.global.exception.BusinessException; +import com.example.api.global.exception.ErrorCode; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; - -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; - @Repository @RequiredArgsConstructor public class EmployeeService { - private final EmployeeRepository employeeRepository; + private final AccountRepository accountRepository; private final ExternalCareerRepository externalCareerRepository; - private final FlavoredRepository flavoredRepository; + private final FlavoredCategoryRepository flavoredRepository; private final PossibleBoardRepository possibleBoardRepository; private final UpdateAccountConditionManager updateAccountConditionManager; @Transactional public Boolean changeOpenStatus(final EmployeeIdRequest employeeIdRequest, boolean openStatus) { - return employeeRepository.findByAccountId(employeeIdRequest.employeeId()).map(employee -> { + return accountRepository.findByEmployeeId(employeeIdRequest.employeeId()).map(employee -> { employee.setOpenStatus(openStatus); - employeeRepository.save(employee); + accountRepository.save(employee); return true; }).orElse(false); } @Transactional - public void updateUserInfo(final EmployeeIdRequest employeeIdRequest, MyInfoDTO myInfo) { - try { - Account employee = employeeRepository.findByAccountId(employeeIdRequest.employeeId()).orElseThrow(); - updateAccountConditionManager.updateAccount(employee, getUpdateUserInfoRequest(myInfo)); - employeeRepository.save(employee); - updateExternalCareer(employee, myInfo.getExternalCareerList()); - updateFlavored(employee, myInfo.getFlavoredCategoryList()); - updatePossibleBoard(employee, myInfo.getPossibleBoardList()); - }catch (Exception e) { - throw new BusinessException(ErrorCode.NULL_USER); - } - } - private UpdateUserInfoRequest getUpdateUserInfoRequest(MyInfoDTO myInfo) { - return new UpdateUserInfoRequest( - myInfo.getName(), - myInfo.getSex(), - myInfo.getAge(), - myInfo.getPhone(), - myInfo.getEmail(), - myInfo.getNickname() - ); - } - public void updateExternalCareer(Account employee, List newExternalCareerList) { - List existList = externalCareerRepository.findAllByEmployeeAccountId(employee.getAccountId()); - Set newSet = new HashSet<>(newExternalCareerList); - - Set toDelete = existList.stream() - .filter(exist -> newSet.stream() - .noneMatch(newDto -> newDto.getName().equals(exist.getName()) && newDto.getPeriod().equals(exist.getPeriod()))) - .collect(Collectors.toSet()); - - Set toAdd = newExternalCareerList.stream() - .filter(dto -> existList.stream() - .noneMatch(exist -> exist.getName().equals(dto.getName()) && exist.getPeriod().equals(dto.getPeriod()))) - .map(dto -> new ExternalCareer(employee, dto.getName(), dto.getPeriod())) - .collect(Collectors.toSet()); - - externalCareerRepository.deleteAll(toDelete); - externalCareerRepository.saveAll(toAdd); + public PersonalInfoResponse updatePersonalInfo(final EmployeeIdRequest employeeIdRequest, final UpdatePersonalInfoRequest personalInfoRequest) { + Account employee = accountRepository.findByEmployeeId(employeeIdRequest.employeeId()).orElseThrow(() -> + new BusinessException(ErrorCode.NULL_USER)); + updateAccountConditionManager.updateAccount(employee, getUpdateUserInfoRequest(personalInfoRequest)); + accountRepository.save(employee); + return PersonalInfoResponse.of(employee); } - public void updateFlavored(Account employee, List newCategoryList) { - List existFlavored = flavoredRepository.findAllByEmployeeAccountId(employee.getAccountId()); - Set newCategoryIds = newCategoryList.stream() - .map(CategoryDTO::getCategoryId) - .collect(Collectors.toSet()); - - Set toDelete = existFlavored.stream() - .filter(exist -> !newCategoryIds.contains(exist.getCategory().getCategoryId())) - .collect(Collectors.toSet()); - - Set toAdd = newCategoryList.stream() - .filter(dto -> existFlavored.stream() - .noneMatch(flavored -> flavored.getCategory().getCategoryId().equals(dto.getCategoryId()))) - .map(dto -> new Flavored(new Category(dto.getCategoryId(), dto.getCategoryName()), employee)) - .collect(Collectors.toSet()); - - flavoredRepository.deleteAll(toDelete); - flavoredRepository.saveAll(toAdd); - } - public void updatePossibleBoard(Account employee, List newPossibleBoard) { - List existPossibleBoard = possibleBoardRepository.findAllByEmployeeAccountId(employee.getAccountId()); - Set newSet = new HashSet<>(newPossibleBoard); - - Set toDelete = existPossibleBoard.stream() - .filter(exist -> newSet.stream() - .noneMatch(newDto -> newDto.getStartTime().equals(exist.getStartTime()) - && newDto.getEndTime().equals(exist.getEndTime()))) - .collect(Collectors.toSet()); - - Set ToAdd = newSet.stream() - .filter(newDto -> existPossibleBoard.stream() - .noneMatch(exist -> newDto.getStartTime().equals(exist.getStartTime()) - && newDto.getEndTime().equals(exist.getEndTime()))) - .map(dto -> new PossibleBoard(employee, dto.getStartTime(), dto.getEndTime())) - .collect(Collectors.toSet()); - - possibleBoardRepository.deleteAll(toDelete); - possibleBoardRepository.saveAll(ToAdd); + private UpdatePersonalInfoRequest getUpdateUserInfoRequest(UpdatePersonalInfoRequest personalInfo) { + return new UpdatePersonalInfoRequest( + personalInfo.name(), + personalInfo.sex(), + personalInfo.age(), + personalInfo.phoneNumber(), + personalInfo.email(), + personalInfo.nickname() + ); } } \ No newline at end of file diff --git a/src/main/java/com/example/api/business/BusinessQueryService.java b/src/main/java/com/example/api/business/BusinessQueryService.java index daf1337a..664cf10e 100644 --- a/src/main/java/com/example/api/business/BusinessQueryService.java +++ b/src/main/java/com/example/api/business/BusinessQueryService.java @@ -7,8 +7,8 @@ import com.example.api.domain.Account; import com.example.api.domain.Business; import com.example.api.domain.BusinessCategory; -import com.example.api.exception.BusinessException; -import com.example.api.exception.ErrorCode; +import com.example.api.global.exception.BusinessException; +import com.example.api.global.exception.ErrorCode; import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; diff --git a/src/main/java/com/example/api/business/BusinessRepository.java b/src/main/java/com/example/api/business/BusinessRepository.java index b583c712..f772a2df 100644 --- a/src/main/java/com/example/api/business/BusinessRepository.java +++ b/src/main/java/com/example/api/business/BusinessRepository.java @@ -16,5 +16,5 @@ public interface BusinessRepository extends JpaRepository { Optional getDetails(@Param("businessId") final Long businessId); @Query("select new com.example.api.employer.controller.dto.EmployerBusinessesRequest(b.businessName, b.location) from Business b where b.employer.accountId = :employerId order by b.location.id") - List findBusinessesByEmployeeId(@Param("employerId")final Long employerId); + List findBusinessesByEmployerId(@Param("employerId")final Long employerId); } \ No newline at end of file diff --git a/src/main/java/com/example/api/business/controller/BusinessController.java b/src/main/java/com/example/api/business/controller/BusinessController.java index 55d9eb7a..ad7d1e50 100644 --- a/src/main/java/com/example/api/business/controller/BusinessController.java +++ b/src/main/java/com/example/api/business/controller/BusinessController.java @@ -1,6 +1,6 @@ package com.example.api.business.controller; -import com.example.api.account.entity.Location; +import com.example.api.business.domain.BusinessLocation; import com.example.api.business.BusinessQueryService; import com.example.api.business.BusinessService; import com.example.api.business.dto.AddBusinessCommand; @@ -53,7 +53,7 @@ public ResponseEntity addBusiness( record AddBusinessRequest( Long requestMemberId, String businessName, - Location location, + BusinessLocation location, List categoryIds, String representationName ) { @@ -66,7 +66,7 @@ record ModifyBusinessRequest( @NotNull Long businessId, String businessName, - Location location, + BusinessLocation location, String representationName, List categoryId ) { diff --git a/src/main/java/com/example/api/business/domain/BusinessLocation.java b/src/main/java/com/example/api/business/domain/BusinessLocation.java index 51990e53..5a5c2f06 100644 --- a/src/main/java/com/example/api/business/domain/BusinessLocation.java +++ b/src/main/java/com/example/api/business/domain/BusinessLocation.java @@ -1,13 +1,48 @@ package com.example.api.business.domain; -import com.example.api.account.entity.Location; +import com.example.api.domain.BaseEntity; +import com.fasterxml.jackson.annotation.JsonIgnore; +import jakarta.persistence.*; import lombok.Getter; +import lombok.ToString; +import java.util.Objects; + +@Entity @Getter -public class BusinessLocation { - private final Location location; +@ToString +public class BusinessLocation extends BaseEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "LOCATION_UNIQUE_ID") + @JsonIgnore + private Long id; + @Column(name = "LOCATION_ZIPCODE") + private String zipcode; + @Column(name = "LOCATION_ADDRESS") + private String address; + @Column(name = "LOCATION_DETAIL_ADDRESS") + private String detailAddress; + + public BusinessLocation() { + } + + public BusinessLocation(String zipcode, String address, String detailAddress) { + this.zipcode = zipcode; + this.address = address; + this.detailAddress = detailAddress; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + BusinessLocation location = (BusinessLocation) o; + return Objects.equals(id, location.id); + } - public BusinessLocation(Location location) { - this.location = location; + @Override + public int hashCode() { + return Objects.hash(id); } -} +} \ No newline at end of file diff --git a/src/main/java/com/example/api/business/domain/BusinessName.java b/src/main/java/com/example/api/business/domain/BusinessName.java index d1432f8c..12d7c3f9 100644 --- a/src/main/java/com/example/api/business/domain/BusinessName.java +++ b/src/main/java/com/example/api/business/domain/BusinessName.java @@ -1,7 +1,7 @@ package com.example.api.business.domain; -import com.example.api.exception.BusinessException; -import com.example.api.exception.ErrorCode; +import com.example.api.global.exception.BusinessException; +import com.example.api.global.exception.ErrorCode; import lombok.Getter; @Getter diff --git a/src/main/java/com/example/api/business/dto/AddBusinessCommand.java b/src/main/java/com/example/api/business/dto/AddBusinessCommand.java index 565ae71a..c90457bd 100644 --- a/src/main/java/com/example/api/business/dto/AddBusinessCommand.java +++ b/src/main/java/com/example/api/business/dto/AddBusinessCommand.java @@ -1,6 +1,6 @@ package com.example.api.business.dto; -import com.example.api.account.entity.Location; +import com.example.api.business.domain.BusinessLocation; import jakarta.validation.constraints.NotNull; import java.util.List; @@ -8,7 +8,7 @@ public record AddBusinessCommand( @NotNull Long requestMemberId, String businessName, - Location location, + BusinessLocation location, List categoryIds, String representationName diff --git a/src/main/java/com/example/api/business/dto/BusinessDetailsResponse.java b/src/main/java/com/example/api/business/dto/BusinessDetailsResponse.java index f036b2b4..c4ae776a 100644 --- a/src/main/java/com/example/api/business/dto/BusinessDetailsResponse.java +++ b/src/main/java/com/example/api/business/dto/BusinessDetailsResponse.java @@ -1,6 +1,6 @@ package com.example.api.business.dto; -import com.example.api.account.entity.Location; +import com.example.api.business.domain.BusinessLocation; import java.util.List; @@ -8,6 +8,6 @@ public record BusinessDetailsResponse( String businessName, Long businessId, BusinessOwner owner, - Location location, + BusinessLocation location, List categoryInfos) { } diff --git a/src/main/java/com/example/api/business/dto/ModifyBusinessCommand.java b/src/main/java/com/example/api/business/dto/ModifyBusinessCommand.java index 840694f7..2114f030 100644 --- a/src/main/java/com/example/api/business/dto/ModifyBusinessCommand.java +++ b/src/main/java/com/example/api/business/dto/ModifyBusinessCommand.java @@ -1,6 +1,6 @@ package com.example.api.business.dto; -import com.example.api.account.entity.Location; +import com.example.api.business.domain.BusinessLocation; import jakarta.validation.constraints.NotNull; import java.util.List; @@ -8,7 +8,7 @@ public record ModifyBusinessCommand( @NotNull Long businessId, String businessName, - Location location, + BusinessLocation location, String representationName, List categoryIds ) { diff --git a/src/main/java/com/example/api/business/update/UpdateBusinessCategoriesHandlerImpl.java b/src/main/java/com/example/api/business/update/UpdateBusinessCategoriesHandlerImpl.java index bd8a9a92..06f07462 100644 --- a/src/main/java/com/example/api/business/update/UpdateBusinessCategoriesHandlerImpl.java +++ b/src/main/java/com/example/api/business/update/UpdateBusinessCategoriesHandlerImpl.java @@ -6,8 +6,8 @@ import com.example.api.domain.Category; import com.example.api.domain.repository.BusinessCategoryRepository; import com.example.api.domain.repository.CategoryRepository; -import com.example.api.exception.BusinessException; -import com.example.api.exception.ErrorCode; +import com.example.api.global.exception.BusinessException; +import com.example.api.global.exception.ErrorCode; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; diff --git a/src/main/java/com/example/api/business/update/UpdateBusinessLocationHandler.java b/src/main/java/com/example/api/business/update/UpdateBusinessLocationHandler.java index 3ae94cc7..cdd6a37e 100644 --- a/src/main/java/com/example/api/business/update/UpdateBusinessLocationHandler.java +++ b/src/main/java/com/example/api/business/update/UpdateBusinessLocationHandler.java @@ -14,8 +14,11 @@ class UpdateBusinessLocationHandler implements BusinessUpdateHandler{ @Override public void update(Business business, ModifyBusinessCommand command) { if (Objects.nonNull(command.location())) { - final BusinessLocation location = new BusinessLocation(command.location()); - business.setLocation(location.getLocation()); + final BusinessLocation location = new BusinessLocation( + command.location().getZipcode(), + command.location().getAddress(), + command.location().getDetailAddress()); + business.setLocation(location); } } } diff --git a/src/main/java/com/example/api/contracts/ContractMapper.java b/src/main/java/com/example/api/contracts/ContractMapper.java index 17c2b95c..43e13a86 100644 --- a/src/main/java/com/example/api/contracts/ContractMapper.java +++ b/src/main/java/com/example/api/contracts/ContractMapper.java @@ -8,7 +8,7 @@ @Service @Transactional(propagation = Propagation.MANDATORY) -class ContractMapper { +public class ContractMapper { public Contract notYetSucceeded(final OfferEmployment offerEmployment) { return new Contract( offerEmployment, diff --git a/src/main/java/com/example/api/contracts/ContractRepository.java b/src/main/java/com/example/api/contracts/ContractRepository.java index a25d67f9..91e23e7e 100644 --- a/src/main/java/com/example/api/contracts/ContractRepository.java +++ b/src/main/java/com/example/api/contracts/ContractRepository.java @@ -4,7 +4,7 @@ import com.example.api.contracts.dto.EmployeeInfoDTO; import com.example.api.domain.Contract; import java.util.Optional; -import com.example.api.reviewavailable.dto.ReviewAvailableResponse; +import com.example.api.review.dto.ReviewAvailableResponse; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; @@ -33,7 +33,7 @@ public interface ContractRepository extends JpaRepository { @Query("SELECT c FROM Contract c JOIN FETCH c.offerEmployment JOIN FETCH c.offerEmployment.business.employer WHERE c.contractId = :contractId") Optional loadContractWithOfferEmployment(@Param("contractId") final Long contractId); - @Query("select new com.example.api.reviewavailable.dto." + + @Query("select new com.example.api.review.dto." + "ReviewAvailableResponse(e.accountId, e.name) " + "from Contract c " + "join c.offerEmployment oe " + diff --git a/src/main/java/com/example/api/contracts/ContractReviewService.java b/src/main/java/com/example/api/contracts/ContractReviewService.java index efd3a941..31979af3 100644 --- a/src/main/java/com/example/api/contracts/ContractReviewService.java +++ b/src/main/java/com/example/api/contracts/ContractReviewService.java @@ -4,9 +4,9 @@ import com.example.api.domain.Business; import com.example.api.domain.Contract; import com.example.api.domain.Review; -import com.example.api.exception.BusinessException; -import com.example.api.exception.ErrorCode; -import com.example.api.review.ReviewRepository; +import com.example.api.global.exception.BusinessException; +import com.example.api.global.exception.ErrorCode; +import com.example.api.review.repository.ReviewRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/src/main/java/com/example/api/contracts/ContractService.java b/src/main/java/com/example/api/contracts/ContractService.java index 2f80f4e3..dcf55dfb 100644 --- a/src/main/java/com/example/api/contracts/ContractService.java +++ b/src/main/java/com/example/api/contracts/ContractService.java @@ -18,33 +18,12 @@ @Service @RequiredArgsConstructor public class ContractService { - private final OfferRepository offerRepository; private final ContractRepository contractRepository; - 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) { - return offerRepository.queryEmployersSuggests(allSuggestsForMeCommand.employeeId()); - } - - @Transactional - public void acceptSuggest(@Validated final AcceptSuggestCommand acceptSuggestCommand) { - final OfferEmployment offerEmployment = loadOffer(acceptSuggestCommand.suggestId()); - offerEmployment.succeeded(); - - final Contract contract = contractMapper.notYetSucceeded(offerEmployment); - contractRepository.save(contract); - } - @Transactional - public void createChatRoom(@Validated final AcceptSuggestCommand acceptSuggestCommand) { - final OfferEmployment offerEmployment = loadOffer(acceptSuggestCommand.suggestId()); - createChatRoom(offerEmployment); - } @Transactional public void updateContract(@Validated final UpdateContractConditionCommand updateContractConditionCommand) { @@ -63,16 +42,6 @@ private Contract loadContract(final Long contractId) { .orElseThrow(); } - private OfferEmployment loadOffer(final Long offerId) { - return offerRepository.findById(offerId) - .orElseThrow(); - } - - private void createChatRoom(final OfferEmployment offer) { - ChatRoom chatRoom = new ChatRoom(offer); - chatRoomRepository.save(chatRoom); - } - @Transactional(readOnly = true) public ContractDTO getContractInfo(final AcceptContractCommand contractStatusCommand) { BusinessInfoDTO businessDTO = contractRepository.findBusinessDTOByContractId(contractStatusCommand.contractId()); diff --git a/src/main/java/com/example/api/contracts/ReviewQueryService.java b/src/main/java/com/example/api/contracts/ReviewQueryService.java index ca35d9b3..13620f54 100644 --- a/src/main/java/com/example/api/contracts/ReviewQueryService.java +++ b/src/main/java/com/example/api/contracts/ReviewQueryService.java @@ -5,7 +5,7 @@ import com.example.api.domain.Review; import java.util.List; -import com.example.api.review.ReviewRepository; +import com.example.api.review.repository.ReviewRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; 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..782e9105 100644 --- a/src/main/java/com/example/api/contracts/controller/ContractController.java +++ b/src/main/java/com/example/api/contracts/controller/ContractController.java @@ -1,48 +1,18 @@ 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 class ContractController { private final ContractService contractService; - @GetMapping("/api/v1/contracts/employment-suggests") - public ResponseEntity> getAllSuggest( - @RequestParam(required = true) final Long employeeId - ) { - final QueryAllSuggestsForMeCommand queryAllSuggestsForMeCommand = new QueryAllSuggestsForMeCommand(employeeId); - final List suggestedBusinesses = contractService.getAllRelatedSuggests( - queryAllSuggestsForMeCommand); - return ResponseEntity.ok(suggestedBusinesses); - } - - @PostMapping("/api/v1/contracts/suggests/{suggestId}/accept") - public ResponseEntity acceptContractContact( - @PathVariable(required = true) final Long suggestId - ) { - final AcceptSuggestCommand acceptSuggestCommand = new AcceptSuggestCommand(suggestId); - contractService.acceptSuggest(acceptSuggestCommand); - return ResponseEntity.ok(null); - } - @PutMapping("/api/v1/contracts/{contractId}") public ResponseEntity updateContractCondition( @PathVariable(required = true) final Long contractId, @@ -62,7 +32,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( diff --git a/src/main/java/com/example/api/contracts/dto/BusinessInfoDTO.java b/src/main/java/com/example/api/contracts/dto/BusinessInfoDTO.java index 7ea7942d..452ebdcc 100644 --- a/src/main/java/com/example/api/contracts/dto/BusinessInfoDTO.java +++ b/src/main/java/com/example/api/contracts/dto/BusinessInfoDTO.java @@ -1,6 +1,6 @@ package com.example.api.contracts.dto; -import com.example.api.account.entity.Location; +import com.example.api.business.domain.BusinessLocation; import lombok.*; import java.time.LocalDateTime; @@ -15,7 +15,7 @@ public class BusinessInfoDTO { private String representationName; private LocalDateTime startTime; private LocalDateTime endTime; - private Location location; + private BusinessLocation location; private String businessPhone; private LocalDateTime signedDate; } diff --git a/src/main/java/com/example/api/domain/Account.java b/src/main/java/com/example/api/domain/Account.java index 299ed3b6..cd4b60e9 100644 --- a/src/main/java/com/example/api/domain/Account.java +++ b/src/main/java/com/example/api/domain/Account.java @@ -4,7 +4,7 @@ import com.example.api.account.entity.UserRole; import com.example.api.auth.dto.LoginUserRequest; import com.example.api.board.dto.update.UpdateOpenStatusRequest; -import com.example.api.board.dto.update.UpdateUserInfoRequest; +import com.example.api.board.dto.update.UpdatePersonalInfoRequest; import jakarta.persistence.*; import lombok.Getter; @@ -114,7 +114,7 @@ public void updateOpenStatus(UpdateOpenStatusRequest request){ this.openStatus = request.openStatus(); } - public void updateUserInfo(UpdateUserInfoRequest request){ + public void updateUserInfo(UpdatePersonalInfoRequest request){ this.name = request.name(); this.sex = request.sex(); this.age = request.age(); diff --git a/src/main/java/com/example/api/domain/Business.java b/src/main/java/com/example/api/domain/Business.java index ef593a92..72f9bb9c 100644 --- a/src/main/java/com/example/api/domain/Business.java +++ b/src/main/java/com/example/api/domain/Business.java @@ -1,6 +1,6 @@ package com.example.api.domain; -import com.example.api.account.entity.Location; +import com.example.api.business.domain.BusinessLocation; import jakarta.persistence.*; import lombok.EqualsAndHashCode; import lombok.Getter; @@ -34,7 +34,7 @@ public class Business extends BaseEntity { @OneToOne(fetch = LAZY) @JoinColumn(name = "BUSINESS_LOCATION", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) - private Location location; + private BusinessLocation location; private String representationName; @@ -48,7 +48,7 @@ public void setBusinessName(String businessName) { this.businessName = businessName; } - public void setLocation(Location location) { + public void setLocation(BusinessLocation location) { this.location = location; } @@ -56,13 +56,13 @@ public void setRepresentationName(String representationName) { this.representationName = representationName; } - public Business(String businessName, Location location, String representationName) { + public Business(String businessName, BusinessLocation location, String representationName) { this.businessName = businessName; this.location = location; this.representationName = representationName; } - public Business(Account user, String businessRegistrationNumber, String businessName, String representationName, String businessOpenDate, Location location) { + public Business(Account user, String businessRegistrationNumber, String businessName, String representationName, String businessOpenDate, BusinessLocation location) { this.employer = user; this.registrationNumber = businessRegistrationNumber; this.businessName = businessName; @@ -71,7 +71,7 @@ public Business(Account user, String businessRegistrationNumber, String business this.location = location; } - public Business(String businessName, Location location, String representationName, Account employer, LocalDate openDate, String registrationNumber) { + public Business(String businessName, BusinessLocation location, String representationName, Account employer, LocalDate openDate, String registrationNumber) { this.businessName = businessName; this.location = location; this.representationName = representationName; @@ -80,7 +80,7 @@ public Business(String businessName, Location location, String representationNam this.registrationNumber = registrationNumber; } - public Business(Account employer, String businessName, Location location) { + public Business(Account employer, String businessName, BusinessLocation location) { this.employer = employer; this.businessName = businessName; this.location = location; diff --git a/src/main/java/com/example/api/domain/Category.java b/src/main/java/com/example/api/domain/Category.java index c229dcd8..e4410426 100644 --- a/src/main/java/com/example/api/domain/Category.java +++ b/src/main/java/com/example/api/domain/Category.java @@ -3,14 +3,12 @@ import jakarta.persistence.*; import lombok.EqualsAndHashCode; import lombok.Getter; -import lombok.Setter; - -import java.util.ArrayList; -import java.util.List; +import lombok.NoArgsConstructor; @Entity @Getter @EqualsAndHashCode(callSuper = false) +@NoArgsConstructor @Table(name = "CATEGORY") public class Category extends BaseEntity{ @Id @@ -21,15 +19,7 @@ public class Category extends BaseEntity{ @Column(name = "CATEGORY_NAME") private String categoryName; - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "ACCOUNT_UNIQUE_ID") - private Account account; - - public Category() { - } - - public Category(Long categoryId, String categoryName) { - this.categoryId = categoryId; + public Category(String categoryName) { this.categoryName = categoryName; } } \ No newline at end of file diff --git a/src/main/java/com/example/api/domain/CityDistrict.java b/src/main/java/com/example/api/domain/CityDistrict.java new file mode 100644 index 00000000..d96cb4aa --- /dev/null +++ b/src/main/java/com/example/api/domain/CityDistrict.java @@ -0,0 +1,21 @@ +package com.example.api.domain; + +import jakarta.persistence.*; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Getter +@NoArgsConstructor +public class CityDistrict extends BaseEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "CITY_DISTRICT_ID") + private Long id; + + private String district; + + public CityDistrict(String district) { + this.district = district; + } +} \ No newline at end of file diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index c8afba88..9dc10cf7 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -5,13 +5,14 @@ import jakarta.persistence.*; import lombok.EqualsAndHashCode; import lombok.Getter; +import lombok.NoArgsConstructor; import lombok.Setter; import static jakarta.persistence.FetchType.*; @Entity @Getter -@EqualsAndHashCode(callSuper = false) +@NoArgsConstructor @Table(name = "EXTERNAL_CAREER") public class ExternalCareer extends BaseEntity{ @Id @@ -19,23 +20,21 @@ public class ExternalCareer extends BaseEntity{ private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "employee_id", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) + @JoinColumn(name = "EMPLOYEE_ID", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) + @EqualsAndHashCode.Include @JsonIgnore private Account employee; + @ManyToOne(fetch = LAZY) + @JoinColumn(name = "CATEGPRY_ID", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) @EqualsAndHashCode.Include - @Column(name = "BUSINESS_NAME") - private String Name; - @EqualsAndHashCode.Include - @Column(name = "PART_TIME_PERIOD") - private String period; + private Category category; - public ExternalCareer(Account employee, String name, String period) { - this.employee = employee; - Name = name; - this.period = period; - } + private int workCount; - public ExternalCareer() { + public ExternalCareer(Account employee, Category category, int workCount) { + this.employee = employee; + this.category = category; + this.workCount = workCount; } } \ No newline at end of file diff --git a/src/main/java/com/example/api/domain/Flavored.java b/src/main/java/com/example/api/domain/FlavoredCategory.java similarity index 51% rename from src/main/java/com/example/api/domain/Flavored.java rename to src/main/java/com/example/api/domain/FlavoredCategory.java index 83db3fa2..9ab9cc65 100644 --- a/src/main/java/com/example/api/domain/Flavored.java +++ b/src/main/java/com/example/api/domain/FlavoredCategory.java @@ -3,34 +3,32 @@ import jakarta.persistence.*; import lombok.EqualsAndHashCode; import lombok.Getter; -import lombok.Setter; +import lombok.NoArgsConstructor; import static jakarta.persistence.FetchType.*; @Entity @Getter @EqualsAndHashCode(callSuper = false) -@Table(name = "flavored", uniqueConstraints = { - @UniqueConstraint(columnNames = {"employee_id", "category_id"}) +@NoArgsConstructor +@Table(name = "FLAVORED_CATEGORY", uniqueConstraints = { + @UniqueConstraint(columnNames = {"EMPLOYEE_ID", "CATEGORY_ID"}) }) -public class Flavored extends BaseEntity{ +public class FlavoredCategory extends BaseEntity{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "FLAVORED_ID") - private Long flavoredId; + @Column(name = "FLAVORED_CATEGORY_ID") + private Long flavoredCategoryId; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "category_id", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) + @JoinColumn(name = "CATEGORY_ID", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) private Category category; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "employee_id", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) + @JoinColumn(name = "EMPLOYEE_ID", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) private Account employee; - public Flavored() { - } - - public Flavored(Category category, Account employee) { + public FlavoredCategory(Category category, Account employee) { this.category = category; this.employee = employee; } diff --git a/src/main/java/com/example/api/domain/FlavoredDistrict.java b/src/main/java/com/example/api/domain/FlavoredDistrict.java new file mode 100644 index 00000000..3be4389b --- /dev/null +++ b/src/main/java/com/example/api/domain/FlavoredDistrict.java @@ -0,0 +1,33 @@ +package com.example.api.domain; + +import jakarta.persistence.*; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import static jakarta.persistence.FetchType.LAZY; + +@Entity +@Getter +@NoArgsConstructor +@Table(name = "FLAVORED_DISTRICT", uniqueConstraints = { + @UniqueConstraint(columnNames = {"EMPLOYEE_ID", "CITY_DISTRICT_ID"}) +}) +public class FlavoredDistrict extends BaseEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "FLAVORED_DISTRICT_ID") + private Long id; + + @ManyToOne(fetch = LAZY) + @JoinColumn(name = "CITY_DISTRICT_ID", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) + private CityDistrict district; + + @ManyToOne(fetch = LAZY) + @JoinColumn(name = "EMPLOYEE_ID", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) + private Account employee; + + public FlavoredDistrict(CityDistrict district, Account employee) { + this.district = district; + this.employee = employee; + } +} \ No newline at end of file diff --git a/src/main/java/com/example/api/domain/repository/EmployeeRepository.java b/src/main/java/com/example/api/domain/repository/EmployeeRepository.java deleted file mode 100644 index f8639357..00000000 --- a/src/main/java/com/example/api/domain/repository/EmployeeRepository.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.example.api.domain.repository; - -import com.example.api.domain.Account; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.repository.query.Param; -import org.springframework.stereotype.Repository; - -import java.util.Optional; - -@Repository -public interface EmployeeRepository extends JpaRepository { - Optional findByAccountId(@Param("employeeId") Long employeeId); -} diff --git a/src/main/java/com/example/api/domain/repository/ExternalCareerRepository.java b/src/main/java/com/example/api/domain/repository/ExternalCareerRepository.java index 18449a97..492dbac0 100644 --- a/src/main/java/com/example/api/domain/repository/ExternalCareerRepository.java +++ b/src/main/java/com/example/api/domain/repository/ExternalCareerRepository.java @@ -1,6 +1,6 @@ package com.example.api.domain.repository; -import com.example.api.board.dto.response.ExternalCareerDTO; +import com.example.api.board.dto.response.ExternalCareerResponse; import com.example.api.domain.ExternalCareer; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; @@ -11,9 +11,7 @@ @Repository public interface ExternalCareerRepository extends JpaRepository { - @Query("select new com.example.api.board.dto.response.ExternalCareerDTO(e.id, e.Name, e.period) " + + @Query("select new com.example.api.board.dto.response.ExternalCareerResponse(e.id, e.category, e.workCount) " + "from ExternalCareer e where e.employee.accountId = :employeeId") - List findAllDTOByEmployeeAccountId(@Param("employeeId") Long employeeId); - - List findAllByEmployeeAccountId(@Param("employeeId")Long employeeId); + List findAllByEmployeeId(@Param("employeeId") Long employeeId); } diff --git a/src/main/java/com/example/api/domain/repository/FlavoredCategoryRepository.java b/src/main/java/com/example/api/domain/repository/FlavoredCategoryRepository.java new file mode 100644 index 00000000..b3ae1cd7 --- /dev/null +++ b/src/main/java/com/example/api/domain/repository/FlavoredCategoryRepository.java @@ -0,0 +1,34 @@ +package com.example.api.domain.repository; + +import com.example.api.board.dto.response.FlavoredCategoryResponse; +import com.example.api.domain.FlavoredCategory; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface FlavoredCategoryRepository extends JpaRepository { + @Query("select distinct new com.example.api.board.dto.response.FlavoredCategoryResponse(c.categoryId, c.categoryName) " + + "from FlavoredCategory f join Category c on f.category.categoryId = c.categoryId where f.employee.accountId = :employeeId") + List findAllByEmployeeId(@Param("employeeId") long employeeId); + + @Modifying + @Query("DELETE FROM FlavoredCategory fc WHERE fc.category.categoryId NOT IN :ids AND fc.employee.accountId = :employeeId") + void deleteByNotInIds(@Param("employeeId") Long employeeId, @Param("ids") List ids); + + @Modifying + @Query(value = "INSERT INTO FLAVORED_CATEGORY (category_id, employee_id) " + + "SELECT temp.category_id, :accountId " + + "FROM JSON_TABLE(:categoryIds, '$[*]' COLUMNS (category_id BIGINT PATH '$')) AS temp " + + "WHERE NOT EXISTS (" + + " SELECT 1 FROM FLAVORED_CATEGORY " + + " WHERE FLAVORED_CATEGORY.category_id = temp.category_id " + + " AND FLAVORED_CATEGORY.employee_id = :accountId" + + ")", + nativeQuery = true) + void saveDistrictIds(@Param("accountId") Long accountId, @Param("categoryIds") String categoryIds); +} diff --git a/src/main/java/com/example/api/domain/repository/FlavoredDistrictRepository.java b/src/main/java/com/example/api/domain/repository/FlavoredDistrictRepository.java new file mode 100644 index 00000000..bed3886d --- /dev/null +++ b/src/main/java/com/example/api/domain/repository/FlavoredDistrictRepository.java @@ -0,0 +1,32 @@ +package com.example.api.domain.repository; + +import com.example.api.board.dto.response.FlavoredDistrictResponse; +import com.example.api.domain.FlavoredDistrict; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +import java.util.List; + +public interface FlavoredDistrictRepository extends JpaRepository { + @Query("select new com.example.api.board.dto.response.FlavoredCategoryResponse(fd.district.id, fd.district.district) " + + "from FlavoredDistrict fd where fd.employee.accountId = :employeeId") + List findAllByEmployeeId(Long employeeId); + + @Modifying + @Query("DELETE FROM FlavoredDistrict p WHERE p.id NOT IN :ids AND p.employee.accountId = :employeeId") + void deleteByNotInIds(@Param("employeeId") Long employeeId, @Param("ids") List ids); + + @Modifying + @Query(value = "INSERT INTO FLAVORED_DISTRICT (CITY_DISTRICT_ID, EMPLOYEE_ID) " + + "SELECT temp.district_id, :accountId " + + "FROM JSON_TABLE(:districtIds, '$[*]' COLUMNS (district_id BIGINT PATH '$')) AS temp " + + "WHERE NOT EXISTS (" + + " SELECT 1 FROM FLAVORED_DISTRICT " + + " WHERE FLAVORED_DISTRICT.CITY_DISTRICT_ID = temp.district_id " + + " AND FLAVORED_DISTRICT.EMPLOYEE_ID = :accountId" + + ")", + nativeQuery = true) + void saveDistrictIds(@Param("accountId") Long accountId, @Param("districtIds") String districtIds); +} \ No newline at end of file diff --git a/src/main/java/com/example/api/domain/repository/FlavoredRepository.java b/src/main/java/com/example/api/domain/repository/FlavoredRepository.java deleted file mode 100644 index 752fd5a4..00000000 --- a/src/main/java/com/example/api/domain/repository/FlavoredRepository.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.example.api.domain.repository; - -import com.example.api.board.dto.response.CategoryDTO; -import com.example.api.domain.Flavored; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; -import org.springframework.stereotype.Repository; - -import java.util.List; - -@Repository -public interface FlavoredRepository extends JpaRepository { - @Query("select distinct new com.example.api.board.dto.response.CategoryDTO(c.categoryId, c.categoryName) " + - "from Flavored f join Category c on f.category.categoryId = c.categoryId where f.employee.accountId = :employeeId") - List findAllCategoryDTOByEmployeeId(@Param("employeeId") long employeeId); - - List findAllByEmployeeAccountId(@Param("employeeId")Long employeeId); -} diff --git a/src/main/java/com/example/api/domain/repository/MyInfoRepository.java b/src/main/java/com/example/api/domain/repository/MyInfoRepository.java index d6d9555d..48123abe 100644 --- a/src/main/java/com/example/api/domain/repository/MyInfoRepository.java +++ b/src/main/java/com/example/api/domain/repository/MyInfoRepository.java @@ -1,6 +1,6 @@ package com.example.api.domain.repository; -import com.example.api.board.dto.response.MyInfoDTO; +import com.example.api.board.dto.response.PersonalInfoResponse; import com.example.api.domain.Account; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; @@ -10,8 +10,8 @@ @Repository public interface MyInfoRepository extends JpaRepository { @Query("select new com.example.api.board.dto.response." + - "MyInfoDTO(a.name, a.nickname, a.age, a.sex, a.email, a.phoneNumber, a.starPoint, a.workCount) " + + "PersonalInfoResponse(a.name, a.nickname, a.age, a.sex, a.email, a.phoneNumber, a.starPoint, a.workCount) " + "from Account a " + "where a.accountId = :EmployeeId") - MyInfoDTO findMyInfoDTOById(@Param("EmployeeId") Long EmployeeId); + PersonalInfoResponse findMyInfoDTOById(@Param("EmployeeId") Long EmployeeId); } diff --git a/src/main/java/com/example/api/domain/repository/OfferEmploymentRepository.java b/src/main/java/com/example/api/domain/repository/OfferEmploymentRepository.java index 99b89712..1322fe32 100644 --- a/src/main/java/com/example/api/domain/repository/OfferEmploymentRepository.java +++ b/src/main/java/com/example/api/domain/repository/OfferEmploymentRepository.java @@ -1,8 +1,7 @@ package com.example.api.domain.repository; -import com.example.api.board.dto.response.InnerCareerDTO; +import com.example.api.board.dto.response.InternalCareerResponse; import com.example.api.domain.OfferEmployment; -import jakarta.validation.constraints.NotNull; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; @@ -13,13 +12,12 @@ @Repository public interface OfferEmploymentRepository extends JpaRepository { - @Query("select new com.example.api.board.dto.response.InnerCareerDTO(b.businessName, c.contractStartTime, b.representationName, r) " + + @Query("select new com.example.api.board.dto.response.InternalCareerResponse(o.suggestId, b.businessName, c.contractStartTime, c.contractEndTime) " + "from OfferEmployment o " + "join Contract c on o.suggestId = c.contractId " + "join Business b on o.business.businessId = b.businessId "+ - "join Review r on o.suggestId = r.reviewId " + "where o.employee.accountId = :employeeId") - List findAllDTOByEmployeeId(@Param("employeeId") long employeeId); + List findAllByEmployeeId(@Param("employeeId") long employeeId); List findAllByBusinessBusinessId(long businessId); diff --git a/src/main/java/com/example/api/employer/controller/EmployerController.java b/src/main/java/com/example/api/employer/controller/EmployerController.java index 5b5c2334..45e57208 100644 --- a/src/main/java/com/example/api/employer/controller/EmployerController.java +++ b/src/main/java/com/example/api/employer/controller/EmployerController.java @@ -1,34 +1,33 @@ package com.example.api.employer.controller; -import com.example.api.board.dto.request.EmployeeIdRequest; import com.example.api.employer.controller.dto.EmployerBusinessesRequest; +import com.example.api.employer.controller.dto.EmployerIdRequest; import com.example.api.employer.controller.dto.LikeEmployeeDTO; import com.example.api.employer.service.EmployerService; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; import java.util.List; -@RestController("/api/v1/employees/") +@RestController("/api/v1/employer/") @RequiredArgsConstructor public class EmployerController { private final EmployerService employerService; - @GetMapping("favorites") + @GetMapping("favorites/employees") public ResponseEntity getLikeEmployee(@AuthenticationPrincipal final Long employerId) { - EmployeeIdRequest employeeIdRequest = new EmployeeIdRequest(employerId); - List result = employerService.getLikeEmployee(employeeIdRequest); + EmployerIdRequest employerIdRequest = new EmployerIdRequest(employerId); + List result = employerService.getLikeEmployee(employerIdRequest); return ResponseEntity.ok(result); } @GetMapping("businesses") - public ResponseEntity getEmployeeBusinessList(@AuthenticationPrincipal final Long employerId) { - EmployeeIdRequest employeeIdRequest = new EmployeeIdRequest(employerId); - List businesses = employerService.getEmployerBusinessList(employeeIdRequest); + public ResponseEntity getBusinessList(@AuthenticationPrincipal final Long employerId) { + EmployerIdRequest employerIdRequest = new EmployerIdRequest(employerId); + List businesses = employerService.getEmployerBusinessList(employerIdRequest); return ResponseEntity.ok(businesses); } } diff --git a/src/main/java/com/example/api/employer/controller/dto/EmployerBusinessesRequest.java b/src/main/java/com/example/api/employer/controller/dto/EmployerBusinessesRequest.java index 975bb7f6..44f11700 100644 --- a/src/main/java/com/example/api/employer/controller/dto/EmployerBusinessesRequest.java +++ b/src/main/java/com/example/api/employer/controller/dto/EmployerBusinessesRequest.java @@ -1,10 +1,10 @@ package com.example.api.employer.controller.dto; -import com.example.api.account.entity.Location; +import com.example.api.business.domain.BusinessLocation; import jakarta.validation.constraints.NotNull; public record EmployerBusinessesRequest( @NotNull String businessName, - @NotNull Location businessLocation + @NotNull BusinessLocation businessLocation ) { } \ No newline at end of file diff --git a/src/main/java/com/example/api/employer/controller/dto/EmployerIdRequest.java b/src/main/java/com/example/api/employer/controller/dto/EmployerIdRequest.java new file mode 100644 index 00000000..ed7f578e --- /dev/null +++ b/src/main/java/com/example/api/employer/controller/dto/EmployerIdRequest.java @@ -0,0 +1,4 @@ +package com.example.api.employer.controller.dto; + +public record EmployerIdRequest(Long employerId) { +} diff --git a/src/main/java/com/example/api/employer/controller/dto/LikeEmployeeDTO.java b/src/main/java/com/example/api/employer/controller/dto/LikeEmployeeDTO.java index 8243278e..01e7e31f 100644 --- a/src/main/java/com/example/api/employer/controller/dto/LikeEmployeeDTO.java +++ b/src/main/java/com/example/api/employer/controller/dto/LikeEmployeeDTO.java @@ -1,7 +1,7 @@ package com.example.api.employer.controller.dto; -import com.example.api.board.dto.response.CategoryDTO; -import com.example.api.board.dto.response.ExternalCareerDTO; +import com.example.api.board.dto.response.ExternalCareerResponse; +import com.example.api.board.dto.response.FlavoredCategoryResponse; import lombok.AllArgsConstructor; import lombok.EqualsAndHashCode; import lombok.Getter; @@ -21,6 +21,6 @@ public class LikeEmployeeDTO { private int age; private float starPoint; private long workCount; - private List externalCareerList; - private List flavoredCategoryList; + private List externalCareerList; + private List flavoredCategoryList; } diff --git a/src/main/java/com/example/api/employer/service/EmployerService.java b/src/main/java/com/example/api/employer/service/EmployerService.java index 5549a433..1f64f40f 100644 --- a/src/main/java/com/example/api/employer/service/EmployerService.java +++ b/src/main/java/com/example/api/employer/service/EmployerService.java @@ -1,12 +1,12 @@ package com.example.api.employer.service; -import com.example.api.board.dto.request.EmployeeIdRequest; +import com.example.api.account.repository.AccountRepository; import com.example.api.business.BusinessRepository; -import com.example.api.domain.repository.EmployeeRepository; import com.example.api.domain.repository.ExternalCareerRepository; -import com.example.api.domain.repository.FlavoredRepository; +import com.example.api.domain.repository.FlavoredCategoryRepository; import com.example.api.domain.Account; import com.example.api.employer.controller.dto.EmployerBusinessesRequest; +import com.example.api.employer.controller.dto.EmployerIdRequest; import com.example.api.employer.controller.dto.LikeEmployeeDTO; import com.example.api.employer.repository.ScrapRepository; import lombok.RequiredArgsConstructor; @@ -21,14 +21,14 @@ @RequiredArgsConstructor public class EmployerService { private final ScrapRepository scrapRepository; - private final EmployeeRepository employeeRepository; + private final AccountRepository employeeRepository; private final ExternalCareerRepository externalCareerRepository; - private final FlavoredRepository flavoredRepository; + private final FlavoredCategoryRepository flavoredRepository; private final BusinessRepository businessRepository; @Transactional(readOnly = true) - public List getLikeEmployee(final EmployeeIdRequest employeeIdRequest) { - Set employeeIds = scrapRepository.findAllByEmployerId(employeeIdRequest.employeeId()).stream() + public List getLikeEmployee(final EmployerIdRequest employerIdRequest) { + Set employeeIds = scrapRepository.findAllByEmployerId(employerIdRequest.employerId()).stream() .map(scrap -> scrap.getEmployee().getAccountId()) .collect(Collectors.toSet()); List likeEmployeeList = employeeRepository.findAllById(employeeIds); @@ -41,14 +41,14 @@ public List getLikeEmployee(final EmployeeIdRequest employeeIdR employee.getAge(), employee.getStarPoint(), employee.getWorkCount(), - externalCareerRepository.findAllDTOByEmployeeAccountId(employee.getAccountId()), - flavoredRepository.findAllCategoryDTOByEmployeeId(employee.getAccountId()) + externalCareerRepository.findAllByEmployeeId(employee.getAccountId()), + flavoredRepository.findAllByEmployeeId(employee.getAccountId()) ) ).collect(Collectors.toList()); } @Transactional(readOnly = true) - public List getEmployerBusinessList(final EmployeeIdRequest employeeIdRequest) { - return businessRepository.findBusinessesByEmployeeId(employeeIdRequest.employeeId()); + public List getEmployerBusinessList(final EmployerIdRequest employerIdRequest) { + return businessRepository.findBusinessesByEmployerId(employerIdRequest.employerId()); } -} +} \ No newline at end of file diff --git a/src/main/java/com/example/api/global/config/filter/JwtAuthenticationFilter.java b/src/main/java/com/example/api/global/config/filter/JwtAuthenticationFilter.java index 2745a4c7..9be0c740 100644 --- a/src/main/java/com/example/api/global/config/filter/JwtAuthenticationFilter.java +++ b/src/main/java/com/example/api/global/config/filter/JwtAuthenticationFilter.java @@ -3,8 +3,8 @@ import com.example.api.auth.entitiy.JwtAuthenticationProvider; import com.example.api.auth.entitiy.JwtAuthenticationToken; import com.example.api.auth.service.JwtTokenProvider; -import com.example.api.exception.BusinessException; -import com.example.api.exception.ErrorCode; +import com.example.api.global.exception.BusinessException; +import com.example.api.global.exception.ErrorCode; import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.servlet.FilterChain; import jakarta.servlet.ServletException; diff --git a/src/main/java/com/example/api/exception/ApiExceptionHandler.java b/src/main/java/com/example/api/global/exception/ApiExceptionHandler.java similarity index 95% rename from src/main/java/com/example/api/exception/ApiExceptionHandler.java rename to src/main/java/com/example/api/global/exception/ApiExceptionHandler.java index e9c30a83..96d4bb19 100644 --- a/src/main/java/com/example/api/exception/ApiExceptionHandler.java +++ b/src/main/java/com/example/api/global/exception/ApiExceptionHandler.java @@ -1,4 +1,4 @@ -package com.example.api.exception; +package com.example.api.global.exception; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ExceptionHandler; diff --git a/src/main/java/com/example/api/exception/BusinessException.java b/src/main/java/com/example/api/global/exception/BusinessException.java similarity index 90% rename from src/main/java/com/example/api/exception/BusinessException.java rename to src/main/java/com/example/api/global/exception/BusinessException.java index c765788e..839138e7 100644 --- a/src/main/java/com/example/api/exception/BusinessException.java +++ b/src/main/java/com/example/api/global/exception/BusinessException.java @@ -1,4 +1,4 @@ -package com.example.api.exception; +package com.example.api.global.exception; public class BusinessException extends RuntimeException{ private final ErrorCode errorCode; diff --git a/src/main/java/com/example/api/exception/ErrorCode.java b/src/main/java/com/example/api/global/exception/ErrorCode.java similarity index 98% rename from src/main/java/com/example/api/exception/ErrorCode.java rename to src/main/java/com/example/api/global/exception/ErrorCode.java index 68878d72..9f86ad2e 100644 --- a/src/main/java/com/example/api/exception/ErrorCode.java +++ b/src/main/java/com/example/api/global/exception/ErrorCode.java @@ -1,4 +1,4 @@ -package com.example.api.exception; +package com.example.api.global.exception; import lombok.Getter; import org.springframework.http.HttpStatus; diff --git a/src/main/java/com/example/api/exception/ExceptionResponseBody.java b/src/main/java/com/example/api/global/exception/ExceptionResponseBody.java similarity index 97% rename from src/main/java/com/example/api/exception/ExceptionResponseBody.java rename to src/main/java/com/example/api/global/exception/ExceptionResponseBody.java index ae905606..b58331d2 100644 --- a/src/main/java/com/example/api/exception/ExceptionResponseBody.java +++ b/src/main/java/com/example/api/global/exception/ExceptionResponseBody.java @@ -1,4 +1,4 @@ -package com.example.api.exception; +package com.example.api.global.exception; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/src/main/java/com/example/api/global/response/CustomResponseDto.java b/src/main/java/com/example/api/global/response/CustomResponseDto.java new file mode 100644 index 00000000..b6a4beb4 --- /dev/null +++ b/src/main/java/com/example/api/global/response/CustomResponseDto.java @@ -0,0 +1,4 @@ +package com.example.api.global.response; + +public record CustomResponseDto(String code, T result) { +} diff --git a/src/main/java/com/example/api/global/response/SuccessResponse.java b/src/main/java/com/example/api/global/response/SuccessResponse.java new file mode 100644 index 00000000..3c356799 --- /dev/null +++ b/src/main/java/com/example/api/global/response/SuccessResponse.java @@ -0,0 +1,19 @@ +package com.example.api.global.response; + +import com.example.api.global.response.success.SuccessCode; +import org.springframework.http.ResponseEntity; + +public class SuccessResponse extends ResponseEntity { + public SuccessResponse(final SuccessCode successCode, final T result) { + super(new CustomResponseDto(successCode.getCode(), result), successCode.getHttpStatus()); + } + + public static SuccessResponse of(final SuccessCode successCode, final T result) { + return new SuccessResponse<>(successCode, result); + } + + public static SuccessResponse of(final SuccessCode successCode) { + return new SuccessResponse(successCode, successCode.getMessage()); + } + +} diff --git a/src/main/java/com/example/api/global/response/success/AccountSuccess.java b/src/main/java/com/example/api/global/response/success/AccountSuccess.java new file mode 100644 index 00000000..7ec7bcf3 --- /dev/null +++ b/src/main/java/com/example/api/global/response/success/AccountSuccess.java @@ -0,0 +1,37 @@ +package com.example.api.global.response.success; + +import org.springframework.http.HttpStatus; + +public enum AccountSuccess implements SuccessCode{ + SEND_EMAIL_SUCCESS(HttpStatus.OK, "ACCOUNT001", "이메일 전송에 성공했습니다."), + VERIFY_EMAIL_SUCCESS(HttpStatus.OK, "ACCOUNT002", "이메일 전송에 성공했습니다."), + SIGN_UP_EMPLOYER_SUCCESS(HttpStatus.OK, "ACCOUNT003", "알바생 회원가입에 성공했습니다."), + VERIFY_BUSINESS_NUMBER_SUCCESS(HttpStatus.OK, "ACCOUNT004", "사업자 번호 인증에 성공했습니다."), + SIGN_UP_EMPLOYEE_SUCCESS(HttpStatus.OK, "ACCOUNT005", "사업자 회원가입에 성공했습니다."), + DELETE_ACCOUNT_SUCCESS(HttpStatus.OK, "ACCOUNT006", "사용자 삭제에 성공했습니다."); + + private final HttpStatus httpStatus; + private final String code; + private final String message; + + AccountSuccess(final HttpStatus httpStatus, final String code, final String message) { + this.httpStatus = httpStatus; + this.code = code; + this.message = message; + } + + @Override + public HttpStatus getHttpStatus() { + return httpStatus; + } + + @Override + public String getCode() { + return code; + } + + @Override + public String getMessage() { + return message; + } +} diff --git a/src/main/java/com/example/api/global/response/success/AnnouncementSuccessCode.java b/src/main/java/com/example/api/global/response/success/AnnouncementSuccessCode.java new file mode 100644 index 00000000..ef1dee02 --- /dev/null +++ b/src/main/java/com/example/api/global/response/success/AnnouncementSuccessCode.java @@ -0,0 +1,37 @@ +package com.example.api.global.response.success; + +import org.springframework.http.HttpStatus; + +public enum AnnouncementSuccessCode implements SuccessCode { + CREATE_ANNOUNCEMENT_SUCCESS(HttpStatus.OK, "ANNOUNCEMENT001", "공지 생성에 성공했습니다."), + LOOK_UP_ANNOUNCEMENTS_SUCCESS(HttpStatus.OK, "ANNOUNCEMENT002", "공지 리스트에 성공했습니다."), + LOOK_UP_SINGLE_ANNOUNCEMENT_SUCCESS(HttpStatus.OK, "ANNOUNCEMENT003", "단일 공지 조회에 성공했습니다."), + UPDATE_ANNOUNCEMENT_SUCCESS(HttpStatus.OK, "ANNOUNCEMENT004", "공지 업데이트에 성공했습니다."), + DELETE_ANNOUNCEMENT_SUCCESS(HttpStatus.OK, "ANNOUNCEMENT005", "공지 삭제에 성공했습니다."), + SEARCH_ANNOUNCEMENT_SUCCESS(HttpStatus.OK, "ANNOUNCEMENT006", "공지 검색에 성공했습니다."); + + private final HttpStatus httpStatus; + private final String code; + private final String message; + + AnnouncementSuccessCode(final HttpStatus httpStatus, final String code, final String message) { + this.httpStatus = httpStatus; + this.code = code; + this.message = message; + } + + @Override + public HttpStatus getHttpStatus() { + return httpStatus; + } + + @Override + public String getCode() { + return code; + } + + @Override + public String getMessage() { + return message; + } +} \ No newline at end of file diff --git a/src/main/java/com/example/api/global/response/success/AuthSuccess.java b/src/main/java/com/example/api/global/response/success/AuthSuccess.java new file mode 100644 index 00000000..269cf71e --- /dev/null +++ b/src/main/java/com/example/api/global/response/success/AuthSuccess.java @@ -0,0 +1,34 @@ +package com.example.api.global.response.success; + +import org.springframework.http.HttpStatus; + +public enum AuthSuccess implements SuccessCode { + GENERATE_TOKEN_SUCCESS(HttpStatus.OK, "AUTH001", "인증 토큰 발행에 성공했습니다."), + LOGOUT_SUCCESS(HttpStatus.OK, "AUTH002", "로그아웃에 성공했습니다."), + REISSUE_TOKEN_SUCCESS(HttpStatus.OK, "AUTH003", "토큰 재발급에 성공했습니다"); + + private final HttpStatus httpStatus; + private final String code; + private final String message; + + AuthSuccess(final HttpStatus httpStatus, final String code, final String message) { + this.httpStatus = httpStatus; + this.code = code; + this.message = message; + } + + @Override + public HttpStatus getHttpStatus() { + return httpStatus; + } + + @Override + public String getCode() { + return code; + } + + @Override + public String getMessage() { + return message; + } +} \ No newline at end of file diff --git a/src/main/java/com/example/api/global/response/success/BoardSuccess.java b/src/main/java/com/example/api/global/response/success/BoardSuccess.java new file mode 100644 index 00000000..3f245c5b --- /dev/null +++ b/src/main/java/com/example/api/global/response/success/BoardSuccess.java @@ -0,0 +1,34 @@ +package com.example.api.global.response.success; + +import org.springframework.http.HttpStatus; + +public enum BoardSuccess implements SuccessCode{ + LOOK_UP_BOARD_SUCCESS(HttpStatus.OK, "BOARD001", "이력서 조회에 성공했습니다."), + CHANGE_OPEN_STATUS_SUCCESS(HttpStatus.OK, "BOARD002", "이력서 열람 상태 변경에 성공했습니다."), + SUBMIT_BOARD_SUCCESS(HttpStatus.OK, "BOARD003", "이력서 저장에 성공했습니다"); + + private final HttpStatus httpStatus; + private final String code; + private final String message; + + BoardSuccess(final HttpStatus httpStatus, final String code, final String message) { + this.httpStatus = httpStatus; + this.code = code; + this.message = message; + } + + @Override + public HttpStatus getHttpStatus() { + return httpStatus; + } + + @Override + public String getCode() { + return code; + } + + @Override + public String getMessage() { + return message; + } +} diff --git a/src/main/java/com/example/api/global/response/success/BusinessSuccess.java b/src/main/java/com/example/api/global/response/success/BusinessSuccess.java new file mode 100644 index 00000000..ccabfd0d --- /dev/null +++ b/src/main/java/com/example/api/global/response/success/BusinessSuccess.java @@ -0,0 +1,34 @@ +package com.example.api.global.response.success; + +import org.springframework.http.HttpStatus; + +public enum BusinessSuccess implements SuccessCode { + LOOK_UP_BUSINESS_SUCCESS(HttpStatus.OK, "BUSINESS001", "나의 사업체 조회에 성공했습니다."), + MODIFY_BUSINESS_SUCCESS(HttpStatus.OK, "BUSINESS002", "사업체 변경에 성공했습니다."), + ADD_BUSINESS_SUCCESS(HttpStatus.OK, "BUSINESS003", "사업체 추가에 성공했습니다"); + + private final HttpStatus httpStatus; + private final String code; + private final String message; + + BusinessSuccess(final HttpStatus httpStatus, final String code, final String message) { + this.httpStatus = httpStatus; + this.code = code; + this.message = message; + } + + @Override + public HttpStatus getHttpStatus() { + return httpStatus; + } + + @Override + public String getCode() { + return code; + } + + @Override + public String getMessage() { + return message; + } +} diff --git a/src/main/java/com/example/api/global/response/success/ChatSuccess.java b/src/main/java/com/example/api/global/response/success/ChatSuccess.java new file mode 100644 index 00000000..f9df142e --- /dev/null +++ b/src/main/java/com/example/api/global/response/success/ChatSuccess.java @@ -0,0 +1,35 @@ +package com.example.api.global.response.success; + +import org.springframework.http.HttpStatus; + +public enum ChatSuccess implements SuccessCode{ + SEND_CHAT_SUCCESS(HttpStatus.OK, "CHAT001", "채팅 전송에 성공했습니다."), + READ_CHAT_SUCCESS(HttpStatus.OK, "CHAT002", "채팅 읽기에 성공했습니다."), + SUMMARIZE_CHAT_SUCCESS(HttpStatus.OK, "CHAT003", "채팅 요약에 성공했습니다"), + GET_CHAT_SUCCESS(HttpStatus.OK, "CHAT004", "채팅 가져오기에 성공했습니다"); + + private final HttpStatus httpStatus; + private final String code; + private final String message; + + ChatSuccess(final HttpStatus httpStatus, final String code, final String message) { + this.httpStatus = httpStatus; + this.code = code; + this.message = message; + } + + @Override + public HttpStatus getHttpStatus() { + return httpStatus; + } + + @Override + public String getCode() { + return code; + } + + @Override + public String getMessage() { + return message; + } +} diff --git a/src/main/java/com/example/api/global/response/success/ContractReviewSuccess.java b/src/main/java/com/example/api/global/response/success/ContractReviewSuccess.java new file mode 100644 index 00000000..a9e24aa5 --- /dev/null +++ b/src/main/java/com/example/api/global/response/success/ContractReviewSuccess.java @@ -0,0 +1,33 @@ +package com.example.api.global.response.success; + +import org.springframework.http.HttpStatus; + +public enum ContractReviewSuccess implements SuccessCode { + LOOK_UP_ALL_REVIEW_SUCCESS(HttpStatus.OK, "CONTRACT_REVIEW001", "내가 쓴 리뷰 조회에 성공했습니다."), + WRITE_REVIEW_SUCCESS(HttpStatus.OK, "CONTRACT_REVIEW002", "리뷰 작성에 성공했습니다."); + + private final HttpStatus httpStatus; + private final String code; + private final String message; + + ContractReviewSuccess(final HttpStatus httpStatus, final String code, final String message) { + this.httpStatus = httpStatus; + this.code = code; + this.message = message; + } + + @Override + public HttpStatus getHttpStatus() { + return httpStatus; + } + + @Override + public String getCode() { + return code; + } + + @Override + public String getMessage() { + return message; + } +} diff --git a/src/main/java/com/example/api/global/response/success/ContractSuccess.java b/src/main/java/com/example/api/global/response/success/ContractSuccess.java new file mode 100644 index 00000000..b57be446 --- /dev/null +++ b/src/main/java/com/example/api/global/response/success/ContractSuccess.java @@ -0,0 +1,38 @@ +package com.example.api.global.response.success; + +import org.springframework.http.HttpStatus; + +public enum ContractSuccess implements SuccessCode{ + // 계약이 아닌 조건이므로 컨트롤러 위치 변경 필요 + LOOK_UP_ALL_SUGGEST_SUCCESS(HttpStatus.OK, "CONTRACT001", "모든 제안들 조회를 성공했습니다."), + // 요것두 + ALLOW_SUGGEST_CONTACT_SUCCESS(HttpStatus.OK, "CONTRACT002", "제안 접촉 수락 요청을 성공했습니다."), + GENERATE_CHAT_ROOM_SUCCESS(HttpStatus.OK, "CONTRACT003", "채팅방 생성에 성공했습니다"), + ACCEPT_CONTRACT_SUCCESS(HttpStatus.OK, "CONTRACT004", "계약 수락 요청을 성공했습니다"), + LOOK_UP_CONTRACT_INFO_SUCCESS(HttpStatus.OK, "CONTRACT005", "계약 정보 조회에 성공했습니다"); + + private final HttpStatus httpStatus; + private final String code; + private final String message; + + ContractSuccess(final HttpStatus httpStatus, final String code, final String message) { + this.httpStatus = httpStatus; + this.code = code; + this.message = message; + } + + @Override + public HttpStatus getHttpStatus() { + return httpStatus; + } + + @Override + public String getCode() { + return code; + } + + @Override + public String getMessage() { + return message; + } +} diff --git a/src/main/java/com/example/api/global/response/success/EmployerSuccess.java b/src/main/java/com/example/api/global/response/success/EmployerSuccess.java new file mode 100644 index 00000000..503af6c1 --- /dev/null +++ b/src/main/java/com/example/api/global/response/success/EmployerSuccess.java @@ -0,0 +1,33 @@ +package com.example.api.global.response.success; + +import org.springframework.http.HttpStatus; + +public enum EmployerSuccess implements SuccessCode { + LOOK_UP_LIKE_EMPLOYEE_SUCCESS(HttpStatus.OK, "EMPLOYER001", "즐겨찾기한 알바생 조회에 성공했습니다."), + FETCH_BUSINESSES_SUCCESS(HttpStatus.OK, "EMPLOYER002", "나의 사업체 리스트 조회에 성공했습니다."); + + private final HttpStatus httpStatus; + private final String code; + private final String message; + + EmployerSuccess(final HttpStatus httpStatus, final String code, final String message) { + this.httpStatus = httpStatus; + this.code = code; + this.message = message; + } + + @Override + public HttpStatus getHttpStatus() { + return httpStatus; + } + + @Override + public String getCode() { + return code; + } + + @Override + public String getMessage() { + return message; + } +} diff --git a/src/main/java/com/example/api/global/response/success/InquirySuccess.java b/src/main/java/com/example/api/global/response/success/InquirySuccess.java new file mode 100644 index 00000000..123bf4ca --- /dev/null +++ b/src/main/java/com/example/api/global/response/success/InquirySuccess.java @@ -0,0 +1,33 @@ +package com.example.api.global.response.success; + +import org.springframework.http.HttpStatus; + +public enum InquirySuccess implements SuccessCode{ + WRITE_INQUIRY_SUCCESS(HttpStatus.OK, "INQUIRY001", "문의 작성에 성공했습니다."), + LOOK_UP_INQUIRIES_SUCCESS(HttpStatus.OK, "INQUIRY002", "내가 쓴 문의사항들 조회에 성공했습니다."); + + private final HttpStatus httpStatus; + private final String code; + private final String message; + + InquirySuccess(final HttpStatus httpStatus, final String code, final String message) { + this.httpStatus = httpStatus; + this.code = code; + this.message = message; + } + + @Override + public HttpStatus getHttpStatus() { + return httpStatus; + } + + @Override + public String getCode() { + return code; + } + + @Override + public String getMessage() { + return message; + } +} diff --git a/src/main/java/com/example/api/global/response/success/OfferEmploymentSuccess.java b/src/main/java/com/example/api/global/response/success/OfferEmploymentSuccess.java new file mode 100644 index 00000000..f7bb5cf2 --- /dev/null +++ b/src/main/java/com/example/api/global/response/success/OfferEmploymentSuccess.java @@ -0,0 +1,33 @@ +package com.example.api.global.response.success; + +import org.springframework.http.HttpStatus; + +public enum OfferEmploymentSuccess implements SuccessCode { + SEND_OFFEREMPLOYMENT_SUCCESS(HttpStatus.OK, "OFFEREMPLOYMENT001", "제안 요청에 성공했습니다."), + COMPLETE_OFFEREMPLOYMENT_SUCCESS(HttpStatus.OK, "OFFEREMPLOYMENT002", "알바가 성공적으로 종료되었습니다."); + + private final HttpStatus httpStatus; + private final String code; + private final String message; + + OfferEmploymentSuccess(final HttpStatus httpStatus, final String code, final String message) { + this.httpStatus = httpStatus; + this.code = code; + this.message = message; + } + + @Override + public HttpStatus getHttpStatus() { + return httpStatus; + } + + @Override + public String getCode() { + return code; + } + + @Override + public String getMessage() { + return message; + } +} diff --git a/src/main/java/com/example/api/global/response/success/PossibleBoardSuccess.java b/src/main/java/com/example/api/global/response/success/PossibleBoardSuccess.java new file mode 100644 index 00000000..fd7ab1d2 --- /dev/null +++ b/src/main/java/com/example/api/global/response/success/PossibleBoardSuccess.java @@ -0,0 +1,33 @@ +package com.example.api.global.response.success; + +import org.springframework.http.HttpStatus; + +public enum PossibleBoardSuccess implements SuccessCode { + ADD_POSSIBLE_TIME_SUCCESS(HttpStatus.OK, "POSSIBLE-BOARD001", "근무 가능 시간 추가에 성공했습니다."), + GET_POSSIBLE_BOARD_SUCCESS(HttpStatus.OK, "POSSIBLE-BOARD002", "이력서 조회에 성공했습니다."); + + private final HttpStatus httpStatus; + private final String code; + private final String message; + + PossibleBoardSuccess(final HttpStatus httpStatus, final String code, final String message) { + this.httpStatus = httpStatus; + this.code = code; + this.message = message; + } + + @Override + public HttpStatus getHttpStatus() { + return httpStatus; + } + + @Override + public String getCode() { + return code; + } + + @Override + public String getMessage() { + return message; + } +} diff --git a/src/main/java/com/example/api/global/response/success/ReviewReport.java b/src/main/java/com/example/api/global/response/success/ReviewReport.java new file mode 100644 index 00000000..30cea0cd --- /dev/null +++ b/src/main/java/com/example/api/global/response/success/ReviewReport.java @@ -0,0 +1,32 @@ +package com.example.api.global.response.success; + +import org.springframework.http.HttpStatus; + +public enum ReviewReport implements SuccessCode { + REPORT_REVIEW_SUCCESS(HttpStatus.OK, "REVIEW_REPORT001", "리뷰 신고를 성공했습니다."); + + private final HttpStatus httpStatus; + private final String code; + private final String message; + + ReviewReport(final HttpStatus httpStatus, final String code, final String message) { + this.httpStatus = httpStatus; + this.code = code; + this.message = message; + } + + @Override + public HttpStatus getHttpStatus() { + return httpStatus; + } + + @Override + public String getCode() { + return code; + } + + @Override + public String getMessage() { + return message; + } +} \ No newline at end of file diff --git a/src/main/java/com/example/api/global/response/success/ReviewSuccess.java b/src/main/java/com/example/api/global/response/success/ReviewSuccess.java new file mode 100644 index 00000000..36bf685e --- /dev/null +++ b/src/main/java/com/example/api/global/response/success/ReviewSuccess.java @@ -0,0 +1,36 @@ +package com.example.api.global.response.success; + +import org.springframework.http.HttpStatus; + +public enum ReviewSuccess implements SuccessCode{ + LOOK_UP_ALL_REVIEW_SUCCESS(HttpStatus.OK, "REVIEW001", "모든 리뷰 조회에 성공했습니다."), + LOOK_UP_DETAIL_REVIEW_SUCCESS(HttpStatus.OK, "REVIEW002", "리뷰 상세 조회에 성공했습니다."), + LOOK_UP_MY_REVIEW_SUCCESS(HttpStatus.OK, "REVIEW003", "내가 쓴 리뷰 조회에 성공했습니다."), + LOOK_UP_AVAILABLE_SUCCESS(HttpStatus.OK, "REVIEW004", "리뷰를 적을 수 있는 직원 리스트 조회에 성공했습니다."); + + private final HttpStatus httpStatus; + private final String code; + + private final String message; + + ReviewSuccess(final HttpStatus httpStatus, final String code, final String message) { + this.httpStatus = httpStatus; + this.code = code; + this.message = message; + } + + @Override + public HttpStatus getHttpStatus() { + return httpStatus; + } + + @Override + public String getCode() { + return code; + } + + @Override + public String getMessage() { + return message; + } +} \ No newline at end of file diff --git a/src/main/java/com/example/api/global/response/success/S3Success.java b/src/main/java/com/example/api/global/response/success/S3Success.java new file mode 100644 index 00000000..1874ac48 --- /dev/null +++ b/src/main/java/com/example/api/global/response/success/S3Success.java @@ -0,0 +1,32 @@ +package com.example.api.global.response.success; + +import org.springframework.http.HttpStatus; + +public enum S3Success implements SuccessCode { + UPLOAD_PROFILE_SUCCESS(HttpStatus.OK, "PROFILE001", "프로필 업로드에 성공했습니다."); + + private final HttpStatus httpStatus; + private final String code; + private final String message; + + S3Success(final HttpStatus httpStatus, final String code, final String message) { + this.httpStatus = httpStatus; + this.code = code; + this.message = message; + } + + @Override + public HttpStatus getHttpStatus() { + return httpStatus; + } + + @Override + public String getCode() { + return code; + } + + @Override + public String getMessage() { + return message; + } +} diff --git a/src/main/java/com/example/api/global/response/success/SearchSuccess.java b/src/main/java/com/example/api/global/response/success/SearchSuccess.java new file mode 100644 index 00000000..919ea9ca --- /dev/null +++ b/src/main/java/com/example/api/global/response/success/SearchSuccess.java @@ -0,0 +1,32 @@ +package com.example.api.global.response.success; + +import org.springframework.http.HttpStatus; + +public enum SearchSuccess implements SuccessCode { + SEARCH_EMPLOYEE_SUCCESS(HttpStatus.OK, "SEARCH001", "조건에 맞는 알바생 조회에 성공했습니다."); + + private final HttpStatus httpStatus; + private final String code; + private final String message; + + SearchSuccess(final HttpStatus httpStatus, final String code, final String message) { + this.httpStatus = httpStatus; + this.code = code; + this.message = message; + } + + @Override + public HttpStatus getHttpStatus() { + return httpStatus; + } + + @Override + public String getCode() { + return code; + } + + @Override + public String getMessage() { + return message; + } +} diff --git a/src/main/java/com/example/api/global/response/success/SuccessCode.java b/src/main/java/com/example/api/global/response/success/SuccessCode.java new file mode 100644 index 00000000..1a1c429a --- /dev/null +++ b/src/main/java/com/example/api/global/response/success/SuccessCode.java @@ -0,0 +1,9 @@ +package com.example.api.global.response.success; + +import org.springframework.http.HttpStatus; + +public interface SuccessCode { + HttpStatus getHttpStatus(); + String getCode(); + String getMessage(); +} \ No newline at end of file diff --git a/src/main/java/com/example/api/global/response/success/SuggestSuccess.java b/src/main/java/com/example/api/global/response/success/SuggestSuccess.java new file mode 100644 index 00000000..5eb94c52 --- /dev/null +++ b/src/main/java/com/example/api/global/response/success/SuggestSuccess.java @@ -0,0 +1,32 @@ +package com.example.api.global.response.success; + +import org.springframework.http.HttpStatus; + +public enum SuggestSuccess implements SuccessCode { + LOOK_UP_SUGGESTS_STATUS_SUCCESS(HttpStatus.OK, "SUGGEST001", "제안 상태들 조회에 성공했습니다."); + + private final HttpStatus httpStatus; + private final String code; + private final String message; + + SuggestSuccess(final HttpStatus httpStatus, final String code, final String message) { + this.httpStatus = httpStatus; + this.code = code; + this.message = message; + } + + @Override + public HttpStatus getHttpStatus() { + return httpStatus; + } + + @Override + public String getCode() { + return code; + } + + @Override + public String getMessage() { + return message; + } +} \ No newline at end of file diff --git a/src/main/java/com/example/api/oauth2/entity/handler/OAuth2AuthenticationSuccessHandler.java b/src/main/java/com/example/api/oauth2/entity/handler/OAuth2AuthenticationSuccessHandler.java index f3f77d58..ae6bdbbf 100644 --- a/src/main/java/com/example/api/oauth2/entity/handler/OAuth2AuthenticationSuccessHandler.java +++ b/src/main/java/com/example/api/oauth2/entity/handler/OAuth2AuthenticationSuccessHandler.java @@ -9,11 +9,12 @@ import com.example.api.auth.repository.TokenRepository; import com.example.api.auth.service.JwtTokenProvider; import com.example.api.domain.Account; -import com.example.api.exception.BusinessException; -import com.example.api.exception.ErrorCode; +import com.example.api.global.exception.BusinessException; +import com.example.api.global.exception.ErrorCode; import com.example.api.global.properties.JwtProperties; import com.example.api.oauth2.entity.CookieUtils; import com.example.api.oauth2.entity.HttpCookieOAuth2AuthorizationRequestRepository; +import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.servlet.ServletException; import jakarta.servlet.http.Cookie; import jakarta.servlet.http.HttpServletRequest; @@ -28,9 +29,7 @@ import java.io.IOException; import java.net.URI; -import java.util.Collection; -import java.util.List; -import java.util.Optional; +import java.util.*; import static com.example.api.oauth2.entity.HttpCookieOAuth2AuthorizationRequestRepository.REDIRECT_URI_PARAM_COOKIE_NAME; @@ -43,43 +42,47 @@ public class OAuth2AuthenticationSuccessHandler extends SimpleUrlAuthenticationS private final AccountRepository accountRepository; private final TokenRepository tokenRepository; private final JwtProperties jwtProperties; + private final ObjectMapper objectMapper; @Value("app.oauth2. authorized-redirect-uris") List authorizedRedirectUris; @Override - public void onAuthenticationSuccess(final HttpServletRequest request, final HttpServletResponse response, final Authentication authentication) throws IOException, ServletException { - String targetUrl = determineTargetUrl(request, response, authentication); - - if (response.isCommitted()) { - logger.debug("Response has already been committed. Unable to redirect to " + targetUrl); - return; - } + public void onAuthenticationSuccess(final HttpServletRequest request, + final HttpServletResponse response, + final Authentication authentication) throws IOException, ServletException { +// String targetUrl = determineTargetUrl(request, response, authentication); +// if (response.isCommitted()) { +// logger.debug("Response has already been committed. Unable to redirect to " + targetUrl); +// return; +// } CustomUserDetails principal = (CustomUserDetails) authentication.getPrincipal(); UserDetailRequest userDetailRequest = new UserDetailRequest(principal.getUserId(), (Collection) authentication.getAuthorities()); setResponse(request, response, userDetailRequest); - getRedirectStrategy().sendRedirect(request, response, targetUrl); } - private void setResponse(final HttpServletRequest request, final HttpServletResponse response, final UserDetailRequest userDetailRequest) { + private void setResponse(final HttpServletRequest request, + final HttpServletResponse response, + final UserDetailRequest userDetailRequest) throws IOException { AuthTokenRequest authTokenRequest = generateAndSaveAuthToken(userDetailRequest); clearAuthenticationAttributes(request, response); - Cookie accessTokenCookie = generateAccessCookie(authTokenRequest.accessToken()); Cookie refreshTokenCookie = generateRefreshCookie(authTokenRequest.refreshToken()); - response.addCookie(accessTokenCookie); response.addCookie(refreshTokenCookie); - response.addCookie(new Cookie("userId", userDetailRequest.userId().toString())); - response.addCookie(new Cookie("userRole", userDetailRequest.authorities().stream().findFirst().toString())); + + generateResponseBody(response, userDetailRequest, authTokenRequest); } - @NotNull - private Cookie generateAccessCookie(final String accessToken) { - Cookie accessTokenCookie = new Cookie("accessToken", accessToken); - accessTokenCookie.setHttpOnly(true); - accessTokenCookie.setPath("/"); - accessTokenCookie.setMaxAge(jwtProperties.getAccessTokenValidTime().intValue()); - return accessTokenCookie; + private void generateResponseBody(HttpServletResponse response, UserDetailRequest userDetailRequest, AuthTokenRequest authTokenRequest) throws IOException { + Map responseBody = new HashMap<>(); + responseBody.put("accessToken", authTokenRequest.accessToken()); + responseBody.put("userId", userDetailRequest.userId().toString()); + responseBody.put("userRole", userDetailRequest.authorities().stream().findFirst().toString()); + + response.setContentType("application/json"); + response.setCharacterEncoding("UTF-8"); + response.setStatus(HttpServletResponse.SC_OK); + objectMapper.writeValue(response.getWriter(), responseBody); } @NotNull @@ -105,15 +108,15 @@ private AuthTokenRequest generateAndSaveAuthToken(final UserDetailRequest userDe return new AuthTokenRequest(accessToken, refreshToken); } - protected String determineTargetUrl(final HttpServletRequest request, final HttpServletResponse response, final Authentication authentication) { - Optional redirectUri = CookieUtils.getCookie(request, REDIRECT_URI_PARAM_COOKIE_NAME) - .map(Cookie::getValue); - - if(redirectUri.isPresent() && !isAuthorizedRedirectUri(redirectUri.get())) { - throw new BusinessException(ErrorCode.INVALID_REDIRECT_URI); - } - return redirectUri.orElse("http://localhost:3000"); // 로그인 성공 후 리다이렉트 url - } +// protected String determineTargetUrl(final HttpServletRequest request, final HttpServletResponse response, final Authentication authentication) { +// Optional redirectUri = CookieUtils.getCookie(request, REDIRECT_URI_PARAM_COOKIE_NAME) +// .map(Cookie::getValue); +// +// if(redirectUri.isPresent() && !isAuthorizedRedirectUri(redirectUri.get())) { +// throw new BusinessException(ErrorCode.INVALID_REDIRECT_URI); +// } +// return redirectUri.orElse("http://localhost:3000"); // 로그인 성공 후 리다이렉트 url +// } private boolean isAuthorizedRedirectUri(final String uri) { URI clientRedirectUri = URI.create(uri); diff --git a/src/main/java/com/example/api/offeremployment/OfferEmploymentService.java b/src/main/java/com/example/api/offeremployment/OfferEmploymentService.java index 0d855656..e43bc0db 100644 --- a/src/main/java/com/example/api/offeremployment/OfferEmploymentService.java +++ b/src/main/java/com/example/api/offeremployment/OfferEmploymentService.java @@ -7,7 +7,7 @@ import com.example.api.domain.OfferEmployment; import com.example.api.domain.repository.OfferEmploymentRepository; import com.example.api.offeremployment.dto.*; -import com.example.api.review.ReviewRepository; +import com.example.api.review.repository.ReviewRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/src/main/java/com/example/api/possbileboard/PossibleBoardRepository.java b/src/main/java/com/example/api/possbileboard/PossibleBoardRepository.java deleted file mode 100644 index 18a05d2d..00000000 --- a/src/main/java/com/example/api/possbileboard/PossibleBoardRepository.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.example.api.possbileboard; - -import com.example.api.board.dto.response.PossibleBoardDTO; -import com.example.api.domain.Category; -import com.example.api.domain.Contract; -import com.example.api.domain.ExternalCareer; -import com.example.api.domain.PossibleBoard; -import com.example.api.possbileboard.dto.PossibleDetails; -import java.time.LocalDateTime; -import java.util.List; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Modifying; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; -import org.springframework.stereotype.Repository; - -@Repository -public interface PossibleBoardRepository extends JpaRepository { - @Modifying - @Query("DELETE FROM PossibleBoard possible WHERE (possible.startTime <= :endDateTime AND possible.endTime >= :startDateTime)") - Long deleteDuplicatedWorkTimeIncluded(@Param("startDateTime") final LocalDateTime startDateTimeIncluded, - @Param("endDateTime") final LocalDateTime endDateTimeIncluded); - - @Query("SELECT new com.example.api.possbileboard.dto.PossibleDetails(p.employee.name, p.employee.age, p.employee.email, p.employee.phoneNumber, p.updatedDate, p.startTime, p.endTime, COUNT (p), CAST(COALESCE(AVG(r.reviewStarPoint),0) as float)) FROM PossibleBoard p INNER JOIN Account a INNER JOIN Contract c INNER JOIN Review r WHERE p.possibleId = :possibleId GROUP BY p.employee.name, p.employee.age, p.employee.email, p.employee.phoneNumber, p.updatedDate, p.startTime, p.endTime") - PossibleDetails queryPossibleDetails(@Param("possibleId") final Long possibleId); - - @Query("SELECT f.category FROM Flavored f JOIN Account a JOIN PossibleBoard p WHERE p.possibleId = :possibleId") - List queryFlavoredCategories(@Param("possibleId") final Long possibleId); - - @Query("SELECT ex FROM ExternalCareer ex JOIN PossibleBoard p ON ex.employee.accountId = p.employee.accountId WHERE p.possibleId = :possibleId") - List queryExternalCareers(@Param("possibleId") final Long possibleId); - - @Query("SELECT c FROM Contract c JOIN PossibleBoard p ON p.employee.accountId = c.offerEmployment.employee.accountId WHERE c.offerEmployment.employee.accountId = :possibleId AND c.contractSucceeded = TRUE ") - List queryInternalCareers(@Param("possibleId") final Long possibleId); - - List findAllByEmployeeAccountId(Long employeeId); - - @Query("select new com.example.api.board.dto.response.PossibleBoardDTO(p.possibleId, p.startTime, p.endTime) " + - "from PossibleBoard p where p.employee.accountId = :employeeId") - List findAllDTOByEmployeeAccountId(@Param("employeeId")Long employeeId); -} \ No newline at end of file diff --git a/src/main/java/com/example/api/possbileboard/PossibleBoardService.java b/src/main/java/com/example/api/possbileboard/PossibleBoardService.java deleted file mode 100644 index 36864f10..00000000 --- a/src/main/java/com/example/api/possbileboard/PossibleBoardService.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.example.api.possbileboard; - -import com.example.api.account.service.AccountService; -import com.example.api.domain.Account; -import com.example.api.domain.Category; -import com.example.api.domain.Contract; -import com.example.api.domain.ExternalCareer; -import com.example.api.domain.PossibleBoard; -import com.example.api.possbileboard.dto.AddPossibleTimeCommand; -import com.example.api.possbileboard.dto.PossibleDetails; -import com.example.api.possbileboard.dto.PossibleDetailsResponse; -import com.example.api.possbileboard.dto.QueryPossibleDetailsCommand; -import java.util.List; -import java.util.stream.Collectors; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -@Service -@RequiredArgsConstructor -public class PossibleBoardService { - private final PossibleBoardRepository possibleBoardRepository; - private final AccountService accountService; - private final PossibleMapper possibleMapper; - - @Transactional - public void addPossibleBoard(final AddPossibleTimeCommand addPossibleTimeCommand) { - final List possibleTimes = addPossibleTimeCommand.possibleTimes().stream() - .map(possibleTimeRange -> new PossibleTime(possibleTimeRange.startTime(), possibleTimeRange.endTime())) - .collect(Collectors.toList()); - deleteDuplicatedPeriod(possibleTimes); - final Account account = accountService.loadAccount(addPossibleTimeCommand.requestMemberId()); - addNewPeriod(account, possibleTimes); - } - - @Transactional(readOnly = true) - public PossibleDetailsResponse queryPossibleDetails(final QueryPossibleDetailsCommand queryPossibleDetailsCommand) { - final PossibleDetails possibleDetails = possibleBoardRepository.queryPossibleDetails(queryPossibleDetailsCommand.possibleId()); - final List categories = possibleBoardRepository.queryFlavoredCategories(queryPossibleDetailsCommand.possibleId()); - final List externalCareers = possibleBoardRepository.queryExternalCareers(queryPossibleDetailsCommand.possibleId()); - final List contracts = possibleBoardRepository.queryInternalCareers(queryPossibleDetailsCommand.possibleId()); - - return possibleMapper.toPossibleDetailsResponse(possibleDetails, categories, externalCareers, contracts); - } - - private void deleteDuplicatedPeriod(final List possibleTimes) { - possibleTimes.stream() - .forEach(possibleTime -> possibleBoardRepository.deleteDuplicatedWorkTimeIncluded(possibleTime.getStartTime(), possibleTime.getEndTime())); - } - - private void addNewPeriod(final Account account, final List possibleTimes) { - final List possibleBoards = possibleTimes.stream() - .map(possibleTime -> possibleMapper.toBoard(account, possibleTime)) - .toList(); - possibleBoardRepository.saveAll(possibleBoards); - } -} diff --git a/src/main/java/com/example/api/possbileboard/controller/PossibleBoardController.java b/src/main/java/com/example/api/possbileboard/controller/PossibleBoardController.java deleted file mode 100644 index 4f8af6a0..00000000 --- a/src/main/java/com/example/api/possbileboard/controller/PossibleBoardController.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.example.api.possbileboard.controller; - -import com.example.api.possbileboard.PossibleBoardService; -import com.example.api.possbileboard.dto.AddPossibleTimeCommand; -import com.example.api.possbileboard.dto.AddPossibleTimeRequest; -import com.example.api.possbileboard.dto.PossibleDetailsResponse; -import com.example.api.possbileboard.dto.QueryPossibleDetailsCommand; -import lombok.RequiredArgsConstructor; -import org.springframework.http.ResponseEntity; -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.RequestBody; -import org.springframework.web.bind.annotation.RestController; - -@RestController -@RequiredArgsConstructor -class PossibleBoardController { - private final PossibleBoardService possibleBoardService; - - @PostMapping("/api/v1/possible-board") - public ResponseEntity addPossibleTimes( - @RequestBody final AddPossibleTimeRequest addPossibleTimeRequest, - final Long requestMemberId - ) { - final AddPossibleTimeCommand addPossibleTimeCommand = addPossibleTimeRequest.toCommand(requestMemberId); - possibleBoardService.addPossibleBoard(addPossibleTimeCommand); - return ResponseEntity.ok().build(); - } - - @GetMapping("/api/v1/possible-board/{possibleId}") - public ResponseEntity queryPossibleBoardTimes( - @PathVariable(required = true) final Long possibleId - ) { - final QueryPossibleDetailsCommand command = new QueryPossibleDetailsCommand(possibleId); - final PossibleDetailsResponse response = possibleBoardService.queryPossibleDetails(command); - return ResponseEntity.ok(response); - } -} diff --git a/src/main/java/com/example/api/possbileboard/dto/ExternalCareerResponse.java b/src/main/java/com/example/api/possbileboard/dto/ExternalCareerResponse.java deleted file mode 100644 index 2420d1de..00000000 --- a/src/main/java/com/example/api/possbileboard/dto/ExternalCareerResponse.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.example.api.possbileboard.dto; - -public record ExternalCareerResponse( - Long externalCareerId, - String careerName, - String period -) { -} diff --git a/src/main/java/com/example/api/possbileboard/dto/PossibleDetails.java b/src/main/java/com/example/api/possbileboard/dto/PossibleDetails.java deleted file mode 100644 index 2ad8f49e..00000000 --- a/src/main/java/com/example/api/possbileboard/dto/PossibleDetails.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.example.api.possbileboard.dto; - -import java.time.LocalDateTime; - -public record PossibleDetails( - String name, - Integer age, - String email, - String phoneNumber, - LocalDateTime recentlyUpdatedTime, - LocalDateTime possibleStartTime, - LocalDateTime possibleEndTime, - Long contractCount, - Float starPoint -) { -} diff --git a/src/main/java/com/example/api/review/controller/ReviewController.java b/src/main/java/com/example/api/review/controller/ReviewController.java index db5bf242..f349203b 100644 --- a/src/main/java/com/example/api/review/controller/ReviewController.java +++ b/src/main/java/com/example/api/review/controller/ReviewController.java @@ -1,8 +1,10 @@ package com.example.api.review.controller; -import com.example.api.review.ReviewService; +import com.example.api.review.service.ReviewService; import com.example.api.review.dto.ReviewCommand; import com.example.api.review.dto.ReviewResponse; +import com.example.api.review.dto.ReviewAvailableCommand; +import com.example.api.review.dto.ReviewAvailableResponse; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -37,4 +39,13 @@ public ResponseEntity> getMyReviews( final List reviews = reviewService.getReviews(reviewCommand); return ResponseEntity.ok(reviews); } + + @GetMapping("/available") + public ResponseEntity> getAvailableReviewTargets( + @RequestParam(required = true) Long businessId + ) { + ReviewAvailableCommand command = new ReviewAvailableCommand(businessId); + List availableEmployees = reviewService.getAvailableReviewTargets(command); + return ResponseEntity.ok(availableEmployees); + } } diff --git a/src/main/java/com/example/api/reviewavailable/dto/ReviewAvailableCommand.java b/src/main/java/com/example/api/review/dto/ReviewAvailableCommand.java similarity index 56% rename from src/main/java/com/example/api/reviewavailable/dto/ReviewAvailableCommand.java rename to src/main/java/com/example/api/review/dto/ReviewAvailableCommand.java index aff7bb82..5d74662c 100644 --- a/src/main/java/com/example/api/reviewavailable/dto/ReviewAvailableCommand.java +++ b/src/main/java/com/example/api/review/dto/ReviewAvailableCommand.java @@ -1,5 +1,6 @@ -package com.example.api.reviewavailable.dto; +package com.example.api.review.dto; public record ReviewAvailableCommand( Long businessId -) {} \ No newline at end of file +){ +} \ No newline at end of file diff --git a/src/main/java/com/example/api/reviewavailable/dto/ReviewAvailableResponse.java b/src/main/java/com/example/api/review/dto/ReviewAvailableResponse.java similarity index 65% rename from src/main/java/com/example/api/reviewavailable/dto/ReviewAvailableResponse.java rename to src/main/java/com/example/api/review/dto/ReviewAvailableResponse.java index 0c477026..7079f48c 100644 --- a/src/main/java/com/example/api/reviewavailable/dto/ReviewAvailableResponse.java +++ b/src/main/java/com/example/api/review/dto/ReviewAvailableResponse.java @@ -1,7 +1,8 @@ -package com.example.api.reviewavailable.dto; +package com.example.api.review.dto; public record ReviewAvailableResponse( Long employeeId, String employeeName -) {} +){ +} diff --git a/src/main/java/com/example/api/review/dto/ReviewCommand.java b/src/main/java/com/example/api/review/dto/ReviewCommand.java index 58f47028..ef555431 100644 --- a/src/main/java/com/example/api/review/dto/ReviewCommand.java +++ b/src/main/java/com/example/api/review/dto/ReviewCommand.java @@ -2,6 +2,7 @@ public record ReviewCommand( Long accountId -){} +){ +} diff --git a/src/main/java/com/example/api/review/ReviewRepository.java b/src/main/java/com/example/api/review/repository/ReviewRepository.java similarity index 90% rename from src/main/java/com/example/api/review/ReviewRepository.java rename to src/main/java/com/example/api/review/repository/ReviewRepository.java index 98a21b28..48576190 100644 --- a/src/main/java/com/example/api/review/ReviewRepository.java +++ b/src/main/java/com/example/api/review/repository/ReviewRepository.java @@ -1,9 +1,7 @@ -package com.example.api.review; +package com.example.api.review.repository; import com.example.api.domain.Review; -import jakarta.validation.constraints.NotNull; import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; @@ -33,7 +31,4 @@ public interface ReviewRepository extends JpaRepository { @Query("select r.reviewStarPoint from Review r where r.reviewId = :suggestId") Integer findReviewStarPointBySuggestId(@Param("suggestId") Long suggestId); -} - - - +} \ No newline at end of file diff --git a/src/main/java/com/example/api/review/ReviewService.java b/src/main/java/com/example/api/review/service/ReviewService.java similarity index 82% rename from src/main/java/com/example/api/review/ReviewService.java rename to src/main/java/com/example/api/review/service/ReviewService.java index 5ab0109c..4a3f9f12 100644 --- a/src/main/java/com/example/api/review/ReviewService.java +++ b/src/main/java/com/example/api/review/service/ReviewService.java @@ -1,6 +1,10 @@ -package com.example.api.review; +package com.example.api.review.service; +import com.example.api.contracts.ContractRepository; import com.example.api.review.dto.ReviewResponse; +import com.example.api.review.dto.ReviewAvailableCommand; +import com.example.api.review.dto.ReviewAvailableResponse; +import com.example.api.review.repository.ReviewRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -17,6 +21,7 @@ @RequiredArgsConstructor public class ReviewService { private final ReviewRepository reviewRepository; + private final ContractRepository contractRepository; @Transactional public List getAllReviews() { @@ -70,5 +75,10 @@ private ReviewResponse mapToReviewResponse(final Review review) { reviewContent ); } -} + @Transactional + public List getAvailableReviewTargets( + final ReviewAvailableCommand command) { + return contractRepository.findAvailableReviewsByBusinessId(command.businessId()); + } +} \ No newline at end of file diff --git a/src/main/java/com/example/api/reviewavailable/ReviewAvailableService.java b/src/main/java/com/example/api/reviewavailable/ReviewAvailableService.java deleted file mode 100644 index db282ca3..00000000 --- a/src/main/java/com/example/api/reviewavailable/ReviewAvailableService.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.example.api.reviewavailable; - -import com.example.api.contracts.ContractRepository; -import com.example.api.reviewavailable.dto.ReviewAvailableCommand; -import com.example.api.reviewavailable.dto.ReviewAvailableResponse; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; - -@Service -@RequiredArgsConstructor -public class ReviewAvailableService { - private final ContractRepository contractRepository; - - @Transactional - public List getAvailableReviewTargets( - final ReviewAvailableCommand command) { - return contractRepository.findAvailableReviewsByBusinessId(command.businessId()); - } -} diff --git a/src/main/java/com/example/api/reviewavailable/controller/ReviewAvailableController.java b/src/main/java/com/example/api/reviewavailable/controller/ReviewAvailableController.java deleted file mode 100644 index fd2211fe..00000000 --- a/src/main/java/com/example/api/reviewavailable/controller/ReviewAvailableController.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.example.api.reviewavailable.controller; - -import com.example.api.reviewavailable.ReviewAvailableService; -import com.example.api.reviewavailable.dto.ReviewAvailableCommand; -import com.example.api.reviewavailable.dto.ReviewAvailableResponse; -import lombok.RequiredArgsConstructor; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -import java.util.List; - -@RestController -@RequestMapping("/api/v1/reviews") -@RequiredArgsConstructor -public class ReviewAvailableController { - private final ReviewAvailableService reviewAvailableService; - - @GetMapping("/available") - public ResponseEntity> getAvailableReviewTargets( - @RequestParam(required = true) Long businessId - ) { - ReviewAvailableCommand command = new ReviewAvailableCommand(businessId); - List availableEmployees = reviewAvailableService.getAvailableReviewTargets(command); - return ResponseEntity.ok(availableEmployees); - } -} - diff --git a/src/main/java/com/example/api/search/SearchRepository.java b/src/main/java/com/example/api/search/SearchRepository.java index 75f8c2d9..57782fac 100644 --- a/src/main/java/com/example/api/search/SearchRepository.java +++ b/src/main/java/com/example/api/search/SearchRepository.java @@ -9,11 +9,10 @@ import java.util.List; public interface SearchRepository extends JpaRepository { - @Query("SELECT DISTINCT a FROM Account a " + "JOIN PossibleBoard pb ON pb.employee = a " + - "JOIN Category c ON c.account = a " + - "WHERE (:category IS NULL OR c.categoryName = :category) " + + "JOIN FlavoredCategory fc ON fc.employee = a " + + "WHERE (:category IS NULL OR fc.category.categoryName = :category) " + "AND (:startTime IS NULL OR pb.startTime <= :startTime) " + "AND (:endTime IS NULL OR pb.endTime >= :endTime)") List searchAccountsByCategoryAndTime( @@ -21,7 +20,4 @@ List searchAccountsByCategoryAndTime( @Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime ); -} - - - +} \ No newline at end of file diff --git a/src/main/java/com/example/api/suggest/controller/SuggestController.java b/src/main/java/com/example/api/suggest/controller/SuggestController.java index 62eea25f..56e0c7db 100644 --- a/src/main/java/com/example/api/suggest/controller/SuggestController.java +++ b/src/main/java/com/example/api/suggest/controller/SuggestController.java @@ -1,13 +1,14 @@ package com.example.api.suggest.controller; +import com.example.api.contracts.dto.AcceptSuggestCommand; +import com.example.api.contracts.dto.QueryAllSuggestsForMeCommand; +import com.example.api.contracts.dto.SuggestedBusinessResponse; import com.example.api.suggest.controller.dto.SuggestStatusDTO; import com.example.api.suggest.controller.dto.request.BusinessIdRequest; import com.example.api.suggest.service.SuggestService; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import java.util.List; @@ -22,4 +23,30 @@ public ResponseEntity getSuggestStatus(@PathVariable() long businessId) { List suggestStatus = suggestService.getSuggestStatus(businessIdRequest); return ResponseEntity.ok(suggestStatus); } + @GetMapping("/api/v1/contracts/employment-suggests") + public ResponseEntity> getAllSuggest( + @RequestParam(required = true) final Long employeeId + ) { + final QueryAllSuggestsForMeCommand queryAllSuggestsForMeCommand = new QueryAllSuggestsForMeCommand(employeeId); + final List suggestedBusinesses = suggestService.getAllRelatedSuggests( + queryAllSuggestsForMeCommand); + return ResponseEntity.ok(suggestedBusinesses); + } + + @PostMapping("/api/v1/contracts/suggests/{suggestId}/accept") + public ResponseEntity acceptContractContact( + @PathVariable(required = true) final Long suggestId + ) { + final AcceptSuggestCommand acceptSuggestCommand = new AcceptSuggestCommand(suggestId); + suggestService.acceptSuggest(acceptSuggestCommand); + return ResponseEntity.ok(null); + } + + @PostMapping("/api/v1/contracts/suggests/{suggestId}/chatroom") + public ResponseEntity createChatRoom( + @RequestBody final AcceptSuggestCommand acceptSuggestCommand + ) { + suggestService.createChatRoom(acceptSuggestCommand); + return ResponseEntity.ok(null); + } } diff --git a/src/main/java/com/example/api/suggest/service/SuggestService.java b/src/main/java/com/example/api/suggest/service/SuggestService.java index 0f9da16e..c9d01856 100644 --- a/src/main/java/com/example/api/suggest/service/SuggestService.java +++ b/src/main/java/com/example/api/suggest/service/SuggestService.java @@ -1,5 +1,14 @@ package com.example.api.suggest.service; +import com.example.api.chat.repository.ChatRoomRepository; +import com.example.api.contracts.ContractMapper; +import com.example.api.contracts.ContractRepository; +import com.example.api.contracts.OfferRepository; +import com.example.api.contracts.dto.AcceptSuggestCommand; +import com.example.api.contracts.dto.QueryAllSuggestsForMeCommand; +import com.example.api.contracts.dto.SuggestedBusinessResponse; +import com.example.api.domain.ChatRoom; +import com.example.api.domain.Contract; import com.example.api.domain.repository.OfferEmploymentRepository; import com.example.api.domain.OfferEmployment; import com.example.api.suggest.controller.dto.SuggestStatusDTO; @@ -7,6 +16,7 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; @@ -18,6 +28,10 @@ public class SuggestService { private final OfferEmploymentRepository offerEmploymentRepository; private final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.MM.dd"); + private final OfferRepository offerRepository; + private final ContractRepository contractRepository; + private final ChatRoomRepository chatRoomRepository; + private final ContractMapper contractMapper; @Transactional(readOnly = true) public List getSuggestStatus(final BusinessIdRequest businessIdRequest) { @@ -72,4 +86,34 @@ public SuggestStatusDTO makeSuggestStatusDTO(Object[] suggest, String status) { workTimeStr ); } + + @Transactional(readOnly = true) + public List getAllRelatedSuggests(final QueryAllSuggestsForMeCommand allSuggestsForMeCommand) { + return offerRepository.queryEmployersSuggests(allSuggestsForMeCommand.employeeId()); + } + + @Transactional + public void acceptSuggest(@Validated final AcceptSuggestCommand acceptSuggestCommand) { + final OfferEmployment offerEmployment = loadOffer(acceptSuggestCommand.suggestId()); + offerEmployment.succeeded(); + + final Contract contract = contractMapper.notYetSucceeded(offerEmployment); + contractRepository.save(contract); + } + + @Transactional + public void createChatRoom(@Validated final AcceptSuggestCommand acceptSuggestCommand) { + final OfferEmployment offerEmployment = loadOffer(acceptSuggestCommand.suggestId()); + createChatRoom(offerEmployment); + } + + private OfferEmployment loadOffer(final Long offerId) { + return offerRepository.findById(offerId) + .orElseThrow(); + } + + private void createChatRoom(final OfferEmployment offer) { + ChatRoom chatRoom = new ChatRoom(offer); + chatRoomRepository.save(chatRoom); + } } \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 3fb87397..b04a00ae 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -12,7 +12,7 @@ spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.data.mongodb.auto-index-creation=true # JPA and Hibernate Configuration -spring.jpa.hibernate.ddl-auto=validate +spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true spring.jpa.properties.hibernate.format_sql=true spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect diff --git a/src/test/java/com/example/api/account/service/AccountServiceTest.java b/src/test/java/com/example/api/account/service/AccountServiceTest.java index 61997561..67223504 100644 --- a/src/test/java/com/example/api/account/service/AccountServiceTest.java +++ b/src/test/java/com/example/api/account/service/AccountServiceTest.java @@ -3,7 +3,7 @@ import com.example.api.account.dto.BusinessNumberRequest; import com.example.api.account.dto.SignUpEmployerRequest; import com.example.api.account.repository.AccountRepository; -import com.example.api.exception.BusinessException; +import com.example.api.global.exception.BusinessException; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; diff --git a/src/test/java/com/example/api/employer/service/EmployerServiceTest.java b/src/test/java/com/example/api/employer/service/EmployerServiceTest.java index a21c360b..daebb266 100644 --- a/src/test/java/com/example/api/employer/service/EmployerServiceTest.java +++ b/src/test/java/com/example/api/employer/service/EmployerServiceTest.java @@ -1,13 +1,13 @@ package com.example.api.employer.service; -import com.example.api.account.entity.Location; +import com.example.api.business.domain.BusinessLocation; import com.example.api.account.repository.AccountRepository; import com.example.api.account.repository.LocationRepository; -import com.example.api.board.dto.request.EmployeeIdRequest; import com.example.api.business.BusinessRepository; import com.example.api.domain.Account; import com.example.api.domain.Business; import com.example.api.employer.controller.dto.EmployerBusinessesRequest; +import com.example.api.employer.controller.dto.EmployerIdRequest; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -33,9 +33,9 @@ class EmployerServiceTest { void setUp() { Account account = new Account(); accountRepository.save(account); - Location location1 = new Location("zipcode1", "address1", "detailAddress1"); - Location location2 = new Location("zipcode2", "address2", "detailAddress2"); - Location location3 = new Location("zipcode3", "address3", "detailAddress3"); + BusinessLocation location1 = new BusinessLocation("zipcode1", "address1", "detailAddress1"); + BusinessLocation location2 = new BusinessLocation("zipcode2", "address2", "detailAddress2"); + BusinessLocation location3 = new BusinessLocation("zipcode3", "address3", "detailAddress3"); locationRepository.save(location1); locationRepository.save(location2); locationRepository.save(location3); @@ -52,7 +52,7 @@ void setUp() { @Test void testGetBusinessesByOwnerId(){ - List employerBusinessList = employerService.getEmployerBusinessList(new EmployeeIdRequest(1L)); + List employerBusinessList = employerService.getEmployerBusinessList(new EmployerIdRequest(1L)); Assertions.assertThat(employerBusinessList).isEqualTo(businessesList); } } \ 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 f44232b0..e5dd902b 100644 --- a/src/test/java/com/example/api/offeremployment/OfferEmploymentServiceTest.java +++ b/src/test/java/com/example/api/offeremployment/OfferEmploymentServiceTest.java @@ -1,6 +1,6 @@ package com.example.api.offeremployment; -import com.example.api.account.entity.Location; +import com.example.api.business.domain.BusinessLocation; import com.example.api.account.entity.Nationality; import com.example.api.account.entity.UserRole; import com.example.api.account.repository.AccountRepository; @@ -59,7 +59,7 @@ void setUp() { Business business = new Business( "My Coffee Shop", - new Location(), + new BusinessLocation(), "Bob", employer, LocalDate.of(2020, 1, 1), 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 c9967f21..cee0eac1 100644 --- a/src/test/java/com/example/api/review/service/ContractReviewServiceTest.java +++ b/src/test/java/com/example/api/review/service/ContractReviewServiceTest.java @@ -2,7 +2,6 @@ import static org.assertj.core.api.Assertions.assertThat; -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; From b95b5e1bbb453632f9f04631cda543384b8ba13b Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Wed, 29 Jan 2025 19:08:50 +0900 Subject: [PATCH 241/276] =?UTF-8?q?#103=EC=B2=B4=EA=B2=B0=EB=90=9C=20?= =?UTF-8?q?=EA=B3=84=C3=AC=20=C2=95=C2=BD=20=EC=8A=A4=EC=BC=80=EC=A5=B4=20?= =?UTF-8?q?=EA=B0=80=EC=A0=B8=EC=98=A4=EA=B8=B0=20api=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/board/controller/BoardController.java | 26 +++++++++---------- .../api/contracts/ContractRepository.java | 9 +++++++ .../api/contracts/ContractService.java | 8 ++++++ .../controller/ContractController.java | 10 ++++++- .../dto/ContractScheduleResponse.java | 11 ++++++++ 5 files changed, 50 insertions(+), 14 deletions(-) create mode 100644 src/main/java/com/example/api/contracts/dto/ContractScheduleResponse.java diff --git a/src/main/java/com/example/api/board/controller/BoardController.java b/src/main/java/com/example/api/board/controller/BoardController.java index 1f46e325..8cdb4354 100644 --- a/src/main/java/com/example/api/board/controller/BoardController.java +++ b/src/main/java/com/example/api/board/controller/BoardController.java @@ -20,7 +20,7 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -@RestController +@RestController("api/v1/possible-board") @RequiredArgsConstructor public class BoardController { private final BoardService boardService; @@ -35,37 +35,37 @@ public class BoardController { * 4. 외부 경력 * 5. 내부 경력 */ - @GetMapping("/api/v1/possible-board/personal-info") + @GetMapping("/personal-info") public ResponseEntity getPersonalInfo(@AuthenticationPrincipal final Long employeeId){ return ResponseEntity.ok(boardService.getPersonalInfoResponse(new EmployeeIdRequest(employeeId))); } - @GetMapping("/api/v1/possible-board/work-preferences/districts") + @GetMapping("/work-preferences/districts") public ResponseEntity> getPreferredDistricts(@AuthenticationPrincipal final Long employeeId){ return ResponseEntity.ok(boardService.getPreferredDistricts(new EmployeeIdRequest(employeeId))); } - @GetMapping("/api/v1/possible-board/work-preferences/category") + @GetMapping("/work-preferences/category") public ResponseEntity> getPreferredCategories(@AuthenticationPrincipal final Long employeeId){ return ResponseEntity.ok(boardService.getPreferredCategories(new EmployeeIdRequest(employeeId))); } - @GetMapping("/api/v1/possible-board/work-hours") + @GetMapping("/work-hours") public ResponseEntity> getWorkHours(@AuthenticationPrincipal final Long employeeId){ return ResponseEntity.ok(boardService.getWorkHours(new EmployeeIdRequest(employeeId))); } - @GetMapping("/api/v1/possible-board/external-career") + @GetMapping("/external-career") public ResponseEntity> getExternalCareers(@AuthenticationPrincipal final Long employeeId){ return ResponseEntity.ok(boardService.getExternalCareers(new EmployeeIdRequest(employeeId))); } - @GetMapping("/api/v1/possible-board/internal-career") + @GetMapping("/internal-career") public ResponseEntity> getInternalCareers(@AuthenticationPrincipal final Long employeeId){ return ResponseEntity.ok(boardService.getInternalCareers(new EmployeeIdRequest(employeeId))); } - @PostMapping("/api/v1/possible-board/personal-info") + @PostMapping("/personal-info") public ResponseEntity updatePersonalInfo( @AuthenticationPrincipal final Long employeeId, @RequestBody final UpdatePersonalInfoRequest request @@ -74,7 +74,7 @@ public ResponseEntity updatePersonalInfo( return ResponseEntity.ok(employeeService.updatePersonalInfo(new EmployeeIdRequest(employeeId), request)); } - @PostMapping("/api/v1/possible-board/work-preferences/districts") + @PostMapping("/work-preferences/districts") public ResponseEntity> updatePreferredDistricts( @AuthenticationPrincipal final Long employeeId, @RequestBody final UpdatePreferredDistrictsRequest request @@ -82,21 +82,21 @@ public ResponseEntity> updatePreferredDistricts( return ResponseEntity.ok(boardService.updatePreferredDistrict(new EmployeeIdRequest(employeeId), request)); } - @PostMapping("/api/v1/possible-board/work-preferences/category") + @PostMapping("/work-preferences/category") public ResponseEntity> updatePreferredCategories( @AuthenticationPrincipal final Long employeeId, @RequestBody final UpdatePreferredCategoriesRequest request){ return ResponseEntity.ok(boardService.updatePreferredCategories(new EmployeeIdRequest(employeeId), request)); } - @PostMapping("/api/v1/possible-board/external-career") + @PostMapping("/external-career") public ResponseEntity> updateExternalCareers( @AuthenticationPrincipal final Long employeeId, @RequestBody final UpdateExternalCareerRequest request){ return ResponseEntity.ok(boardService.updateExternalCareers(new EmployeeIdRequest(employeeId), request)); } - @PostMapping("/api/v1/possible-board/work-hours") + @PostMapping("/work-hours") public ResponseEntity updatePossibleTimes( @RequestBody final AddPossibleTimeRequest addPossibleTimeRequest, final Long requestMemberId @@ -106,7 +106,7 @@ public ResponseEntity updatePossibleTimes( return ResponseEntity.ok().build(); } - @PostMapping("/api/v1/possible-board") + @PostMapping() public ResponseEntity changeOpenStatus( @AuthenticationPrincipal final Long employeeId, @RequestParam("open-status") Boolean openStatus diff --git a/src/main/java/com/example/api/contracts/ContractRepository.java b/src/main/java/com/example/api/contracts/ContractRepository.java index 91e23e7e..27bf8e04 100644 --- a/src/main/java/com/example/api/contracts/ContractRepository.java +++ b/src/main/java/com/example/api/contracts/ContractRepository.java @@ -1,8 +1,11 @@ package com.example.api.contracts; import com.example.api.contracts.dto.BusinessInfoDTO; +import com.example.api.contracts.dto.ContractScheduleResponse; import com.example.api.contracts.dto.EmployeeInfoDTO; import com.example.api.domain.Contract; + +import java.time.LocalDate; import java.util.Optional; import com.example.api.review.dto.ReviewAvailableResponse; import org.springframework.data.jpa.repository.JpaRepository; @@ -41,4 +44,10 @@ public interface ContractRepository extends JpaRepository { "join oe.business b " + "where b.businessId = :businessId and c.contractSucceeded = true") List findAvailableReviewsByBusinessId(@Param("businessId") Long businessId); + + @Query("select new com.example.api.contracts.dto.ContractScheduleResponse(c.contractId, b.businessName, c.contractStartTime, c.contractEndTime) " + + "from Contract c join fetch c.offerEmployment o join fetch o.business b " + + "where o.employee.accountId = :employeeId and c.contractStartTime >= :currentMonth") + List findContractScheduleByEmployeeId(@Param("employeeId")Long employeeId, + @Param("currentMonth")LocalDate currentMonth); } diff --git a/src/main/java/com/example/api/contracts/ContractService.java b/src/main/java/com/example/api/contracts/ContractService.java index dcf55dfb..66b2a4cd 100644 --- a/src/main/java/com/example/api/contracts/ContractService.java +++ b/src/main/java/com/example/api/contracts/ContractService.java @@ -1,5 +1,6 @@ package com.example.api.contracts; +import com.example.api.board.dto.request.EmployeeIdRequest; import com.example.api.chat.repository.ChatRoomRepository; import com.example.api.contracts.dto.*; import com.example.api.contracts.update.UpdateContractConditionManager; @@ -9,6 +10,8 @@ import com.example.api.contracts.dto.QueryAllSuggestsForMeCommand; import com.example.api.domain.Contract; import com.example.api.domain.OfferEmployment; + +import java.time.LocalDate; import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -48,4 +51,9 @@ public ContractDTO getContractInfo(final AcceptContractCommand contractStatusCom EmployeeInfoDTO employeeDTO = contractRepository.findEmployeeDTOByContractId(contractStatusCommand.contractId()); return new ContractDTO(businessDTO, employeeDTO); } + + @Transactional(readOnly = true) + public List getContractSchedule(final EmployeeIdRequest employeeIdRequest) { + return contractRepository.findContractScheduleByEmployeeId(employeeIdRequest.employeeId(), LocalDate.now().withDayOfMonth(1)); + } } \ No newline at end of file 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 782e9105..ac629f8b 100644 --- a/src/main/java/com/example/api/contracts/controller/ContractController.java +++ b/src/main/java/com/example/api/contracts/controller/ContractController.java @@ -1,11 +1,13 @@ package com.example.api.contracts.controller; +import com.example.api.board.dto.request.EmployeeIdRequest; import com.example.api.contracts.ContractService; import com.example.api.contracts.dto.*; import java.time.LocalDateTime; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; +import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.*; @RestController @@ -60,10 +62,16 @@ public ResponseEntity acceptContract( return ResponseEntity.ok(null); } - @GetMapping("/api/v1/contract/{contractId}/status") + @GetMapping("/api/v1/contracts/{contractId}/status") public ResponseEntity getContractInfo(@PathVariable(required = true) final Long contractId) { final AcceptContractCommand contractStatusCommand = new AcceptContractCommand(contractId); ContractDTO contractDTO = contractService.getContractInfo(contractStatusCommand); return ResponseEntity.ok(contractDTO); } + + @GetMapping("/api/v1/contracts/schedule") + public ResponseEntity> getContractSchedule(@AuthenticationPrincipal Long employeeId){ + EmployeeIdRequest employeeIdRequest = new EmployeeIdRequest(employeeId); + return ResponseEntity.ok(contractService.getContractSchedule(employeeIdRequest)); + } } \ No newline at end of file diff --git a/src/main/java/com/example/api/contracts/dto/ContractScheduleResponse.java b/src/main/java/com/example/api/contracts/dto/ContractScheduleResponse.java new file mode 100644 index 00000000..d11d8153 --- /dev/null +++ b/src/main/java/com/example/api/contracts/dto/ContractScheduleResponse.java @@ -0,0 +1,11 @@ +package com.example.api.contracts.dto; + +import java.time.LocalDateTime; + +public record ContractScheduleResponse( + Long contractId, + String businessName, + LocalDateTime startTime, + LocalDateTime endTime +) { +} From fcb2600b7b606b80affae248b50d6f429bdf4b85 Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Fri, 31 Jan 2025 17:39:15 +0900 Subject: [PATCH 242/276] . --- .../api/contracts/ContractRepository.java | 2 +- src/main/resources/application.properties | 8 +- src/main/resources/static/danpat.yaml | 1846 +++++++++++++++++ 3 files changed, 1854 insertions(+), 2 deletions(-) create mode 100644 src/main/resources/static/danpat.yaml diff --git a/src/main/java/com/example/api/contracts/ContractRepository.java b/src/main/java/com/example/api/contracts/ContractRepository.java index 27bf8e04..28e7bd40 100644 --- a/src/main/java/com/example/api/contracts/ContractRepository.java +++ b/src/main/java/com/example/api/contracts/ContractRepository.java @@ -46,7 +46,7 @@ public interface ContractRepository extends JpaRepository { List findAvailableReviewsByBusinessId(@Param("businessId") Long businessId); @Query("select new com.example.api.contracts.dto.ContractScheduleResponse(c.contractId, b.businessName, c.contractStartTime, c.contractEndTime) " + - "from Contract c join fetch c.offerEmployment o join fetch o.business b " + + "from Contract c inner join c.offerEmployment o inner join o.business b " + "where o.employee.accountId = :employeeId and c.contractStartTime >= :currentMonth") List findContractScheduleByEmployeeId(@Param("employeeId")Long employeeId, @Param("currentMonth")LocalDate currentMonth); diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index b04a00ae..e2945943 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -93,4 +93,10 @@ cloud.aws.credentials.secretKey=${AWS_CREDENTIALS_SECRETKEY} spring.servlet.multipart.enabled=true spring.servlet.multipart.max-file-size=10MB -spring.servlet.multipart.max-request-size=10MB \ No newline at end of file +spring.servlet.multipart.max-request-size=10MB + +springdoc.swagger-ui.path=/swagger-ui.html +springdoc.swagger-ui.url=/danpat.yaml +springdoc.api-docs.path=/v3/api-docs +springdoc.default-consumes-media-type=application/json +springdoc.default-produces-media-type=application/json \ No newline at end of file diff --git a/src/main/resources/static/danpat.yaml b/src/main/resources/static/danpat.yaml new file mode 100644 index 00000000..4115fa52 --- /dev/null +++ b/src/main/resources/static/danpat.yaml @@ -0,0 +1,1846 @@ +openapi: 3.0.1 +info: + title: Spring API + description: 단팥 백엔드 API 명세서입123니다. + version: 1.0.0 +servers: + - url: http://43.201.78.102:8080/api/v1 +security: + - JWT_TOKEN: [] +paths: + /api/v1/support/announcements/{announcementId}: + get: + tags: + - announcement-controller + operationId: getAnnouncement + parameters: + - name: announcementId + in: path + required: true + schema: + type: integer + format: int64 + responses: + "200": + description: OK + content: + application/json: + schema: + $ref: "#/components/schemas/AnnouncementResponse" + example: + announcementId: 1 + announcementTitle: "긴급 서버 점검 공지" + announcementType: "공지" + announcementContent: "서버 점검이 오늘 밤 11시에 진행됩니다." + viewCount: 123 + + + put: + tags: + - announcement-controller + operationId: updateAnnouncement + parameters: + - name: announcementId + in: path + required: true + schema: + type: integer + format: int64 + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/AnnouncementRequest" + required: true + responses: + "200": + description: OK + content: + '*/*': + schema: + $ref: "#/components/schemas/AnnouncementResponse" + delete: + tags: + - announcement-controller + operationId: deleteAnnouncement + parameters: + - name: announcementId + in: path + required: true + schema: + type: integer + format: int64 + responses: + "200": + description: OK + /api/v1/contracts/{contractId}: + put: + tags: + - contract-controller + operationId: updateContractCondition + parameters: + - name: contractId + in: path + required: true + schema: + type: integer + format: int64 + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/UpdateContractConditionRequest" + required: true + responses: + "200": + description: OK + content: + '*/*': + schema: + type: object + /api/v1/business: + get: + tags: + - business-controller + operationId: getMyBusiness + parameters: + - name: businessId + in: query + required: true + schema: + type: integer + format: int64 + responses: + "200": + description: OK + content: + '*/*': + schema: + type: object + put: + tags: + - business-controller + operationId: modifyMyBusiness + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/ModifyBusinessRequest" + required: true + responses: + "200": + description: OK + content: + '*/*': + schema: + type: object + post: + tags: + - business-controller + operationId: addBusiness + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/AddBusinessRequest" + required: true + responses: + "200": + description: OK + content: + '*/*': + schema: + type: object + /api/v1/upload/profile: + post: + tags: + - s-3-controller + operationId: upload + requestBody: + content: + multipart/form-data: + schema: + required: + - file + type: object + properties: + file: + type: string + format: binary + responses: + "200": + description: OK + content: + '*/*': + schema: + type: string + /api/v1/support/inquiry: + post: + tags: + - inquiry-controller + operationId: createInquiry + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/InquiryRequest" + required: true + responses: + "200": + description: OK + content: + '*/*': + schema: + $ref: "#/components/schemas/InquiryResponse" + /api/v1/support/announcements: + get: + tags: + - announcement-controller + operationId: getAnnouncements + responses: + "200": + description: OK + content: + '*/*': + schema: + type: array + items: + $ref: "#/components/schemas/AnnouncementResponse" + post: + tags: + - announcement-controller + operationId: createAnnouncement + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/AnnouncementRequest" + required: true + responses: + "200": + description: OK + content: + '*/*': + schema: + $ref: "#/components/schemas/AnnouncementResponse" + /api/v1/possible-board: + post: + tags: + - board-controller + operationId: changeOpenStatus + parameters: + - name: open-status + in: query + required: true + schema: + type: boolean + responses: + "200": + description: OK + content: + '*/*': + schema: + type: string + /api/v1/possible-board/work-preferences/districts: + get: + tags: + - board-controller + operationId: getPreferredDistricts + responses: + "200": + description: OK + content: + '*/*': + schema: + type: array + items: + $ref: "#/components/schemas/FlavoredDistrictResponse" + post: + tags: + - board-controller + operationId: updatePreferredDistricts + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/UpdatePreferredDistrictsRequest" + required: true + responses: + "200": + description: OK + content: + '*/*': + schema: + type: array + items: + $ref: "#/components/schemas/FlavoredDistrictResponse" + /api/v1/possible-board/work-preferences/category: + get: + tags: + - board-controller + operationId: getPreferredCategories + responses: + "200": + description: OK + content: + '*/*': + schema: + type: array + items: + $ref: "#/components/schemas/FlavoredCategoryResponse" + post: + tags: + - board-controller + operationId: updatePreferredCategories + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/UpdatePreferredCategoriesRequest" + required: true + responses: + "200": + description: OK + content: + '*/*': + schema: + type: array + items: + $ref: "#/components/schemas/FlavoredCategoryResponse" + /api/v1/possible-board/work-hours: + get: + tags: + - board-controller + operationId: getWorkHours + responses: + "200": + description: OK + content: + '*/*': + schema: + type: array + items: + $ref: "#/components/schemas/WorkHourResponse" + post: + tags: + - board-controller + operationId: updatePossibleTimes + parameters: + - name: requestMemberId + in: query + required: true + schema: + type: integer + format: int64 + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/AddPossibleTimeRequest" + required: true + responses: + "200": + description: OK + content: + '*/*': + schema: + type: object + /api/v1/possible-board/personal-info: + get: + tags: + - board-controller + operationId: getPersonalInfo + responses: + "200": + description: OK + content: + '*/*': + schema: + $ref: "#/components/schemas/PersonalInfoResponse" + post: + tags: + - board-controller + operationId: updatePersonalInfo + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/UpdatePersonalInfoRequest" + required: true + responses: + "200": + description: OK + content: + '*/*': + schema: + $ref: "#/components/schemas/PersonalInfoResponse" + /api/v1/possible-board/external-career: + get: + tags: + - board-controller + operationId: getExternalCareers + responses: + "200": + description: OK + content: + '*/*': + schema: + type: array + items: + $ref: "#/components/schemas/ExternalCareerResponse" + post: + tags: + - board-controller + operationId: updateExternalCareers + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/UpdateExternalCareerRequest" + required: true + responses: + "200": + description: OK + content: + '*/*': + schema: + type: array + items: + $ref: "#/components/schemas/ExternalCareerResponse" + /api/v1/offeremployment: + post: + tags: + - offer-employment-controller + operationId: sendOfferEmployment + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/OfferEmploymentRequest" + required: true + responses: + "200": + description: OK + content: + '*/*': + schema: + $ref: "#/components/schemas/OfferEmploymentResponse" + /api/v1/offeremployment/complete: + post: + tags: + - offer-employment-controller + operationId: completeOfferEmployment + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/OfferEmploymentCompleteRequest" + required: true + responses: + "200": + description: OK + content: + '*/*': + schema: + type: string + /api/v1/info/my/reviews/{reviewId}/report: + post: + tags: + - review-report-controller + operationId: reportReview + parameters: + - name: reviewId + in: path + required: true + schema: + $ref: "#/components/schemas/Review" + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/ReviewReportRequest" + required: true + responses: + "200": + description: OK + content: + '*/*': + schema: + $ref: "#/components/schemas/ReviewReportResponse" + /api/v1/contracts/{contractId}/accepts: + post: + tags: + - contract-controller + operationId: acceptContract + parameters: + - name: contractId + in: path + required: true + schema: + type: integer + format: int64 + responses: + "200": + description: OK + content: + '*/*': + schema: + type: object + /api/v1/contracts/suggests/{suggestId}/chatroom: + post: + parameters: + - name: suggestId + in: path + required: true + schema: + type: string + tags: + - suggest-controller + operationId: createChatRoom + requestBody: + required: true + content: + application/json: + schema: + $ref: "#/components/schemas/AcceptSuggestCommand" + responses: + "200": + description: OK + content: + application/json: + schema: + type: object + /api/v1/contracts/suggests/{suggestId}/accept: + post: + tags: + - suggest-controller + operationId: acceptContractContact + parameters: + - name: suggestId + in: path + required: true + schema: + type: integer + format: int64 + responses: + "200": + description: OK + content: + '*/*': + schema: + type: object + /api/v1/contracts/review: + post: + tags: + - contract-review-controller + operationId: addReview + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/AddReviewRequest" + required: true + responses: + "200": + description: OK + content: + '*/*': + schema: + type: object + /api/v1/auth/refresh: + post: + tags: + - auth-controller + operationId: refresh + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/RefreshTokenRequest" + required: true + responses: + "200": + description: OK + content: + '*/*': + schema: + type: object + additionalProperties: + type: string + /api/v1/auth/logout: + post: + tags: + - auth-controller + operationId: logout + responses: + "200": + description: OK + content: + '*/*': + schema: + type: object + additionalProperties: + type: string + /api/v1/auth/login: + post: + tags: + - auth-controller + operationId: login + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/LoginRequest" + required: true + responses: + "200": + description: OK + content: + '*/*': + schema: + type: object + additionalProperties: + type: string + /api/v1/account/validation/business-number: + post: + tags: + - account-controller + operationId: verifyBusinessNumber + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/BusinessNumberRequest" + required: true + responses: + "200": + description: OK + content: + '*/*': + schema: + type: string + /api/v1/account/sign-up/employer: + post: + tags: + - account-controller + operationId: signUpEmployer + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/SignUpEmployerRequest" + required: true + responses: + "200": + description: OK + content: + '*/*': + schema: + type: string + /api/v1/account/sign-up/employee: + post: + tags: + - account-controller + operationId: signUpEmployee + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/SignUpEmployeeRequest" + required: true + responses: + "200": + description: OK + content: + '*/*': + schema: + type: string + /api/v1/account/email/verification: + post: + tags: + - account-controller + operationId: verifyEmail + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/EmailCodeRequest" + required: true + responses: + "200": + description: OK + content: + '*/*': + schema: + type: string + /api/v1/account/email/code: + post: + tags: + - account-controller + operationId: sendEmailCode + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/EmailRequest" + required: true + responses: + "200": + description: OK + content: + '*/*': + schema: + type: string + /api/search/search: + post: + tags: + - search-controller + operationId: searchAccounts + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/SearchRequest" + required: true + responses: + "200": + description: OK + content: + '*/*': + schema: + type: array + items: + $ref: "#/components/schemas/SearchResponse" + /favorites/employees: + get: + tags: + - employer-controller + operationId: getLikeEmployee + responses: + "200": + description: OK + content: + '*/*': + schema: + type: string + /chat/summaries: + get: + tags: + - chat-controller + operationId: getChatSummaries + parameters: + - name: userIdRequest + in: query + required: true + schema: + $ref: "#/components/schemas/UserIdRequest" + responses: + "200": + description: OK + content: + '*/*': + schema: + $ref: "#/components/schemas/ChatSummaryResponse" + /chat/room/{roomId}/chats: + get: + tags: + - chat-controller + operationId: getMessages + parameters: + - name: roomId + in: path + required: true + schema: + type: integer + format: int64 + - name: lastChatId + in: query + required: false + schema: + type: string + responses: + "200": + description: OK + content: + '*/*': + schema: + type: array + items: + $ref: "#/components/schemas/Chat" + /businesses: + get: + tags: + - employer-controller + operationId: getBusinessList + responses: + "200": + description: OK + content: + '*/*': + schema: + type: string + /api/v1/support/my-inquiries: + get: + tags: + - inquiry-controller + operationId: getMyInquiries + parameters: + - name: accountId + in: query + required: true + schema: + type: integer + format: int64 + responses: + "200": + description: OK + content: + '*/*': + schema: + type: array + items: + $ref: "#/components/schemas/InquiryResponse" + /api/v1/support/announcements/search: + get: + tags: + - announcement-controller + operationId: searchAnnouncements + parameters: + - name: keyword + in: query + required: true + schema: + type: string + responses: + "200": + description: OK + content: + '*/*': + schema: + type: array + items: + $ref: "#/components/schemas/AnnouncementResponse" + /api/v1/review: + get: + tags: + - review-controller + operationId: getAllReviews + responses: + "200": + description: OK + content: + '*/*': + schema: + type: array + items: + $ref: "#/components/schemas/ReviewResponse" + /api/v1/review/{reviewId}: + get: + tags: + - review-controller + operationId: getReviewsByEmployee + parameters: [] + responses: + "200": + description: OK + content: + '*/*': + schema: + type: array + items: + $ref: "#/components/schemas/ReviewResponse" + /api/v1/review/my/reviews: + get: + tags: + - review-controller + operationId: getMyReviews + parameters: + - name: accountId + in: query + required: true + schema: + type: integer + format: int64 + responses: + "200": + description: OK + content: + '*/*': + schema: + type: array + items: + $ref: "#/components/schemas/ReviewResponse" + /api/v1/review/available: + get: + tags: + - review-controller + operationId: getAvailableReviewTargets + parameters: + - name: businessId + in: query + required: true + schema: + type: integer + format: int64 + responses: + "200": + description: OK + content: + '*/*': + schema: + type: array + items: + $ref: "#/components/schemas/ReviewAvailableResponse" + /api/v1/possible-board/internal-career: + get: + tags: + - board-controller + operationId: getInternalCareers + responses: + "200": + description: OK + content: + '*/*': + schema: + type: array + items: + $ref: "#/components/schemas/InternalCareerResponse" + /api/v1/employment-suggests/status/{businessId}: + get: + tags: + - suggest-controller + operationId: getSuggestStatus + parameters: + - name: businessId + in: path + required: true + schema: + type: integer + format: int64 + responses: + "200": + description: OK + content: + '*/*': + schema: + type: string + /api/v1/contracts/review/my: + get: + tags: + - contract-review-controller + operationId: getMyReview + responses: + "200": + description: OK + content: + '*/*': + schema: + type: array + items: + $ref: "#/components/schemas/ReviewResponse" + /api/v1/contracts/employment-suggests: + get: + tags: + - suggest-controller + operationId: getAllSuggest + parameters: + - name: employeeId + in: query + required: true + schema: + type: integer + format: int64 + responses: + "200": + description: OK + content: + '*/*': + schema: + type: array + items: + $ref: "#/components/schemas/SuggestedBusinessResponse" + /api/v1/contract/{contractId}/status: + get: + tags: + - contract-controller + operationId: getContractInfo + parameters: + - name: contractId + in: path + required: true + schema: + type: integer + format: int64 + responses: + "200": + description: OK + content: + '*/*': + schema: + $ref: "#/components/schemas/ContractDTO" + /api/v1/account/my: + delete: + tags: + - account-controller + operationId: deleteAccount + responses: + "200": + description: OK + content: + '*/*': + schema: + type: string +components: + schemas: + AnnouncementRequest: + type: object + properties: + announcementTitle: + type: string + announcementType: + type: string + announcementContent: + type: string + AnnouncementResponse: + type: object + properties: + announcementId: + type: integer + format: int64 + announcementTitle: + type: string + announcementType: + type: string + announcementContent: + type: string + viewCount: + type: integer + format: int32 + + UpdateContractConditionRequest: + type: object + properties: + suggestStartDateTime: + type: string + format: date-time + suggestEndDateTime: + type: string + format: date-time + suggestHourlyPayment: + type: integer + format: int32 + BusinessLocation: + type: object + properties: + createdDate: + type: string + format: date-time + updatedDate: + type: string + format: date-time + zipcode: + type: string + address: + type: string + detailAddress: + type: string + ModifyBusinessRequest: + required: + - businessId + type: object + properties: + businessId: + type: integer + format: int64 + businessName: + type: string + location: + $ref: "#/components/schemas/BusinessLocation" + representationName: + type: string + categoryId: + type: array + items: + type: integer + format: int64 + Account: + type: object + properties: + createdDate: + type: string + format: date-time + updatedDate: + type: string + format: date-time + accountId: + type: integer + format: int64 + loginId: + type: string + password: + type: string + name: + type: string + nickname: + type: string + phoneNumber: + type: string + email: + type: string + nationality: + type: string + enum: + - KOREAN + - FOREIGN + roles: + type: array + items: + type: string + enum: + - EMPLOYEE + - EMPLOYER + sex: + type: string + age: + type: integer + format: int32 + profileImage: + type: string + starPoint: + type: number + format: float + workCount: + type: integer + format: int32 + openStatus: + type: boolean + deleted: + type: boolean + emailReceivable: + type: boolean + loginUser: + $ref: "#/components/schemas/LoginUserRequest" + InquiryRequest: + required: + - createdBy + - inquiryType + type: object + properties: + inquiryType: + type: string + subInquiryType: + type: string + title: + type: string + content: + type: string + createdBy: + $ref: "#/components/schemas/Account" + LoginUserRequest: + type: object + properties: + userId: + type: integer + format: int64 + InquiryResponse: + required: + - createdBy + - inquiryId + type: object + properties: + inquiryId: + type: integer + format: int64 + inquiryType: + type: string + subInquiryType: + type: string + title: + type: string + content: + type: string + inquiryStatus: + type: string + answerDate: + type: string + format: date-time + createdBy: + $ref: "#/components/schemas/Account" + UpdatePreferredDistrictsRequest: + type: object + properties: + districtIds: + type: array + items: + type: integer + format: int64 + FlavoredDistrictResponse: + type: object + properties: + districtId: + type: integer + format: int64 + districtName: + type: string + UpdatePreferredCategoriesRequest: + type: object + properties: + categoryIds: + type: array + items: + type: integer + format: int64 + FlavoredCategoryResponse: + type: object + properties: + categoryId: + type: integer + format: int64 + categoryName: + type: string + AddPossibleTimeRequest: + type: object + properties: + possibleTimes: + type: array + items: + $ref: "#/components/schemas/PossibleTimeForm" + PossibleTimeForm: + type: object + properties: + startTime: + type: string + format: date-time + endTime: + type: string + format: date-time + UpdatePersonalInfoRequest: + type: object + properties: + name: + type: string + sex: + type: string + age: + type: integer + format: int32 + phoneNumber: + type: string + email: + type: string + nickname: + type: string + PersonalInfoResponse: + type: object + properties: + name: + type: string + nickname: + type: string + age: + type: integer + format: int32 + sex: + type: string + email: + type: string + phoneNumber: + type: string + starPoint: + type: number + format: float + workCount: + type: integer + format: int32 + ExternalCareerRequest: + type: object + properties: + categoryId: + type: integer + format: int64 + workCount: + type: integer + format: int32 + UpdateExternalCareerRequest: + type: object + properties: + newExternalCareers: + type: array + items: + $ref: "#/components/schemas/ExternalCareerRequest" + Category: + type: object + properties: + createdDate: + type: string + format: date-time + updatedDate: + type: string + format: date-time + categoryId: + type: integer + format: int64 + categoryName: + type: string + ExternalCareerResponse: + type: object + properties: + externalCareerId: + type: integer + format: int64 + category: + $ref: "#/components/schemas/Category" + workCount: + type: integer + format: int32 + OfferEmploymentRequest: + type: object + properties: + employeeId: + type: integer + format: int64 + businessId: + type: integer + format: int64 + suggestHourlyPay: + type: integer + format: int32 + suggestStartTime: + type: string + format: date-time + suggestEndTime: + type: string + format: date-time + OfferEmploymentResponse: + type: object + properties: + suggestId: + type: integer + format: int64 + success: + type: boolean + message: + type: string + OfferEmploymentCompleteRequest: + required: + - employeeId + - suggestId + type: object + properties: + suggestId: + type: integer + format: int64 + employeeId: + type: integer + format: int64 + Business: + type: object + properties: + createdDate: + type: string + format: date-time + updatedDate: + type: string + format: date-time + businessId: + type: integer + format: int64 + employer: + $ref: "#/components/schemas/Account" + businessCategories: + type: array + items: + $ref: "#/components/schemas/BusinessCategory" + businessName: + type: string + location: + $ref: "#/components/schemas/BusinessLocation" + representationName: + type: string + openDate: + type: string + format: date + registrationNumber: + type: string + BusinessCategory: + type: object + properties: + createdDate: + type: string + format: date-time + updatedDate: + type: string + format: date-time + id: + type: integer + format: int64 + business: + $ref: "#/components/schemas/Business" + category: + $ref: "#/components/schemas/Category" + Contract: + type: object + properties: + createdDate: + type: string + format: date-time + updatedDate: + type: string + format: date-time + contractId: + type: integer + format: int64 + offerEmployment: + $ref: "#/components/schemas/OfferEmployment" + contractStartTime: + type: string + format: date-time + contractEndTime: + type: string + format: date-time + contractHourlyPay: + type: integer + format: int32 + contractSucceeded: + type: boolean + validContractRangeTime: + type: boolean + OfferEmployment: + type: object + properties: + suggestId: + type: integer + format: int64 + business: + $ref: "#/components/schemas/Business" + employee: + $ref: "#/components/schemas/Account" + contract: + $ref: "#/components/schemas/Contract" + suggestStartTime: + type: string + format: date-time + suggestEndTime: + type: string + format: date-time + suggestHourlyPay: + type: integer + format: int32 + suggestReaded: + type: boolean + suggestSucceeded: + type: boolean + suggestRegisterTime: + type: string + format: date-time + suggestFinished: + type: boolean + Review: + type: object + properties: + createdDate: + type: string + format: date-time + updatedDate: + type: string + format: date-time + reviewId: + type: integer + format: int64 + offerEmployment: + $ref: "#/components/schemas/OfferEmployment" + writer: + $ref: "#/components/schemas/Business" + employee: + $ref: "#/components/schemas/Account" + contract: + $ref: "#/components/schemas/Contract" + reviewStarPoint: + type: integer + format: int32 + reviewContent: + type: string + ReviewReportRequest: + type: object + properties: + reason: + type: string + ReviewReportResponse: + type: object + properties: + reportId: + type: integer + format: int64 + message: + type: string + AcceptSuggestCommand: + required: + - suggestId + type: object + properties: + suggestId: + type: integer + format: int64 + AddReviewRequest: + required: + - contractId + type: object + properties: + contractId: + type: integer + format: int64 + reviewScore: + type: integer + format: int32 + reviewContent: + type: string + AddBusinessRequest: + type: object + properties: + requestMemberId: + type: integer + format: int64 + businessName: + type: string + location: + $ref: "#/components/schemas/BusinessLocation" + categoryIds: + type: array + items: + type: integer + format: int64 + representationName: + type: string + RefreshTokenRequest: + required: + - refreshToken + type: object + properties: + refreshToken: + type: string + LoginRequest: + required: + - loginId + - password + type: object + properties: + loginId: + type: string + password: + type: string + BusinessNumberRequest: + required: + - businessName + - businessOpenDate + - businessRegistrationNumber + - representationName + type: object + properties: + businessRegistrationNumber: + type: string + businessName: + type: string + representationName: + type: string + businessOpenDate: + type: string + SignUpEmployerRequest: + required: + - businessName + - businessOpenDate + - businessRegistrationNumber + - location + - loginId + - nationality + - password + - phoneNumber + - representationName + - role + type: object + properties: + loginId: + type: string + password: + type: string + email: + type: string + businessRegistrationNumber: + type: string + businessName: + type: string + representationName: + type: string + businessOpenDate: + type: string + location: + $ref: "#/components/schemas/BusinessLocation" + nationality: + type: string + enum: + - KOREAN + - FOREIGN + role: + type: string + enum: + - EMPLOYEE + - EMPLOYER + phoneNumber: + type: string + SignUpEmployeeRequest: + required: + - emailReceivable + - loginId + - name + - nationality + - nickname + - password + - phoneNumber + - role + type: object + properties: + loginId: + type: string + password: + type: string + name: + type: string + nickname: + type: string + email: + type: string + nationality: + type: string + enum: + - KOREAN + - FOREIGN + role: + type: string + enum: + - EMPLOYEE + - EMPLOYER + phoneNumber: + type: string + emailReceivable: + type: boolean + EmailCodeRequest: + type: object + properties: + email: + type: string + code: + type: string + EmailRequest: + type: object + properties: + email: + type: string + SearchRequest: + type: object + properties: + category: + type: string + startTime: + type: string + format: date-time + endTime: + type: string + format: date-time + SearchResponse: + type: object + properties: + name: + type: string + sex: + type: string + age: + type: integer + format: int32 + starPoint: + type: number + format: float + workCount: + type: integer + format: int32 + UserIdRequest: + type: object + properties: + userId: + type: integer + format: int64 + ChatRoom: + type: object + properties: + chatRoomId: + type: integer + format: int64 + offerEmployment: + $ref: "#/components/schemas/OfferEmployment" + suggestGeneratedDate: + type: string + format: date-time + ChatSummary: + type: object + properties: + roomId: + type: integer + format: int64 + lastMessageContent: + type: string + lastMessageTime: + type: string + format: date-time + numberOfUnreadMessages: + type: integer + format: int64 + ChatSummaryResponse: + type: object + properties: + chatRooms: + type: array + items: + $ref: "#/components/schemas/ChatRoom" + chatSummaries: + type: array + items: + $ref: "#/components/schemas/ChatSummary" + Chat: + type: object + properties: + id: + type: string + content: + type: string + roomId: + type: integer + format: int64 + senderId: + type: integer + format: int64 + receiverId: + type: integer + format: int64 + sendTime: + type: string + format: date-time + isRead: + type: boolean + ReviewResponse: + type: object + properties: + reviewId: + type: integer + format: int64 + businessName: + type: string + businessId: + type: integer + format: int64 + contractStartTime: + type: string + format: date-time + contractEndTime: + type: string + format: date-time + reviewStarPoint: + type: integer + format: int32 + reviewContent: + type: string + ReviewAvailableResponse: + type: object + properties: + employeeId: + type: integer + format: int64 + employeeName: + type: string + WorkHourResponse: + type: object + properties: + id: + type: integer + format: int64 + startTime: + type: string + format: date-time + endTime: + type: string + format: date-time + InternalCareerResponse: + type: object + properties: + contractId: + type: integer + format: int64 + businessName: + type: string + startTime: + type: string + format: date-time + endTime: + type: string + format: date-time + SuggestedBusinessResponse: + type: object + properties: + businessId: + type: integer + format: int64 + suggestStartDateTime: + type: string + format: date-time + suggestEndDateTime: + type: string + format: date-time + suggestPartTimePayment: + type: integer + format: int32 + suggestChecked: + type: boolean + suggestAccepted: + type: boolean + BusinessInfoDTO: + type: object + properties: + businessName: + type: string + representationName: + type: string + startTime: + type: string + format: date-time + endTime: + type: string + format: date-time + location: + $ref: "#/components/schemas/BusinessLocation" + businessPhone: + type: string + signedDate: + type: string + format: date-time + ContractDTO: + type: object + properties: + businessInfo: + $ref: "#/components/schemas/BusinessInfoDTO" + employeeInfo: + $ref: "#/components/schemas/EmployeeInfoDTO" + EmployeeInfoDTO: + type: object + properties: + employeeName: + type: string + employeePhone: + type: string + starPoint: + type: number + format: float + workCount: + type: integer + format: int32 + securitySchemes: + JWT_TOKEN: + type: http + scheme: bearer + bearerFormat: JWT From ba78b4b6dc845bf022153e60164d4fb978ef7eae Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Fri, 31 Jan 2025 17:45:24 +0900 Subject: [PATCH 243/276] rebase develop --- .../api/contracts/ContractService.java | 4 -- .../example/api/contracts/ReviewService.java | 35 ----------- .../controller/ContractController.java | 20 +----- .../controller/ReviewController.java | 62 ------------------- .../domain/repository/ReviewRepository.java | 15 ----- 5 files changed, 2 insertions(+), 134 deletions(-) delete mode 100644 src/main/java/com/example/api/contracts/ReviewService.java delete mode 100644 src/main/java/com/example/api/contracts/controller/ReviewController.java delete mode 100644 src/main/java/com/example/api/domain/repository/ReviewRepository.java diff --git a/src/main/java/com/example/api/contracts/ContractService.java b/src/main/java/com/example/api/contracts/ContractService.java index 66b2a4cd..a4f94ed5 100644 --- a/src/main/java/com/example/api/contracts/ContractService.java +++ b/src/main/java/com/example/api/contracts/ContractService.java @@ -23,10 +23,6 @@ public class ContractService { private final ContractRepository contractRepository; private final UpdateContractConditionManager updateContractConditionManager; - private final ContractRepository contractRepository; - private final ContractMapper contractMapper; - - @Transactional public void updateContract(@Validated final UpdateContractConditionCommand updateContractConditionCommand) { diff --git a/src/main/java/com/example/api/contracts/ReviewService.java b/src/main/java/com/example/api/contracts/ReviewService.java deleted file mode 100644 index db019fc3..00000000 --- a/src/main/java/com/example/api/contracts/ReviewService.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.example.api.contracts; - -import com.example.api.contracts.dto.AddReviewCommand; -import com.example.api.domain.Business; -import com.example.api.domain.Contract; -import com.example.api.domain.Review; -import com.example.api.domain.repository.ReviewRepository; -import com.example.api.exception.BusinessException; -import com.example.api.exception.ErrorCode; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.validation.annotation.Validated; - -@Service -@RequiredArgsConstructor -public class ReviewService { - private final ContractRepository contractRepository; - private final ReviewRepository reviewRepository; - - @Transactional - public void saveReview(@Validated final AddReviewCommand command) { - final Contract contract = contractRepository.loadContractWithOfferEmployment(command.contractId()) - .orElseThrow(); - validateContractOwner(command.requestMemberId(), contract.getOfferEmployment().getBusiness()); - final Review review = new Review(command.reviewScore(), command.reviewContent(), contract); - reviewRepository.save(review); - } - - private void validateContractOwner(final Long requestMemberId, final Business business) { - if (!business.getEmployer().getAccountId().equals(requestMemberId)) { - throw new BusinessException("본인의 계약에만 리뷰가 가능합니다", ErrorCode.CONTRACT_EXCEPTION); - } - } -} 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 ac629f8b..00db59cd 100644 --- a/src/main/java/com/example/api/contracts/controller/ContractController.java +++ b/src/main/java/com/example/api/contracts/controller/ContractController.java @@ -5,6 +5,8 @@ import com.example.api.contracts.dto.*; import java.time.LocalDateTime; +import java.util.List; + import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; @@ -35,24 +37,6 @@ UpdateContractConditionCommand toCommand(final Long contractId) { } } - @PostMapping("/api/v1/contracts/suggests/{suggestId}/chatroom") - public ResponseEntity createChatRoom( - @RequestBody final AcceptSuggestCommand acceptSuggestCommand - ) { - contractService.createChatRoom(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); - } - @PostMapping("/api/v1/contracts/{contractId}/accepts") public ResponseEntity acceptContract( @PathVariable(required = true) final Long contractId diff --git a/src/main/java/com/example/api/contracts/controller/ReviewController.java b/src/main/java/com/example/api/contracts/controller/ReviewController.java deleted file mode 100644 index e897da32..00000000 --- a/src/main/java/com/example/api/contracts/controller/ReviewController.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.example.api.contracts.controller; - -import com.example.api.contracts.ReviewQueryService; -import com.example.api.contracts.ReviewService; -import com.example.api.contracts.dto.AddReviewCommand; -import com.example.api.contracts.dto.QueryEmployersReviewCommand; -import com.example.api.contracts.dto.ReviewResponse; -import jakarta.validation.Valid; -import jakarta.validation.constraints.NotNull; -import java.util.List; -import lombok.RequiredArgsConstructor; -import org.hibernate.validator.constraints.Range; -import org.springframework.http.ResponseEntity; -import org.springframework.security.core.annotation.AuthenticationPrincipal; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@RestController -@RequiredArgsConstructor -@RequestMapping("/api/v1/contracts") -public class ReviewController { - private final ReviewService reviewService; - private final ReviewQueryService reviewQueryService; - - - /** - * @param requestMemberId 고용자 ( employer ID ) 가 본인이 작성한 리뷰 목록 가져오기 - * @return - */ - @GetMapping("/review/my") - public ResponseEntity> getMyReview( - @AuthenticationPrincipal final Long requestMemberId - ) { - final QueryEmployersReviewCommand command = new QueryEmployersReviewCommand(requestMemberId); - return ResponseEntity.ok(reviewQueryService.loadReviewsWithEmployerId(command)); - } - - @PostMapping("/review") - public ResponseEntity addReview( - @RequestBody @Valid final AddReviewRequest request, - @AuthenticationPrincipal final Long memberId - ) { - final AddReviewCommand command = request.toCommand(memberId); - reviewService.saveReview(command); - return ResponseEntity.ok(null); - } - - record AddReviewRequest( - @NotNull - Long contractId, - @Range(min = 0, max = 5) - Integer reviewScore, - String reviewContent - ) { - AddReviewCommand toCommand(final Long requestMemberId) { - return new AddReviewCommand(requestMemberId, contractId, reviewContent, reviewScore); - } - } -} diff --git a/src/main/java/com/example/api/domain/repository/ReviewRepository.java b/src/main/java/com/example/api/domain/repository/ReviewRepository.java deleted file mode 100644 index d8ef51af..00000000 --- a/src/main/java/com/example/api/domain/repository/ReviewRepository.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.example.api.domain.repository; - -import com.example.api.domain.Review; -import java.util.List; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; -import org.springframework.stereotype.Repository; - -@Repository -public interface ReviewRepository extends JpaRepository { - - @Query("SELECT r FROM Review r JOIN FETCH r.contract WHERE r.contract.offerEmployment.business.employer.accountId = :employerId") - List loadReviewsByEmployerId(@Param("employerId") Long employerId); -} From e4943569b6b366c5eec7aa50d92e8441c2cd1dfe Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Sat, 1 Feb 2025 02:04:51 +0900 Subject: [PATCH 244/276] =?UTF-8?q?#103=20=EB=8D=B0=EC=9D=B4=ED=84=B0?= =?UTF-8?q?=EB=B2=A0=EC=9D=B4=EC=8A=A4=20=EC=BB=AC=EB=9F=BC=EB=AA=85?= =?UTF-8?q?=EC=97=90=20=EB=A7=9E=EC=B6=B0=20=EB=8F=84=EB=A9=94=EC=9D=B8=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/generated/com/example/api/domain/QReview.java | 3 --- .../example/api/account/dto/SignUpEmployeeRequest.java | 2 +- .../java/com/example/api/auth/entitiy/RefreshToken.java | 9 +++++---- .../example/api/business/domain/BusinessLocation.java | 1 + src/main/java/com/example/api/domain/Account.java | 1 + src/main/java/com/example/api/domain/Announcement.java | 8 +++++--- src/main/java/com/example/api/domain/Business.java | 2 ++ .../java/com/example/api/domain/BusinessCategory.java | 2 +- src/main/java/com/example/api/domain/ChatRoom.java | 1 + src/main/java/com/example/api/domain/CityDistrict.java | 1 + src/main/java/com/example/api/domain/Contract.java | 4 ++-- src/main/java/com/example/api/domain/ExternalCareer.java | 3 ++- src/main/java/com/example/api/domain/Inquiry.java | 5 +++++ .../java/com/example/api/domain/OfferEmployment.java | 5 +++-- src/main/java/com/example/api/domain/PossibleBoard.java | 6 ++++-- src/main/java/com/example/api/domain/Review.java | 4 ---- src/main/java/com/example/api/domain/ReviewReport.java | 1 + src/main/java/com/example/api/domain/Scrap.java | 2 ++ .../handler/OAuth2AuthenticationSuccessHandler.java | 5 ----- src/main/resources/application.properties | 3 ++- src/main/resources/static/danpat.yaml | 2 +- 21 files changed, 40 insertions(+), 30 deletions(-) diff --git a/src/main/generated/com/example/api/domain/QReview.java b/src/main/generated/com/example/api/domain/QReview.java index 30f99fe2..7da09154 100644 --- a/src/main/generated/com/example/api/domain/QReview.java +++ b/src/main/generated/com/example/api/domain/QReview.java @@ -31,8 +31,6 @@ public class QReview extends EntityPathBase { public final QAccount employee; - public final QOfferEmployment offerEmployment; - public final StringPath reviewContent = createString("reviewContent"); public final NumberPath reviewId = createNumber("reviewId", Long.class); @@ -64,7 +62,6 @@ public QReview(Class type, PathMetadata metadata, PathInits in super(type, metadata, inits); this.contract = inits.isInitialized("contract") ? new QContract(forProperty("contract"), inits.get("contract")) : null; this.employee = inits.isInitialized("employee") ? new QAccount(forProperty("employee")) : null; - this.offerEmployment = inits.isInitialized("offerEmployment") ? new QOfferEmployment(forProperty("offerEmployment"), inits.get("offerEmployment")) : null; this.writer = inits.isInitialized("writer") ? new QBusiness(forProperty("writer"), inits.get("writer")) : null; } diff --git a/src/main/java/com/example/api/account/dto/SignUpEmployeeRequest.java b/src/main/java/com/example/api/account/dto/SignUpEmployeeRequest.java index 3ac7a843..a8f4ba3e 100644 --- a/src/main/java/com/example/api/account/dto/SignUpEmployeeRequest.java +++ b/src/main/java/com/example/api/account/dto/SignUpEmployeeRequest.java @@ -18,7 +18,7 @@ public record SignUpEmployeeRequest( @ValidEmail String email, @NotNull - Nationality nationality, + Nationality nationality , @NotNull UserRole role, @NotBlank diff --git a/src/main/java/com/example/api/auth/entitiy/RefreshToken.java b/src/main/java/com/example/api/auth/entitiy/RefreshToken.java index d461e29c..003ccf4e 100644 --- a/src/main/java/com/example/api/auth/entitiy/RefreshToken.java +++ b/src/main/java/com/example/api/auth/entitiy/RefreshToken.java @@ -6,19 +6,20 @@ import java.time.LocalDateTime; @Entity +@Table(name = "REFRESH_TOKEN") public class RefreshToken { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "tokenId") + @Column(name = "TOKEN_ID") private Long id; - @Column + @Column(name = "REFRESH_TOKEN") private String refreshToken; - @Column + @Column(name = "IS_EXPIRED") private boolean isExpired = false; - @Column + @Column(name = "RECENT_LOGIN") private LocalDateTime recentLogin = LocalDateTime.now(); @ManyToOne(fetch = FetchType.LAZY) diff --git a/src/main/java/com/example/api/business/domain/BusinessLocation.java b/src/main/java/com/example/api/business/domain/BusinessLocation.java index 5a5c2f06..49acbdfb 100644 --- a/src/main/java/com/example/api/business/domain/BusinessLocation.java +++ b/src/main/java/com/example/api/business/domain/BusinessLocation.java @@ -11,6 +11,7 @@ @Entity @Getter @ToString +@Table(name = "BUSINESS_LOCATION") public class BusinessLocation extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) diff --git a/src/main/java/com/example/api/domain/Account.java b/src/main/java/com/example/api/domain/Account.java index cd4b60e9..2075ca8a 100644 --- a/src/main/java/com/example/api/domain/Account.java +++ b/src/main/java/com/example/api/domain/Account.java @@ -36,6 +36,7 @@ public class Account extends BaseEntity { private Nationality nationality; @ElementCollection(targetClass = UserRole.class) @CollectionTable(name = "AUTHORITY", joinColumns = @JoinColumn(name = "ACCOUNT_UNIQUE_ID"), foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) + @Column(name = "ROLE_NAME") @Enumerated(EnumType.STRING) private Collection roles; @Column(name = "ACCOUNT_SEX") diff --git a/src/main/java/com/example/api/domain/Announcement.java b/src/main/java/com/example/api/domain/Announcement.java index 14bd190a..9926e93f 100644 --- a/src/main/java/com/example/api/domain/Announcement.java +++ b/src/main/java/com/example/api/domain/Announcement.java @@ -12,14 +12,16 @@ @EqualsAndHashCode(callSuper = false) @Table(name = "ANNOUNCEMENT") public class Announcement extends BaseEntity { - @NonNull @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "ANNOUNCEMENT_ID") private Long announcementId; + @Column(name = "ANNOUNCEMENT_TITLE") private String announcementTitle; + @Column(name = "ANNOUNCEMENT_TYPE") private String announcementType; + @Column(name = "ANNOUNCEMENT_CONTENT", columnDefinition = "TEXT") private String announcementContent; - - @Column(columnDefinition = "int DEFAULT 0") + @Column(name = "VIEW_COUNT", columnDefinition = "int DEFAULT 0") private int viewCount; } \ No newline at end of file diff --git a/src/main/java/com/example/api/domain/Business.java b/src/main/java/com/example/api/domain/Business.java index 72f9bb9c..2ac85309 100644 --- a/src/main/java/com/example/api/domain/Business.java +++ b/src/main/java/com/example/api/domain/Business.java @@ -20,6 +20,7 @@ public class Business extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "BUSINESS_ID") private Long businessId; @ManyToOne(fetch = LAZY) @@ -36,6 +37,7 @@ public class Business extends BaseEntity { @JoinColumn(name = "BUSINESS_LOCATION", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) private BusinessLocation location; + @Column(name = "REPRESENTATION_NAME") private String representationName; @Column(name = "BUSINESS_OPEN_DATE") diff --git a/src/main/java/com/example/api/domain/BusinessCategory.java b/src/main/java/com/example/api/domain/BusinessCategory.java index ce7f1bb0..4f71111d 100644 --- a/src/main/java/com/example/api/domain/BusinessCategory.java +++ b/src/main/java/com/example/api/domain/BusinessCategory.java @@ -23,7 +23,7 @@ public class BusinessCategory extends BaseEntity{ private Business business; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "CATEGOREY_ID", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) + @JoinColumn(name = "CATEGORY_ID", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) private Category category; public BusinessCategory(Business business, Category category) { diff --git a/src/main/java/com/example/api/domain/ChatRoom.java b/src/main/java/com/example/api/domain/ChatRoom.java index 94f250f5..caf5f2aa 100644 --- a/src/main/java/com/example/api/domain/ChatRoom.java +++ b/src/main/java/com/example/api/domain/ChatRoom.java @@ -17,6 +17,7 @@ public class ChatRoom { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "CHAT_ROOM_ID") private Long chatRoomId; @OneToOne(fetch = LAZY) diff --git a/src/main/java/com/example/api/domain/CityDistrict.java b/src/main/java/com/example/api/domain/CityDistrict.java index d96cb4aa..e26d4657 100644 --- a/src/main/java/com/example/api/domain/CityDistrict.java +++ b/src/main/java/com/example/api/domain/CityDistrict.java @@ -7,6 +7,7 @@ @Entity @Getter @NoArgsConstructor +@Table(name = "CITY_DISTRICT") public class CityDistrict extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) diff --git a/src/main/java/com/example/api/domain/Contract.java b/src/main/java/com/example/api/domain/Contract.java index c26d15db..cf0a17bf 100644 --- a/src/main/java/com/example/api/domain/Contract.java +++ b/src/main/java/com/example/api/domain/Contract.java @@ -21,9 +21,9 @@ public class Contract extends BaseEntity { @PrimaryKeyJoinColumn(name = "CONTRACT_ID", referencedColumnName = "SUGGEST_ID", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) private OfferEmployment offerEmployment; - @Column(name = "CONTRACT_START_TIME") + @Column(name = "CONTRACT_START_TIME", columnDefinition = "TIMESTAMP(0)") private LocalDateTime contractStartTime; - @Column(name = "CONTRACT_END_TIME") + @Column(name = "CONTRACT_END_TIME", columnDefinition = "TIMESTAMP(0)") private LocalDateTime contractEndTime; @Column(name = "CONTRACT_HOURLY_PAY") private int contractHourlyPay; diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 9dc10cf7..971c6d3d 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -26,10 +26,11 @@ public class ExternalCareer extends BaseEntity{ private Account employee; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "CATEGPRY_ID", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) + @JoinColumn(name = "CATEGORY_ID", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) @EqualsAndHashCode.Include private Category category; + @Column(name = "WORK_COUNT") private int workCount; public ExternalCareer(Account employee, Category category, int workCount) { diff --git a/src/main/java/com/example/api/domain/Inquiry.java b/src/main/java/com/example/api/domain/Inquiry.java index 137e9103..b0161e37 100644 --- a/src/main/java/com/example/api/domain/Inquiry.java +++ b/src/main/java/com/example/api/domain/Inquiry.java @@ -15,14 +15,17 @@ public class Inquiry extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "INQUIRY_ID") private Long inquiryId; @ManyToOne(fetch = LAZY) @JoinColumn(name = "ACCOUNT_UNIQUE_ID") private Account createdBy; + @Column(name = "INQUIRY_TYPE") private String inquiryType; + @Column(name = "SUB_INQUIRY_TYPE") private String subInquiryType; private String title; @@ -30,8 +33,10 @@ public class Inquiry extends BaseEntity { private String content; @Enumerated(EnumType.STRING) + @Column(name = "INQUIRY_STATUS") private InquiryStatus inquiryStatus; + @Column(name = "ANSWER_DATE") private LocalDateTime answerDate; public enum InquiryStatus { WAITING, COMPLETED diff --git a/src/main/java/com/example/api/domain/OfferEmployment.java b/src/main/java/com/example/api/domain/OfferEmployment.java index eb8b6c56..ad98046b 100644 --- a/src/main/java/com/example/api/domain/OfferEmployment.java +++ b/src/main/java/com/example/api/domain/OfferEmployment.java @@ -15,6 +15,7 @@ public class OfferEmployment { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "SUGGEST_ID") private Long suggestId; @OneToOne(fetch = LAZY) @@ -25,9 +26,9 @@ public class OfferEmployment { private Account employee; @OneToOne(mappedBy = "offerEmployment", cascade = CascadeType.ALL) private Contract contract; - @Column(name = "SUGGEST_START_TIME") + @Column(name = "SUGGEST_START_TIME", columnDefinition = "TIMESTAMP(0)") private LocalDateTime suggestStartTime; - @Column(name = "SUGGEST_END_TIME") + @Column(name = "SUGGEST_END_TIME", columnDefinition = "TIMESTAMP(0)") private LocalDateTime suggestEndTime; @Column(name = "SUGGEST_HOURLY_PAY") private int suggestHourlyPay; diff --git a/src/main/java/com/example/api/domain/PossibleBoard.java b/src/main/java/com/example/api/domain/PossibleBoard.java index 3684b7c9..856a0ae7 100644 --- a/src/main/java/com/example/api/domain/PossibleBoard.java +++ b/src/main/java/com/example/api/domain/PossibleBoard.java @@ -12,20 +12,22 @@ @AllArgsConstructor @EqualsAndHashCode(callSuper = false) @NoArgsConstructor +@Table(name = "POSSIBLE_BOARD") public class PossibleBoard extends BaseEntity{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "POSSIBLE_ID") private Long possibleId; @ManyToOne(fetch = LAZY) @JoinColumn(name = "EMPLOYEE_ID", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) private Account employee; - @Column(name = "POSSIBLE_START_TIME") + @Column(name = "POSSIBLE_START_TIME", columnDefinition = "TIMESTAMP(0)") @EqualsAndHashCode.Include private LocalDateTime startTime; - @Column(name = "POSSIBLE_END_TIME") + @Column(name = "POSSIBLE_END_TIME", columnDefinition = "TIMESTAMP(0)") @EqualsAndHashCode.Include private LocalDateTime endTime; diff --git a/src/main/java/com/example/api/domain/Review.java b/src/main/java/com/example/api/domain/Review.java index 1ff66018..d84b5f2e 100644 --- a/src/main/java/com/example/api/domain/Review.java +++ b/src/main/java/com/example/api/domain/Review.java @@ -16,10 +16,6 @@ public class Review extends BaseEntity { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long reviewId; - @OneToOne(fetch = FetchType.LAZY) - @PrimaryKeyJoinColumn(name = "REVIEW_ID", referencedColumnName = "SUGGEST_ID", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) - private OfferEmployment offerEmployment; - @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "REVIEW_WRITER_ID") private Business writer; diff --git a/src/main/java/com/example/api/domain/ReviewReport.java b/src/main/java/com/example/api/domain/ReviewReport.java index e709bc90..cda092a4 100644 --- a/src/main/java/com/example/api/domain/ReviewReport.java +++ b/src/main/java/com/example/api/domain/ReviewReport.java @@ -19,6 +19,7 @@ public class ReviewReport extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "REPORT_ID") private Long reportId; @OneToOne(fetch = FetchType.LAZY) diff --git a/src/main/java/com/example/api/domain/Scrap.java b/src/main/java/com/example/api/domain/Scrap.java index 3182db1b..3d0a1fa0 100644 --- a/src/main/java/com/example/api/domain/Scrap.java +++ b/src/main/java/com/example/api/domain/Scrap.java @@ -4,6 +4,7 @@ import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; +import org.checkerframework.checker.units.qual.C; import java.time.LocalDateTime; @@ -14,6 +15,7 @@ public class Scrap extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "SCRAP_ID") private Long scrapId; @ManyToOne(fetch = FetchType.LAZY) diff --git a/src/main/java/com/example/api/oauth2/entity/handler/OAuth2AuthenticationSuccessHandler.java b/src/main/java/com/example/api/oauth2/entity/handler/OAuth2AuthenticationSuccessHandler.java index ae6bdbbf..5cab1854 100644 --- a/src/main/java/com/example/api/oauth2/entity/handler/OAuth2AuthenticationSuccessHandler.java +++ b/src/main/java/com/example/api/oauth2/entity/handler/OAuth2AuthenticationSuccessHandler.java @@ -9,10 +9,7 @@ import com.example.api.auth.repository.TokenRepository; import com.example.api.auth.service.JwtTokenProvider; import com.example.api.domain.Account; -import com.example.api.global.exception.BusinessException; -import com.example.api.global.exception.ErrorCode; import com.example.api.global.properties.JwtProperties; -import com.example.api.oauth2.entity.CookieUtils; import com.example.api.oauth2.entity.HttpCookieOAuth2AuthorizationRequestRepository; import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.servlet.ServletException; @@ -31,8 +28,6 @@ import java.net.URI; import java.util.*; -import static com.example.api.oauth2.entity.HttpCookieOAuth2AuthorizationRequestRepository.REDIRECT_URI_PARAM_COOKIE_NAME; - @Component @Slf4j @RequiredArgsConstructor diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index e2945943..a66914e6 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -12,10 +12,11 @@ spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.data.mongodb.auto-index-creation=true # JPA and Hibernate Configuration -spring.jpa.hibernate.ddl-auto=update +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.MySQL8Dialect +spring.jpa.properties.hibernate.physical_naming_strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl # Logging (Optional) logging.level.org.hibernate.SQL=DEBUG diff --git a/src/main/resources/static/danpat.yaml b/src/main/resources/static/danpat.yaml index 4115fa52..60b6a202 100644 --- a/src/main/resources/static/danpat.yaml +++ b/src/main/resources/static/danpat.yaml @@ -1,7 +1,7 @@ openapi: 3.0.1 info: title: Spring API - description: 단팥 백엔드 API 명세서입123니다. + description: 단팥 백엔드 API 명세서입니다. version: 1.0.0 servers: - url: http://43.201.78.102:8080/api/v1 From d12d6607e22cf212c64e49b88e65301f17b7c10b Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Wed, 29 Jan 2025 17:39:43 +0900 Subject: [PATCH 245/276] =?UTF-8?q?#103=20=EC=9D=B4=EB=A0=A5=EC=84=9C=20ap?= =?UTF-8?q?i=206=EA=B0=9C=EB=A1=9C=20=EB=B6=84=EB=A6=AC=20=EB=B0=8F=20?= =?UTF-8?q?=EA=B7=B8=EC=97=90=20=EB=94=B0=EB=A5=B8=20crud=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1,=20=EB=8F=84=EB=A9=94=EC=9D=B8=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/contracts/ContractService.java | 5 ----- src/main/java/com/example/api/domain/ExternalCareer.java | 2 -- .../entity/handler/OAuth2AuthenticationSuccessHandler.java | 1 + src/main/resources/application.properties | 2 +- 4 files changed, 2 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/example/api/contracts/ContractService.java b/src/main/java/com/example/api/contracts/ContractService.java index a4f94ed5..d6c49c52 100644 --- a/src/main/java/com/example/api/contracts/ContractService.java +++ b/src/main/java/com/example/api/contracts/ContractService.java @@ -1,15 +1,10 @@ package com.example.api.contracts; import com.example.api.board.dto.request.EmployeeIdRequest; -import com.example.api.chat.repository.ChatRoomRepository; import com.example.api.contracts.dto.*; import com.example.api.contracts.update.UpdateContractConditionManager; -import com.example.api.domain.ChatRoom; -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.time.LocalDate; import java.util.List; diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 971c6d3d..4e430875 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -1,12 +1,10 @@ package com.example.api.domain; - import com.fasterxml.jackson.annotation.JsonIgnore; import jakarta.persistence.*; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; -import lombok.Setter; import static jakarta.persistence.FetchType.*; diff --git a/src/main/java/com/example/api/oauth2/entity/handler/OAuth2AuthenticationSuccessHandler.java b/src/main/java/com/example/api/oauth2/entity/handler/OAuth2AuthenticationSuccessHandler.java index 5cab1854..f466d189 100644 --- a/src/main/java/com/example/api/oauth2/entity/handler/OAuth2AuthenticationSuccessHandler.java +++ b/src/main/java/com/example/api/oauth2/entity/handler/OAuth2AuthenticationSuccessHandler.java @@ -28,6 +28,7 @@ import java.net.URI; import java.util.*; + @Component @Slf4j @RequiredArgsConstructor diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index a66914e6..e3b55d59 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -12,7 +12,7 @@ spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.data.mongodb.auto-index-creation=true # JPA and Hibernate Configuration -spring.jpa.hibernate.ddl-auto=validate +spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true spring.jpa.properties.hibernate.format_sql=true spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect From ef4c2cd7d4982fd41e7293a3fa7d15c0ae5289d9 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Wed, 29 Jan 2025 19:08:50 +0900 Subject: [PATCH 246/276] =?UTF-8?q?#103=EC=B2=B4=EA=B2=B0=EB=90=9C=20?= =?UTF-8?q?=EA=B3=84=C3=AC=20=C2=95=C2=BD=20=EC=8A=A4=EC=BC=80=EC=A5=B4=20?= =?UTF-8?q?=EA=B0=80=EC=A0=B8=EC=98=A4=EA=B8=B0=20api=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/api/contracts/ContractService.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/com/example/api/contracts/ContractService.java b/src/main/java/com/example/api/contracts/ContractService.java index d6c49c52..87472fce 100644 --- a/src/main/java/com/example/api/contracts/ContractService.java +++ b/src/main/java/com/example/api/contracts/ContractService.java @@ -7,6 +7,7 @@ import com.example.api.domain.Contract; import java.time.LocalDate; + import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -19,6 +20,8 @@ public class ContractService { private final ContractRepository contractRepository; private final UpdateContractConditionManager updateContractConditionManager; + + @Transactional public void updateContract(@Validated final UpdateContractConditionCommand updateContractConditionCommand) { final Contract contract = loadContract(updateContractConditionCommand.contractId()); From d61ea68b3c4b0f7b0f36c03550fac86f9134a3b4 Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Sat, 1 Feb 2025 02:04:51 +0900 Subject: [PATCH 247/276] =?UTF-8?q?#103=20=EB=8D=B0=EC=9D=B4=ED=84=B0?= =?UTF-8?q?=EB=B2=A0=EC=9D=B4=EC=8A=A4=20=EC=BB=AC=EB=9F=BC=EB=AA=85?= =?UTF-8?q?=EC=97=90=20=EB=A7=9E=EC=B6=B0=20=EB=8F=84=EB=A9=94=EC=9D=B8=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entity/handler/OAuth2AuthenticationSuccessHandler.java | 1 - src/main/resources/application.properties | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/com/example/api/oauth2/entity/handler/OAuth2AuthenticationSuccessHandler.java b/src/main/java/com/example/api/oauth2/entity/handler/OAuth2AuthenticationSuccessHandler.java index f466d189..5cab1854 100644 --- a/src/main/java/com/example/api/oauth2/entity/handler/OAuth2AuthenticationSuccessHandler.java +++ b/src/main/java/com/example/api/oauth2/entity/handler/OAuth2AuthenticationSuccessHandler.java @@ -28,7 +28,6 @@ import java.net.URI; import java.util.*; - @Component @Slf4j @RequiredArgsConstructor diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index e3b55d59..a66914e6 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -12,7 +12,7 @@ spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.data.mongodb.auto-index-creation=true # JPA and Hibernate Configuration -spring.jpa.hibernate.ddl-auto=update +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.MySQL8Dialect From b148d7ada0b004d291829cd0c63248583b7a0451 Mon Sep 17 00:00:00 2001 From: yuna83 Date: Sat, 1 Feb 2025 11:41:41 +0900 Subject: [PATCH 248/276] =?UTF-8?q?YAML=20=ED=8C=8C=EC=9D=BC=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=EA=B0=92=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/static/danpat.yaml | 143 ++++++++++++++++++++++++++ 1 file changed, 143 insertions(+) diff --git a/src/main/resources/static/danpat.yaml b/src/main/resources/static/danpat.yaml index 60b6a202..ed1cc30b 100644 --- a/src/main/resources/static/danpat.yaml +++ b/src/main/resources/static/danpat.yaml @@ -51,6 +51,10 @@ paths: application/json: schema: $ref: "#/components/schemas/AnnouncementRequest" + example: + announcementTitle: "수정된 공지사항 제목" + announcementType: "업데이트" + announcementContent: "공지 내용이 업데이트되었습니다." required: true responses: "200": @@ -59,6 +63,12 @@ paths: '*/*': schema: $ref: "#/components/schemas/AnnouncementResponse" + example: + announcementId: 1 + announcementTitle: "수정된 공지사항 제목" + announcementType: "업데이트" + announcementContent: "공지 내용이 업데이트되었습니다." + viewCount: 200 delete: tags: - announcement-controller @@ -184,6 +194,11 @@ paths: application/json: schema: $ref: "#/components/schemas/InquiryRequest" + example: + inquiryType: "일반" + subInquiryType: "서비스 문제" + title: "서비스 관련 문제" + content: "서비스 기능에 문제가 있습니다." required: true responses: "200": @@ -192,6 +207,10 @@ paths: '*/*': schema: $ref: "#/components/schemas/InquiryResponse" + example: + inquiry_id: "123" + message: "문의가 성공적으로 접수되었습니다." + /api/v1/support/announcements: get: tags: @@ -206,6 +225,17 @@ paths: type: array items: $ref: "#/components/schemas/AnnouncementResponse" + example: + - announcementId: 1 + announcementTitle: "긴급 서버 점검 공지" + announcementType: "공지" + announcementContent: "서버 점검이 오늘 밤 11시에 진행됩니다." + viewCount: 123 + - announcementId: 2 + announcementTitle: "새로운 기능 업데이트" + announcementType: "업데이트" + announcementContent: "신규 기능이 추가되었습니다. 확인해보세요!" + viewCount: 89 post: tags: - announcement-controller @@ -215,6 +245,10 @@ paths: application/json: schema: $ref: "#/components/schemas/AnnouncementRequest" + example: + announcementTitle: "시스템 점검 안내" + announcementType: "공지" + announcementContent: "시스템 점검이 오전 12시부터 오전 4시까지 진행됩니다." required: true responses: "200": @@ -223,6 +257,12 @@ paths: '*/*': schema: $ref: "#/components/schemas/AnnouncementResponse" + example: + announcementId: 1 + announcementTitle: "시스템 점검 안내" + announcementType: "공지" + announcementContent: "시스템 점검이 오전 12시부터 오전 4시까지 진행됩니다." + viewCount: 0 /api/v1/possible-board: post: tags: @@ -417,6 +457,12 @@ paths: application/json: schema: $ref: "#/components/schemas/OfferEmploymentRequest" + example: + employeeId: 1001 + businessId: 1 + suggestHourlyPay: 10000 + suggestStartTime: "2025-01-01T09:00:00" + suggestEndTime: "2025-01-01T18:00:00" required: true responses: "200": @@ -425,6 +471,10 @@ paths: '*/*': schema: $ref: "#/components/schemas/OfferEmploymentResponse" + example: + suggestId: 1 + success: false + message: "제안 보류 중" /api/v1/offeremployment/complete: post: tags: @@ -435,6 +485,9 @@ paths: application/json: schema: $ref: "#/components/schemas/OfferEmploymentCompleteRequest" + example: + suggestId: 1 + employeeId: 1001 required: true responses: "200": @@ -443,6 +496,9 @@ paths: '*/*': schema: type: string + example: + success: true + message: "성공적으로 종료되었습니다." /api/v1/info/my/reviews/{reviewId}/report: post: tags: @@ -459,6 +515,8 @@ paths: application/json: schema: $ref: "#/components/schemas/ReviewReportRequest" + example: + reason: "부당하거나 허위 내용이 포함되어 있습니다." required: true responses: "200": @@ -467,6 +525,9 @@ paths: '*/*': schema: $ref: "#/components/schemas/ReviewReportResponse" + example: + reportId: 789 + message: "리뷰 신고가 성공적으로 접수되었습니다." /api/v1/contracts/{contractId}/accepts: post: tags: @@ -701,6 +762,10 @@ paths: application/json: schema: $ref: "#/components/schemas/SearchRequest" + example: + category: "IT" + startTime: "2025-01-01T09:00:00" + endTime: "2025-01-01T18:00:00" required: true responses: "200": @@ -711,6 +776,17 @@ paths: type: array items: $ref: "#/components/schemas/SearchResponse" + example: + - name: "John Doe" + sex: "Male" + age: 30 + starPoint: 4.5 + workCount: 50 + - name: "Jane Smith" + sex: "Female" + age: 28 + starPoint: 4.8 + workCount: 60 /favorites/employees: get: tags: @@ -800,6 +876,23 @@ paths: type: array items: $ref: "#/components/schemas/InquiryResponse" + example: + - inquiryId: 1 + inquiryType: "일반" + subInquiryType: "서비스 문제" + title: "서비스 관련 문제" + content: "서비스 기능에 문제가 발생했습니다." + inquiryStatus: "대기 중" + answerDate: null + createdBy: 123 + - inquiryId: 2 + inquiryType: "기술" + subInquiryType: "버그 신고" + title: "애플리케이션 버그 신고" + content: "애플리케이션에서 치명적인 버그를 발견했습니다." + inquiryStatus: "답변 완료" + answerDate: "2025-01-20T10:00:00" + createdBy: 123 /api/v1/support/announcements/search: get: tags: @@ -811,6 +904,7 @@ paths: required: true schema: type: string + example: "점검" responses: "200": description: OK @@ -820,6 +914,12 @@ paths: type: array items: $ref: "#/components/schemas/AnnouncementResponse" + example: + - announcementId: 1 + announcementTitle: "시스템 점검 안내" + announcementType: "공지" + announcementContent: "시스템이 오전 12시부터 오전 4시까지 점검을 진행합니다." + viewCount: 150 /api/v1/review: get: tags: @@ -834,6 +934,21 @@ paths: type: array items: $ref: "#/components/schemas/ReviewResponse" + example: + - reviewId: 1 + businessName: "테스트 사업장" + businessId: 10 + contractStartTime: "2025-01-01T09:00:00" + contractEndTime: "2025-01-01T18:00:00" + reviewStarPoint: 5 + reviewContent: "훌륭한 작업이었습니다!" + - reviewId: 2 + businessName: "또 다른 사업장" + businessId: 20 + contractStartTime: "2025-01-02T09:00:00" + contractEndTime: "2025-01-02T18:00:00" + reviewStarPoint: 4 + reviewContent: "좋은 성과를 보여주었습니다." /api/v1/review/{reviewId}: get: tags: @@ -849,6 +964,14 @@ paths: type: array items: $ref: "#/components/schemas/ReviewResponse" + example: + - reviewId: 1 + businessName: "테스트 사업장" + businessId: 10 + contractStartTime: "2025-01-01T09:00:00" + contractEndTime: "2025-01-01T18:00:00" + reviewStarPoint: 5 + reviewContent: "훌륭한 작업이었습니다!" /api/v1/review/my/reviews: get: tags: @@ -870,6 +993,21 @@ paths: type: array items: $ref: "#/components/schemas/ReviewResponse" + example: + - reviewId: 1 + businessName: "테스트 사업장" + businessId: 10 + contractStartTime: "2025-01-01T09:00:00" + contractEndTime: "2025-01-01T18:00:00" + reviewStarPoint: 5 + reviewContent: "훌륭한 작업이었습니다!" + - reviewId: 2 + businessName: "스타트업 컴퍼니" + businessId: 20 + contractStartTime: "2025-01-05T10:00:00" + contractEndTime: "2025-01-05T19:00:00" + reviewStarPoint: 4 + reviewContent: "업무 진행이 원활했습니다." /api/v1/review/available: get: tags: @@ -891,6 +1029,11 @@ paths: type: array items: $ref: "#/components/schemas/ReviewAvailableResponse" + example: + - employeeId: 1001 + employeeName: "김철수" + - employeeId: 1002 + employeeName: "이영희" /api/v1/possible-board/internal-career: get: tags: From 9ff354c239be24badcb8d50ee70eed34e2e1f892 Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Sat, 1 Feb 2025 18:03:51 +0900 Subject: [PATCH 249/276] =?UTF-8?q?swagger=20path=20=EA=B2=BD=EB=A1=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/static/danpat.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/static/danpat.yaml b/src/main/resources/static/danpat.yaml index ed1cc30b..e33fd81a 100644 --- a/src/main/resources/static/danpat.yaml +++ b/src/main/resources/static/danpat.yaml @@ -4,7 +4,7 @@ info: description: 단팥 백엔드 API 명세서입니다. version: 1.0.0 servers: - - url: http://43.201.78.102:8080/api/v1 + - url: http://43.201.78.102:8080 security: - JWT_TOKEN: [] paths: From e25e97487a2fa78e22dbd4754eedfe717def094b Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Wed, 29 Jan 2025 17:39:43 +0900 Subject: [PATCH 250/276] =?UTF-8?q?#103=20=EC=9D=B4=EB=A0=A5=EC=84=9C=20ap?= =?UTF-8?q?i=206=EA=B0=9C=EB=A1=9C=20=EB=B6=84=EB=A6=AC=20=EB=B0=8F=20?= =?UTF-8?q?=EA=B7=B8=EC=97=90=20=EB=94=B0=EB=A5=B8=20crud=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1,=20=EB=8F=84=EB=A9=94=EC=9D=B8=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index a66914e6..e3b55d59 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -12,7 +12,7 @@ spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.data.mongodb.auto-index-creation=true # JPA and Hibernate Configuration -spring.jpa.hibernate.ddl-auto=validate +spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true spring.jpa.properties.hibernate.format_sql=true spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect From 5873ec64a4f5b49586d3d8f440e27a19af07faf3 Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Sun, 2 Feb 2025 22:07:54 +0900 Subject: [PATCH 251/276] =?UTF-8?q?api=20=EA=B2=80=EC=A6=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 2 +- .../com/example/api/domain/QBusiness.java | 2 +- .../account/controller/AccountController.java | 4 +- .../com/example/api/account/entity/Code.java | 4 +- .../api/account/service/AccountService.java | 23 +- .../api/auth/controller/AuthController.java | 3 +- .../example/api/auth/service/AuthService.java | 7 +- .../api/aws/controller/S3Controller.java | 14 +- .../example/api/aws/service/S3Service.java | 2 +- .../api/board/controller/BoardController.java | 15 +- .../entitiy/update/UpdateUserInfoHandler.java | 2 + .../repository/PossibleBoardRepository.java | 4 +- .../api/board/service/BoardService.java | 9 +- .../api/business/BusinessQueryService.java | 4 +- .../api/business/BusinessRepository.java | 2 + .../example/api/business/BusinessService.java | 16 +- .../controller/BusinessController.java | 15 +- .../api/business/dto/AddBusinessCommand.java | 2 + .../dto/response/ChatSummaryResponse.java | 5 +- .../example/api/chat/service/ChatService.java | 2 +- .../example/api/contracts/ContractMapper.java | 1 + .../api/contracts/ContractRepository.java | 22 +- .../api/contracts/ContractService.java | 2 +- .../controller/ContractController.java | 8 +- .../controller/ContractReviewController.java | 4 +- .../api/contracts/dto/BusinessInfoDTO.java | 25 +- .../UpdateContractConditionManager.java | 2 +- .../UpdateContractHourlyPaymentHandler.java | 2 +- .../update/UpdateContractRangeHandler.java | 4 +- .../java/com/example/api/domain/Account.java | 8 +- .../java/com/example/api/domain/Business.java | 15 +- .../java/com/example/api/domain/Contract.java | 4 +- .../example/api/domain/OfferEmployment.java | 6 +- .../FlavoredDistrictRepository.java | 2 +- .../repository/OfferEmploymentRepository.java | 13 +- .../api/global/config/SecurityConfig.java | 7 +- .../filter/JwtAuthenticationFilter.java | 2 + .../suggest/controller/SuggestController.java | 7 +- .../request/OfferEmploymentDetailRequest.java | 11 + .../api/suggest/service/SuggestService.java | 47 +- src/main/resources/application.properties | 2 +- src/main/resources/static/danpat.yaml | 1760 ++++++++++------- 42 files changed, 1252 insertions(+), 839 deletions(-) create mode 100644 src/main/java/com/example/api/suggest/controller/dto/request/OfferEmploymentDetailRequest.java diff --git a/build.gradle b/build.gradle index 86c85ec9..47935994 100644 --- a/build.gradle +++ b/build.gradle @@ -81,7 +81,7 @@ dependencies { implementation 'org.modelmapper:modelmapper:3.1.0' // swagger - implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.1.0' + implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.6.0' // S3 implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE' diff --git a/src/main/generated/com/example/api/domain/QBusiness.java b/src/main/generated/com/example/api/domain/QBusiness.java index ab3b6da6..5492c02d 100644 --- a/src/main/generated/com/example/api/domain/QBusiness.java +++ b/src/main/generated/com/example/api/domain/QBusiness.java @@ -37,7 +37,7 @@ public class QBusiness extends EntityPathBase { public final com.example.api.business.domain.QBusinessLocation location; - public final DatePath openDate = createDate("openDate", java.time.LocalDate.class); + public final StringPath openDate = createString("openDate"); public final StringPath registrationNumber = createString("registrationNumber"); diff --git a/src/main/java/com/example/api/account/controller/AccountController.java b/src/main/java/com/example/api/account/controller/AccountController.java index 5a48a335..aeea12d9 100644 --- a/src/main/java/com/example/api/account/controller/AccountController.java +++ b/src/main/java/com/example/api/account/controller/AccountController.java @@ -5,6 +5,7 @@ import com.example.api.account.service.AccountService; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; @@ -14,6 +15,7 @@ @RestController @RequestMapping("/api/v1/account") @RequiredArgsConstructor +@Slf4j public class AccountController { private final AccountService signUpService; private final AccountService accountService; @@ -53,7 +55,7 @@ public ResponseEntity deleteAccount( @AuthenticationPrincipal final Long memberId ) { accountService.deleteAccount(memberId); - return ResponseEntity.ok("delete account"); + return ResponseEntity.ok("성공적으로 삭제되었습니다."); } @PostMapping("/validation/business-number") diff --git a/src/main/java/com/example/api/account/entity/Code.java b/src/main/java/com/example/api/account/entity/Code.java index 8ace57c5..d623d204 100644 --- a/src/main/java/com/example/api/account/entity/Code.java +++ b/src/main/java/com/example/api/account/entity/Code.java @@ -16,11 +16,11 @@ public class Code { private String code; @Indexed(expireAfterSeconds = 600) - private final Date createdAt; + private Date createdAt; public Code(String email, String code) { this.email = email; this.code = code; this.createdAt = new Date(); } -} \ No newline at end of file + } \ No newline at end of file diff --git a/src/main/java/com/example/api/account/service/AccountService.java b/src/main/java/com/example/api/account/service/AccountService.java index 722c195c..dcc01d74 100644 --- a/src/main/java/com/example/api/account/service/AccountService.java +++ b/src/main/java/com/example/api/account/service/AccountService.java @@ -63,15 +63,13 @@ public String saveCode(@Validated final Code code){ @Transactional public String verifyEmail(@Validated final EmailCodeRequest request) { - Optional findCode = codeRepository.findFirstByEmailOrderByCreatedAtDesc(request.email()); - - return findCode.map(code -> { - if (code.getCode().equals(request.code())) { - return "유효한 이메일입니다."; - } else { - throw new BusinessException(ErrorCode.INCORRECT_CODE); - } - }).orElseThrow(() -> new BusinessException(ErrorCode.EXPIRATION_DATE_END)); + Code findCode = codeRepository.findFirstByEmailOrderByCreatedAtDesc(request.email()).orElseThrow(() -> new BusinessException(ErrorCode.EXPIRATION_DATE_END)); + log.info("find code = {}", findCode.getCode()); + if(findCode.getCode().equals(request.code())){ + return "유효한 이메일입니다."; + } else { + throw new BusinessException(ErrorCode.INCORRECT_CODE); + } } @Transactional @@ -134,15 +132,14 @@ private void saveEmployerAccount(final SignUpEmployerRequest request) { BusinessLocation savedLocation = locationRepository.save(request.location()); Business business = new Business( - savedUser, - request.businessRegistrationNumber(), request.businessName(), + savedLocation, request.representationName(), + savedUser, request.businessOpenDate(), - savedLocation + request.businessRegistrationNumber() ); businessRepository.save(business); - accountRepository.save(account); } private void validateDuplicateLoginId(final LoginIdRequest loginIdRequest) { diff --git a/src/main/java/com/example/api/auth/controller/AuthController.java b/src/main/java/com/example/api/auth/controller/AuthController.java index 53884e82..594b00bb 100644 --- a/src/main/java/com/example/api/auth/controller/AuthController.java +++ b/src/main/java/com/example/api/auth/controller/AuthController.java @@ -40,8 +40,7 @@ public ResponseEntity> refresh( } @PostMapping("/logout") - public ResponseEntity> logout(@AuthenticationPrincipal final Object principal) { - Long userId = Long.parseLong(principal.toString()); + public ResponseEntity> logout(@AuthenticationPrincipal final Long userId) { LoginSuccessResponse loginSuccessResponse = authService.logout(new LoginUserRequest(userId)); return ResponseEntity.ok(loginSuccessResponse.responseBody()); } diff --git a/src/main/java/com/example/api/auth/service/AuthService.java b/src/main/java/com/example/api/auth/service/AuthService.java index c9541463..b2aa44c5 100644 --- a/src/main/java/com/example/api/auth/service/AuthService.java +++ b/src/main/java/com/example/api/auth/service/AuthService.java @@ -102,7 +102,12 @@ public LoginSuccessResponse refreshAuthToken(@Validated final RefreshTokenReques public LoginSuccessResponse logout(@Validated final LoginUserRequest loginUserRequest) { Account user = getUserById(loginUserRequest.userId()); tokenRepository.deleteAllByUser(user); - return new LoginSuccessResponse(null, null); + + Map responseBody = new HashMap<>(); + responseBody.put("accessToken", null); + responseBody.put("userId", null); + responseBody.put("userRole", null); + return new LoginSuccessResponse(null, responseBody); } private Account getUserById(final Long userId) { diff --git a/src/main/java/com/example/api/aws/controller/S3Controller.java b/src/main/java/com/example/api/aws/controller/S3Controller.java index 4bd0f652..05a66980 100644 --- a/src/main/java/com/example/api/aws/controller/S3Controller.java +++ b/src/main/java/com/example/api/aws/controller/S3Controller.java @@ -2,22 +2,28 @@ import com.example.api.aws.dto.UploadProfileRequest; import com.example.api.aws.service.S3Service; -import jakarta.validation.Valid; import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; +import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; +@Slf4j @AllArgsConstructor @RestController @RequestMapping("/api/v1") public class S3Controller { private final S3Service s3Service; - @PostMapping(value = "/upload/profile", consumes = "multipart/form-data") - public ResponseEntity upload(@RequestParam("file") final MultipartFile file) { - UploadProfileRequest request = new UploadProfileRequest(1L, file); + @PostMapping(value = "/upload/profile", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + public ResponseEntity upload( + @AuthenticationPrincipal final Long userId, + @RequestParam("file") final MultipartFile file) { + log.info("userId={}", userId); + UploadProfileRequest request = new UploadProfileRequest(userId, file); return new ResponseEntity<>(s3Service.upload(request).path(), HttpStatus.OK); } } \ No newline at end of file diff --git a/src/main/java/com/example/api/aws/service/S3Service.java b/src/main/java/com/example/api/aws/service/S3Service.java index b67b84a3..b0774ca1 100644 --- a/src/main/java/com/example/api/aws/service/S3Service.java +++ b/src/main/java/com/example/api/aws/service/S3Service.java @@ -33,7 +33,7 @@ public class S3Service { public UploadProfileResponse upload(@Validated final UploadProfileRequest request) { // 업로드 파일이 null 이라면 기본 프로필로 초기화 if (initDefaultIfFileIsNull(request)) return new UploadProfileResponse(null); - + log.info("Upload profile request: {}", request.userId()); Optional userProfile = accountRepository.findProfileImageByAccountId(request.userId()); userProfile.ifPresent(oldKey -> remove(new OldKeyRequest(oldKey))); diff --git a/src/main/java/com/example/api/board/controller/BoardController.java b/src/main/java/com/example/api/board/controller/BoardController.java index 8cdb4354..3f31d932 100644 --- a/src/main/java/com/example/api/board/controller/BoardController.java +++ b/src/main/java/com/example/api/board/controller/BoardController.java @@ -12,19 +12,17 @@ import java.util.List; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; -@RestController("api/v1/possible-board") +@RestController +@RequestMapping("/api/v1/possible-board") @RequiredArgsConstructor +@Slf4j public class BoardController { private final BoardService boardService; - private final CategoryService categoryService; private final EmployeeService employeeService; /** @@ -42,6 +40,7 @@ public ResponseEntity getPersonalInfo(@AuthenticationPrinc @GetMapping("/work-preferences/districts") public ResponseEntity> getPreferredDistricts(@AuthenticationPrincipal final Long employeeId){ + log.info("employee id: {}", employeeId); return ResponseEntity.ok(boardService.getPreferredDistricts(new EmployeeIdRequest(employeeId))); } @@ -99,7 +98,7 @@ public ResponseEntity> updateExternalCareers( @PostMapping("/work-hours") public ResponseEntity updatePossibleTimes( @RequestBody final AddPossibleTimeRequest addPossibleTimeRequest, - final Long requestMemberId + @AuthenticationPrincipal final Long requestMemberId ) { final AddPossibleTimeCommand addPossibleTimeCommand = addPossibleTimeRequest.toCommand(requestMemberId); boardService.addPossibleBoard(addPossibleTimeCommand); diff --git a/src/main/java/com/example/api/board/entitiy/update/UpdateUserInfoHandler.java b/src/main/java/com/example/api/board/entitiy/update/UpdateUserInfoHandler.java index 84dc1c3d..05a77a3a 100644 --- a/src/main/java/com/example/api/board/entitiy/update/UpdateUserInfoHandler.java +++ b/src/main/java/com/example/api/board/entitiy/update/UpdateUserInfoHandler.java @@ -3,7 +3,9 @@ import com.example.api.board.dto.update.UpdateAccountConditionCommand; import com.example.api.board.dto.update.UpdatePersonalInfoRequest; import com.example.api.domain.Account; +import org.springframework.stereotype.Service; +@Service public class UpdateUserInfoHandler implements UpdateAccountConditionHandler { @Override public void update(Account account, UpdateAccountConditionCommand updateAccountConditionCommand) { diff --git a/src/main/java/com/example/api/board/repository/PossibleBoardRepository.java b/src/main/java/com/example/api/board/repository/PossibleBoardRepository.java index 9ad6f06b..8a51bbc8 100644 --- a/src/main/java/com/example/api/board/repository/PossibleBoardRepository.java +++ b/src/main/java/com/example/api/board/repository/PossibleBoardRepository.java @@ -19,10 +19,10 @@ public interface PossibleBoardRepository extends JpaRepository { @Modifying @Query("DELETE FROM PossibleBoard possible WHERE (possible.startTime <= :endDateTime AND possible.endTime >= :startDateTime)") - Long deleteDuplicatedWorkTimeIncluded(@Param("startDateTime") final LocalDateTime startDateTimeIncluded, + Integer deleteDuplicatedWorkTimeIncluded(@Param("startDateTime") final LocalDateTime startDateTimeIncluded, @Param("endDateTime") final LocalDateTime endDateTimeIncluded); @Query("select new com.example.api.board.dto.response.WorkHourResponse(p.possibleId, p.startTime, p.endTime) " + "from PossibleBoard p where p.employee.accountId = :employeeId and p.startTime >= :currentMonth") - List findScheduleFromCurrentMonth(@Param("employeeId")Long employeeId, @Param("currentMonth") LocalDate currentMonth); + List findScheduleFromCurrentMonth(@Param("employeeId")Long employeeId, @Param("currentMonth") LocalDateTime currentMonth); } \ No newline at end of file diff --git a/src/main/java/com/example/api/board/service/BoardService.java b/src/main/java/com/example/api/board/service/BoardService.java index 4af533ac..46c6b83d 100644 --- a/src/main/java/com/example/api/board/service/BoardService.java +++ b/src/main/java/com/example/api/board/service/BoardService.java @@ -17,6 +17,7 @@ import com.example.api.global.exception.ErrorCode; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.jetbrains.annotations.NotNull; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -29,6 +30,7 @@ @Service @RequiredArgsConstructor +@Slf4j public class BoardService { private final AccountRepository accountRepository; private final OfferEmploymentRepository offerEmploymentRepository; @@ -50,7 +52,10 @@ public PersonalInfoResponse getPersonalInfoResponse(final EmployeeIdRequest empl @Transactional(readOnly = true) public List getPreferredDistricts(final EmployeeIdRequest employeeIdRequest) { - return flavoredDistrictRepository.findAllByEmployeeId(employeeIdRequest.employeeId()); + log.info("employeeIdRequest={}", employeeIdRequest.employeeId()); + List allByEmployeeId = flavoredDistrictRepository.findAllByEmployeeId(employeeIdRequest.employeeId()); + log.info("allByEmployeeId: {}", allByEmployeeId); + return allByEmployeeId; } @Transactional(readOnly = true) @@ -60,7 +65,7 @@ public List getPreferredCategories(final EmployeeIdReq @Transactional(readOnly = true) public List getWorkHours(final EmployeeIdRequest employeeIdRequest) { - return possibleBoardRepository.findScheduleFromCurrentMonth(employeeIdRequest.employeeId(), LocalDate.now().withDayOfMonth(1)); + return possibleBoardRepository.findScheduleFromCurrentMonth(employeeIdRequest.employeeId(), LocalDate.now().atStartOfDay()); } @Transactional(readOnly = true) diff --git a/src/main/java/com/example/api/business/BusinessQueryService.java b/src/main/java/com/example/api/business/BusinessQueryService.java index 664cf10e..e0b9a076 100644 --- a/src/main/java/com/example/api/business/BusinessQueryService.java +++ b/src/main/java/com/example/api/business/BusinessQueryService.java @@ -1,5 +1,6 @@ package com.example.api.business; +import com.example.api.business.domain.BusinessLocation; import com.example.api.business.dto.BusinessDetailsResponse; import com.example.api.business.dto.BusinessOwner; import com.example.api.business.dto.CategoryInfo; @@ -24,12 +25,13 @@ public class BusinessQueryService { public BusinessDetailsResponse loadDetails(@Validated final QueryBusinessDetailCommand queryBusinessDetailCommand) { final Business business = businessRepository.getDetails(queryBusinessDetailCommand.businessId()) .orElseThrow(() -> new BusinessException("해당 비즈니스를 찾을 수 없습니다.", ErrorCode.BUSINESS_DOMAIN_EXCEPTION)); + final BusinessLocation location = business.getLocation(); final Account account = business.getEmployer(); final List categoryInfos = business.getBusinessCategories().stream() .map(BusinessCategory::getCategory) .map(category -> new CategoryInfo(category.getCategoryId(), category.getCategoryName())) .toList(); final BusinessOwner owner = new BusinessOwner(account.getAccountId(), account.getName()); - return new BusinessDetailsResponse(business.getBusinessName(), business.getBusinessId(), owner, business.getLocation(), categoryInfos); + return new BusinessDetailsResponse(business.getBusinessName(), business.getBusinessId(), owner, location, categoryInfos); } } diff --git a/src/main/java/com/example/api/business/BusinessRepository.java b/src/main/java/com/example/api/business/BusinessRepository.java index f772a2df..1f943d7a 100644 --- a/src/main/java/com/example/api/business/BusinessRepository.java +++ b/src/main/java/com/example/api/business/BusinessRepository.java @@ -2,6 +2,7 @@ import com.example.api.domain.Business; import com.example.api.employer.controller.dto.EmployerBusinessesRequest; +import org.springframework.data.jpa.repository.EntityGraph; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; @@ -13,6 +14,7 @@ @Repository public interface BusinessRepository extends JpaRepository { @Query("SELECT b FROM Business b JOIN FETCH b.employer JOIN FETCH b.businessCategories WHERE b.businessId = :businessId") + @EntityGraph(attributePaths = {"location", "employer", "businessCategories.category"}) Optional getDetails(@Param("businessId") final Long businessId); @Query("select new com.example.api.employer.controller.dto.EmployerBusinessesRequest(b.businessName, b.location) from Business b where b.employer.accountId = :employerId order by b.location.id") diff --git a/src/main/java/com/example/api/business/BusinessService.java b/src/main/java/com/example/api/business/BusinessService.java index cf98a7be..441e0c22 100644 --- a/src/main/java/com/example/api/business/BusinessService.java +++ b/src/main/java/com/example/api/business/BusinessService.java @@ -1,8 +1,10 @@ package com.example.api.business; +import com.example.api.account.repository.AccountRepository; import com.example.api.business.dto.AddBusinessCommand; import com.example.api.business.dto.ModifyBusinessCommand; import com.example.api.business.update.BusinessUpdateManager; +import com.example.api.domain.Account; import com.example.api.domain.Business; import com.example.api.domain.BusinessCategory; import com.example.api.domain.Category; @@ -10,6 +12,9 @@ import com.example.api.domain.repository.CategoryRepository; import java.util.List; import java.util.stream.Collectors; + +import com.example.api.global.exception.BusinessException; +import com.example.api.global.exception.ErrorCode; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -24,6 +29,7 @@ public class BusinessService { private final BusinessCategoryRepository businessCategoryRepository; private final BusinessUpdateManager businessUpdateManager; private final CategoryRepository categoryRepository; + private final AccountRepository accountRepository; @Transactional public void updateBusiness(@Validated final ModifyBusinessCommand command) { @@ -34,7 +40,15 @@ public void updateBusiness(@Validated final ModifyBusinessCommand command) { @Transactional public void addBusiness(@Validated final AddBusinessCommand command) { - final Business business = new Business(command.businessName(), command.location(), command.representationName()); + Account requestMember = accountRepository.findById(command.requestMemberId()).orElseThrow(() -> new BusinessException(ErrorCode.NULL_USER)); + final Business business = new Business( + command.businessName(), + command.location(), + command.representationName(), + requestMember, + command.businessOpenDate(), + command.businessRegistrationNumber() + ); final List businessCategories = loadCategories(command.categoryIds(), business); businessRepository.save(business); businessCategoryRepository.saveAll(businessCategories); diff --git a/src/main/java/com/example/api/business/controller/BusinessController.java b/src/main/java/com/example/api/business/controller/BusinessController.java index ad7d1e50..a2913878 100644 --- a/src/main/java/com/example/api/business/controller/BusinessController.java +++ b/src/main/java/com/example/api/business/controller/BusinessController.java @@ -4,6 +4,7 @@ import com.example.api.business.BusinessQueryService; import com.example.api.business.BusinessService; import com.example.api.business.dto.AddBusinessCommand; +import com.example.api.business.dto.BusinessDetailsResponse; import com.example.api.business.dto.ModifyBusinessCommand; import com.example.api.business.dto.QueryBusinessDetailCommand; import jakarta.validation.constraints.NotNull; @@ -26,39 +27,41 @@ public class BusinessController { private final BusinessQueryService businessQueryService; @GetMapping - public ResponseEntity getMyBusiness( + public ResponseEntity getMyBusiness( @RequestParam final Long businessId ) { return ResponseEntity.ok(businessQueryService.loadDetails(new QueryBusinessDetailCommand(businessId))); } @PutMapping - public ResponseEntity modifyMyBusiness( + public ResponseEntity modifyMyBusiness( @RequestBody final ModifyBusinessRequest request ) { final ModifyBusinessCommand command = request.toCommand(); businessService.updateBusiness(command); - return ResponseEntity.ok().build(); + return ResponseEntity.ok().body("요청이 성공적으로 처리되었습니다."); } @PostMapping - public ResponseEntity addBusiness( + public ResponseEntity addBusiness( @RequestBody final AddBusinessRequest request ) { final AddBusinessCommand command = request.toCommand(); businessService.addBusiness(command); - return ResponseEntity.ok().build(); + return ResponseEntity.ok().body("요청이 성공적으로 처리되었습니다."); } record AddBusinessRequest( Long requestMemberId, String businessName, + String businessRegistrationNumber, + String businessOpenDate, BusinessLocation location, List categoryIds, String representationName ) { AddBusinessCommand toCommand() { - return new AddBusinessCommand(requestMemberId, businessName, location, categoryIds, representationName); + return new AddBusinessCommand(requestMemberId, businessName, businessRegistrationNumber, businessOpenDate, location, categoryIds, representationName); } } diff --git a/src/main/java/com/example/api/business/dto/AddBusinessCommand.java b/src/main/java/com/example/api/business/dto/AddBusinessCommand.java index c90457bd..12360467 100644 --- a/src/main/java/com/example/api/business/dto/AddBusinessCommand.java +++ b/src/main/java/com/example/api/business/dto/AddBusinessCommand.java @@ -8,6 +8,8 @@ public record AddBusinessCommand( @NotNull Long requestMemberId, String businessName, + String businessRegistrationNumber, + String businessOpenDate, BusinessLocation location, List categoryIds, String representationName diff --git a/src/main/java/com/example/api/chat/controller/dto/response/ChatSummaryResponse.java b/src/main/java/com/example/api/chat/controller/dto/response/ChatSummaryResponse.java index 29c669bc..7786f97a 100644 --- a/src/main/java/com/example/api/chat/controller/dto/response/ChatSummaryResponse.java +++ b/src/main/java/com/example/api/chat/controller/dto/response/ChatSummaryResponse.java @@ -1,9 +1,8 @@ package com.example.api.chat.controller.dto.response; import com.example.api.chat.dto.ChatSummary; -import com.example.api.domain.ChatRoom; import java.util.List; -public record ChatSummaryResponse(List chatRooms, List chatSummaries) { -} +public record ChatSummaryResponse(List chatSummaries) { +} \ No newline at end of file diff --git a/src/main/java/com/example/api/chat/service/ChatService.java b/src/main/java/com/example/api/chat/service/ChatService.java index 4dd73ed4..d5aab5f2 100644 --- a/src/main/java/com/example/api/chat/service/ChatService.java +++ b/src/main/java/com/example/api/chat/service/ChatService.java @@ -47,7 +47,7 @@ public ChatSummaryResponse getChatSummaries(UserIdRequest requestUserId) { List chatRooms = chatRoomRepository.findByUserId(requestUserId.userId()); List chatRoomIds = chatRooms.stream().map(ChatRoom::getChatRoomId).toList(); List chatSummaries = chatRepository.aggregateChatSummaries(chatRoomIds, requestUserId.userId()); - return new ChatSummaryResponse(chatRooms, chatSummaries); + return new ChatSummaryResponse(chatSummaries); } @Transactional(readOnly = true) diff --git a/src/main/java/com/example/api/contracts/ContractMapper.java b/src/main/java/com/example/api/contracts/ContractMapper.java index 43e13a86..5481b3bd 100644 --- a/src/main/java/com/example/api/contracts/ContractMapper.java +++ b/src/main/java/com/example/api/contracts/ContractMapper.java @@ -11,6 +11,7 @@ public class ContractMapper { public Contract notYetSucceeded(final OfferEmployment offerEmployment) { return new Contract( + offerEmployment.getSuggestId(), offerEmployment, offerEmployment.getSuggestStartTime(), offerEmployment.getSuggestEndTime(), diff --git a/src/main/java/com/example/api/contracts/ContractRepository.java b/src/main/java/com/example/api/contracts/ContractRepository.java index 28e7bd40..e2e61f65 100644 --- a/src/main/java/com/example/api/contracts/ContractRepository.java +++ b/src/main/java/com/example/api/contracts/ContractRepository.java @@ -5,24 +5,27 @@ import com.example.api.contracts.dto.EmployeeInfoDTO; import com.example.api.domain.Contract; -import java.time.LocalDate; +import java.time.LocalDateTime; import java.util.Optional; import com.example.api.review.dto.ReviewAvailableResponse; +import com.example.api.suggest.controller.dto.request.OfferEmploymentDetailRequest; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; import java.util.List; +@Repository public interface ContractRepository extends JpaRepository { @Query("select new com.example.api.contracts.dto." + "BusinessInfoDTO(b.businessName, b.representationName, c.contractStartTime, c.contractEndTime, b.location, e.phoneNumber, c.updatedDate) " + "from Contract c " + "join c.offerEmployment oe " + "join oe.business b " + - "join oe.employee e on e.accountId = b.employer.accountId " + + "join oe.employee e " + "where c.contractId = :contractId") - BusinessInfoDTO findBusinessDTOByContractId(@Param("contractId") long contractId); + BusinessInfoDTO findBusinessDTOByContractId(@Param("contractId") Long contractId); @Query("select new com.example.api.contracts.dto." + "EmployeeInfoDTO(e.name, e.phoneNumber, e.starPoint, e.workCount) " + @@ -32,7 +35,6 @@ public interface ContractRepository extends JpaRepository { "where c.contractId = :contractId") EmployeeInfoDTO findEmployeeDTOByContractId(@Param("contractId") long contractId); - @Query("SELECT c FROM Contract c JOIN FETCH c.offerEmployment JOIN FETCH c.offerEmployment.business.employer WHERE c.contractId = :contractId") Optional loadContractWithOfferEmployment(@Param("contractId") final Long contractId); @@ -48,6 +50,14 @@ public interface ContractRepository extends JpaRepository { @Query("select new com.example.api.contracts.dto.ContractScheduleResponse(c.contractId, b.businessName, c.contractStartTime, c.contractEndTime) " + "from Contract c inner join c.offerEmployment o inner join o.business b " + "where o.employee.accountId = :employeeId and c.contractStartTime >= :currentMonth") - List findContractScheduleByEmployeeId(@Param("employeeId")Long employeeId, - @Param("currentMonth")LocalDate currentMonth); + List findContractScheduleByEmployeeId(@Param("employeeId") Long employeeId, + @Param("currentMonth") LocalDateTime currentMonth); + + @Query("select new com.example.api.suggest.controller.dto.request.OfferEmploymentDetailRequest(e.name, b.businessName, c.contractStartTime, c.contractEndTime) " + + "from Contract c " + + "join c.offerEmployment oe " + + "join oe.employee e " + + "join oe.business b " + + "where c.contractId = :contractId") + OfferEmploymentDetailRequest findContractByContractId(@Param("contractId") Long contractId); } diff --git a/src/main/java/com/example/api/contracts/ContractService.java b/src/main/java/com/example/api/contracts/ContractService.java index 87472fce..9e93640e 100644 --- a/src/main/java/com/example/api/contracts/ContractService.java +++ b/src/main/java/com/example/api/contracts/ContractService.java @@ -48,6 +48,6 @@ public ContractDTO getContractInfo(final AcceptContractCommand contractStatusCom @Transactional(readOnly = true) public List getContractSchedule(final EmployeeIdRequest employeeIdRequest) { - return contractRepository.findContractScheduleByEmployeeId(employeeIdRequest.employeeId(), LocalDate.now().withDayOfMonth(1)); + return contractRepository.findContractScheduleByEmployeeId(employeeIdRequest.employeeId(), LocalDate.now().atStartOfDay()); } } \ No newline at end of file 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 00db59cd..43fbb7da 100644 --- a/src/main/java/com/example/api/contracts/controller/ContractController.java +++ b/src/main/java/com/example/api/contracts/controller/ContractController.java @@ -18,13 +18,13 @@ class ContractController { private final ContractService contractService; @PutMapping("/api/v1/contracts/{contractId}") - public ResponseEntity updateContractCondition( + 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); + return ResponseEntity.ok("근무 조건이 변경되었습니다."); } record UpdateContractConditionRequest( @@ -38,12 +38,12 @@ UpdateContractConditionCommand toCommand(final Long contractId) { } @PostMapping("/api/v1/contracts/{contractId}/accepts") - public ResponseEntity acceptContract( + public ResponseEntity acceptContract( @PathVariable(required = true) final Long contractId ) { final AcceptContractCommand acceptContractCommand = new AcceptContractCommand(contractId); contractService.acceptContract(acceptContractCommand); - return ResponseEntity.ok(null); + return ResponseEntity.ok("성공적으로 수락되었습니다."); } @GetMapping("/api/v1/contracts/{contractId}/status") diff --git a/src/main/java/com/example/api/contracts/controller/ContractReviewController.java b/src/main/java/com/example/api/contracts/controller/ContractReviewController.java index 13a20031..8a1f58f0 100644 --- a/src/main/java/com/example/api/contracts/controller/ContractReviewController.java +++ b/src/main/java/com/example/api/contracts/controller/ContractReviewController.java @@ -39,13 +39,13 @@ public ResponseEntity> getMyReview( } @PostMapping("/review") - public ResponseEntity addReview( + public ResponseEntity addReview( @RequestBody @Valid final AddReviewRequest request, @AuthenticationPrincipal final Long memberId ) { final AddReviewCommand command = request.toCommand(memberId); contractReviewService.saveReview(command); - return ResponseEntity.ok(null); + return ResponseEntity.ok("리뷰가 성공적으로 작성되었습니다."); } record AddReviewRequest( diff --git a/src/main/java/com/example/api/contracts/dto/BusinessInfoDTO.java b/src/main/java/com/example/api/contracts/dto/BusinessInfoDTO.java index 452ebdcc..64eb0dfc 100644 --- a/src/main/java/com/example/api/contracts/dto/BusinessInfoDTO.java +++ b/src/main/java/com/example/api/contracts/dto/BusinessInfoDTO.java @@ -1,21 +1,14 @@ package com.example.api.contracts.dto; import com.example.api.business.domain.BusinessLocation; -import lombok.*; - import java.time.LocalDateTime; -@EqualsAndHashCode -@Getter -@Setter -@AllArgsConstructor -@NoArgsConstructor -public class BusinessInfoDTO { - private String businessName; - private String representationName; - private LocalDateTime startTime; - private LocalDateTime endTime; - private BusinessLocation location; - private String businessPhone; - private LocalDateTime signedDate; -} +public record BusinessInfoDTO ( + String businessName, + String representationName, + LocalDateTime startTime, + LocalDateTime endTime, + BusinessLocation location, + String businessPhone, + LocalDateTime signedDate){ +} \ No newline at end of file diff --git a/src/main/java/com/example/api/contracts/update/UpdateContractConditionManager.java b/src/main/java/com/example/api/contracts/update/UpdateContractConditionManager.java index 1109f72d..8c0a6952 100644 --- a/src/main/java/com/example/api/contracts/update/UpdateContractConditionManager.java +++ b/src/main/java/com/example/api/contracts/update/UpdateContractConditionManager.java @@ -18,4 +18,4 @@ public void updateContract(final Contract contract, final UpdateContractConditio updateContractConditionHandlers.stream() .forEach(updateContractHandler -> updateContractHandler.update(contract, updateContractConditionCommand)); } -} +} \ No newline at end of file diff --git a/src/main/java/com/example/api/contracts/update/UpdateContractHourlyPaymentHandler.java b/src/main/java/com/example/api/contracts/update/UpdateContractHourlyPaymentHandler.java index d68457e5..e3513950 100644 --- a/src/main/java/com/example/api/contracts/update/UpdateContractHourlyPaymentHandler.java +++ b/src/main/java/com/example/api/contracts/update/UpdateContractHourlyPaymentHandler.java @@ -14,4 +14,4 @@ public void update(final Contract contract, final UpdateContractConditionCommand contract.updateHourlyPayment(payment); } } -} +} \ No newline at end of file diff --git a/src/main/java/com/example/api/contracts/update/UpdateContractRangeHandler.java b/src/main/java/com/example/api/contracts/update/UpdateContractRangeHandler.java index cd7caabb..aebafae8 100644 --- a/src/main/java/com/example/api/contracts/update/UpdateContractRangeHandler.java +++ b/src/main/java/com/example/api/contracts/update/UpdateContractRangeHandler.java @@ -16,8 +16,8 @@ public void update(final Contract contract, final UpdateContractConditionCommand contract.updateEndDateTime(updateCommand.suggestEndDateTime()); } - if (contract.isValidContractRangeTime()) { + if (!contract.isValidContractRangeTime()) { throw new IllegalArgumentException(); } } -} +} \ 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 2075ca8a..15eddf46 100644 --- a/src/main/java/com/example/api/domain/Account.java +++ b/src/main/java/com/example/api/domain/Account.java @@ -45,11 +45,11 @@ public class Account extends BaseEntity { private int age; @Column(name = "ACCOUNT_PROFILE_IMAGE") private String profileImage; - @Column(name = "ACCOUNT_STAR_RATING") - private float starPoint; - @Column(name = "ACCOUNT_WORK_COUNT") + @Column(name = "ACCOUNT_STAR_RATING", columnDefinition = "FLOAT DEFAULT 0.0f") + private Float starPoint; + @Column(name = "ACCOUNT_WORK_COUNT", columnDefinition = "INTEGER DEFAULT 0") private int workCount; - @Column(name = "ACCOUNT_OPEN_STATUS") + @Column(name = "ACCOUNT_OPEN_STATUS", columnDefinition = "BOOLEAN DEFAULT true") private boolean openStatus; @Column(name = "ACCOUNT_DELETED", columnDefinition = "BOOLEAN DEFAULT false") private boolean deleted = false; diff --git a/src/main/java/com/example/api/domain/Business.java b/src/main/java/com/example/api/domain/Business.java index 2ac85309..a9e85022 100644 --- a/src/main/java/com/example/api/domain/Business.java +++ b/src/main/java/com/example/api/domain/Business.java @@ -33,7 +33,7 @@ public class Business extends BaseEntity { @Column(name = "BUSINESS_NAME") private String businessName; - @OneToOne(fetch = LAZY) + @OneToOne(fetch = LAZY, cascade = CascadeType.ALL, orphanRemoval = true) @JoinColumn(name = "BUSINESS_LOCATION", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) private BusinessLocation location; @@ -41,7 +41,7 @@ public class Business extends BaseEntity { private String representationName; @Column(name = "BUSINESS_OPEN_DATE") - private LocalDate openDate; + private String openDate; @Column(name = "BUSINESS_REGISTRATION_NUMBER") private String registrationNumber; @@ -64,16 +64,7 @@ public Business(String businessName, BusinessLocation location, String represent this.representationName = representationName; } - public Business(Account user, String businessRegistrationNumber, String businessName, String representationName, String businessOpenDate, BusinessLocation location) { - this.employer = user; - this.registrationNumber = businessRegistrationNumber; - this.businessName = businessName; - this.representationName = representationName; - this.openDate = LocalDate.parse(businessOpenDate); - this.location = location; - } - - public Business(String businessName, BusinessLocation location, String representationName, Account employer, LocalDate openDate, String registrationNumber) { + public Business(String businessName, BusinessLocation location, String representationName, Account employer, String openDate, String registrationNumber) { this.businessName = businessName; this.location = location; this.representationName = representationName; diff --git a/src/main/java/com/example/api/domain/Contract.java b/src/main/java/com/example/api/domain/Contract.java index cf0a17bf..17329df2 100644 --- a/src/main/java/com/example/api/domain/Contract.java +++ b/src/main/java/com/example/api/domain/Contract.java @@ -18,7 +18,7 @@ public class Contract extends BaseEntity { private Long contractId; @OneToOne(fetch = FetchType.LAZY) - @PrimaryKeyJoinColumn(name = "CONTRACT_ID", referencedColumnName = "SUGGEST_ID", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) + @JoinColumn(name = "SUGGEST_ID", referencedColumnName = "SUGGEST_ID", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) private OfferEmployment offerEmployment; @Column(name = "CONTRACT_START_TIME", columnDefinition = "TIMESTAMP(0)") @@ -31,12 +31,14 @@ public class Contract extends BaseEntity { private boolean contractSucceeded; public Contract( + final Long contractId, final OfferEmployment offerEmployment, final LocalDateTime contractStartTime, final LocalDateTime contractEndTime, final int contractHourlyPay, final boolean contractSucceeded ) { + this.contractId = contractId; this.offerEmployment = offerEmployment; this.contractStartTime = contractStartTime; this.contractEndTime = contractEndTime; diff --git a/src/main/java/com/example/api/domain/OfferEmployment.java b/src/main/java/com/example/api/domain/OfferEmployment.java index ad98046b..8450283f 100644 --- a/src/main/java/com/example/api/domain/OfferEmployment.java +++ b/src/main/java/com/example/api/domain/OfferEmployment.java @@ -68,4 +68,8 @@ protected void onCreate() { public void succeeded() { this.suggestSucceeded = true; } -} + + public void setContract(Contract contract) { + this.contract = contract; + } +} \ No newline at end of file diff --git a/src/main/java/com/example/api/domain/repository/FlavoredDistrictRepository.java b/src/main/java/com/example/api/domain/repository/FlavoredDistrictRepository.java index bed3886d..49b81141 100644 --- a/src/main/java/com/example/api/domain/repository/FlavoredDistrictRepository.java +++ b/src/main/java/com/example/api/domain/repository/FlavoredDistrictRepository.java @@ -10,7 +10,7 @@ import java.util.List; public interface FlavoredDistrictRepository extends JpaRepository { - @Query("select new com.example.api.board.dto.response.FlavoredCategoryResponse(fd.district.id, fd.district.district) " + + @Query("select new com.example.api.board.dto.response.FlavoredDistrictResponse(fd.district.id, fd.district.district) " + "from FlavoredDistrict fd where fd.employee.accountId = :employeeId") List findAllByEmployeeId(Long employeeId); diff --git a/src/main/java/com/example/api/domain/repository/OfferEmploymentRepository.java b/src/main/java/com/example/api/domain/repository/OfferEmploymentRepository.java index 1322fe32..e677cb1e 100644 --- a/src/main/java/com/example/api/domain/repository/OfferEmploymentRepository.java +++ b/src/main/java/com/example/api/domain/repository/OfferEmploymentRepository.java @@ -2,6 +2,7 @@ import com.example.api.board.dto.response.InternalCareerResponse; import com.example.api.domain.OfferEmployment; +import com.example.api.suggest.controller.dto.request.OfferEmploymentDetailRequest; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; @@ -15,23 +16,23 @@ public interface OfferEmploymentRepository extends JpaRepository findAllByEmployeeId(@Param("employeeId") long employeeId); + @Query("select o from OfferEmployment o where o.business.businessId = :businessId") List findAllByBusinessBusinessId(long businessId); - @Query("select e.name, b.businessName, c.contractStartTime, c.contractEndTime " + + @Query("select new com.example.api.suggest.controller.dto.request.OfferEmploymentDetailRequest(e.name, b.businessName, oe.suggestStartTime, oe.suggestEndTime) " + "from OfferEmployment oe " + - "join oe.contract c " + "join oe.employee e " + "join oe.business b " + - "where oe.suggestId = :OfferEmploymentId") - List findSuggestByOfferEmploymentId(@Param("OfferEmploymentId")long OfferEmploymentId); + "where oe.suggestId = :offerEmploymentId") + OfferEmploymentDetailRequest findSuggestByOfferEmploymentId(@Param("offerEmploymentId") Long offerEmploymentId); @Modifying @Query("update OfferEmployment oe " + "set oe.suggestFinished = true, oe.suggestEndTime = CURRENT_TIMESTAMP " + - "where oe.suggestFinished = :suggestId") + "where oe.suggestId = :suggestId") void updateSuggestStatusToFinishedBySuggestId(@Param("suggestId") Long suggestId); } \ No newline at end of file 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 5f8b735a..3932a4fe 100644 --- a/src/main/java/com/example/api/global/config/SecurityConfig.java +++ b/src/main/java/com/example/api/global/config/SecurityConfig.java @@ -28,6 +28,7 @@ import java.io.IOException; +import java.util.Arrays; import java.util.List; @Configuration @@ -75,9 +76,9 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti @Bean public CorsConfigurationSource corsConfigurationSource() { CorsConfiguration corsConfiguration = new CorsConfiguration(); - corsConfiguration.addAllowedOrigin("*"); - corsConfiguration.addAllowedMethod("*"); - corsConfiguration.addAllowedHeader("*"); + corsConfiguration.setAllowedOrigins(Arrays.asList("http://localhost:8080", "http://43.201.78.102:8080")); + corsConfiguration.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE", "OPTIONS")); + corsConfiguration.setAllowedHeaders(Arrays.asList("Authorization", "Content-Type")); corsConfiguration.setAllowCredentials(true); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); diff --git a/src/main/java/com/example/api/global/config/filter/JwtAuthenticationFilter.java b/src/main/java/com/example/api/global/config/filter/JwtAuthenticationFilter.java index 9be0c740..265db929 100644 --- a/src/main/java/com/example/api/global/config/filter/JwtAuthenticationFilter.java +++ b/src/main/java/com/example/api/global/config/filter/JwtAuthenticationFilter.java @@ -11,6 +11,7 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Component; @@ -21,6 +22,7 @@ @Component @RequiredArgsConstructor +@Slf4j public class JwtAuthenticationFilter extends OncePerRequestFilter { private final JwtAuthenticationProvider jwtAuthenticationProvider; private final JwtTokenProvider jwtTokenProvider; diff --git a/src/main/java/com/example/api/suggest/controller/SuggestController.java b/src/main/java/com/example/api/suggest/controller/SuggestController.java index 56e0c7db..51080d5b 100644 --- a/src/main/java/com/example/api/suggest/controller/SuggestController.java +++ b/src/main/java/com/example/api/suggest/controller/SuggestController.java @@ -23,6 +23,7 @@ public ResponseEntity getSuggestStatus(@PathVariable() long businessId) { List suggestStatus = suggestService.getSuggestStatus(businessIdRequest); return ResponseEntity.ok(suggestStatus); } + @GetMapping("/api/v1/contracts/employment-suggests") public ResponseEntity> getAllSuggest( @RequestParam(required = true) final Long employeeId @@ -42,11 +43,11 @@ public ResponseEntity acceptContractContact( return ResponseEntity.ok(null); } - @PostMapping("/api/v1/contracts/suggests/{suggestId}/chatroom") - public ResponseEntity createChatRoom( + @PostMapping("/api/v1/contracts/suggests/chatroom") + public ResponseEntity createChatRoom( @RequestBody final AcceptSuggestCommand acceptSuggestCommand ) { suggestService.createChatRoom(acceptSuggestCommand); - return ResponseEntity.ok(null); + return ResponseEntity.ok("성공적으로 채팅방을 생성하였습니다."); } } diff --git a/src/main/java/com/example/api/suggest/controller/dto/request/OfferEmploymentDetailRequest.java b/src/main/java/com/example/api/suggest/controller/dto/request/OfferEmploymentDetailRequest.java new file mode 100644 index 00000000..a0e9cb5d --- /dev/null +++ b/src/main/java/com/example/api/suggest/controller/dto/request/OfferEmploymentDetailRequest.java @@ -0,0 +1,11 @@ +package com.example.api.suggest.controller.dto.request; + +import java.time.LocalDateTime; + +public record OfferEmploymentDetailRequest( + String name, + String businessName, + LocalDateTime startTime, + LocalDateTime endTime +) { +} diff --git a/src/main/java/com/example/api/suggest/service/SuggestService.java b/src/main/java/com/example/api/suggest/service/SuggestService.java index c9d01856..c469c5fb 100644 --- a/src/main/java/com/example/api/suggest/service/SuggestService.java +++ b/src/main/java/com/example/api/suggest/service/SuggestService.java @@ -11,9 +11,13 @@ import com.example.api.domain.Contract; import com.example.api.domain.repository.OfferEmploymentRepository; import com.example.api.domain.OfferEmployment; +import com.example.api.global.exception.BusinessException; +import com.example.api.global.exception.ErrorCode; import com.example.api.suggest.controller.dto.SuggestStatusDTO; import com.example.api.suggest.controller.dto.request.BusinessIdRequest; +import com.example.api.suggest.controller.dto.request.OfferEmploymentDetailRequest; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; @@ -25,6 +29,7 @@ @Service @RequiredArgsConstructor +@Slf4j public class SuggestService { private final OfferEmploymentRepository offerEmploymentRepository; private final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.MM.dd"); @@ -36,8 +41,11 @@ public class SuggestService { @Transactional(readOnly = true) public List getSuggestStatus(final BusinessIdRequest businessIdRequest) { List offerList = offerEmploymentRepository.findAllByBusinessBusinessId(businessIdRequest.BusinessId()); - List suggestStatusDTOList = new ArrayList<>(); + return currentSuggestStatusCheck(offerList); + } + private List currentSuggestStatusCheck(List offerList) { + List suggestStatusDTOList = new ArrayList<>(); String status; for (OfferEmployment offer : offerList) { if (offer.isSuggestReaded() == false) { @@ -45,44 +53,45 @@ public List getSuggestStatus(final BusinessIdRequest businessI } else if (offer.isSuggestReaded() == true && offer.isSuggestSucceeded() == false) { status = "거절"; } else if (offer.isSuggestReaded() && offer.isSuggestSucceeded() == true) { - if(offer.getContract().isContractSucceeded() == false) + Contract contract = contractRepository.findById(offer.getSuggestId()).orElseThrow(() -> new BusinessException(ErrorCode.CONTRACT_EXCEPTION)); + if(!contract.isContractSucceeded()) status = "체결 중"; else status = "체결 완료"; } else { status = "알 수 없는 상태"; } - List suggestList = offerEmploymentRepository.findSuggestByOfferEmploymentId(offer.getSuggestId()); - Object[] suggest = suggestList.get(0); - suggestStatusDTOList.add(makeSuggestStatusDTO(suggest, status)); + + if(contractRepository.existsById(offer.getSuggestId())) { + OfferEmploymentDetailRequest contractDetail = contractRepository.findContractByContractId(offer.getSuggestId()); + suggestStatusDTOList.add(makeSuggestStatusDTO(contractDetail, status)); + } else { + OfferEmploymentDetailRequest suggestDetail = offerEmploymentRepository.findSuggestByOfferEmploymentId(offer.getSuggestId()); + suggestStatusDTOList.add(makeSuggestStatusDTO(suggestDetail, status)); + } } return suggestStatusDTOList; } - public SuggestStatusDTO makeSuggestStatusDTO(Object[] suggest, String status) { - String name = (String) suggest[0]; - String businessName = suggest[1].toString(); - LocalDateTime startTime = (LocalDateTime) suggest[2]; - LocalDateTime endTime = (LocalDateTime) suggest[3]; - - String formattedDate = startTime.format(formatter); + public SuggestStatusDTO makeSuggestStatusDTO(OfferEmploymentDetailRequest suggest, String status) { + String formattedDate = suggest.startTime().format(formatter); StringBuilder workTime = new StringBuilder(); workTime.append(formattedDate) .append(" ") - .append(String.format("%02d", startTime.getHour())) + .append(String.format("%02d", suggest.startTime().getHour())) .append(":") - .append(String.format("%02d", startTime.getMinute())) + .append(String.format("%02d", suggest.startTime().getMinute())) .append("~") - .append(String.format("%02d", endTime.getHour())) + .append(String.format("%02d", suggest.endTime().getHour())) .append(":") - .append(String.format("%02d", endTime.getMinute())); + .append(String.format("%02d", suggest.endTime().getMinute())); String workTimeStr = workTime.toString(); return new SuggestStatusDTO( status, - name, - businessName, + suggest.name(), + suggest.businessName(), workTimeStr ); } @@ -98,6 +107,8 @@ public void acceptSuggest(@Validated final AcceptSuggestCommand acceptSuggestCom offerEmployment.succeeded(); final Contract contract = contractMapper.notYetSucceeded(offerEmployment); + offerEmployment.setContract(contract); + offerEmploymentRepository.save(offerEmployment); contractRepository.save(contract); } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index e3b55d59..3c54b831 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -3,7 +3,7 @@ spring.application.name=api spring.config.import=optional:file:.env[.properties] # mysql Database Configuration -spring.datasource.url=jdbc:mysql://52.79.243.139:3306/danpat?useSSL=false&serverTimezone=Asia/Seoul&characterEncoding=UTF-8 +spring.datasource.url=jdbc:mysql://3.36.70.9:3306/danpat?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Seoul&characterEncoding=UTF-8 spring.datasource.username=root spring.datasource.password=password spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver diff --git a/src/main/resources/static/danpat.yaml b/src/main/resources/static/danpat.yaml index e33fd81a..98d402b3 100644 --- a/src/main/resources/static/danpat.yaml +++ b/src/main/resources/static/danpat.yaml @@ -4,57 +4,27 @@ info: description: 단팥 백엔드 API 명세서입니다. version: 1.0.0 servers: - - url: http://43.201.78.102:8080 + - url: http://localhost:8080 security: - JWT_TOKEN: [] paths: - /api/v1/support/announcements/{announcementId}: - get: - tags: - - announcement-controller - operationId: getAnnouncement - parameters: - - name: announcementId - in: path - required: true - schema: - type: integer - format: int64 - responses: - "200": - description: OK - content: - application/json: - schema: - $ref: "#/components/schemas/AnnouncementResponse" - example: - announcementId: 1 - announcementTitle: "긴급 서버 점검 공지" - announcementType: "공지" - announcementContent: "서버 점검이 오늘 밤 11시에 진행됩니다." - viewCount: 123 - - - put: + /api/v1/account/validation/business-number: + post: tags: - - announcement-controller - operationId: updateAnnouncement - parameters: - - name: announcementId - in: path - required: true - schema: - type: integer - format: int64 + - AccountController + operationId: verifyBusinessNumber requestBody: content: application/json: schema: - $ref: "#/components/schemas/AnnouncementRequest" + $ref: "#/components/schemas/BusinessNumberRequest" example: - announcementTitle: "수정된 공지사항 제목" - announcementType: "업데이트" - announcementContent: "공지 내용이 업데이트되었습니다." + { + businessRegistrationNumber: "1041736263", + businessName: "김태영닷컴", + representationName: "김태영", + businessOpenDate: "20231123" + } required: true responses: "200": @@ -62,44 +32,33 @@ paths: content: '*/*': schema: - $ref: "#/components/schemas/AnnouncementResponse" - example: - announcementId: 1 - announcementTitle: "수정된 공지사항 제목" - announcementType: "업데이트" - announcementContent: "공지 내용이 업데이트되었습니다." - viewCount: 200 - delete: - tags: - - announcement-controller - operationId: deleteAnnouncement - parameters: - - name: announcementId - in: path - required: true - schema: - type: integer - format: int64 - responses: - "200": - description: OK - /api/v1/contracts/{contractId}: - put: + type: string + example: "유효한 사업자 등록 정보입니다." + /api/v1/account/sign-up/employer: + post: tags: - - contract-controller - operationId: updateContractCondition - parameters: - - name: contractId - in: path - required: true - schema: - type: integer - format: int64 + - AccountController + operationId: signUpEmployer requestBody: content: application/json: schema: - $ref: "#/components/schemas/UpdateContractConditionRequest" + $ref: "#/components/schemas/SignUpEmployerRequest" + example: + loginId: "로그인 ID를 적어주세요" + password: "비밀번호를 적어주세요" + email: "회원가입한 적 없는 이메일을 적어주세요" + businessRegistrationNumber: "1041736263" + businessName: "김태영닷컴" + representationName: "김태영" + businessOpenDate: "20231123" + location: + zipcode: "12093" + address: "경기도 남양주시 송산로339번길 25, 3층(별내동)" + detailAddress: "101호" + nationality: "KOREAN" + role: "EMPLOYER" + phoneNumber: "010-1234-1234" required: true responses: "200": @@ -107,35 +66,42 @@ paths: content: '*/*': schema: - type: object - /api/v1/business: - get: + type: string + example: "회원가입이 완료되었습니다" + /api/v1/account/email/code: + post: tags: - - business-controller - operationId: getMyBusiness - parameters: - - name: businessId - in: query + - AccountController + operationId: sendEmailCode + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/EmailRequest" + example: + email: "본인 이메일 적어서 테스트해주세요" required: true - schema: - type: integer - format: int64 responses: "200": description: OK content: '*/*': schema: - type: object - put: + type: string + example: "이메일 전송을 완료하였습니다." + /api/v1/account/email/verification: + post: tags: - - business-controller - operationId: modifyMyBusiness + - AccountController + operationId: verifyEmail requestBody: content: application/json: schema: - $ref: "#/components/schemas/ModifyBusinessRequest" + $ref: "#/components/schemas/EmailCodeRequest" + example: + email: "테스트한 이메일을 적어주세요" + code: "받은 코드 번호를 적어주세요" required: true responses: "200": @@ -143,16 +109,28 @@ paths: content: '*/*': schema: - type: object + type: string + example: "유효한 이메일입니다." + /api/v1/account/sign-up/employee: post: tags: - - business-controller - operationId: addBusiness + - AccountController + operationId: signUpEmployee requestBody: content: application/json: schema: - $ref: "#/components/schemas/AddBusinessRequest" + $ref: "#/components/schemas/SignUpEmployeeRequest" + example: + "loginId": "로그인 ID를 적어주세요" + "password": "비밀번호를 적어주세요" + "name": "이름을 적어주세요" + "nickname": "닉네임을 적어주세요" + "email": "회원가입한 적이 없는 이메일을 적어주세요" + "nationality": "KOREAN" + "role": "EMPLOYEE" + "phoneNumber": "010-1234-1234" + "emailReceivable": true required: true responses: "200": @@ -160,23 +138,13 @@ paths: content: '*/*': schema: - type: object - /api/v1/upload/profile: - post: + type: string + example: "회원가입이 완료되었습니다" + /api/v1/account/my: + delete: tags: - - s-3-controller - operationId: upload - requestBody: - content: - multipart/form-data: - schema: - required: - - file - type: object - properties: - file: - type: string - format: binary + - AccountController + operationId: deleteAccount responses: "200": description: OK @@ -184,21 +152,20 @@ paths: '*/*': schema: type: string - /api/v1/support/inquiry: + example: "성공적으로 삭제되었습니다." + /api/v1/auth/login: post: tags: - - inquiry-controller - operationId: createInquiry + - AuthController + operationId: login requestBody: content: application/json: schema: - $ref: "#/components/schemas/InquiryRequest" + $ref: "#/components/schemas/LoginRequest" example: - inquiryType: "일반" - subInquiryType: "서비스 문제" - title: "서비스 관련 문제" - content: "서비스 기능에 문제가 있습니다." + loginId: "로그인 ID를 입력해주세요" + password: "비밀번호를 입력해주세요" required: true responses: "200": @@ -206,74 +173,69 @@ paths: content: '*/*': schema: - $ref: "#/components/schemas/InquiryResponse" + type: object + additionalProperties: + type: string example: - inquiry_id: "123" - message: "문의가 성공적으로 접수되었습니다." - - /api/v1/support/announcements: - get: + accessToken: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." + userId: "123" + userRole: "EMPLOYEE" + /api/v1/auth/refresh: + post: tags: - - announcement-controller - operationId: getAnnouncements + - AuthController + operationId: refresh + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/RefreshTokenRequest" + example: + refreshToken: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." + required: true responses: "200": description: OK content: '*/*': schema: - type: array - items: - $ref: "#/components/schemas/AnnouncementResponse" - example: - - announcementId: 1 - announcementTitle: "긴급 서버 점검 공지" - announcementType: "공지" - announcementContent: "서버 점검이 오늘 밤 11시에 진행됩니다." - viewCount: 123 - - announcementId: 2 - announcementTitle: "새로운 기능 업데이트" - announcementType: "업데이트" - announcementContent: "신규 기능이 추가되었습니다. 확인해보세요!" - viewCount: 89 + type: object + additionalProperties: + type: string + example: + accessToken: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." + userId: "123" + userRole: "EMPLOYEE" + /api/v1/auth/logout: post: tags: - - announcement-controller - operationId: createAnnouncement - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/AnnouncementRequest" - example: - announcementTitle: "시스템 점검 안내" - announcementType: "공지" - announcementContent: "시스템 점검이 오전 12시부터 오전 4시까지 진행됩니다." - required: true + - AuthController + operationId: logout responses: "200": description: OK content: '*/*': schema: - $ref: "#/components/schemas/AnnouncementResponse" + type: object + additionalProperties: + type: string example: - announcementId: 1 - announcementTitle: "시스템 점검 안내" - announcementType: "공지" - announcementContent: "시스템 점검이 오전 12시부터 오전 4시까지 진행됩니다." - viewCount: 0 + accessToken: null + userId: null + userRole: null /api/v1/possible-board: post: tags: - - board-controller + - BoardController operationId: changeOpenStatus parameters: - - name: open-status - in: query - required: true - schema: - type: boolean + - name: open-status + in: query + required: true + schema: + type: boolean + example: true responses: "200": description: OK @@ -281,10 +243,11 @@ paths: '*/*': schema: type: string + example: "사용자 정보가 성공적으로 업데이트되었습니다." /api/v1/possible-board/work-preferences/districts: get: tags: - - board-controller + - BoardController operationId: getPreferredDistricts responses: "200": @@ -295,9 +258,14 @@ paths: type: array items: $ref: "#/components/schemas/FlavoredDistrictResponse" + example: + - districtId: 1 + districtName: "서울 강남구" + - districtId: 5 + districtName: "대구 남구" post: tags: - - board-controller + - BoardController operationId: updatePreferredDistricts requestBody: content: @@ -314,10 +282,16 @@ paths: type: array items: $ref: "#/components/schemas/FlavoredDistrictResponse" + example: + example: + - districtId: 1 + districtName: "서울 강남구" + - districtId: 5 + districtName: "대구 남구" /api/v1/possible-board/work-preferences/category: get: tags: - - board-controller + - BoardController operationId: getPreferredCategories responses: "200": @@ -328,15 +302,24 @@ paths: type: array items: $ref: "#/components/schemas/FlavoredCategoryResponse" + example: + - categoryId: 8 + categoryName: "IT•인터넷" + - categoryId: 9 + categoryName: "교육•강사" post: tags: - - board-controller + - BoardController operationId: updatePreferredCategories requestBody: content: application/json: schema: $ref: "#/components/schemas/UpdatePreferredCategoriesRequest" + example: + categoryIds: + - 8 + - 9 required: true responses: "200": @@ -347,10 +330,15 @@ paths: type: array items: $ref: "#/components/schemas/FlavoredCategoryResponse" + example: + - categoryId: 8 + categoryName: "IT•인터넷" + - categoryId: 9 + categoryName: "교육•강사" /api/v1/possible-board/work-hours: get: tags: - - board-controller + - BoardController operationId: getWorkHours responses: "200": @@ -361,22 +349,35 @@ paths: type: array items: $ref: "#/components/schemas/WorkHourResponse" + example: + - id: 101 + startTime: "2024-02-01T09:00:00" + endTime: "2024-02-01T18:00:00" + - id: 102 + startTime: "2024-02-02T10:00:00" + endTime: "2024-02-02T19:00:00" post: tags: - - board-controller + - BoardController operationId: updatePossibleTimes parameters: - - name: requestMemberId - in: query - required: true - schema: - type: integer - format: int64 + - name: requestMemberId + in: query + required: true + schema: + type: integer + format: int64 requestBody: content: application/json: schema: $ref: "#/components/schemas/AddPossibleTimeRequest" + example: + possibleTimes: + - startTime: "2025-02-10T09:00:00" + endTime: "2025-02-10T18:00:00" + - startTime: "2025-02-13T10:00:00" + endTime: "2025-02-13T19:00:00" required: true responses: "200": @@ -385,10 +386,16 @@ paths: '*/*': schema: type: object + example: + possibleTimes: + - startTime: "2025-02-10T09:00:00" + endTime: "2025-02-10T18:00:00" + - startTime: "2025-02-13T10:00:00" + endTime: "2025-02-13T19:00:00" /api/v1/possible-board/personal-info: get: tags: - - board-controller + - BoardController operationId: getPersonalInfo responses: "200": @@ -397,15 +404,31 @@ paths: '*/*': schema: $ref: "#/components/schemas/PersonalInfoResponse" + example: + - name: "김태영" + nickname: "김태일" + age: 25 + sex: "남" + email: "chulsoo@example.com" + phoneNumber: "010-1234-5678" + starPoint: 4.5 + workCount: 100 post: tags: - - board-controller + - BoardController operationId: updatePersonalInfo requestBody: content: application/json: schema: $ref: "#/components/schemas/UpdatePersonalInfoRequest" + example: + name: "김태영" + nickname: "김태일" + age: 25 + sex: "남" + email: "chulsoo@example.com" + phoneNumber: "010-1234-5678" required: true responses: "200": @@ -414,10 +437,19 @@ paths: '*/*': schema: $ref: "#/components/schemas/PersonalInfoResponse" + example: + - name: "김태영" + nickname: "김태일" + age: 25 + sex: "남" + email: "chulsoo@example.com" + phoneNumber: "010-1234-5678" + starPoint: 4.5 + workCount: 100 /api/v1/possible-board/external-career: get: tags: - - board-controller + - BoardController operationId: getExternalCareers responses: "200": @@ -428,15 +460,32 @@ paths: type: array items: $ref: "#/components/schemas/ExternalCareerResponse" + example: + - externalCareerId: 1 + category: + categoryId: 1 + categoryName: "외식•음료" + workCount: 1 + - externalCareerId: 2 + category: + categoryId: 2 + categoryName: "유통•판매" + workCount: 1 post: tags: - - board-controller + - BoardController operationId: updateExternalCareers requestBody: content: application/json: schema: $ref: "#/components/schemas/UpdateExternalCareerRequest" + example: + newExternalCareers: + - categoryId: 1 + workCount: 1 + - categoryId: 2 + workCount: 1 required: true responses: "200": @@ -447,304 +496,54 @@ paths: type: array items: $ref: "#/components/schemas/ExternalCareerResponse" - /api/v1/offeremployment: - post: - tags: - - offer-employment-controller - operationId: sendOfferEmployment - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/OfferEmploymentRequest" - example: - employeeId: 1001 - businessId: 1 - suggestHourlyPay: 10000 - suggestStartTime: "2025-01-01T09:00:00" - suggestEndTime: "2025-01-01T18:00:00" - required: true - responses: - "200": - description: OK - content: - '*/*': - schema: - $ref: "#/components/schemas/OfferEmploymentResponse" - example: - suggestId: 1 - success: false - message: "제안 보류 중" - /api/v1/offeremployment/complete: - post: - tags: - - offer-employment-controller - operationId: completeOfferEmployment - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/OfferEmploymentCompleteRequest" - example: - suggestId: 1 - employeeId: 1001 - required: true - responses: - "200": - description: OK - content: - '*/*': - schema: - type: string example: - success: true - message: "성공적으로 종료되었습니다." - /api/v1/info/my/reviews/{reviewId}/report: - post: + - externalCareerId: 1 + category: + categoryId: 1 + categoryName: "외식•음료" + workCount: 1 + - externalCareerId: 2 + category: + categoryId: 2 + categoryName: "유통•판매" + workCount: 1 + /api/v1/possible-board/internal-career: + get: tags: - - review-report-controller - operationId: reportReview - parameters: - - name: reviewId - in: path - required: true - schema: - $ref: "#/components/schemas/Review" - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/ReviewReportRequest" - example: - reason: "부당하거나 허위 내용이 포함되어 있습니다." - required: true + - BoardController + operationId: getInternalCareers responses: "200": description: OK content: '*/*': schema: - $ref: "#/components/schemas/ReviewReportResponse" + type: array + items: + $ref: "#/components/schemas/InternalCareerResponse" example: - reportId: 789 - message: "리뷰 신고가 성공적으로 접수되었습니다." - /api/v1/contracts/{contractId}/accepts: - post: - tags: - - contract-controller - operationId: acceptContract - parameters: - - name: contractId - in: path - required: true - schema: - type: integer - format: int64 - responses: - "200": - description: OK - content: - '*/*': - schema: - type: object - /api/v1/contracts/suggests/{suggestId}/chatroom: - post: - parameters: - - name: suggestId - in: path - required: true - schema: - type: string - tags: - - suggest-controller - operationId: createChatRoom - requestBody: - required: true - content: - application/json: - schema: - $ref: "#/components/schemas/AcceptSuggestCommand" - responses: - "200": - description: OK - content: - application/json: - schema: - type: object - /api/v1/contracts/suggests/{suggestId}/accept: - post: - tags: - - suggest-controller - operationId: acceptContractContact - parameters: - - name: suggestId - in: path - required: true - schema: - type: integer - format: int64 - responses: - "200": - description: OK - content: - '*/*': - schema: - type: object - /api/v1/contracts/review: - post: - tags: - - contract-review-controller - operationId: addReview - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/AddReviewRequest" - required: true - responses: - "200": - description: OK - content: - '*/*': - schema: - type: object - /api/v1/auth/refresh: + - contractId: 1 + businessName: "김태영닷컴" + startTime: "2024-02-15 12:00:00" + endTime: "2024-02-15 14:00:00" + /api/v1/upload/profile: post: tags: - - auth-controller - operationId: refresh + - S3Controller + summary: 프로필 이미지 업로드 + description: "사용자가 프로필 이미지를 업로드합니다." + operationId: upload requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/RefreshTokenRequest" required: true - responses: - "200": - description: OK - content: - '*/*': - schema: - type: object - additionalProperties: - type: string - /api/v1/auth/logout: - post: - tags: - - auth-controller - operationId: logout - responses: - "200": - description: OK - content: - '*/*': - schema: - type: object - additionalProperties: - type: string - /api/v1/auth/login: - post: - tags: - - auth-controller - operationId: login - requestBody: content: - application/json: + multipart/form-data: schema: - $ref: "#/components/schemas/LoginRequest" - required: true - responses: - "200": - description: OK - content: - '*/*': - schema: - type: object - additionalProperties: + type: object + properties: + file: type: string - /api/v1/account/validation/business-number: - post: - tags: - - account-controller - operationId: verifyBusinessNumber - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/BusinessNumberRequest" - required: true - responses: - "200": - description: OK - content: - '*/*': - schema: - type: string - /api/v1/account/sign-up/employer: - post: - tags: - - account-controller - operationId: signUpEmployer - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/SignUpEmployerRequest" - required: true - responses: - "200": - description: OK - content: - '*/*': - schema: - type: string - /api/v1/account/sign-up/employee: - post: - tags: - - account-controller - operationId: signUpEmployee - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/SignUpEmployeeRequest" - required: true - responses: - "200": - description: OK - content: - '*/*': - schema: - type: string - /api/v1/account/email/verification: - post: - tags: - - account-controller - operationId: verifyEmail - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/EmailCodeRequest" - required: true - responses: - "200": - description: OK - content: - '*/*': - schema: - type: string - /api/v1/account/email/code: - post: - tags: - - account-controller - operationId: sendEmailCode - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/EmailRequest" - required: true + format: binary + description: "업로드할 프로필 이미지 파일을 선택하세요." responses: "200": description: OK @@ -752,209 +551,323 @@ paths: '*/*': schema: type: string - /api/search/search: + example: "https://danpat.s3.ap-northeast-2.amazonaws.com/user-uploads/1/profile.png" + + /api/v1/offeremployment: post: tags: - - search-controller - operationId: searchAccounts + - OfferEmploymentController + operationId: sendOfferEmployment requestBody: content: application/json: schema: - $ref: "#/components/schemas/SearchRequest" + $ref: "#/components/schemas/OfferEmploymentRequest" example: - category: "IT" - startTime: "2025-01-01T09:00:00" - endTime: "2025-01-01T18:00:00" - required: true - responses: - "200": - description: OK - content: - '*/*': - schema: - type: array - items: - $ref: "#/components/schemas/SearchResponse" - example: - - name: "John Doe" - sex: "Male" - age: 30 - starPoint: 4.5 - workCount: 50 - - name: "Jane Smith" - sex: "Female" - age: 28 - starPoint: 4.8 - workCount: 60 - /favorites/employees: - get: - tags: - - employer-controller - operationId: getLikeEmployee - responses: - "200": - description: OK - content: - '*/*': - schema: - type: string - /chat/summaries: - get: - tags: - - chat-controller - operationId: getChatSummaries - parameters: - - name: userIdRequest - in: query + employeeId: 1001 + businessId: 1 + suggestHourlyPay: 10000 + suggestStartTime: "2025-01-01T09:00:00" + suggestEndTime: "2025-01-01T18:00:00" required: true - schema: - $ref: "#/components/schemas/UserIdRequest" responses: "200": description: OK content: '*/*': schema: - $ref: "#/components/schemas/ChatSummaryResponse" - /chat/room/{roomId}/chats: - get: + $ref: "#/components/schemas/OfferEmploymentResponse" + example: + suggestId: 1 + success: false + message: "Offer pending" + /api/v1/offeremployment/complete: + post: tags: - - chat-controller - operationId: getMessages - parameters: - - name: roomId - in: path + - OfferEmploymentController + operationId: completeOfferEmployment + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/OfferEmploymentCompleteRequest" + example: + suggestId: 1 + employeeId: 1001 required: true - schema: - type: integer - format: int64 - - name: lastChatId - in: query - required: false - schema: - type: string responses: "200": description: OK content: '*/*': schema: - type: array - items: - $ref: "#/components/schemas/Chat" - /businesses: - get: - tags: - - employer-controller - operationId: getBusinessList - responses: - "200": - description: OK + type: string + example: + success: true + message: "성공적으로 종료되었습니다." + /api/v1/contracts/suggests/chatroom: + post: + tags: + - SuggestController + operationId: createChatRoom + requestBody: + required: true content: - '*/*': + application/json: schema: - type: string - /api/v1/support/my-inquiries: - get: + $ref: "#/components/schemas/AcceptSuggestCommand" + example: + suggestId: 1 + responses: + "200": + description: OK + content: + '*/*': + schema: + type: string + example: "성공적으로 채팅방을 생성하였습니다." + /api/v1/contracts/suggests/{suggestId}/accept: + post: + tags: + - SuggestController + operationId: acceptContractContact + parameters: + - name: suggestId + in: path + required: true + schema: + type: integer + format: int64 + responses: + "200": + description: OK + content: + '*/*': + schema: + type: object + /api/v1/employment-suggests/status/{businessId}: + get: + tags: + - SuggestController + operationId: getSuggestStatus + parameters: + - name: businessId + in: path + required: true + schema: + type: integer + format: int64 + responses: + "200": + description: OK + content: + '*/*': + schema: + type: string + example: + - status: "대기 중" + name: "알바생" + businessName: "김태영닷컴" + workTime: "2024.02.20 12:00~14:00" + /api/v1/contracts/employment-suggests: + get: + tags: + - SuggestController + operationId: getAllSuggest + parameters: + - name: employeeId + in: query + required: true + schema: + type: integer + format: int64 + responses: + "200": + description: OK + content: + '*/*': + schema: + type: array + items: + $ref: "#/components/schemas/SuggestedBusinessResponse" + example: + - businessId: 1 + suggestStartDateTime: "2024-02-01T09:00:00" + suggestEndDateTime: "2024-02-01T11:00:00" + suggestPartTimePayment: 10000 + suggestChecked: 1 + suggestAccepted: 0 + - businessId: 2 + suggestStartDateTime: "2024-02-01T09:00:00" + suggestEndDateTime: "2024-02-01T11:00:00" + suggestPartTimePayment: 10000 + suggestChecked: 1 + suggestAccepted: 1 +# /api/v1/support/announcements/{announcementId}: +# get: +# tags: +# - announcement-controller +# operationId: getAnnouncement +# parameters: +# - name: announcementId +# in: path +# required: true +# schema: +# type: integer +# format: int64 +# responses: +# "200": +# description: OK +# content: +# application/json: +# schema: +# $ref: "#/components/schemas/AnnouncementResponse" +# example: +# announcementId: 1 +# announcementTitle: "긴급 서버 점검 공지" +# announcementType: "공지" +# announcementContent: "서버 점검이 오늘 밤 11시에 진행됩니다." +# viewCount: 123 +# +# +# put: +# tags: +# - announcement-controller +# operationId: updateAnnouncement +# parameters: +# - name: announcementId +# in: path +# required: true +# schema: +# type: integer +# format: int64 +# requestBody: +# content: +# application/json: +# schema: +# $ref: "#/components/schemas/AnnouncementRequest" +# example: +# announcementTitle: "수정된 공지사항 제목" +# announcementType: "업데이트" +# announcementContent: "공지 내용이 업데이트되었습니다." +# required: true +# responses: +# "200": +# description: OK +# content: +# '*/*': +# schema: +# $ref: "#/components/schemas/AnnouncementResponse" +# example: +# announcementId: 1 +# announcementTitle: "수정된 공지사항 제목" +# announcementType: "업데이트" +# announcementContent: "공지 내용이 업데이트되었습니다." +# viewCount: 200 +# delete: +# tags: +# - announcement-controller +# operationId: deleteAnnouncement +# parameters: +# - name: announcementId +# in: path +# required: true +# schema: +# type: integer +# format: int64 +# responses: +# "200": +# description: OK + /api/v1/contracts/{contractId}: + put: tags: - - inquiry-controller - operationId: getMyInquiries + - ContractController + operationId: updateContractCondition parameters: - - name: accountId - in: query + - name: contractId + in: path required: true schema: type: integer format: int64 + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/UpdateContractConditionRequest" + example: + suggestStartDateTime: "2025-02-01T14:00:00" + suggestEndDateTime: "2025-02-01T16:00:00" + suggestHourlyPayment: 10000 + required: true responses: "200": description: OK content: '*/*': schema: - type: array - items: - $ref: "#/components/schemas/InquiryResponse" - example: - - inquiryId: 1 - inquiryType: "일반" - subInquiryType: "서비스 문제" - title: "서비스 관련 문제" - content: "서비스 기능에 문제가 발생했습니다." - inquiryStatus: "대기 중" - answerDate: null - createdBy: 123 - - inquiryId: 2 - inquiryType: "기술" - subInquiryType: "버그 신고" - title: "애플리케이션 버그 신고" - content: "애플리케이션에서 치명적인 버그를 발견했습니다." - inquiryStatus: "답변 완료" - answerDate: "2025-01-20T10:00:00" - createdBy: 123 - /api/v1/support/announcements/search: - get: + type: string + example: "근무 조건이 변경되었습니다." + /api/v1/contracts/{contractId}/accepts: + post: tags: - - announcement-controller - operationId: searchAnnouncements + - ContractController + operationId: acceptContract parameters: - - name: keyword - in: query - required: true - schema: - type: string - example: "점검" + - name: contractId + in: path + required: true + schema: + type: integer + format: int64 responses: "200": description: OK content: '*/*': schema: - type: array - items: - $ref: "#/components/schemas/AnnouncementResponse" - example: - - announcementId: 1 - announcementTitle: "시스템 점검 안내" - announcementType: "공지" - announcementContent: "시스템이 오전 12시부터 오전 4시까지 점검을 진행합니다." - viewCount: 150 - /api/v1/review: + type: string + /api/v1/contracts/{contractId}/status: get: tags: - - review-controller - operationId: getAllReviews + - ContractController + operationId: getContractInfo + parameters: + - name: contractId + in: path + required: true + schema: + type: integer + format: int64 responses: "200": description: OK content: '*/*': schema: - type: array - items: - $ref: "#/components/schemas/ReviewResponse" - example: - - reviewId: 1 - businessName: "테스트 사업장" - businessId: 10 - contractStartTime: "2025-01-01T09:00:00" - contractEndTime: "2025-01-01T18:00:00" - reviewStarPoint: 5 - reviewContent: "훌륭한 작업이었습니다!" - - reviewId: 2 - businessName: "또 다른 사업장" - businessId: 20 - contractStartTime: "2025-01-02T09:00:00" - contractEndTime: "2025-01-02T18:00:00" - reviewStarPoint: 4 - reviewContent: "좋은 성과를 보여주었습니다." - /api/v1/review/{reviewId}: + $ref: "#/components/schemas/ContractDTO" + example: + businessInfo: + businessName: "김태영닷컴" + representationName: "김태영" + startTime: "2024-02-01T09:00:00" + endTime: "2024-02-01T18:00:00" + location: + address: "서울시 강남구 테헤란로 123" + zipcode: "06100" + detailAddress: "5층 503호" + businessPhone: "02-1234-5678" + signedDate: "2023-12-01T14:30:00" + employeeInfo: + employeeName: "이영희" + employeePhone: "010-9876-5432" + starPoint: 4.7 + workCount: 120 + /api/v1/contracts/schedule: get: tags: - - review-controller - operationId: getReviewsByEmployee - parameters: [] + - ContractController + operationId: getContractSchedule responses: "200": description: OK @@ -963,103 +876,230 @@ paths: schema: type: array items: - $ref: "#/components/schemas/ReviewResponse" - example: - - reviewId: 1 - businessName: "테스트 사업장" - businessId: 10 - contractStartTime: "2025-01-01T09:00:00" - contractEndTime: "2025-01-01T18:00:00" - reviewStarPoint: 5 - reviewContent: "훌륭한 작업이었습니다!" - /api/v1/review/my/reviews: + $ref: "#/components/schemas/ContractScheduleResponse" + example: + - contractId: + businessName: + startTime: + endTime: + - contractId: + businessName: + startTime: + endTime: + + /api/v1/business: get: tags: - - review-controller - operationId: getMyReviews + - BusinessController + operationId: getMyBusiness parameters: - - name: accountId + - name: businessId in: query required: true schema: type: integer format: int64 + example: 1 responses: "200": description: OK content: '*/*': schema: - type: array - items: - $ref: "#/components/schemas/ReviewResponse" - example: - - reviewId: 1 - businessName: "테스트 사업장" - businessId: 10 - contractStartTime: "2025-01-01T09:00:00" - contractEndTime: "2025-01-01T18:00:00" - reviewStarPoint: 5 - reviewContent: "훌륭한 작업이었습니다!" - - reviewId: 2 - businessName: "스타트업 컴퍼니" - businessId: 20 - contractStartTime: "2025-01-05T10:00:00" - contractEndTime: "2025-01-05T19:00:00" - reviewStarPoint: 4 - reviewContent: "업무 진행이 원활했습니다." - /api/v1/review/available: - get: + type: object + example: + businessName: "김태영닷컴" + businessId: 1 + owner: + accountId: 1 + name: "김태영" + location: + zipcode: "12093" + address: "경기도 남양주시 송산로339번길 25, 3층(별내동)" + detailAddress: "101호" + categoryInfos: + - categoryId: 8 + categoryName: "IT•인터넷" + put: tags: - - review-controller - operationId: getAvailableReviewTargets - parameters: - - name: businessId - in: query + - BusinessController + operationId: modifyMyBusiness + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/ModifyBusinessRequest" + example: + businessId: 1 + businessName: "김태영닷컴" + location: + zipcode: "12093" + address: "경기도 남양주시 송산로339번길 25, 3층(별내동)" + detailAddress: "101호" + categoryInfos: + - 8 required: true - schema: - type: integer - format: int64 responses: "200": description: OK content: '*/*': schema: - type: array - items: - $ref: "#/components/schemas/ReviewAvailableResponse" - example: - - employeeId: 1001 - employeeName: "김철수" - - employeeId: 1002 - employeeName: "이영희" - /api/v1/possible-board/internal-career: - get: + type: string + example: "요청이 성공적으로 처리되었습니다." + post: tags: - - board-controller - operationId: getInternalCareers + - BusinessController + operationId: addBusiness + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/AddBusinessRequest" + example: + requestMemberId: 1 + businessName: "김태영닷컴" + businessRegistrationNumber: "12345" + businessOpenDate: "250101" + location: + zipcode: "12093" + address: "경기도 남양주시 송산로339번길 25, 3층(별내동)" + detailAddress: "101호" + categoryIds: + - 8 + representationName: "김태영" + required: true responses: "200": description: OK content: '*/*': schema: - type: array - items: - $ref: "#/components/schemas/InternalCareerResponse" - /api/v1/employment-suggests/status/{businessId}: - get: + type: string + example: "요청이 성공적으로 처리되었습니다." +# /api/v1/support/inquiry: +# post: +# tags: +# - inquiry-controller +# operationId: createInquiry +# requestBody: +# content: +# application/json: +# schema: +# $ref: "#/components/schemas/InquiryRequest" +# example: +# inquiryType: "일반" +# subInquiryType: "서비스 문제" +# title: "서비스 관련 문제" +# content: "서비스 기능에 문제가 있습니다." +# required: true +# responses: +# "200": +# description: OK +# content: +# '*/*': +# schema: +# $ref: "#/components/schemas/InquiryResponse" +# example: +# inquiry_id: "123" +# message: "문의가 성공적으로 접수되었습니다." +# +# /api/v1/support/announcements: +# get: +# tags: +# - announcement-controller +# operationId: getAnnouncements +# responses: +# "200": +# description: OK +# content: +# '*/*': +# schema: +# type: array +# items: +# $ref: "#/components/schemas/AnnouncementResponse" +# example: +# - announcementId: 1 +# announcementTitle: "긴급 서버 점검 공지" +# announcementType: "공지" +# announcementContent: "서버 점검이 오늘 밤 11시에 진행됩니다." +# viewCount: 123 +# - announcementId: 2 +# announcementTitle: "새로운 기능 업데이트" +# announcementType: "업데이트" +# announcementContent: "신규 기능이 추가되었습니다. 확인해보세요!" +# viewCount: 89 +# post: +# tags: +# - announcement-controller +# operationId: createAnnouncement +# requestBody: +# content: +# application/json: +# schema: +# $ref: "#/components/schemas/AnnouncementRequest" +# example: +# announcementTitle: "시스템 점검 안내" +# announcementType: "공지" +# announcementContent: "시스템 점검이 오전 12시부터 오전 4시까지 진행됩니다." +# required: true +# responses: +# "200": +# description: OK +# content: +# '*/*': +# schema: +# $ref: "#/components/schemas/AnnouncementResponse" +# example: +# announcementId: 1 +# announcementTitle: "시스템 점검 안내" +# announcementType: "공지" +# announcementContent: "시스템 점검이 오전 12시부터 오전 4시까지 진행됩니다." +# viewCount: 0 + /api/v1/info/my/reviews/{reviewId}/report: + post: tags: - - suggest-controller - operationId: getSuggestStatus + - ReviewReportController + operationId: reportReview parameters: - - name: businessId + - name: reviewId in: path required: true schema: - type: integer - format: int64 + $ref: "#/components/schemas/Review" + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/ReviewReportRequest" + example: + reason: "부당하거나 허위 내용이 포함되어 있습니다." + required: true + responses: + "200": + description: OK + content: + '*/*': + schema: + $ref: "#/components/schemas/ReviewReportResponse" + example: + reportId: 789 + message: "리뷰 신고가 성공적으로 접수되었습니다." + /api/v1/contracts/review: + post: + tags: + - ContractReviewController + operationId: addReview + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/AddReviewRequest" + example: + contractId: 9 + reviewScore: 5 + reviewContent: "일 잘하네요" + required: true responses: "200": description: OK @@ -1067,10 +1107,11 @@ paths: '*/*': schema: type: string + example: "리뷰가 성공적으로 작성되었습니다." /api/v1/contracts/review/my: get: tags: - - contract-review-controller + - ContractReviewController operationId: getMyReview responses: "200": @@ -1081,58 +1122,355 @@ paths: type: array items: $ref: "#/components/schemas/ReviewResponse" - /api/v1/contracts/employment-suggests: + example: + - reviewId: 1 + contractId: 9 + reviewContent: "일 잘하네요" + reviewScore: 5 + # /api/search/search: +# post: +# tags: +# - search-controller +# operationId: searchAccounts +# requestBody: +# content: +# application/json: +# schema: +# $ref: "#/components/schemas/SearchRequest" +# example: +# category: "IT" +# startTime: "2025-01-01T09:00:00" +# endTime: "2025-01-01T18:00:00" +# required: true +# responses: +# "200": +# description: OK +# content: +# '*/*': +# schema: +# type: array +# items: +# $ref: "#/components/schemas/SearchResponse" +# example: +# - name: "John Doe" +# sex: "Male" +# age: 30 +# starPoint: 4.5 +# workCount: 50 +# - name: "Jane Smith" +# sex: "Female" +# age: 28 +# starPoint: 4.8 +# workCount: 60 +# /favorites/employees: +# get: +# tags: +# - EmployerController +# operationId: getLikeEmployee +# responses: +# "200": +# description: OK +# content: +# '*/*': +# schema: +# type: string +# example: +# - employeeId: 101 +# name: "김태영" +# nickname: "김태영1" +# sex: "남" +# age: 30 +# starPoint: 4.7 +# workCount: 120 +# externalCareerList: +# - externalCareerId: 1 +# category: +# - categoryId: 1 +# categoryName: "외식•음료" +# workCount: 1 +# - externalCareerId: 2 +# category: +# - categoryId: 2 +# categoryName: "유통•판매" +# workCount: 1 +# flavoredCategoryList: +# - categoryId: 1 +# categoryName: "외식•음료" +# - categoryId: 2 +# categoryName: "유통•판매" + /chat/summaries: get: tags: - - suggest-controller - operationId: getAllSuggest + - chat-controller + operationId: getChatSummaries parameters: - - name: employeeId + - name: userIdRequest in: query required: true schema: - type: integer - format: int64 + $ref: "#/components/schemas/UserIdRequest" responses: "200": description: OK content: '*/*': schema: - type: array - items: - $ref: "#/components/schemas/SuggestedBusinessResponse" - /api/v1/contract/{contractId}/status: + $ref: "#/components/schemas/ChatSummaryResponse" + example: + chatSummaries: + - roomId: 1 + lastMessageContent: "안녕하세요!" + lastMessageTime: "2025-02-01T15:51:55.626Z" + numberOfUnreadMessages: 2 + - roomId: 2 + lastMessageContent: "알바 하실래요?" + lastMessageTime: "2025-02-01T15:51:55.626Z" + numberOfUnreadMessages: 2 + /chat/room/{roomId}/chats: get: tags: - - contract-controller - operationId: getContractInfo + - chat-controller + operationId: getMessages parameters: - - name: contractId + - name: roomId in: path required: true schema: type: integer format: int64 + example: 1 + - name: lastChatId + in: query + required: false + schema: + type: string + example: "1" responses: "200": description: OK content: '*/*': schema: - $ref: "#/components/schemas/ContractDTO" - /api/v1/account/my: - delete: - tags: - - account-controller - operationId: deleteAccount - responses: - "200": - description: OK - content: - '*/*': - schema: - type: string + type: array + items: + $ref: "#/components/schemas/Chat" + example: + - id: "msg-12345" + content: "안녕하세요!" + roomId: 0 + senderId: 1 + receiverId: 2 + sendTime: "2025-02-01T15:56:28.378Z" + isRead: true + - id: "msg-67890" + content: "네, 반갑습니다!" + roomId: 0 + senderId: 2 + receiverId: 1 + sendTime: "2025-02-01T15:57:00.123Z" + isRead: false +# /businesses: +# get: +# tags: +# - EmployerController +# operationId: getBusinessList +# responses: +# "200": +# description: OK +# content: +# '*/*': +# schema: +# type: object +# example: +# - businessName: "김태영닷컴" +# businessLocation: +# zipcode: "12093" +# address: "경기도 남양주시 송산로339번길 25, 3층(별내동)" +# detailAddress: "101호" +# - businessName: "김태영법조타운" +# businessLocation: +# zipcode: "404320" +# address: "인천광역시 서구 원당동 인천검단택지개발지구 C5-1-1BL" +# detailAddress: "101호" +# /api/v1/support/my-inquiries: +# get: +# tags: +# - inquiry-controller +# operationId: getMyInquiries +# parameters: +# - name: accountId +# in: query +# required: true +# schema: +# type: integer +# format: int64 +# responses: +# "200": +# description: OK +# content: +# '*/*': +# schema: +# type: array +# items: +# $ref: "#/components/schemas/InquiryResponse" +# example: +# - inquiryId: 1 +# inquiryType: "일반" +# subInquiryType: "서비스 문제" +# title: "서비스 관련 문제" +# content: "서비스 기능에 문제가 발생했습니다." +# inquiryStatus: "대기 중" +# answerDate: null +# createdBy: 123 +# - inquiryId: 2 +# inquiryType: "기술" +# subInquiryType: "버그 신고" +# title: "애플리케이션 버그 신고" +# content: "애플리케이션에서 치명적인 버그를 발견했습니다." +# inquiryStatus: "답변 완료" +# answerDate: "2025-01-20T10:00:00" +# createdBy: 123 +# /api/v1/support/announcements/search: +# get: +# tags: +# - announcement-controller +# operationId: searchAnnouncements +# parameters: +# - name: keyword +# in: query +# required: true +# schema: +# type: string +# example: "점검" +# responses: +# "200": +# description: OK +# content: +# '*/*': +# schema: +# type: array +# items: +# $ref: "#/components/schemas/AnnouncementResponse" +# example: +# - announcementId: 1 +# announcementTitle: "시스템 점검 안내" +# announcementType: "공지" +# announcementContent: "시스템이 오전 12시부터 오전 4시까지 점검을 진행합니다." +# viewCount: 150 +# /api/v1/review: +# get: +# tags: +# - review-controller +# operationId: getAllReviews +# responses: +# "200": +# description: OK +# content: +# '*/*': +# schema: +# type: array +# items: +# $ref: "#/components/schemas/ReviewResponse" +# example: +# - reviewId: 1 +# businessName: "테스트 사업장" +# businessId: 10 +# contractStartTime: "2025-01-01T09:00:00" +# contractEndTime: "2025-01-01T18:00:00" +# reviewStarPoint: 5 +# reviewContent: "훌륭한 작업이었습니다!" +# - reviewId: 2 +# businessName: "또 다른 사업장" +# businessId: 20 +# contractStartTime: "2025-01-02T09:00:00" +# contractEndTime: "2025-01-02T18:00:00" +# reviewStarPoint: 4 +# reviewContent: "좋은 성과를 보여주었습니다." +# /api/v1/review/{reviewId}: +# get: +# tags: +# - review-controller +# operationId: getReviewsByEmployee +# parameters: [] +# responses: +# "200": +# description: OK +# content: +# '*/*': +# schema: +# type: array +# items: +# $ref: "#/components/schemas/ReviewResponse" +# example: +# - reviewId: 1 +# businessName: "테스트 사업장" +# businessId: 10 +# contractStartTime: "2025-01-01T09:00:00" +# contractEndTime: "2025-01-01T18:00:00" +# reviewStarPoint: 5 +# reviewContent: "훌륭한 작업이었습니다!" +# /api/v1/review/my/reviews: +# get: +# tags: +# - review-controller +# operationId: getMyReviews +# parameters: +# - name: accountId +# in: query +# required: true +# schema: +# type: integer +# format: int64 +# responses: +# "200": +# description: OK +# content: +# '*/*': +# schema: +# type: array +# items: +# $ref: "#/components/schemas/ReviewResponse" +# example: +# - reviewId: 1 +# businessName: "테스트 사업장" +# businessId: 10 +# contractStartTime: "2025-01-01T09:00:00" +# contractEndTime: "2025-01-01T18:00:00" +# reviewStarPoint: 5 +# reviewContent: "훌륭한 작업이었습니다!" +# - reviewId: 2 +# businessName: "스타트업 컴퍼니" +# businessId: 20 +# contractStartTime: "2025-01-05T10:00:00" +# contractEndTime: "2025-01-05T19:00:00" +# reviewStarPoint: 4 +# reviewContent: "업무 진행이 원활했습니다." +# /api/v1/review/available: +# get: +# tags: +# - review-controller +# operationId: getAvailableReviewTargets +# parameters: +# - name: businessId +# in: query +# required: true +# schema: +# type: integer +# format: int64 +# responses: +# "200": +# description: OK +# content: +# '*/*': +# schema: +# type: array +# items: +# $ref: "#/components/schemas/ReviewAvailableResponse" +# example: +# - employeeId: 1001 +# employeeName: "김철수" +# - employeeId: 1002 +# employeeName: "이영희" components: schemas: AnnouncementRequest: @@ -1838,10 +2176,6 @@ components: ChatSummaryResponse: type: object properties: - chatRooms: - type: array - items: - $ref: "#/components/schemas/ChatRoom" chatSummaries: type: array items: @@ -1969,6 +2303,20 @@ components: $ref: "#/components/schemas/BusinessInfoDTO" employeeInfo: $ref: "#/components/schemas/EmployeeInfoDTO" + ContractScheduleResponse: + type: object + properties: + contractId: + type: number + format: int64 + businessName: + type: string + startTime: + type: string + format: date-time + endTime: + type: string + format: data-time EmployeeInfoDTO: type: object properties: From bfb6c4d44df8a2a6791a02f661ecdd1268bd95c6 Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Mon, 3 Feb 2025 00:28:52 +0900 Subject: [PATCH 252/276] =?UTF-8?q?scrap=20api=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/example/api/domain/Scrap.java | 9 + .../controller/EmployerController.java | 31 +- .../dto/FavoriteEmployeeRequest.java | 7 + .../employer/repository/ScrapRepository.java | 4 + .../api/employer/service/EmployerService.java | 25 + src/main/resources/static/danpat.yaml | 899 +++++++++--------- 6 files changed, 542 insertions(+), 433 deletions(-) create mode 100644 src/main/java/com/example/api/employer/controller/dto/FavoriteEmployeeRequest.java diff --git a/src/main/java/com/example/api/domain/Scrap.java b/src/main/java/com/example/api/domain/Scrap.java index 3d0a1fa0..19c7f511 100644 --- a/src/main/java/com/example/api/domain/Scrap.java +++ b/src/main/java/com/example/api/domain/Scrap.java @@ -21,7 +21,16 @@ public class Scrap extends BaseEntity { @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "EMPLOYER_ID", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) private Account employer; + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "EMPLOYEE_ID", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) private Account employee; + + public Scrap() { + } + + public Scrap(Account employee, Account employer) { + this.employee = employee; + this.employer = employer; + } } \ No newline at end of file diff --git a/src/main/java/com/example/api/employer/controller/EmployerController.java b/src/main/java/com/example/api/employer/controller/EmployerController.java index 45e57208..7cc59cbe 100644 --- a/src/main/java/com/example/api/employer/controller/EmployerController.java +++ b/src/main/java/com/example/api/employer/controller/EmployerController.java @@ -2,32 +2,51 @@ import com.example.api.employer.controller.dto.EmployerBusinessesRequest; import com.example.api.employer.controller.dto.EmployerIdRequest; +import com.example.api.employer.controller.dto.FavoriteEmployeeRequest; import com.example.api.employer.controller.dto.LikeEmployeeDTO; import com.example.api.employer.service.EmployerService; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import java.util.List; -@RestController("/api/v1/employer/") +@RestController +@RequestMapping("/api/v1/employer") @RequiredArgsConstructor public class EmployerController { private final EmployerService employerService; - @GetMapping("favorites/employees") + @GetMapping("/favorites/employees") public ResponseEntity getLikeEmployee(@AuthenticationPrincipal final Long employerId) { EmployerIdRequest employerIdRequest = new EmployerIdRequest(employerId); List result = employerService.getLikeEmployee(employerIdRequest); return ResponseEntity.ok(result); } - @GetMapping("businesses") + @GetMapping("/businesses") public ResponseEntity getBusinessList(@AuthenticationPrincipal final Long employerId) { EmployerIdRequest employerIdRequest = new EmployerIdRequest(employerId); List businesses = employerService.getEmployerBusinessList(employerIdRequest); return ResponseEntity.ok(businesses); } -} + + @PutMapping("/favorites/employee/{employeeId}") + public ResponseEntity addFavoriteEmployee( + @PathVariable Long employeeId, + @AuthenticationPrincipal final Long employerId + ) { + FavoriteEmployeeRequest favoriteEmployeeRequest = new FavoriteEmployeeRequest(employeeId, employerId); + return ResponseEntity.ok().body(employerService.addFavoriteEmployee(favoriteEmployeeRequest)); + } + + @DeleteMapping("/favorites/employee/{employeeId}") + public ResponseEntity deleteFavoriteEmployee( + @PathVariable Long employeeId, + @AuthenticationPrincipal final Long employerId + ) { + FavoriteEmployeeRequest favoriteEmployeeRequest = new FavoriteEmployeeRequest(employeeId, employerId); + return ResponseEntity.ok().body(employerService.deleteFavoriteEmployee(favoriteEmployeeRequest)); + } +} \ No newline at end of file diff --git a/src/main/java/com/example/api/employer/controller/dto/FavoriteEmployeeRequest.java b/src/main/java/com/example/api/employer/controller/dto/FavoriteEmployeeRequest.java new file mode 100644 index 00000000..90438551 --- /dev/null +++ b/src/main/java/com/example/api/employer/controller/dto/FavoriteEmployeeRequest.java @@ -0,0 +1,7 @@ +package com.example.api.employer.controller.dto; + +public record FavoriteEmployeeRequest( + Long employeeId, + Long employerId +) { +} diff --git a/src/main/java/com/example/api/employer/repository/ScrapRepository.java b/src/main/java/com/example/api/employer/repository/ScrapRepository.java index ad0bc503..1364d1a6 100644 --- a/src/main/java/com/example/api/employer/repository/ScrapRepository.java +++ b/src/main/java/com/example/api/employer/repository/ScrapRepository.java @@ -1,5 +1,6 @@ package com.example.api.employer.repository; +import com.example.api.domain.Account; import com.example.api.domain.Scrap; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; @@ -7,9 +8,12 @@ import org.springframework.stereotype.Repository; import java.util.List; +import java.util.Optional; @Repository public interface ScrapRepository extends JpaRepository { @Query("select s from Scrap s where s.employer.accountId = :employerId") List findAllByEmployerId(@Param("employerId") long employerId); + + Optional findFirstByEmployeeAndEmployer(Account employee, Account employer); } diff --git a/src/main/java/com/example/api/employer/service/EmployerService.java b/src/main/java/com/example/api/employer/service/EmployerService.java index 1f64f40f..be189d16 100644 --- a/src/main/java/com/example/api/employer/service/EmployerService.java +++ b/src/main/java/com/example/api/employer/service/EmployerService.java @@ -2,13 +2,17 @@ import com.example.api.account.repository.AccountRepository; import com.example.api.business.BusinessRepository; +import com.example.api.domain.Scrap; import com.example.api.domain.repository.ExternalCareerRepository; import com.example.api.domain.repository.FlavoredCategoryRepository; import com.example.api.domain.Account; import com.example.api.employer.controller.dto.EmployerBusinessesRequest; import com.example.api.employer.controller.dto.EmployerIdRequest; +import com.example.api.employer.controller.dto.FavoriteEmployeeRequest; import com.example.api.employer.controller.dto.LikeEmployeeDTO; import com.example.api.employer.repository.ScrapRepository; +import com.example.api.global.exception.BusinessException; +import com.example.api.global.exception.ErrorCode; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -25,6 +29,7 @@ public class EmployerService { private final ExternalCareerRepository externalCareerRepository; private final FlavoredCategoryRepository flavoredRepository; private final BusinessRepository businessRepository; + private final AccountRepository accountRepository; @Transactional(readOnly = true) public List getLikeEmployee(final EmployerIdRequest employerIdRequest) { @@ -51,4 +56,24 @@ public List getLikeEmployee(final EmployerIdRequest employerIdR public List getEmployerBusinessList(final EmployerIdRequest employerIdRequest) { return businessRepository.findBusinessesByEmployerId(employerIdRequest.employerId()); } + + @Transactional + public String addFavoriteEmployee(final FavoriteEmployeeRequest favorite) { + Account employee = accountRepository.findById(favorite.employeeId()).orElseThrow(() -> new BusinessException(ErrorCode.NULL_USER)); + Account employer = accountRepository.findById(favorite.employerId()).orElseThrow(() -> new BusinessException(ErrorCode.NULL_USER)); + Scrap newScrap = new Scrap(employee, employer); + scrapRepository.save(newScrap); + return "성공적으로 즐겨찾기를 완료하였습니다."; + } + + @Transactional + public String deleteFavoriteEmployee(final FavoriteEmployeeRequest favorite) { + Account employee = accountRepository.findById(favorite.employeeId()).orElseThrow(() -> new BusinessException(ErrorCode.NULL_USER)); + Account employer = accountRepository.findById(favorite.employerId()).orElseThrow(() -> new BusinessException(ErrorCode.NULL_USER)); + + Scrap deleteScrap = scrapRepository.findFirstByEmployeeAndEmployer(employee, employer) + .orElseThrow(() -> new BusinessException(ErrorCode.NULL_USER)); + scrapRepository.delete(deleteScrap); + return "성공적으로 즐겨찾기를 삭제하였습니다."; + } } \ No newline at end of file diff --git a/src/main/resources/static/danpat.yaml b/src/main/resources/static/danpat.yaml index 98d402b3..12ae2042 100644 --- a/src/main/resources/static/danpat.yaml +++ b/src/main/resources/static/danpat.yaml @@ -703,81 +703,81 @@ paths: suggestPartTimePayment: 10000 suggestChecked: 1 suggestAccepted: 1 -# /api/v1/support/announcements/{announcementId}: -# get: -# tags: -# - announcement-controller -# operationId: getAnnouncement -# parameters: -# - name: announcementId -# in: path -# required: true -# schema: -# type: integer -# format: int64 -# responses: -# "200": -# description: OK -# content: -# application/json: -# schema: -# $ref: "#/components/schemas/AnnouncementResponse" -# example: -# announcementId: 1 -# announcementTitle: "긴급 서버 점검 공지" -# announcementType: "공지" -# announcementContent: "서버 점검이 오늘 밤 11시에 진행됩니다." -# viewCount: 123 -# -# -# put: -# tags: -# - announcement-controller -# operationId: updateAnnouncement -# parameters: -# - name: announcementId -# in: path -# required: true -# schema: -# type: integer -# format: int64 -# requestBody: -# content: -# application/json: -# schema: -# $ref: "#/components/schemas/AnnouncementRequest" -# example: -# announcementTitle: "수정된 공지사항 제목" -# announcementType: "업데이트" -# announcementContent: "공지 내용이 업데이트되었습니다." -# required: true -# responses: -# "200": -# description: OK -# content: -# '*/*': -# schema: -# $ref: "#/components/schemas/AnnouncementResponse" -# example: -# announcementId: 1 -# announcementTitle: "수정된 공지사항 제목" -# announcementType: "업데이트" -# announcementContent: "공지 내용이 업데이트되었습니다." -# viewCount: 200 -# delete: -# tags: -# - announcement-controller -# operationId: deleteAnnouncement -# parameters: -# - name: announcementId -# in: path -# required: true -# schema: -# type: integer -# format: int64 -# responses: -# "200": -# description: OK + /api/v1/support/announcements/{announcementId}: + get: + tags: + - announcement-controller + operationId: getAnnouncement + parameters: + - name: announcementId + in: path + required: true + schema: + type: integer + format: int64 + responses: + "200": + description: OK + content: + application/json: + schema: + $ref: "#/components/schemas/AnnouncementResponse" + example: + announcementId: 1 + announcementTitle: "긴급 서버 점검 공지" + announcementType: "공지" + announcementContent: "서버 점검이 오늘 밤 11시에 진행됩니다." + viewCount: 123 + + + put: + tags: + - announcement-controller + operationId: updateAnnouncement + parameters: + - name: announcementId + in: path + required: true + schema: + type: integer + format: int64 + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/AnnouncementRequest" + example: + announcementTitle: "수정된 공지사항 제목" + announcementType: "업데이트" + announcementContent: "공지 내용이 업데이트되었습니다." + required: true + responses: + "200": + description: OK + content: + '*/*': + schema: + $ref: "#/components/schemas/AnnouncementResponse" + example: + announcementId: 1 + announcementTitle: "수정된 공지사항 제목" + announcementType: "업데이트" + announcementContent: "공지 내용이 업데이트되었습니다." + viewCount: 200 + delete: + tags: + - announcement-controller + operationId: deleteAnnouncement + parameters: + - name: announcementId + in: path + required: true + schema: + type: integer + format: int64 + responses: + "200": + description: OK /api/v1/contracts/{contractId}: put: tags: @@ -977,85 +977,85 @@ paths: schema: type: string example: "요청이 성공적으로 처리되었습니다." -# /api/v1/support/inquiry: -# post: -# tags: -# - inquiry-controller -# operationId: createInquiry -# requestBody: -# content: -# application/json: -# schema: -# $ref: "#/components/schemas/InquiryRequest" -# example: -# inquiryType: "일반" -# subInquiryType: "서비스 문제" -# title: "서비스 관련 문제" -# content: "서비스 기능에 문제가 있습니다." -# required: true -# responses: -# "200": -# description: OK -# content: -# '*/*': -# schema: -# $ref: "#/components/schemas/InquiryResponse" -# example: -# inquiry_id: "123" -# message: "문의가 성공적으로 접수되었습니다." -# -# /api/v1/support/announcements: -# get: -# tags: -# - announcement-controller -# operationId: getAnnouncements -# responses: -# "200": -# description: OK -# content: -# '*/*': -# schema: -# type: array -# items: -# $ref: "#/components/schemas/AnnouncementResponse" -# example: -# - announcementId: 1 -# announcementTitle: "긴급 서버 점검 공지" -# announcementType: "공지" -# announcementContent: "서버 점검이 오늘 밤 11시에 진행됩니다." -# viewCount: 123 -# - announcementId: 2 -# announcementTitle: "새로운 기능 업데이트" -# announcementType: "업데이트" -# announcementContent: "신규 기능이 추가되었습니다. 확인해보세요!" -# viewCount: 89 -# post: -# tags: -# - announcement-controller -# operationId: createAnnouncement -# requestBody: -# content: -# application/json: -# schema: -# $ref: "#/components/schemas/AnnouncementRequest" -# example: -# announcementTitle: "시스템 점검 안내" -# announcementType: "공지" -# announcementContent: "시스템 점검이 오전 12시부터 오전 4시까지 진행됩니다." -# required: true -# responses: -# "200": -# description: OK -# content: -# '*/*': -# schema: -# $ref: "#/components/schemas/AnnouncementResponse" -# example: -# announcementId: 1 -# announcementTitle: "시스템 점검 안내" -# announcementType: "공지" -# announcementContent: "시스템 점검이 오전 12시부터 오전 4시까지 진행됩니다." -# viewCount: 0 + /api/v1/support/inquiry: + post: + tags: + - inquiry-controller + operationId: createInquiry + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/InquiryRequest" + example: + inquiryType: "일반" + subInquiryType: "서비스 문제" + title: "서비스 관련 문제" + content: "서비스 기능에 문제가 있습니다." + required: true + responses: + "200": + description: OK + content: + '*/*': + schema: + $ref: "#/components/schemas/InquiryResponse" + example: + inquiry_id: "123" + message: "문의가 성공적으로 접수되었습니다." + + /api/v1/support/announcements: + get: + tags: + - announcement-controller + operationId: getAnnouncements + responses: + "200": + description: OK + content: + '*/*': + schema: + type: array + items: + $ref: "#/components/schemas/AnnouncementResponse" + example: + - announcementId: 1 + announcementTitle: "긴급 서버 점검 공지" + announcementType: "공지" + announcementContent: "서버 점검이 오늘 밤 11시에 진행됩니다." + viewCount: 123 + - announcementId: 2 + announcementTitle: "새로운 기능 업데이트" + announcementType: "업데이트" + announcementContent: "신규 기능이 추가되었습니다. 확인해보세요!" + viewCount: 89 + post: + tags: + - announcement-controller + operationId: createAnnouncement + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/AnnouncementRequest" + example: + announcementTitle: "시스템 점검 안내" + announcementType: "공지" + announcementContent: "시스템 점검이 오전 12시부터 오전 4시까지 진행됩니다." + required: true + responses: + "200": + description: OK + content: + '*/*': + schema: + $ref: "#/components/schemas/AnnouncementResponse" + example: + announcementId: 1 + announcementTitle: "시스템 점검 안내" + announcementType: "공지" + announcementContent: "시스템 점검이 오전 12시부터 오전 4시까지 진행됩니다." + viewCount: 0 /api/v1/info/my/reviews/{reviewId}/report: post: tags: @@ -1127,77 +1127,122 @@ paths: contractId: 9 reviewContent: "일 잘하네요" reviewScore: 5 - # /api/search/search: -# post: -# tags: -# - search-controller -# operationId: searchAccounts -# requestBody: -# content: -# application/json: -# schema: -# $ref: "#/components/schemas/SearchRequest" -# example: -# category: "IT" -# startTime: "2025-01-01T09:00:00" -# endTime: "2025-01-01T18:00:00" -# required: true -# responses: -# "200": -# description: OK -# content: -# '*/*': -# schema: -# type: array -# items: -# $ref: "#/components/schemas/SearchResponse" -# example: -# - name: "John Doe" -# sex: "Male" -# age: 30 -# starPoint: 4.5 -# workCount: 50 -# - name: "Jane Smith" -# sex: "Female" -# age: 28 -# starPoint: 4.8 -# workCount: 60 -# /favorites/employees: -# get: -# tags: -# - EmployerController -# operationId: getLikeEmployee -# responses: -# "200": -# description: OK -# content: -# '*/*': -# schema: -# type: string -# example: -# - employeeId: 101 -# name: "김태영" -# nickname: "김태영1" -# sex: "남" -# age: 30 -# starPoint: 4.7 -# workCount: 120 -# externalCareerList: -# - externalCareerId: 1 -# category: -# - categoryId: 1 -# categoryName: "외식•음료" -# workCount: 1 -# - externalCareerId: 2 -# category: -# - categoryId: 2 -# categoryName: "유통•판매" -# workCount: 1 -# flavoredCategoryList: -# - categoryId: 1 -# categoryName: "외식•음료" -# - categoryId: 2 -# categoryName: "유통•판매" + /api/search/search: + post: + tags: + - search-controller + operationId: searchAccounts + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/SearchRequest" + example: + category: "IT" + startTime: "2025-01-01T09:00:00" + endTime: "2025-01-01T18:00:00" + required: true + responses: + "200": + description: OK + content: + '*/*': + schema: + type: array + items: + $ref: "#/components/schemas/SearchResponse" + example: + - name: "John Doe" + sex: "Male" + age: 30 + starPoint: 4.5 + workCount: 50 + - name: "Jane Smith" + sex: "Female" + age: 28 + starPoint: 4.8 + workCount: 60 + /api/v1/employer/favorites/employees: + get: + tags: + - EmployerController + operationId: getLikeEmployee + responses: + "200": + description: OK + content: + '*/*': + schema: + type: string + example: + - employeeId: 101 + name: "김태영" + nickname: "김태영1" + sex: "남" + age: 30 + starPoint: 4.7 + workCount: 120 + externalCareerList: + - externalCareerId: 1 + category: + - categoryId: 1 + categoryName: "외식•음료" + workCount: 1 + - externalCareerId: 2 + category: + - categoryId: 2 + categoryName: "유통•판매" + workCount: 1 + flavoredCategoryList: + - categoryId: 1 + categoryName: "외식•음료" + - categoryId: 2 + categoryName: "유통•판매" + /api/v1/employer/favorites/employee/{employeeId}: + put: + tags: + - EmployerController + summary: "알바생 즐겨찾기 하기" + description: "고용주가 즐겨찾기에 알바생을 등록합니다." + operationId: putFavoriteEmployee + parameters: + - name: employeeId + in: path + required: true + description: "즐겨찾기할 알바생 ID" + schema: + type: integer + format: int64 + responses: + "200": + description: OK + content: + '*/*': + schema: + type: string + example: "성공적으로 즐겨찾기를 완료하였습니다." + delete: + tags: + - EmployerController + summary: "즐겨찾기한 알바생 삭제" + description: "고용주가 즐겨찾기에 등록한 알바생을 삭제합니다." + operationId: deleteFavoriteEmployee + parameters: + - name: employeeId + in: path + required: true + description: "삭제할 알바생 ID" + schema: + type: integer + format: int64 + responses: + "200": + description: OK + content: + '*/*': + schema: + type: string + example: "성공적으로 즐겨찾기를 삭제하였습니다." /chat/summaries: get: tags: @@ -1269,208 +1314,208 @@ paths: receiverId: 1 sendTime: "2025-02-01T15:57:00.123Z" isRead: false -# /businesses: -# get: -# tags: -# - EmployerController -# operationId: getBusinessList -# responses: -# "200": -# description: OK -# content: -# '*/*': -# schema: -# type: object -# example: -# - businessName: "김태영닷컴" -# businessLocation: -# zipcode: "12093" -# address: "경기도 남양주시 송산로339번길 25, 3층(별내동)" -# detailAddress: "101호" -# - businessName: "김태영법조타운" -# businessLocation: -# zipcode: "404320" -# address: "인천광역시 서구 원당동 인천검단택지개발지구 C5-1-1BL" -# detailAddress: "101호" -# /api/v1/support/my-inquiries: -# get: -# tags: -# - inquiry-controller -# operationId: getMyInquiries -# parameters: -# - name: accountId -# in: query -# required: true -# schema: -# type: integer -# format: int64 -# responses: -# "200": -# description: OK -# content: -# '*/*': -# schema: -# type: array -# items: -# $ref: "#/components/schemas/InquiryResponse" -# example: -# - inquiryId: 1 -# inquiryType: "일반" -# subInquiryType: "서비스 문제" -# title: "서비스 관련 문제" -# content: "서비스 기능에 문제가 발생했습니다." -# inquiryStatus: "대기 중" -# answerDate: null -# createdBy: 123 -# - inquiryId: 2 -# inquiryType: "기술" -# subInquiryType: "버그 신고" -# title: "애플리케이션 버그 신고" -# content: "애플리케이션에서 치명적인 버그를 발견했습니다." -# inquiryStatus: "답변 완료" -# answerDate: "2025-01-20T10:00:00" -# createdBy: 123 -# /api/v1/support/announcements/search: -# get: -# tags: -# - announcement-controller -# operationId: searchAnnouncements -# parameters: -# - name: keyword -# in: query -# required: true -# schema: -# type: string -# example: "점검" -# responses: -# "200": -# description: OK -# content: -# '*/*': -# schema: -# type: array -# items: -# $ref: "#/components/schemas/AnnouncementResponse" -# example: -# - announcementId: 1 -# announcementTitle: "시스템 점검 안내" -# announcementType: "공지" -# announcementContent: "시스템이 오전 12시부터 오전 4시까지 점검을 진행합니다." -# viewCount: 150 -# /api/v1/review: -# get: -# tags: -# - review-controller -# operationId: getAllReviews -# responses: -# "200": -# description: OK -# content: -# '*/*': -# schema: -# type: array -# items: -# $ref: "#/components/schemas/ReviewResponse" -# example: -# - reviewId: 1 -# businessName: "테스트 사업장" -# businessId: 10 -# contractStartTime: "2025-01-01T09:00:00" -# contractEndTime: "2025-01-01T18:00:00" -# reviewStarPoint: 5 -# reviewContent: "훌륭한 작업이었습니다!" -# - reviewId: 2 -# businessName: "또 다른 사업장" -# businessId: 20 -# contractStartTime: "2025-01-02T09:00:00" -# contractEndTime: "2025-01-02T18:00:00" -# reviewStarPoint: 4 -# reviewContent: "좋은 성과를 보여주었습니다." -# /api/v1/review/{reviewId}: -# get: -# tags: -# - review-controller -# operationId: getReviewsByEmployee -# parameters: [] -# responses: -# "200": -# description: OK -# content: -# '*/*': -# schema: -# type: array -# items: -# $ref: "#/components/schemas/ReviewResponse" -# example: -# - reviewId: 1 -# businessName: "테스트 사업장" -# businessId: 10 -# contractStartTime: "2025-01-01T09:00:00" -# contractEndTime: "2025-01-01T18:00:00" -# reviewStarPoint: 5 -# reviewContent: "훌륭한 작업이었습니다!" -# /api/v1/review/my/reviews: -# get: -# tags: -# - review-controller -# operationId: getMyReviews -# parameters: -# - name: accountId -# in: query -# required: true -# schema: -# type: integer -# format: int64 -# responses: -# "200": -# description: OK -# content: -# '*/*': -# schema: -# type: array -# items: -# $ref: "#/components/schemas/ReviewResponse" -# example: -# - reviewId: 1 -# businessName: "테스트 사업장" -# businessId: 10 -# contractStartTime: "2025-01-01T09:00:00" -# contractEndTime: "2025-01-01T18:00:00" -# reviewStarPoint: 5 -# reviewContent: "훌륭한 작업이었습니다!" -# - reviewId: 2 -# businessName: "스타트업 컴퍼니" -# businessId: 20 -# contractStartTime: "2025-01-05T10:00:00" -# contractEndTime: "2025-01-05T19:00:00" -# reviewStarPoint: 4 -# reviewContent: "업무 진행이 원활했습니다." -# /api/v1/review/available: -# get: -# tags: -# - review-controller -# operationId: getAvailableReviewTargets -# parameters: -# - name: businessId -# in: query -# required: true -# schema: -# type: integer -# format: int64 -# responses: -# "200": -# description: OK -# content: -# '*/*': -# schema: -# type: array -# items: -# $ref: "#/components/schemas/ReviewAvailableResponse" -# example: -# - employeeId: 1001 -# employeeName: "김철수" -# - employeeId: 1002 -# employeeName: "이영희" + /businesses: + get: + tags: + - EmployerController + operationId: getBusinessList + responses: + "200": + description: OK + content: + '*/*': + schema: + type: object + example: + - businessName: "김태영닷컴" + businessLocation: + zipcode: "12093" + address: "경기도 남양주시 송산로339번길 25, 3층(별내동)" + detailAddress: "101호" + - businessName: "김태영법조타운" + businessLocation: + zipcode: "404320" + address: "인천광역시 서구 원당동 인천검단택지개발지구 C5-1-1BL" + detailAddress: "101호" + /api/v1/support/my-inquiries: + get: + tags: + - inquiry-controller + operationId: getMyInquiries + parameters: + - name: accountId + in: query + required: true + schema: + type: integer + format: int64 + responses: + "200": + description: OK + content: + '*/*': + schema: + type: array + items: + $ref: "#/components/schemas/InquiryResponse" + example: + - inquiryId: 1 + inquiryType: "일반" + subInquiryType: "서비스 문제" + title: "서비스 관련 문제" + content: "서비스 기능에 문제가 발생했습니다." + inquiryStatus: "대기 중" + answerDate: null + createdBy: 123 + - inquiryId: 2 + inquiryType: "기술" + subInquiryType: "버그 신고" + title: "애플리케이션 버그 신고" + content: "애플리케이션에서 치명적인 버그를 발견했습니다." + inquiryStatus: "답변 완료" + answerDate: "2025-01-20T10:00:00" + createdBy: 123 + /api/v1/support/announcements/search: + get: + tags: + - announcement-controller + operationId: searchAnnouncements + parameters: + - name: keyword + in: query + required: true + schema: + type: string + example: "점검" + responses: + "200": + description: OK + content: + '*/*': + schema: + type: array + items: + $ref: "#/components/schemas/AnnouncementResponse" + example: + - announcementId: 1 + announcementTitle: "시스템 점검 안내" + announcementType: "공지" + announcementContent: "시스템이 오전 12시부터 오전 4시까지 점검을 진행합니다." + viewCount: 150 + /api/v1/review: + get: + tags: + - review-controller + operationId: getAllReviews + responses: + "200": + description: OK + content: + '*/*': + schema: + type: array + items: + $ref: "#/components/schemas/ReviewResponse" + example: + - reviewId: 1 + businessName: "테스트 사업장" + businessId: 10 + contractStartTime: "2025-01-01T09:00:00" + contractEndTime: "2025-01-01T18:00:00" + reviewStarPoint: 5 + reviewContent: "훌륭한 작업이었습니다!" + - reviewId: 2 + businessName: "또 다른 사업장" + businessId: 20 + contractStartTime: "2025-01-02T09:00:00" + contractEndTime: "2025-01-02T18:00:00" + reviewStarPoint: 4 + reviewContent: "좋은 성과를 보여주었습니다." + /api/v1/review/{reviewId}: + get: + tags: + - review-controller + operationId: getReviewsByEmployee + parameters: [] + responses: + "200": + description: OK + content: + '*/*': + schema: + type: array + items: + $ref: "#/components/schemas/ReviewResponse" + example: + - reviewId: 1 + businessName: "테스트 사업장" + businessId: 10 + contractStartTime: "2025-01-01T09:00:00" + contractEndTime: "2025-01-01T18:00:00" + reviewStarPoint: 5 + reviewContent: "훌륭한 작업이었습니다!" + /api/v1/review/my/reviews: + get: + tags: + - review-controller + operationId: getMyReviews + parameters: + - name: accountId + in: query + required: true + schema: + type: integer + format: int64 + responses: + "200": + description: OK + content: + '*/*': + schema: + type: array + items: + $ref: "#/components/schemas/ReviewResponse" + example: + - reviewId: 1 + businessName: "테스트 사업장" + businessId: 10 + contractStartTime: "2025-01-01T09:00:00" + contractEndTime: "2025-01-01T18:00:00" + reviewStarPoint: 5 + reviewContent: "훌륭한 작업이었습니다!" + - reviewId: 2 + businessName: "스타트업 컴퍼니" + businessId: 20 + contractStartTime: "2025-01-05T10:00:00" + contractEndTime: "2025-01-05T19:00:00" + reviewStarPoint: 4 + reviewContent: "업무 진행이 원활했습니다." + /api/v1/review/available: + get: + tags: + - review-controller + operationId: getAvailableReviewTargets + parameters: + - name: businessId + in: query + required: true + schema: + type: integer + format: int64 + responses: + "200": + description: OK + content: + '*/*': + schema: + type: array + items: + $ref: "#/components/schemas/ReviewAvailableResponse" + example: + - employeeId: 1001 + employeeName: "김철수" + - employeeId: 1002 + employeeName: "이영희" components: schemas: AnnouncementRequest: From c85f704f345117e76f50e0f44dc112b8a58ed9f9 Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Mon, 3 Feb 2025 00:31:23 +0900 Subject: [PATCH 253/276] host change --- src/main/resources/static/danpat.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/static/danpat.yaml b/src/main/resources/static/danpat.yaml index 12ae2042..b9acddf4 100644 --- a/src/main/resources/static/danpat.yaml +++ b/src/main/resources/static/danpat.yaml @@ -4,7 +4,7 @@ info: description: 단팥 백엔드 API 명세서입니다. version: 1.0.0 servers: - - url: http://localhost:8080 + - url: http://43.201.78.102:8080 security: - JWT_TOKEN: [] paths: From 9d0a77bd034ece414d0298b40f3a0f6aef5d2c3f Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Wed, 5 Feb 2025 15:44:52 +0900 Subject: [PATCH 254/276] =?UTF-8?q?security=20config=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker-compose.yml | 1 - .../com/example/api/global/config/SecurityConfig.java | 4 ++-- .../api/global/config/filter/JwtAuthenticationFilter.java | 8 ++++++++ src/main/resources/application.properties | 6 +++--- 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 903dbb56..25e1da06 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -15,7 +15,6 @@ services: ports: - "8080:8080" volumes: - - logs:/app/logs - ./src:/app/src environment: - SPRING_DATA_MONGODB_URI=${MONGO_URI} 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 3932a4fe..72a46f41 100644 --- a/src/main/java/com/example/api/global/config/SecurityConfig.java +++ b/src/main/java/com/example/api/global/config/SecurityConfig.java @@ -54,7 +54,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", "/ws/**").permitAll() + .requestMatchers("/api/auth/login", "/oauth2/**", "/swagger-ui/**", "/v3/api-docs/**", "/api/v1/account/**", "/aws", "/ws/**").permitAll() .anyRequest().authenticated() ) .oauth2Login(oauth2 -> oauth2 @@ -76,7 +76,7 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti @Bean public CorsConfigurationSource corsConfigurationSource() { CorsConfiguration corsConfiguration = new CorsConfiguration(); - corsConfiguration.setAllowedOrigins(Arrays.asList("http://localhost:8080", "http://43.201.78.102:8080")); + corsConfiguration.setAllowedOrigins(Arrays.asList("*")); corsConfiguration.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE", "OPTIONS")); corsConfiguration.setAllowedHeaders(Arrays.asList("Authorization", "Content-Type")); corsConfiguration.setAllowCredentials(true); diff --git a/src/main/java/com/example/api/global/config/filter/JwtAuthenticationFilter.java b/src/main/java/com/example/api/global/config/filter/JwtAuthenticationFilter.java index 265db929..62631452 100644 --- a/src/main/java/com/example/api/global/config/filter/JwtAuthenticationFilter.java +++ b/src/main/java/com/example/api/global/config/filter/JwtAuthenticationFilter.java @@ -57,4 +57,12 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse SecurityContextHolder.clearContext(); } } + + @Override + protected boolean shouldNotFilter(HttpServletRequest request) { + String path = request.getRequestURI(); + + // 특정 API는 JWT 필터를 거치지 않도록 예외 처리 + return path.startsWith("/api/v1/account/") || path.startsWith("/api/v1/auth/login"); + } } \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 3c54b831..dc081787 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -3,9 +3,9 @@ spring.application.name=api spring.config.import=optional:file:.env[.properties] # mysql Database Configuration -spring.datasource.url=jdbc:mysql://3.36.70.9:3306/danpat?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Seoul&characterEncoding=UTF-8 -spring.datasource.username=root -spring.datasource.password=password +spring.datasource.url=${MYSQL_URI} +spring.datasource.username=${MYSQL_INITDB_ROOT_USERNAME} +spring.datasource.password=${MYSQL_INITDB_ROOT_PASSWORD} spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver # Mongo Database Configuration From 072061401ef60e530e536aef7a89074a8131ca0b Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Tue, 11 Feb 2025 19:39:36 +0900 Subject: [PATCH 255/276] create sub category --- .../example/api/domain/QFlavoredCategory.java | 3 + .../com/example/api/domain/QSubCategory.java | 61 +++++++++++++++++++ .../api/board/controller/BoardController.java | 1 - .../response/FlavoredCategoryResponse.java | 6 +- .../api/board/service/CategoryService.java | 25 -------- .../api/board/service/EmployeeService.java | 6 -- .../example/api/domain/FlavoredCategory.java | 7 ++- .../com/example/api/domain/SubCategory.java | 24 ++++++++ .../FlavoredCategoryRepository.java | 6 +- src/main/resources/static/danpat.yaml | 2 +- 10 files changed, 103 insertions(+), 38 deletions(-) create mode 100644 src/main/generated/com/example/api/domain/QSubCategory.java delete mode 100644 src/main/java/com/example/api/board/service/CategoryService.java create mode 100644 src/main/java/com/example/api/domain/SubCategory.java diff --git a/src/main/generated/com/example/api/domain/QFlavoredCategory.java b/src/main/generated/com/example/api/domain/QFlavoredCategory.java index 72e066cb..7e4e6079 100644 --- a/src/main/generated/com/example/api/domain/QFlavoredCategory.java +++ b/src/main/generated/com/example/api/domain/QFlavoredCategory.java @@ -33,6 +33,8 @@ public class QFlavoredCategory extends EntityPathBase { public final NumberPath flavoredCategoryId = createNumber("flavoredCategoryId", Long.class); + public final QSubCategory subCategory; + //inherited public final DateTimePath updatedDate = _super.updatedDate; @@ -56,6 +58,7 @@ public QFlavoredCategory(Class type, PathMetadata me super(type, metadata, inits); this.category = inits.isInitialized("category") ? new QCategory(forProperty("category")) : null; this.employee = inits.isInitialized("employee") ? new QAccount(forProperty("employee")) : null; + this.subCategory = inits.isInitialized("subCategory") ? new QSubCategory(forProperty("subCategory"), inits.get("subCategory")) : null; } } diff --git a/src/main/generated/com/example/api/domain/QSubCategory.java b/src/main/generated/com/example/api/domain/QSubCategory.java new file mode 100644 index 00000000..bb348463 --- /dev/null +++ b/src/main/generated/com/example/api/domain/QSubCategory.java @@ -0,0 +1,61 @@ +package com.example.api.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QSubCategory is a Querydsl query type for SubCategory + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QSubCategory extends EntityPathBase { + + private static final long serialVersionUID = 300381305L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QSubCategory subCategory = new QSubCategory("subCategory"); + + public final QBaseEntity _super = new QBaseEntity(this); + + public final QCategory category; + + //inherited + public final DateTimePath createdDate = _super.createdDate; + + public final NumberPath subCategoryId = createNumber("subCategoryId", Long.class); + + public final StringPath subCategoryName = createString("subCategoryName"); + + //inherited + public final DateTimePath updatedDate = _super.updatedDate; + + public QSubCategory(String variable) { + this(SubCategory.class, forVariable(variable), INITS); + } + + public QSubCategory(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QSubCategory(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QSubCategory(PathMetadata metadata, PathInits inits) { + this(SubCategory.class, metadata, inits); + } + + public QSubCategory(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.category = inits.isInitialized("category") ? new QCategory(forProperty("category")) : null; + } + +} + diff --git a/src/main/java/com/example/api/board/controller/BoardController.java b/src/main/java/com/example/api/board/controller/BoardController.java index 3f31d932..15238d24 100644 --- a/src/main/java/com/example/api/board/controller/BoardController.java +++ b/src/main/java/com/example/api/board/controller/BoardController.java @@ -7,7 +7,6 @@ import com.example.api.board.dto.update.UpdatePreferredCategoriesRequest; import com.example.api.board.dto.update.UpdatePreferredDistrictsRequest; import com.example.api.board.service.BoardService; -import com.example.api.board.service.CategoryService; import com.example.api.board.service.EmployeeService; import java.util.List; diff --git a/src/main/java/com/example/api/board/dto/response/FlavoredCategoryResponse.java b/src/main/java/com/example/api/board/dto/response/FlavoredCategoryResponse.java index 2eabe0c5..bfc95aed 100644 --- a/src/main/java/com/example/api/board/dto/response/FlavoredCategoryResponse.java +++ b/src/main/java/com/example/api/board/dto/response/FlavoredCategoryResponse.java @@ -2,6 +2,8 @@ public record FlavoredCategoryResponse( Long categoryId, - String categoryName + String categoryName, + Long subCategoryIdm, + String subCategoryName ) { -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/main/java/com/example/api/board/service/CategoryService.java b/src/main/java/com/example/api/board/service/CategoryService.java deleted file mode 100644 index a7f482ab..00000000 --- a/src/main/java/com/example/api/board/service/CategoryService.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.example.api.board.service; - -import com.example.api.board.dto.response.FlavoredCategoryResponse; -import com.example.api.domain.repository.CategoryRepository; -import com.example.api.domain.Category; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; -import java.util.stream.Collectors; - -@Service -@RequiredArgsConstructor -public class CategoryService { - private final CategoryRepository categoryRepository; - - @Transactional(readOnly = true) - public List getAllCategories() { - List categories = categoryRepository.findAll(); - return categories.stream() - .map(category -> new FlavoredCategoryResponse(category.getCategoryId(), category.getCategoryName())) - .collect(Collectors.toList()); - } -} diff --git a/src/main/java/com/example/api/board/service/EmployeeService.java b/src/main/java/com/example/api/board/service/EmployeeService.java index b7bedf9e..b7590305 100644 --- a/src/main/java/com/example/api/board/service/EmployeeService.java +++ b/src/main/java/com/example/api/board/service/EmployeeService.java @@ -6,9 +6,6 @@ import com.example.api.board.dto.update.UpdatePersonalInfoRequest; import com.example.api.board.entitiy.update.UpdateAccountConditionManager; import com.example.api.domain.Account; -import com.example.api.domain.repository.ExternalCareerRepository; -import com.example.api.domain.repository.FlavoredCategoryRepository; -import com.example.api.board.repository.PossibleBoardRepository; import com.example.api.global.exception.BusinessException; import com.example.api.global.exception.ErrorCode; import lombok.RequiredArgsConstructor; @@ -19,9 +16,6 @@ @RequiredArgsConstructor public class EmployeeService { private final AccountRepository accountRepository; - private final ExternalCareerRepository externalCareerRepository; - private final FlavoredCategoryRepository flavoredRepository; - private final PossibleBoardRepository possibleBoardRepository; private final UpdateAccountConditionManager updateAccountConditionManager; @Transactional diff --git a/src/main/java/com/example/api/domain/FlavoredCategory.java b/src/main/java/com/example/api/domain/FlavoredCategory.java index 9ab9cc65..62bb4476 100644 --- a/src/main/java/com/example/api/domain/FlavoredCategory.java +++ b/src/main/java/com/example/api/domain/FlavoredCategory.java @@ -24,12 +24,17 @@ public class FlavoredCategory extends BaseEntity{ @JoinColumn(name = "CATEGORY_ID", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) private Category category; + @ManyToOne(fetch = LAZY) + @JoinColumn(name = "SUB_CATEGORY_ID", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) + private SubCategory subCategory; + @ManyToOne(fetch = LAZY) @JoinColumn(name = "EMPLOYEE_ID", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) private Account employee; - public FlavoredCategory(Category category, Account employee) { + public FlavoredCategory(Category category, SubCategory subCategory, Account employee) { this.category = category; + this.subCategory = subCategory; this.employee = employee; } } \ No newline at end of file diff --git a/src/main/java/com/example/api/domain/SubCategory.java b/src/main/java/com/example/api/domain/SubCategory.java new file mode 100644 index 00000000..94a0c4b8 --- /dev/null +++ b/src/main/java/com/example/api/domain/SubCategory.java @@ -0,0 +1,24 @@ +package com.example.api.domain; + +import jakarta.persistence.*; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import static jakarta.persistence.FetchType.LAZY; + +@Entity +@Getter +@NoArgsConstructor +@Table(name = "SUB_CATEGORY") +public class SubCategory extends BaseEntity{ + @Id + @Column(name = "SUB_CATEGORY_ID") + private Long subCategoryId; + + @ManyToOne(fetch = LAZY) + @JoinColumn(name = "CATEGORY_ID", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) + private Category category; + + @Column(name = "SUB_CATEGORY_NAME") + private String subCategoryName; +} \ No newline at end of file diff --git a/src/main/java/com/example/api/domain/repository/FlavoredCategoryRepository.java b/src/main/java/com/example/api/domain/repository/FlavoredCategoryRepository.java index b3ae1cd7..078df172 100644 --- a/src/main/java/com/example/api/domain/repository/FlavoredCategoryRepository.java +++ b/src/main/java/com/example/api/domain/repository/FlavoredCategoryRepository.java @@ -12,8 +12,10 @@ @Repository public interface FlavoredCategoryRepository extends JpaRepository { - @Query("select distinct new com.example.api.board.dto.response.FlavoredCategoryResponse(c.categoryId, c.categoryName) " + - "from FlavoredCategory f join Category c on f.category.categoryId = c.categoryId where f.employee.accountId = :employeeId") + @Query("select distinct new com.example.api.board.dto.response.FlavoredCategoryResponse(c.categoryId, c.categoryName, sc.subCategoryId, sc.subCategoryName) " + + "from FlavoredCategory fc join fc.category c " + + "join fc.subCategory sc " + + "where fc.employee.accountId = :employeeId") List findAllByEmployeeId(@Param("employeeId") long employeeId); @Modifying diff --git a/src/main/resources/static/danpat.yaml b/src/main/resources/static/danpat.yaml index b9acddf4..12ae2042 100644 --- a/src/main/resources/static/danpat.yaml +++ b/src/main/resources/static/danpat.yaml @@ -4,7 +4,7 @@ info: description: 단팥 백엔드 API 명세서입니다. version: 1.0.0 servers: - - url: http://43.201.78.102:8080 + - url: http://localhost:8080 security: - JWT_TOKEN: [] paths: From c5f8f6f9873339c0b78aa45a238032e81df90a41 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Tue, 11 Feb 2025 22:02:48 +0900 Subject: [PATCH 256/276] login response change --- .../java/com/example/api/auth/service/AuthService.java | 6 ++++++ .../java/com/example/api/aws/service/S3Service.java | 10 ++++++---- .../com/example/api/global/config/SecurityConfig.java | 5 +++-- .../handler/OAuth2AuthenticationSuccessHandler.java | 9 +++++++++ 4 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/example/api/auth/service/AuthService.java b/src/main/java/com/example/api/auth/service/AuthService.java index b2aa44c5..ea941746 100644 --- a/src/main/java/com/example/api/auth/service/AuthService.java +++ b/src/main/java/com/example/api/auth/service/AuthService.java @@ -4,6 +4,8 @@ import com.example.api.auth.entitiy.RefreshToken; import com.example.api.auth.dto.*; import com.example.api.auth.repository.TokenRepository; +import com.example.api.aws.dto.OldKeyRequest; +import com.example.api.aws.service.S3Service; import com.example.api.domain.Account; import com.example.api.global.exception.BusinessException; import com.example.api.global.exception.ErrorCode; @@ -27,6 +29,7 @@ public class AuthService { private final JwtTokenProvider jwtTokenProvider; private final TokenRepository tokenRepository; private final JwtProperties jwtProperties; + private final S3Service s3Service; @Transactional public LoginSuccessResponse login(@Validated final LoginRequest request) { @@ -57,10 +60,13 @@ private LoginSuccessResponse generateAuthToken(final Account user) { Cookie refreshTokenCookie = genreateRefreshTokenCookie(refreshToken); String role = user.getRoles().stream().findFirst().get().getAuthority(); // 회원가입 시에 무조건 역할이 들어가기에 바로 get으로 꺼냄 + String profile = s3Service.getImage(new OldKeyRequest(user.getProfileImage())); Map responseBody = new HashMap<>(); responseBody.put("accessToken", accessToken); responseBody.put("userId", String.valueOf(user.getAccountId())); responseBody.put("userRole", role); + responseBody.put("name", user.getName()); + responseBody.put("profile", profile); return new LoginSuccessResponse(refreshTokenCookie, responseBody); } diff --git a/src/main/java/com/example/api/aws/service/S3Service.java b/src/main/java/com/example/api/aws/service/S3Service.java index b0774ca1..e92f17f4 100644 --- a/src/main/java/com/example/api/aws/service/S3Service.java +++ b/src/main/java/com/example/api/aws/service/S3Service.java @@ -5,10 +5,8 @@ import com.amazonaws.services.s3.model.ObjectMetadata; import com.amazonaws.services.s3.model.PutObjectRequest; import com.example.api.account.repository.AccountRepository; -import com.example.api.aws.dto.S3UploadRequest; -import com.example.api.aws.dto.OldKeyRequest; -import com.example.api.aws.dto.UploadProfileRequest; -import com.example.api.aws.dto.UploadProfileResponse; +import com.example.api.auth.dto.LoginUserRequest; +import com.example.api.aws.dto.*; import com.example.api.global.exception.BusinessException; import com.example.api.global.exception.ErrorCode; import com.example.api.global.config.AmazonConfig; @@ -90,4 +88,8 @@ public void remove(final OldKeyRequest request) { } amazonS3.deleteObject(amazonConfig.getBucket(), request.oldKey()); } + + public String getImage(final OldKeyRequest request){ + return amazonS3.getUrl(amazonConfig.getBucket(), request.oldKey()).toString(); + } } \ No newline at end of file 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 72a46f41..bc234c56 100644 --- a/src/main/java/com/example/api/global/config/SecurityConfig.java +++ b/src/main/java/com/example/api/global/config/SecurityConfig.java @@ -5,7 +5,6 @@ import com.example.api.oauth2.entity.HttpCookieOAuth2AuthorizationRequestRepository; import com.example.api.oauth2.entity.handler.OAuth2AuthenticationFailureHandler; import com.example.api.oauth2.entity.handler.OAuth2AuthenticationSuccessHandler; -import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; @@ -21,10 +20,12 @@ import org.springframework.security.web.AuthenticationEntryPoint; import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.web.access.channel.ChannelProcessingFilter; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.CorsConfigurationSource; import org.springframework.web.cors.UrlBasedCorsConfigurationSource; +import org.springframework.web.filter.CorsFilter; import java.io.IOException; @@ -76,7 +77,7 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti @Bean public CorsConfigurationSource corsConfigurationSource() { CorsConfiguration corsConfiguration = new CorsConfiguration(); - corsConfiguration.setAllowedOrigins(Arrays.asList("*")); + corsConfiguration.setAllowedOrigins(List.of("http://localhost:3000", "http://localhost:8080")); corsConfiguration.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE", "OPTIONS")); corsConfiguration.setAllowedHeaders(Arrays.asList("Authorization", "Content-Type")); corsConfiguration.setAllowCredentials(true); diff --git a/src/main/java/com/example/api/oauth2/entity/handler/OAuth2AuthenticationSuccessHandler.java b/src/main/java/com/example/api/oauth2/entity/handler/OAuth2AuthenticationSuccessHandler.java index 5cab1854..7e3df792 100644 --- a/src/main/java/com/example/api/oauth2/entity/handler/OAuth2AuthenticationSuccessHandler.java +++ b/src/main/java/com/example/api/oauth2/entity/handler/OAuth2AuthenticationSuccessHandler.java @@ -8,7 +8,11 @@ import com.example.api.auth.entitiy.RefreshToken; import com.example.api.auth.repository.TokenRepository; import com.example.api.auth.service.JwtTokenProvider; +import com.example.api.aws.dto.OldKeyRequest; +import com.example.api.aws.service.S3Service; import com.example.api.domain.Account; +import com.example.api.global.exception.BusinessException; +import com.example.api.global.exception.ErrorCode; import com.example.api.global.properties.JwtProperties; import com.example.api.oauth2.entity.HttpCookieOAuth2AuthorizationRequestRepository; import com.fasterxml.jackson.databind.ObjectMapper; @@ -38,6 +42,7 @@ public class OAuth2AuthenticationSuccessHandler extends SimpleUrlAuthenticationS private final TokenRepository tokenRepository; private final JwtProperties jwtProperties; private final ObjectMapper objectMapper; + private final S3Service s3Service; @Value("app.oauth2. authorized-redirect-uris") List authorizedRedirectUris; @@ -69,10 +74,14 @@ private void setResponse(final HttpServletRequest request, } private void generateResponseBody(HttpServletResponse response, UserDetailRequest userDetailRequest, AuthTokenRequest authTokenRequest) throws IOException { + Account loginUser = accountRepository.findById(userDetailRequest.userId()).orElseThrow(() -> new BusinessException(ErrorCode.NULL_USER)); + String profile = s3Service.getImage(new OldKeyRequest(loginUser.getProfileImage())); Map responseBody = new HashMap<>(); responseBody.put("accessToken", authTokenRequest.accessToken()); responseBody.put("userId", userDetailRequest.userId().toString()); responseBody.put("userRole", userDetailRequest.authorities().stream().findFirst().toString()); + responseBody.put("name", loginUser.getName()); + responseBody.put("profile", profile); response.setContentType("application/json"); response.setCharacterEncoding("UTF-8"); From bd9843e371bc7e4779e00d25316f61129c7f3569 Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Tue, 11 Feb 2025 22:04:57 +0900 Subject: [PATCH 257/276] category + subcategory response --- .../UpdatePreferredCategoriesRequest.java | 6 ++- .../FlavoredCategoryRepositoryCustom.java | 8 ++++ .../FlavoredCategoryRepositoryImpl.java | 39 +++++++++++++++++++ .../api/board/service/BoardService.java | 11 +++++- .../FlavoredCategoryRepository.java | 21 +++------- 5 files changed, 66 insertions(+), 19 deletions(-) create mode 100644 src/main/java/com/example/api/board/repository/FlavoredCategoryRepositoryCustom.java create mode 100644 src/main/java/com/example/api/board/repository/FlavoredCategoryRepositoryImpl.java diff --git a/src/main/java/com/example/api/board/dto/update/UpdatePreferredCategoriesRequest.java b/src/main/java/com/example/api/board/dto/update/UpdatePreferredCategoriesRequest.java index cb0de88c..b0e1e342 100644 --- a/src/main/java/com/example/api/board/dto/update/UpdatePreferredCategoriesRequest.java +++ b/src/main/java/com/example/api/board/dto/update/UpdatePreferredCategoriesRequest.java @@ -3,6 +3,10 @@ import java.util.List; public record UpdatePreferredCategoriesRequest( - List categoryIds + List categoryIds ) { + public record PreferredCategoryIdsRequest( + Long categoryId, + Long subCategoryId + ){} } diff --git a/src/main/java/com/example/api/board/repository/FlavoredCategoryRepositoryCustom.java b/src/main/java/com/example/api/board/repository/FlavoredCategoryRepositoryCustom.java new file mode 100644 index 00000000..6e7f6612 --- /dev/null +++ b/src/main/java/com/example/api/board/repository/FlavoredCategoryRepositoryCustom.java @@ -0,0 +1,8 @@ +package com.example.api.board.repository; + +import java.util.List; + +public interface FlavoredCategoryRepositoryCustom { + void saveAllCategoryIds(Long accountId, List categoryIds, List subCategoryIds); +} + diff --git a/src/main/java/com/example/api/board/repository/FlavoredCategoryRepositoryImpl.java b/src/main/java/com/example/api/board/repository/FlavoredCategoryRepositoryImpl.java new file mode 100644 index 00000000..0b40ef88 --- /dev/null +++ b/src/main/java/com/example/api/board/repository/FlavoredCategoryRepositoryImpl.java @@ -0,0 +1,39 @@ +package com.example.api.board.repository; + +import jakarta.persistence.EntityManager; +import jakarta.transaction.Transactional; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +@RequiredArgsConstructor +public class FlavoredCategoryRepositoryImpl implements FlavoredCategoryRepositoryCustom { + + private final EntityManager entityManager; + + @Transactional + @Override + public void saveAllCategoryIds(Long accountId, List categoryIds, List subCategoryIds) { + if (categoryIds.isEmpty() || subCategoryIds.isEmpty()) return; + + StringBuilder sql = new StringBuilder(); + sql.append("INSERT INTO FLAVORED_CATEGORY (CATEGORY_ID, SUB_CATEGORY_ID, EMPLOYEE_ID) VALUES "); + + for (int i = 0; i < categoryIds.size(); i++) { + sql.append("(") + .append(categoryIds.get(i)).append(", ") + .append(subCategoryIds.get(i)).append(", ") + .append(accountId) + .append("),"); + } + + // 마지막 쉼표 제거 + sql.setLength(sql.length() - 1); + + // 실행 + entityManager.createNativeQuery(sql.toString()).executeUpdate(); + } +} + diff --git a/src/main/java/com/example/api/board/service/BoardService.java b/src/main/java/com/example/api/board/service/BoardService.java index 46c6b83d..e436369b 100644 --- a/src/main/java/com/example/api/board/service/BoardService.java +++ b/src/main/java/com/example/api/board/service/BoardService.java @@ -16,6 +16,7 @@ import com.example.api.global.exception.BusinessException; import com.example.api.global.exception.ErrorCode; import com.fasterxml.jackson.databind.ObjectMapper; +import com.github.jknack.handlebars.internal.lang3.tuple.Pair; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.jetbrains.annotations.NotNull; @@ -118,8 +119,14 @@ public List updatePreferredCategories( final EmployeeIdRequest employeeIdRequest, final UpdatePreferredCategoriesRequest request ) { - flavoredCategoryRepository.deleteByNotInIds(employeeIdRequest.employeeId(), request.categoryIds()); - flavoredCategoryRepository.saveDistrictIds(employeeIdRequest.employeeId(), request.categoryIds().toString()); + List> categoryPairs = request.categoryIds().stream() + .map(cat -> Pair.of(cat.categoryId(), cat.subCategoryId())) + .toList(); + List categoryIds = categoryPairs.stream().map(Pair::getLeft).collect(Collectors.toList()); + List subCategoryIds = categoryPairs.stream().map(Pair::getRight).collect(Collectors.toList()); + + flavoredCategoryRepository.deleteByNotInIds(employeeIdRequest.employeeId(), subCategoryIds); + flavoredCategoryRepository.saveAllCategoryIds(employeeIdRequest.employeeId(), categoryIds, subCategoryIds); return flavoredCategoryRepository.findAllByEmployeeId(employeeIdRequest.employeeId()); } diff --git a/src/main/java/com/example/api/domain/repository/FlavoredCategoryRepository.java b/src/main/java/com/example/api/domain/repository/FlavoredCategoryRepository.java index 078df172..9fb95dce 100644 --- a/src/main/java/com/example/api/domain/repository/FlavoredCategoryRepository.java +++ b/src/main/java/com/example/api/domain/repository/FlavoredCategoryRepository.java @@ -1,6 +1,7 @@ package com.example.api.domain.repository; import com.example.api.board.dto.response.FlavoredCategoryResponse; +import com.example.api.board.repository.FlavoredCategoryRepositoryCustom; import com.example.api.domain.FlavoredCategory; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Modifying; @@ -11,26 +12,14 @@ import java.util.List; @Repository -public interface FlavoredCategoryRepository extends JpaRepository { +public interface FlavoredCategoryRepository extends JpaRepository, FlavoredCategoryRepositoryCustom { @Query("select distinct new com.example.api.board.dto.response.FlavoredCategoryResponse(c.categoryId, c.categoryName, sc.subCategoryId, sc.subCategoryName) " + "from FlavoredCategory fc join fc.category c " + "join fc.subCategory sc " + "where fc.employee.accountId = :employeeId") - List findAllByEmployeeId(@Param("employeeId") long employeeId); + List findAllByEmployeeId(@Param("employeeId") Long employeeId); @Modifying - @Query("DELETE FROM FlavoredCategory fc WHERE fc.category.categoryId NOT IN :ids AND fc.employee.accountId = :employeeId") + @Query("DELETE FROM FlavoredCategory fc WHERE fc.subCategory.subCategoryId NOT IN :ids AND fc.employee.accountId = :employeeId") void deleteByNotInIds(@Param("employeeId") Long employeeId, @Param("ids") List ids); - - @Modifying - @Query(value = "INSERT INTO FLAVORED_CATEGORY (category_id, employee_id) " + - "SELECT temp.category_id, :accountId " + - "FROM JSON_TABLE(:categoryIds, '$[*]' COLUMNS (category_id BIGINT PATH '$')) AS temp " + - "WHERE NOT EXISTS (" + - " SELECT 1 FROM FLAVORED_CATEGORY " + - " WHERE FLAVORED_CATEGORY.category_id = temp.category_id " + - " AND FLAVORED_CATEGORY.employee_id = :accountId" + - ")", - nativeQuery = true) - void saveDistrictIds(@Param("accountId") Long accountId, @Param("categoryIds") String categoryIds); -} +} \ No newline at end of file From 83b7e382e2bc0f33b1af02d385ae5b71c7cdc3dd Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Tue, 11 Feb 2025 23:55:23 +0900 Subject: [PATCH 258/276] =?UTF-8?q?#108=20subCategory=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20=EC=B6=94=EA=B0=80=EC=97=90=20=EB=94=B0=EB=A5=B8=20?= =?UTF-8?q?category=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/api/domain/QBusinessCategory.java | 6 +-- .../example/api/domain/QExternalCareer.java | 6 +-- .../board/dto/request/FlavoredCategory.java | 4 +- .../dto/response/ExternalCareerResponse.java | 4 +- .../dto/response/SubCategoryResponse.java | 7 +++ .../update/UpdateExternalCareerRequest.java | 2 +- .../api/board/entitiy/PossibleMapper.java | 48 +------------------ .../api/board/service/BoardService.java | 31 ++++++------ .../api/business/BusinessQueryService.java | 4 +- .../api/business/BusinessRepository.java | 2 +- .../example/api/business/BusinessService.java | 16 +++---- .../controller/BusinessController.java | 8 ++-- .../api/business/dto/AddBusinessCommand.java | 2 +- .../api/business/dto/CategoryInfo.java | 4 +- .../UpdateBusinessCategoriesHandlerImpl.java | 15 +++--- .../example/api/domain/BusinessCategory.java | 8 ++-- .../example/api/domain/ExternalCareer.java | 8 ++-- .../BusinessCategoryRepository.java | 8 ++++ .../domain/repository/CategoryRepository.java | 1 - .../repository/ExternalCareerRepository.java | 4 +- .../repository/SubCategoryRepository.java | 9 ++++ src/main/resources/static/danpat.yaml | 10 ++-- 22 files changed, 90 insertions(+), 117 deletions(-) create mode 100644 src/main/java/com/example/api/board/dto/response/SubCategoryResponse.java create mode 100644 src/main/java/com/example/api/domain/repository/SubCategoryRepository.java diff --git a/src/main/generated/com/example/api/domain/QBusinessCategory.java b/src/main/generated/com/example/api/domain/QBusinessCategory.java index 975e63bc..d67bdd02 100644 --- a/src/main/generated/com/example/api/domain/QBusinessCategory.java +++ b/src/main/generated/com/example/api/domain/QBusinessCategory.java @@ -26,13 +26,13 @@ public class QBusinessCategory extends EntityPathBase { public final QBusiness business; - public final QCategory category; - //inherited public final DateTimePath createdDate = _super.createdDate; public final NumberPath id = createNumber("id", Long.class); + public final QSubCategory subCategory; + //inherited public final DateTimePath updatedDate = _super.updatedDate; @@ -55,7 +55,7 @@ public QBusinessCategory(PathMetadata metadata, PathInits inits) { public QBusinessCategory(Class type, PathMetadata metadata, PathInits inits) { super(type, metadata, inits); this.business = inits.isInitialized("business") ? new QBusiness(forProperty("business"), inits.get("business")) : null; - this.category = inits.isInitialized("category") ? new QCategory(forProperty("category")) : null; + this.subCategory = inits.isInitialized("subCategory") ? new QSubCategory(forProperty("subCategory"), inits.get("subCategory")) : null; } } diff --git a/src/main/generated/com/example/api/domain/QExternalCareer.java b/src/main/generated/com/example/api/domain/QExternalCareer.java index 56202e1f..34251764 100644 --- a/src/main/generated/com/example/api/domain/QExternalCareer.java +++ b/src/main/generated/com/example/api/domain/QExternalCareer.java @@ -24,8 +24,6 @@ public class QExternalCareer extends EntityPathBase { public final QBaseEntity _super = new QBaseEntity(this); - public final QCategory category; - //inherited public final DateTimePath createdDate = _super.createdDate; @@ -33,6 +31,8 @@ public class QExternalCareer extends EntityPathBase { public final NumberPath id = createNumber("id", Long.class); + public final QSubCategory subCategory; + //inherited public final DateTimePath updatedDate = _super.updatedDate; @@ -56,8 +56,8 @@ public QExternalCareer(PathMetadata metadata, PathInits inits) { public QExternalCareer(Class type, PathMetadata metadata, PathInits inits) { super(type, metadata, inits); - this.category = inits.isInitialized("category") ? new QCategory(forProperty("category")) : null; this.employee = inits.isInitialized("employee") ? new QAccount(forProperty("employee")) : null; + this.subCategory = inits.isInitialized("subCategory") ? new QSubCategory(forProperty("subCategory"), inits.get("subCategory")) : null; } } diff --git a/src/main/java/com/example/api/board/dto/request/FlavoredCategory.java b/src/main/java/com/example/api/board/dto/request/FlavoredCategory.java index 905e328e..154cd4c4 100644 --- a/src/main/java/com/example/api/board/dto/request/FlavoredCategory.java +++ b/src/main/java/com/example/api/board/dto/request/FlavoredCategory.java @@ -1,7 +1,7 @@ package com.example.api.board.dto.request; public record FlavoredCategory( - Long categoryId, - String categoryName + Long subCategoryId, + String subCategoryName ) { } diff --git a/src/main/java/com/example/api/board/dto/response/ExternalCareerResponse.java b/src/main/java/com/example/api/board/dto/response/ExternalCareerResponse.java index dafe9fb4..cbfd2f8a 100644 --- a/src/main/java/com/example/api/board/dto/response/ExternalCareerResponse.java +++ b/src/main/java/com/example/api/board/dto/response/ExternalCareerResponse.java @@ -1,10 +1,8 @@ package com.example.api.board.dto.response; -import com.example.api.domain.Category; - public record ExternalCareerResponse( Long externalCareerId, - Category category, + SubCategoryResponse subCategory, Integer workCount ) { } diff --git a/src/main/java/com/example/api/board/dto/response/SubCategoryResponse.java b/src/main/java/com/example/api/board/dto/response/SubCategoryResponse.java new file mode 100644 index 00000000..a75b7550 --- /dev/null +++ b/src/main/java/com/example/api/board/dto/response/SubCategoryResponse.java @@ -0,0 +1,7 @@ +package com.example.api.board.dto.response; + +public record SubCategoryResponse( + Long subCategoryId, + String subCategoryName +){ +} diff --git a/src/main/java/com/example/api/board/dto/update/UpdateExternalCareerRequest.java b/src/main/java/com/example/api/board/dto/update/UpdateExternalCareerRequest.java index 7690912d..030f22cc 100644 --- a/src/main/java/com/example/api/board/dto/update/UpdateExternalCareerRequest.java +++ b/src/main/java/com/example/api/board/dto/update/UpdateExternalCareerRequest.java @@ -6,7 +6,7 @@ public record UpdateExternalCareerRequest( List newExternalCareers ) { public record ExternalCareerRequest( - Long categoryId, + Long subCategoryId, Integer workCount ){} } \ No newline at end of file diff --git a/src/main/java/com/example/api/board/entitiy/PossibleMapper.java b/src/main/java/com/example/api/board/entitiy/PossibleMapper.java index 33c991b6..5daf2c13 100644 --- a/src/main/java/com/example/api/board/entitiy/PossibleMapper.java +++ b/src/main/java/com/example/api/board/entitiy/PossibleMapper.java @@ -1,58 +1,12 @@ package com.example.api.board.entitiy; -import com.example.api.domain.Account; -import com.example.api.domain.Category; -import com.example.api.domain.Contract; -import com.example.api.domain.ExternalCareer; -import com.example.api.domain.PossibleBoard; -import com.example.api.board.dto.response.ExternalCareerResponse; -import com.example.api.board.dto.request.FlavoredCategory; -import com.example.api.board.dto.response.InternalCareerResponse; -import com.example.api.board.dto.response.PossibleDetailsResponse; -import java.util.List; +import com.example.api.domain.*; import org.springframework.stereotype.Service; @Service public class PossibleMapper { - public PossibleBoard toBoard(final Account account, final PossibleTime possibleTime) { return new PossibleBoard(account, possibleTime.getStartTime(), possibleTime.getEndTime()); } - - public PossibleDetailsResponse toPossibleDetailsResponse(final PossibleDetailsResponse possibleDetails, final List categories, final List externalCareers, final List internalCareeors) { - return new PossibleDetailsResponse( - possibleDetails.name(), - possibleDetails.age(), - possibleDetails.email(), - possibleDetails.phoneNumber(), - possibleDetails.recentlyUpdatedTime(), - possibleDetails.possibleStartTime(), - possibleDetails.possibleEndTime(), - categories.stream() - .map(this::toFlavoredCategory) - .toList(), - externalCareers.stream() - .map(this::toExternalCareerResponse) - .toList(), - internalCareeors.stream() - .map(this::toInternalCareerResponse) - .toList(), - possibleDetails.contractCount(), - possibleDetails.starPoint().intValue() - ); - } - - public ExternalCareerResponse toExternalCareerResponse(final ExternalCareer externalCareer) { - return new ExternalCareerResponse(externalCareer.getId(), externalCareer.getCategory(), externalCareer.getWorkCount()); - } - - public FlavoredCategory toFlavoredCategory(final Category category) { - return new FlavoredCategory(category.getCategoryId(), category.getCategoryName()); - } - - public InternalCareerResponse toInternalCareerResponse(final Contract contract) { - String businessName = contract.getOfferEmployment().getBusiness().getBusinessName(); - return new InternalCareerResponse(contract.getContractId(), businessName, contract.getContractStartTime(), contract.getContractEndTime()); - } } \ No newline at end of file diff --git a/src/main/java/com/example/api/board/service/BoardService.java b/src/main/java/com/example/api/board/service/BoardService.java index e436369b..cccad512 100644 --- a/src/main/java/com/example/api/board/service/BoardService.java +++ b/src/main/java/com/example/api/board/service/BoardService.java @@ -41,8 +41,7 @@ public class BoardService { private final FlavoredDistrictRepository flavoredDistrictRepository; private final AccountService accountService; private final PossibleMapper possibleMapper; - private final ObjectMapper objectMapper; - private final CategoryRepository categoryRepository; + private final SubCategoryRepository subCategoryRepository; @Transactional(readOnly = true) public PersonalInfoResponse getPersonalInfoResponse(final EmployeeIdRequest employeeIdRequest){ @@ -140,14 +139,14 @@ public List updateExternalCareers( List allExternalCareer = externalCareerRepository.findAllByEmployeeId(user.getAccountId()); - Set categoryIds = request.newExternalCareers().stream() - .map(UpdateExternalCareerRequest.ExternalCareerRequest::categoryId) + Set subCategoryIds = request.newExternalCareers().stream() + .map(UpdateExternalCareerRequest.ExternalCareerRequest::subCategoryId) .collect(Collectors.toSet()); - Map categoryMap = categoryRepository.findAllById(categoryIds).stream() - .collect(Collectors.toMap(Category::getCategoryId, category -> category)); + Map subCategoryMap = subCategoryRepository.findAllById(subCategoryIds).stream() + .collect(Collectors.toMap(SubCategory::getSubCategoryId, subCategory -> subCategory)); - List newList = filterNewExternalCareers(request, allExternalCareer, categoryMap, user); + List newList = filterNewExternalCareers(request, allExternalCareer, subCategoryMap, user); List oldList = filterRemovableExternalCareers(request, allExternalCareer); if (!oldList.isEmpty()) { @@ -162,31 +161,29 @@ public List updateExternalCareers( @NotNull private static List filterRemovableExternalCareers(UpdateExternalCareerRequest request, List allExternalCareer) { - List oldList = allExternalCareer.stream() + return allExternalCareer.stream() .filter(savedAll -> request.newExternalCareers().stream() .noneMatch(externalCareerRequest -> - savedAll.category().getCategoryId().equals(externalCareerRequest.categoryId()) && + savedAll.subCategory().subCategoryId().equals(externalCareerRequest.subCategoryId()) && savedAll.workCount().equals(externalCareerRequest.workCount()))) .map(ExternalCareerResponse::externalCareerId) .collect(Collectors.toList()); - return oldList; } @NotNull - private static List filterNewExternalCareers(UpdateExternalCareerRequest request, List allExternalCareer, Map categoryMap, Account user) { - List newList = request.newExternalCareers().stream() + private static List filterNewExternalCareers(UpdateExternalCareerRequest request, List allExternalCareer, Map subCategoryMap, Account user) { + return request.newExternalCareers().stream() .filter(externalCareerRequest -> allExternalCareer.stream() .noneMatch(savedAll -> - savedAll.category().getCategoryId().equals(externalCareerRequest.categoryId()) && + savedAll.subCategory().subCategoryId().equals(externalCareerRequest.subCategoryId()) && savedAll.workCount().equals(externalCareerRequest.workCount()))) .map(updateRequest -> { - Category category = categoryMap.get(updateRequest.categoryId()); - if (category == null) { + SubCategory subCategory = subCategoryMap.get(updateRequest.subCategoryId()); + if (subCategory == null) { throw new BusinessException(ErrorCode.CATEGORY_EXCEPTION); } - return new ExternalCareer(user, category, updateRequest.workCount()); + return new ExternalCareer(user, subCategory, updateRequest.workCount()); }) .collect(Collectors.toList()); - return newList; } } \ No newline at end of file diff --git a/src/main/java/com/example/api/business/BusinessQueryService.java b/src/main/java/com/example/api/business/BusinessQueryService.java index e0b9a076..8ddef3ab 100644 --- a/src/main/java/com/example/api/business/BusinessQueryService.java +++ b/src/main/java/com/example/api/business/BusinessQueryService.java @@ -28,8 +28,8 @@ public BusinessDetailsResponse loadDetails(@Validated final QueryBusinessDetailC final BusinessLocation location = business.getLocation(); final Account account = business.getEmployer(); final List categoryInfos = business.getBusinessCategories().stream() - .map(BusinessCategory::getCategory) - .map(category -> new CategoryInfo(category.getCategoryId(), category.getCategoryName())) + .map(BusinessCategory::getSubCategory) + .map(category -> new CategoryInfo(category.getSubCategoryId(), category.getSubCategoryName())) .toList(); final BusinessOwner owner = new BusinessOwner(account.getAccountId(), account.getName()); return new BusinessDetailsResponse(business.getBusinessName(), business.getBusinessId(), owner, location, categoryInfos); diff --git a/src/main/java/com/example/api/business/BusinessRepository.java b/src/main/java/com/example/api/business/BusinessRepository.java index 1f943d7a..f664922b 100644 --- a/src/main/java/com/example/api/business/BusinessRepository.java +++ b/src/main/java/com/example/api/business/BusinessRepository.java @@ -14,7 +14,7 @@ @Repository public interface BusinessRepository extends JpaRepository { @Query("SELECT b FROM Business b JOIN FETCH b.employer JOIN FETCH b.businessCategories WHERE b.businessId = :businessId") - @EntityGraph(attributePaths = {"location", "employer", "businessCategories.category"}) + @EntityGraph(attributePaths = {"location", "employer", "businessCategories.subCategory"}) Optional getDetails(@Param("businessId") final Long businessId); @Query("select new com.example.api.employer.controller.dto.EmployerBusinessesRequest(b.businessName, b.location) from Business b where b.employer.accountId = :employerId order by b.location.id") diff --git a/src/main/java/com/example/api/business/BusinessService.java b/src/main/java/com/example/api/business/BusinessService.java index 441e0c22..b92280af 100644 --- a/src/main/java/com/example/api/business/BusinessService.java +++ b/src/main/java/com/example/api/business/BusinessService.java @@ -4,15 +4,13 @@ import com.example.api.business.dto.AddBusinessCommand; import com.example.api.business.dto.ModifyBusinessCommand; import com.example.api.business.update.BusinessUpdateManager; -import com.example.api.domain.Account; -import com.example.api.domain.Business; -import com.example.api.domain.BusinessCategory; -import com.example.api.domain.Category; +import com.example.api.domain.*; import com.example.api.domain.repository.BusinessCategoryRepository; import com.example.api.domain.repository.CategoryRepository; import java.util.List; import java.util.stream.Collectors; +import com.example.api.domain.repository.SubCategoryRepository; import com.example.api.global.exception.BusinessException; import com.example.api.global.exception.ErrorCode; import lombok.RequiredArgsConstructor; @@ -28,7 +26,7 @@ public class BusinessService { private final BusinessRepository businessRepository; private final BusinessCategoryRepository businessCategoryRepository; private final BusinessUpdateManager businessUpdateManager; - private final CategoryRepository categoryRepository; + private final SubCategoryRepository subCategoryRepository; private final AccountRepository accountRepository; @Transactional @@ -49,15 +47,15 @@ public void addBusiness(@Validated final AddBusinessCommand command) { command.businessOpenDate(), command.businessRegistrationNumber() ); - final List businessCategories = loadCategories(command.categoryIds(), business); + final List businessCategories = loadCategories(command.subCategoryIds(), business); businessRepository.save(business); businessCategoryRepository.saveAll(businessCategories); } private List loadCategories(final List categoryIds, final Business business) { - final List categories = categoryRepository.findAllById(categoryIds); - return categories.stream() - .map(category -> new BusinessCategory(business, category)) + final List subCategories = subCategoryRepository.findAllById(categoryIds); + return subCategories.stream() + .map(subCategory -> new BusinessCategory(business, subCategory)) .toList(); } } diff --git a/src/main/java/com/example/api/business/controller/BusinessController.java b/src/main/java/com/example/api/business/controller/BusinessController.java index a2913878..5a638043 100644 --- a/src/main/java/com/example/api/business/controller/BusinessController.java +++ b/src/main/java/com/example/api/business/controller/BusinessController.java @@ -57,11 +57,11 @@ record AddBusinessRequest( String businessRegistrationNumber, String businessOpenDate, BusinessLocation location, - List categoryIds, + List subCategoryIds, String representationName ) { AddBusinessCommand toCommand() { - return new AddBusinessCommand(requestMemberId, businessName, businessRegistrationNumber, businessOpenDate, location, categoryIds, representationName); + return new AddBusinessCommand(requestMemberId, businessName, businessRegistrationNumber, businessOpenDate, location, subCategoryIds, representationName); } } @@ -71,10 +71,10 @@ record ModifyBusinessRequest( String businessName, BusinessLocation location, String representationName, - List categoryId + List subCategoryIds ) { ModifyBusinessCommand toCommand() { - return new ModifyBusinessCommand(businessId, businessName, location, representationName, categoryId); + return new ModifyBusinessCommand(businessId, businessName, location, representationName, subCategoryIds); } } } diff --git a/src/main/java/com/example/api/business/dto/AddBusinessCommand.java b/src/main/java/com/example/api/business/dto/AddBusinessCommand.java index 12360467..64e1d759 100644 --- a/src/main/java/com/example/api/business/dto/AddBusinessCommand.java +++ b/src/main/java/com/example/api/business/dto/AddBusinessCommand.java @@ -11,7 +11,7 @@ public record AddBusinessCommand( String businessRegistrationNumber, String businessOpenDate, BusinessLocation location, - List categoryIds, + List subCategoryIds, String representationName ) { diff --git a/src/main/java/com/example/api/business/dto/CategoryInfo.java b/src/main/java/com/example/api/business/dto/CategoryInfo.java index 0c11c0c5..2ee72496 100644 --- a/src/main/java/com/example/api/business/dto/CategoryInfo.java +++ b/src/main/java/com/example/api/business/dto/CategoryInfo.java @@ -1,7 +1,7 @@ package com.example.api.business.dto; public record CategoryInfo( - Long categoryid, - String categoryname + Long subCategoryId, + String subCategoryName ) { } diff --git a/src/main/java/com/example/api/business/update/UpdateBusinessCategoriesHandlerImpl.java b/src/main/java/com/example/api/business/update/UpdateBusinessCategoriesHandlerImpl.java index 06f07462..99aaeaef 100644 --- a/src/main/java/com/example/api/business/update/UpdateBusinessCategoriesHandlerImpl.java +++ b/src/main/java/com/example/api/business/update/UpdateBusinessCategoriesHandlerImpl.java @@ -4,8 +4,10 @@ import com.example.api.domain.Business; import com.example.api.domain.BusinessCategory; import com.example.api.domain.Category; +import com.example.api.domain.SubCategory; import com.example.api.domain.repository.BusinessCategoryRepository; import com.example.api.domain.repository.CategoryRepository; +import com.example.api.domain.repository.SubCategoryRepository; import com.example.api.global.exception.BusinessException; import com.example.api.global.exception.ErrorCode; import java.util.List; @@ -20,7 +22,7 @@ @Transactional(propagation = Propagation.MANDATORY) @RequiredArgsConstructor public class UpdateBusinessCategoriesHandlerImpl implements BusinessUpdateHandler { - private final CategoryRepository categoryRepository; + private final SubCategoryRepository subCategoryRepository; private final BusinessCategoryRepository businessCategoryRepository; @Override @@ -29,15 +31,16 @@ public void update(Business business, ModifyBusinessCommand command) { return; } final List businessCategories = findRelatedCategories(command.categoryIds()).stream() - .map(category -> new BusinessCategory(business, category)) + .map(subCategory -> new BusinessCategory(business, subCategory)) .collect(Collectors.toList()); + businessCategoryRepository.deleteAllByBusinessId(business.getBusinessId()); businessCategoryRepository.saveAll(businessCategories); } - private List findRelatedCategories(final List categoryIds) { - final List categories = categoryRepository.findAllById(categoryIds); - validate(categories.size(), categoryIds.size()); - return categories; + private List findRelatedCategories(final List subCategoryIds) { + final List subCategories = subCategoryRepository.findAllById(subCategoryIds); + validate(subCategories.size(), subCategoryIds.size()); + return subCategories; } private void validate(final int requestCategorySize, final int foundedSize) { diff --git a/src/main/java/com/example/api/domain/BusinessCategory.java b/src/main/java/com/example/api/domain/BusinessCategory.java index 4f71111d..18d95be0 100644 --- a/src/main/java/com/example/api/domain/BusinessCategory.java +++ b/src/main/java/com/example/api/domain/BusinessCategory.java @@ -23,11 +23,11 @@ public class BusinessCategory extends BaseEntity{ private Business business; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "CATEGORY_ID", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) - private Category category; + @JoinColumn(name = "SUB_CATEGORY_ID", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) + private SubCategory subCategory; - public BusinessCategory(Business business, Category category) { + public BusinessCategory(Business business, SubCategory subCategory) { this.business = business; - this.category = category; + this.subCategory = subCategory; } } \ No newline at end of file diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 4e430875..510db52b 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -24,16 +24,16 @@ public class ExternalCareer extends BaseEntity{ private Account employee; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "CATEGORY_ID", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) + @JoinColumn(name = "SUB_CATEGORY_ID", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) @EqualsAndHashCode.Include - private Category category; + private SubCategory subCategory; @Column(name = "WORK_COUNT") private int workCount; - public ExternalCareer(Account employee, Category category, int workCount) { + public ExternalCareer(Account employee, SubCategory subCategory, int workCount) { this.employee = employee; - this.category = category; + this.subCategory = subCategory; this.workCount = workCount; } } \ No newline at end of file diff --git a/src/main/java/com/example/api/domain/repository/BusinessCategoryRepository.java b/src/main/java/com/example/api/domain/repository/BusinessCategoryRepository.java index 51cf31d8..16ad76a8 100644 --- a/src/main/java/com/example/api/domain/repository/BusinessCategoryRepository.java +++ b/src/main/java/com/example/api/domain/repository/BusinessCategoryRepository.java @@ -2,8 +2,16 @@ import com.example.api.domain.BusinessCategory; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; +import java.util.List; + @Repository public interface BusinessCategoryRepository extends JpaRepository { + @Modifying + @Query("delete from BusinessCategory bc where bc.business.businessId = :businessId") + void deleteAllByBusinessId(@Param("businessId") Long businessId); } diff --git a/src/main/java/com/example/api/domain/repository/CategoryRepository.java b/src/main/java/com/example/api/domain/repository/CategoryRepository.java index 128775ff..b69aaa33 100644 --- a/src/main/java/com/example/api/domain/repository/CategoryRepository.java +++ b/src/main/java/com/example/api/domain/repository/CategoryRepository.java @@ -4,7 +4,6 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; - @Repository public interface CategoryRepository extends JpaRepository { } diff --git a/src/main/java/com/example/api/domain/repository/ExternalCareerRepository.java b/src/main/java/com/example/api/domain/repository/ExternalCareerRepository.java index 492dbac0..459d99ca 100644 --- a/src/main/java/com/example/api/domain/repository/ExternalCareerRepository.java +++ b/src/main/java/com/example/api/domain/repository/ExternalCareerRepository.java @@ -11,7 +11,9 @@ @Repository public interface ExternalCareerRepository extends JpaRepository { - @Query("select new com.example.api.board.dto.response.ExternalCareerResponse(e.id, e.category, e.workCount) " + + @Query("select new com.example.api.board.dto.response.ExternalCareerResponse(e.id, " + + "new com.example.api.board.dto.response.SubCategoryResponse(e.subCategory.subCategoryId, e.subCategory.subCategoryName)" + + ", e.workCount) " + "from ExternalCareer e where e.employee.accountId = :employeeId") List findAllByEmployeeId(@Param("employeeId") Long employeeId); } diff --git a/src/main/java/com/example/api/domain/repository/SubCategoryRepository.java b/src/main/java/com/example/api/domain/repository/SubCategoryRepository.java new file mode 100644 index 00000000..a1bfd04f --- /dev/null +++ b/src/main/java/com/example/api/domain/repository/SubCategoryRepository.java @@ -0,0 +1,9 @@ +package com.example.api.domain.repository; + +import com.example.api.domain.SubCategory; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface SubCategoryRepository extends JpaRepository { +} diff --git a/src/main/resources/static/danpat.yaml b/src/main/resources/static/danpat.yaml index 12ae2042..f110d7d3 100644 --- a/src/main/resources/static/danpat.yaml +++ b/src/main/resources/static/danpat.yaml @@ -918,8 +918,8 @@ paths: address: "경기도 남양주시 송산로339번길 25, 3층(별내동)" detailAddress: "101호" categoryInfos: - - categoryId: 8 - categoryName: "IT•인터넷" + - subCategoryId: 1002 + subCategoryName: "일반음식점" put: tags: - BusinessController @@ -936,7 +936,7 @@ paths: zipcode: "12093" address: "경기도 남양주시 송산로339번길 25, 3층(별내동)" detailAddress: "101호" - categoryInfos: + subCategoryIds: - 8 required: true responses: @@ -965,7 +965,7 @@ paths: zipcode: "12093" address: "경기도 남양주시 송산로339번길 25, 3층(별내동)" detailAddress: "101호" - categoryIds: + subCategoryIds: - 8 representationName: "김태영" required: true @@ -1065,8 +1065,6 @@ paths: - name: reviewId in: path required: true - schema: - $ref: "#/components/schemas/Review" requestBody: content: application/json: From 2d814a9d82043aa0fdd1efdd5acca3b18e6fd494 Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Wed, 12 Feb 2025 00:48:44 +0900 Subject: [PATCH 259/276] birthdate, callTime --- .../account/repository/AccountRepository.java | 2 + .../api/board/controller/BoardController.java | 12 +++++ .../dto/request/AddIntroductionRequest.java | 4 ++ .../dto/response/IntroductionResponse.java | 6 +++ .../dto/response/PersonalInfoResponse.java | 10 +++- .../board/dto/response/WorkHourResponse.java | 2 +- .../dto/update/UpdatePersonalInfoRequest.java | 4 +- .../api/board/service/BoardService.java | 16 ++++++ .../api/board/service/EmployeeService.java | 4 +- .../java/com/example/api/domain/Account.java | 12 +++++ src/main/resources/static/danpat.yaml | 49 +++++++++++++++++++ 11 files changed, 116 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/example/api/board/dto/request/AddIntroductionRequest.java create mode 100644 src/main/java/com/example/api/board/dto/response/IntroductionResponse.java diff --git a/src/main/java/com/example/api/account/repository/AccountRepository.java b/src/main/java/com/example/api/account/repository/AccountRepository.java index 812c571d..6a1befd1 100644 --- a/src/main/java/com/example/api/account/repository/AccountRepository.java +++ b/src/main/java/com/example/api/account/repository/AccountRepository.java @@ -36,4 +36,6 @@ public interface AccountRepository extends JpaRepository { @Query("select a from Account a where a.accountId = :employeeId") Optional findByEmployeeId(@Param("employeeId") Long employeeId); + + String findIntroductionByAccountId(Long accountId); } \ No newline at end of file diff --git a/src/main/java/com/example/api/board/controller/BoardController.java b/src/main/java/com/example/api/board/controller/BoardController.java index 15238d24..6b759eae 100644 --- a/src/main/java/com/example/api/board/controller/BoardController.java +++ b/src/main/java/com/example/api/board/controller/BoardController.java @@ -63,6 +63,18 @@ public ResponseEntity> getInternalCareers(@Authenti return ResponseEntity.ok(boardService.getInternalCareers(new EmployeeIdRequest(employeeId))); } + @GetMapping("/introduction") + public ResponseEntity getIntroduction(@AuthenticationPrincipal final Long employeeId){ + return ResponseEntity.ok(boardService.getIntroduction(new EmployeeIdRequest(employeeId))); + } + + @PostMapping("/introduction") + public ResponseEntity postIntroduction( + @AuthenticationPrincipal final Long employeeId, + @RequestBody final AddIntroductionRequest request){ + return ResponseEntity.ok(boardService.postIntroduction(new EmployeeIdRequest(employeeId), request)); + } + @PostMapping("/personal-info") public ResponseEntity updatePersonalInfo( @AuthenticationPrincipal final Long employeeId, diff --git a/src/main/java/com/example/api/board/dto/request/AddIntroductionRequest.java b/src/main/java/com/example/api/board/dto/request/AddIntroductionRequest.java new file mode 100644 index 00000000..0004dc26 --- /dev/null +++ b/src/main/java/com/example/api/board/dto/request/AddIntroductionRequest.java @@ -0,0 +1,4 @@ +package com.example.api.board.dto.request; + +public record AddIntroductionRequest(String introduction) { +} diff --git a/src/main/java/com/example/api/board/dto/response/IntroductionResponse.java b/src/main/java/com/example/api/board/dto/response/IntroductionResponse.java new file mode 100644 index 00000000..a9d7102a --- /dev/null +++ b/src/main/java/com/example/api/board/dto/response/IntroductionResponse.java @@ -0,0 +1,6 @@ +package com.example.api.board.dto.response; + +public record IntroductionResponse( + String introduction +) { +} diff --git a/src/main/java/com/example/api/board/dto/response/PersonalInfoResponse.java b/src/main/java/com/example/api/board/dto/response/PersonalInfoResponse.java index 0934c646..20d37cf0 100644 --- a/src/main/java/com/example/api/board/dto/response/PersonalInfoResponse.java +++ b/src/main/java/com/example/api/board/dto/response/PersonalInfoResponse.java @@ -10,7 +10,10 @@ public record PersonalInfoResponse( String email, String phoneNumber, Float starPoint, - Integer workCount + Integer workCount, + String profile, + String birthdate, + String callTime ) { public static PersonalInfoResponse of(Account user){ return new PersonalInfoResponse( @@ -21,7 +24,10 @@ public static PersonalInfoResponse of(Account user){ user.getEmail(), user.getPhoneNumber(), user.getStarPoint(), - user.getWorkCount() + user.getWorkCount(), + user.getProfileImage(), + user.getBirthdate(), + user.getCallTime() ); } } \ No newline at end of file diff --git a/src/main/java/com/example/api/board/dto/response/WorkHourResponse.java b/src/main/java/com/example/api/board/dto/response/WorkHourResponse.java index dd8f6ed0..36f5b030 100644 --- a/src/main/java/com/example/api/board/dto/response/WorkHourResponse.java +++ b/src/main/java/com/example/api/board/dto/response/WorkHourResponse.java @@ -11,4 +11,4 @@ public record WorkHourResponse( @EqualsAndHashCode.Include LocalDateTime endTime ) { -} +} \ No newline at end of file diff --git a/src/main/java/com/example/api/board/dto/update/UpdatePersonalInfoRequest.java b/src/main/java/com/example/api/board/dto/update/UpdatePersonalInfoRequest.java index 1d0e7590..13a1cbef 100644 --- a/src/main/java/com/example/api/board/dto/update/UpdatePersonalInfoRequest.java +++ b/src/main/java/com/example/api/board/dto/update/UpdatePersonalInfoRequest.java @@ -6,6 +6,8 @@ public record UpdatePersonalInfoRequest( Integer age, String phoneNumber, String email, - String nickname + String nickname, + String birthdate, + String callTime ) implements UpdateAccountConditionCommand{ } diff --git a/src/main/java/com/example/api/board/service/BoardService.java b/src/main/java/com/example/api/board/service/BoardService.java index cccad512..47a15096 100644 --- a/src/main/java/com/example/api/board/service/BoardService.java +++ b/src/main/java/com/example/api/board/service/BoardService.java @@ -2,6 +2,7 @@ import com.example.api.account.repository.AccountRepository; import com.example.api.account.service.AccountService; +import com.example.api.board.dto.request.AddIntroductionRequest; import com.example.api.board.dto.request.AddPossibleTimeCommand; import com.example.api.board.dto.request.EmployeeIdRequest; import com.example.api.board.dto.update.UpdateExternalCareerRequest; @@ -186,4 +187,19 @@ private static List filterNewExternalCareers(UpdateExternalCaree }) .collect(Collectors.toList()); } + + @Transactional(readOnly = true) + public IntroductionResponse getIntroduction(final EmployeeIdRequest employeeIdRequest) { + return new IntroductionResponse(accountRepository.findIntroductionByAccountId(employeeIdRequest.employeeId())); + } + + @Transactional + public IntroductionResponse postIntroduction( + final EmployeeIdRequest employeeIdRequest, + final AddIntroductionRequest request) { + Account user = accountRepository.findById(employeeIdRequest.employeeId()).orElseThrow(() -> new BusinessException(ErrorCode.NULL_USER)); + user.setIntroduction(request.introduction()); + accountRepository.save(user); + return new IntroductionResponse(request.introduction()); + } } \ No newline at end of file diff --git a/src/main/java/com/example/api/board/service/EmployeeService.java b/src/main/java/com/example/api/board/service/EmployeeService.java index b7590305..b51e712b 100644 --- a/src/main/java/com/example/api/board/service/EmployeeService.java +++ b/src/main/java/com/example/api/board/service/EmployeeService.java @@ -43,7 +43,9 @@ private UpdatePersonalInfoRequest getUpdateUserInfoRequest(UpdatePersonalInfoReq personalInfo.age(), personalInfo.phoneNumber(), personalInfo.email(), - personalInfo.nickname() + personalInfo.nickname(), + personalInfo.birthdate(), + personalInfo.callTime() ); } } \ 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 15eddf46..32ce5511 100644 --- a/src/main/java/com/example/api/domain/Account.java +++ b/src/main/java/com/example/api/domain/Account.java @@ -45,6 +45,12 @@ public class Account extends BaseEntity { private int age; @Column(name = "ACCOUNT_PROFILE_IMAGE") private String profileImage; + @Column(name = "ACCOUNT_BIRTHDATE") + private String birthdate; + @Column(name = "ACCOUNT_CALLTIME") + private String callTime; + @Column(name = "ACCOUNT_INTRODUCTION") + private String introduction; @Column(name = "ACCOUNT_STAR_RATING", columnDefinition = "FLOAT DEFAULT 0.0f") private Float starPoint; @Column(name = "ACCOUNT_WORK_COUNT", columnDefinition = "INTEGER DEFAULT 0") @@ -122,6 +128,8 @@ public void updateUserInfo(UpdatePersonalInfoRequest request){ this.phoneNumber = request.phoneNumber(); this.email = request.email(); this.nickname = request.nickname(); + this.birthdate = request.birthdate(); + this.callTime = request.callTime(); } public void setDeleted(boolean deleted){ @@ -135,4 +143,8 @@ public void setOpenStatus(boolean openStatus) { public void setAccountId(long l) { this.accountId = l; } + + public void setIntroduction(String introduction) { + this.introduction = introduction; + } } \ No newline at end of file diff --git a/src/main/resources/static/danpat.yaml b/src/main/resources/static/danpat.yaml index f110d7d3..a5d463ab 100644 --- a/src/main/resources/static/danpat.yaml +++ b/src/main/resources/static/danpat.yaml @@ -411,6 +411,9 @@ paths: sex: "남" email: "chulsoo@example.com" phoneNumber: "010-1234-5678" + profile: "https://danpat.s3.ap-northeast-2.amazonaws.com/user-uploads/1/profile.png" + birthdate: "yyyy.mm.dd" + callTime: "hh:mm~hh:mm" starPoint: 4.5 workCount: 100 post: @@ -526,6 +529,41 @@ paths: businessName: "김태영닷컴" startTime: "2024-02-15 12:00:00" endTime: "2024-02-15 14:00:00" + /api/v1/possible-board/introduction: + get: + tags: + - BoardController + operationId: getIntroduction + responses: + "200": + description: OK + content: + '*/*': + schema: + type: object + example: + introduction : "자기소개" + post: + tags: + - BoardController + operationId: postIntroduction + requestBody: + content: + application/json: + schema: + type: object + example: + introduction: "자기소개" + required: true + responses: + "200": + description: OK + content: + '*/*': + schema: + type: object + example: + introduction: "자기소개" /api/v1/upload/profile: post: tags: @@ -2373,6 +2411,17 @@ components: workCount: type: integer format: int32 + IntroductionRequest: + type: object + properties: + introduction: + type: string + AddIntroductionResponse: + type: object + properties: + introduction: + type: string + securitySchemes: JWT_TOKEN: type: http From eff70e3a17829736189c0e50166401cf1ee47bc2 Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Wed, 12 Feb 2025 00:51:53 +0900 Subject: [PATCH 260/276] myInfoRepository delete --- .../com/example/api/domain/QAccount.java | 6 ++++++ .../api/domain/repository/MyInfoRepository.java | 17 ----------------- 2 files changed, 6 insertions(+), 17 deletions(-) delete mode 100644 src/main/java/com/example/api/domain/repository/MyInfoRepository.java diff --git a/src/main/generated/com/example/api/domain/QAccount.java b/src/main/generated/com/example/api/domain/QAccount.java index bebfa199..065f7888 100644 --- a/src/main/generated/com/example/api/domain/QAccount.java +++ b/src/main/generated/com/example/api/domain/QAccount.java @@ -26,6 +26,10 @@ public class QAccount extends EntityPathBase { public final NumberPath age = createNumber("age", Integer.class); + public final StringPath birthdate = createString("birthdate"); + + public final StringPath callTime = createString("callTime"); + //inherited public final DateTimePath createdDate = _super.createdDate; @@ -35,6 +39,8 @@ public class QAccount extends EntityPathBase { public final BooleanPath emailReceivable = createBoolean("emailReceivable"); + public final StringPath introduction = createString("introduction"); + public final StringPath loginId = createString("loginId"); public final StringPath name = createString("name"); diff --git a/src/main/java/com/example/api/domain/repository/MyInfoRepository.java b/src/main/java/com/example/api/domain/repository/MyInfoRepository.java deleted file mode 100644 index 48123abe..00000000 --- a/src/main/java/com/example/api/domain/repository/MyInfoRepository.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.example.api.domain.repository; - -import com.example.api.board.dto.response.PersonalInfoResponse; -import com.example.api.domain.Account; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; -import org.springframework.stereotype.Repository; - -@Repository -public interface MyInfoRepository extends JpaRepository { - @Query("select new com.example.api.board.dto.response." + - "PersonalInfoResponse(a.name, a.nickname, a.age, a.sex, a.email, a.phoneNumber, a.starPoint, a.workCount) " + - "from Account a " + - "where a.accountId = :EmployeeId") - PersonalInfoResponse findMyInfoDTOById(@Param("EmployeeId") Long EmployeeId); -} From 4b5bb0ef34d1b02a0e8c1d79b4fa916da05ec6aa Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Wed, 12 Feb 2025 09:07:22 +0900 Subject: [PATCH 261/276] update available work hours --- .gitignore | 5 +++- .../dto/request/ContractDetailRequest.java | 15 ++++++++++ .../board/dto/response/WorkHourResponse.java | 8 +++++- .../api/board/entitiy/PossibleMapper.java | 28 +++++++++++++++++++ .../repository/PossibleBoardRepository.java | 9 ++++-- .../api/board/service/BoardService.java | 11 +++++++- .../api/contracts/ContractRepository.java | 10 +++++++ .../api/contracts/ContractService.java | 24 +++++++++++++++- 8 files changed, 103 insertions(+), 7 deletions(-) create mode 100644 src/main/java/com/example/api/board/dto/request/ContractDetailRequest.java diff --git a/.gitignore b/.gitignore index ab064487..b05e212f 100644 --- a/.gitignore +++ b/.gitignore @@ -37,4 +37,7 @@ out/ .vscode/ ### .env ### -.env \ No newline at end of file +.env + +### local swagger file ### +src/main/resources/static/danpat-local.yaml \ No newline at end of file diff --git a/src/main/java/com/example/api/board/dto/request/ContractDetailRequest.java b/src/main/java/com/example/api/board/dto/request/ContractDetailRequest.java new file mode 100644 index 00000000..f66b77ce --- /dev/null +++ b/src/main/java/com/example/api/board/dto/request/ContractDetailRequest.java @@ -0,0 +1,15 @@ +package com.example.api.board.dto.request; + +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; + +public record ContractDetailRequest( + Long id, + String title, + @EqualsAndHashCode.Include + LocalDateTime startTime, + @EqualsAndHashCode.Include + LocalDateTime endTime +) { +} diff --git a/src/main/java/com/example/api/board/dto/response/WorkHourResponse.java b/src/main/java/com/example/api/board/dto/response/WorkHourResponse.java index 36f5b030..10c4da3e 100644 --- a/src/main/java/com/example/api/board/dto/response/WorkHourResponse.java +++ b/src/main/java/com/example/api/board/dto/response/WorkHourResponse.java @@ -6,9 +6,15 @@ public record WorkHourResponse( Long id, + String title, @EqualsAndHashCode.Include LocalDateTime startTime, @EqualsAndHashCode.Include - LocalDateTime endTime + LocalDateTime endTime, + Status status ) { + public enum Status { + COMPLETED, + AVAILABLE + } } \ No newline at end of file diff --git a/src/main/java/com/example/api/board/entitiy/PossibleMapper.java b/src/main/java/com/example/api/board/entitiy/PossibleMapper.java index 5daf2c13..046e3205 100644 --- a/src/main/java/com/example/api/board/entitiy/PossibleMapper.java +++ b/src/main/java/com/example/api/board/entitiy/PossibleMapper.java @@ -1,12 +1,40 @@ package com.example.api.board.entitiy; +import com.example.api.board.dto.request.ContractDetailRequest; +import com.example.api.board.dto.response.WorkHourResponse; import com.example.api.domain.*; import org.springframework.stereotype.Service; +import java.util.List; + +import static java.util.stream.Collectors.toList; + @Service public class PossibleMapper { public PossibleBoard toBoard(final Account account, final PossibleTime possibleTime) { return new PossibleBoard(account, possibleTime.getStartTime(), possibleTime.getEndTime()); } + + public List toWorkResponseFromPossibleBoard(final List possibleBoard) { + return possibleBoard.stream() + .map(board -> new WorkHourResponse( + board.getPossibleId(), + null, + board.getStartTime(), + board.getEndTime(), + WorkHourResponse.Status.AVAILABLE)) + .collect(toList()); + } + + public List toWorkResponseFromContract(final List contractRequest) { + return contractRequest.stream() + .map(contract -> new WorkHourResponse( + contract.id(), + contract.title(), + contract.startTime(), + contract.endTime(), + WorkHourResponse.Status.COMPLETED)) + .collect(toList()); + } } \ No newline at end of file diff --git a/src/main/java/com/example/api/board/repository/PossibleBoardRepository.java b/src/main/java/com/example/api/board/repository/PossibleBoardRepository.java index 8a51bbc8..8c0d3c5b 100644 --- a/src/main/java/com/example/api/board/repository/PossibleBoardRepository.java +++ b/src/main/java/com/example/api/board/repository/PossibleBoardRepository.java @@ -22,7 +22,10 @@ public interface PossibleBoardRepository extends JpaRepository= :currentMonth") - List findScheduleFromCurrentMonth(@Param("employeeId")Long employeeId, @Param("currentMonth") LocalDateTime currentMonth); + @Query("select p from PossibleBoard p where p.employee.accountId = :employeeId and p.startTime >= :currentMonth") + List findScheduleFromCurrentMonth(@Param("employeeId")Long employeeId, @Param("currentMonth") LocalDateTime currentMonth); + + @Query("select p from PossibleBoard p where p.employee.accountId = :employeeId and p.startTime <= :endDateTime and p.endTime >= :startDateTime") + PossibleBoard findMatchingWorkHours(@Param("startDateTime") final LocalDateTime startDateTimeIncluded, + @Param("endDateTime") final LocalDateTime endDateTimeIncluded); } \ No newline at end of file diff --git a/src/main/java/com/example/api/board/service/BoardService.java b/src/main/java/com/example/api/board/service/BoardService.java index 47a15096..116db320 100644 --- a/src/main/java/com/example/api/board/service/BoardService.java +++ b/src/main/java/com/example/api/board/service/BoardService.java @@ -4,6 +4,7 @@ import com.example.api.account.service.AccountService; import com.example.api.board.dto.request.AddIntroductionRequest; import com.example.api.board.dto.request.AddPossibleTimeCommand; +import com.example.api.board.dto.request.ContractDetailRequest; import com.example.api.board.dto.request.EmployeeIdRequest; import com.example.api.board.dto.update.UpdateExternalCareerRequest; import com.example.api.board.dto.update.UpdatePreferredCategoriesRequest; @@ -11,6 +12,7 @@ import com.example.api.board.dto.update.UpdatePreferredDistrictsRequest; import com.example.api.board.entitiy.PossibleMapper; import com.example.api.board.entitiy.PossibleTime; +import com.example.api.contracts.ContractRepository; import com.example.api.domain.*; import com.example.api.domain.repository.*; import com.example.api.board.repository.PossibleBoardRepository; @@ -29,6 +31,7 @@ import java.util.Map; import java.util.Set; import java.util.stream.Collectors; +import java.util.stream.Stream; @Service @RequiredArgsConstructor @@ -43,6 +46,7 @@ public class BoardService { private final AccountService accountService; private final PossibleMapper possibleMapper; private final SubCategoryRepository subCategoryRepository; + private final ContractRepository contractRepository; @Transactional(readOnly = true) public PersonalInfoResponse getPersonalInfoResponse(final EmployeeIdRequest employeeIdRequest){ @@ -66,7 +70,12 @@ public List getPreferredCategories(final EmployeeIdReq @Transactional(readOnly = true) public List getWorkHours(final EmployeeIdRequest employeeIdRequest) { - return possibleBoardRepository.findScheduleFromCurrentMonth(employeeIdRequest.employeeId(), LocalDate.now().atStartOfDay()); + List boardScheduleFromCurrentMonth = possibleBoardRepository.findScheduleFromCurrentMonth(employeeIdRequest.employeeId(), LocalDate.now().atStartOfDay()); + List contractScheduleFromCurrentMonth = contractRepository.findScheduleFromCurrentMonth(employeeIdRequest.employeeId(), LocalDate.now().atStartOfDay()); + List possibleBoardResponses = possibleMapper.toWorkResponseFromPossibleBoard(boardScheduleFromCurrentMonth); + List contractResponses = possibleMapper.toWorkResponseFromContract(contractScheduleFromCurrentMonth); + return Stream.concat(possibleBoardResponses.stream(), contractResponses.stream()) + .collect(Collectors.toList()); } @Transactional(readOnly = true) diff --git a/src/main/java/com/example/api/contracts/ContractRepository.java b/src/main/java/com/example/api/contracts/ContractRepository.java index e2e61f65..8641d9d1 100644 --- a/src/main/java/com/example/api/contracts/ContractRepository.java +++ b/src/main/java/com/example/api/contracts/ContractRepository.java @@ -1,5 +1,6 @@ package com.example.api.contracts; +import com.example.api.board.dto.request.ContractDetailRequest; import com.example.api.contracts.dto.BusinessInfoDTO; import com.example.api.contracts.dto.ContractScheduleResponse; import com.example.api.contracts.dto.EmployeeInfoDTO; @@ -7,6 +8,8 @@ import java.time.LocalDateTime; import java.util.Optional; + +import com.example.api.domain.PossibleBoard; import com.example.api.review.dto.ReviewAvailableResponse; import com.example.api.suggest.controller.dto.request.OfferEmploymentDetailRequest; import org.springframework.data.jpa.repository.JpaRepository; @@ -60,4 +63,11 @@ List findContractScheduleByEmployeeId(@Param("employee "join oe.business b " + "where c.contractId = :contractId") OfferEmploymentDetailRequest findContractByContractId(@Param("contractId") Long contractId); + + @Query("select new com.example.api.board.dto.request.ContractDetailRequest(c.contractId, b.businessName, c.contractStartTime, c.contractEndTime) " + + "from Contract c " + + "Join OfferEmployment oe on c.contractId = oe.suggestId " + + "Join oe.business b on oe.business.businessId = b.businessId " + + "where oe.employee.accountId = :employeeId and c.contractStartTime >= :currentMonth") + List findScheduleFromCurrentMonth(@Param("employeeId")Long employeeId, @Param("currentMonth") LocalDateTime currentMonth); } diff --git a/src/main/java/com/example/api/contracts/ContractService.java b/src/main/java/com/example/api/contracts/ContractService.java index 9e93640e..6eb91f4e 100644 --- a/src/main/java/com/example/api/contracts/ContractService.java +++ b/src/main/java/com/example/api/contracts/ContractService.java @@ -1,25 +1,35 @@ package com.example.api.contracts; +import com.example.api.account.repository.AccountRepository; import com.example.api.board.dto.request.EmployeeIdRequest; +import com.example.api.board.repository.PossibleBoardRepository; import com.example.api.contracts.dto.*; import com.example.api.contracts.update.UpdateContractConditionManager; import com.example.api.contracts.dto.UpdateContractConditionCommand; +import com.example.api.domain.Account; import com.example.api.domain.Contract; import java.time.LocalDate; import java.util.List; + +import com.example.api.domain.PossibleBoard; +import com.example.api.global.exception.BusinessException; +import com.example.api.global.exception.ErrorCode; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; +@Slf4j @Service @RequiredArgsConstructor public class ContractService { private final ContractRepository contractRepository; private final UpdateContractConditionManager updateContractConditionManager; - + private final PossibleBoardRepository possibleBoardRepository; + private final AccountRepository accountRepository; @Transactional @@ -32,6 +42,18 @@ public void updateContract(@Validated final UpdateContractConditionCommand updat public void acceptContract(@Validated final AcceptContractCommand acceptContractCommand) { final Contract contract = loadContract(acceptContractCommand.contractId()); contract.succeed(); + // 계약 시간에 따른 근무 가능 시간 변경 + updateAvailableWorkHours(acceptContractCommand, contract); + } + + private void updateAvailableWorkHours(AcceptContractCommand acceptContractCommand, Contract contract) { + Account user = accountRepository.findById(acceptContractCommand.contractId()).orElseThrow(() -> new BusinessException(ErrorCode.NULL_USER)); + PossibleBoard matchingWorkHours = possibleBoardRepository.findMatchingWorkHours(contract.getContractStartTime(), contract.getContractEndTime()); + PossibleBoard firstSplitWorkHour = new PossibleBoard(user, matchingWorkHours.getStartTime(), contract.getContractEndTime()); + PossibleBoard secondSplitWorkHour = new PossibleBoard(user, contract.getContractStartTime(), matchingWorkHours.getEndTime()); + + possibleBoardRepository.delete(matchingWorkHours);.log + possibleBoardRepository.saveAll(List.of(firstSplitWorkHour, secondSplitWorkHour)); } private Contract loadContract(final Long contractId) { From f9a8ebcaba8f3437933f4c3d2fe9447bfb9f4f56 Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Wed, 12 Feb 2025 09:07:51 +0900 Subject: [PATCH 262/276] update available work hours --- src/main/java/com/example/api/contracts/ContractService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/api/contracts/ContractService.java b/src/main/java/com/example/api/contracts/ContractService.java index 6eb91f4e..82ff0a3b 100644 --- a/src/main/java/com/example/api/contracts/ContractService.java +++ b/src/main/java/com/example/api/contracts/ContractService.java @@ -52,7 +52,7 @@ private void updateAvailableWorkHours(AcceptContractCommand acceptContractComman PossibleBoard firstSplitWorkHour = new PossibleBoard(user, matchingWorkHours.getStartTime(), contract.getContractEndTime()); PossibleBoard secondSplitWorkHour = new PossibleBoard(user, contract.getContractStartTime(), matchingWorkHours.getEndTime()); - possibleBoardRepository.delete(matchingWorkHours);.log + possibleBoardRepository.delete(matchingWorkHours); possibleBoardRepository.saveAll(List.of(firstSplitWorkHour, secondSplitWorkHour)); } From df21fa7031268a4015709caa23e59d3062a9bfbe Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Wed, 12 Feb 2025 09:22:40 +0900 Subject: [PATCH 263/276] refactoring available time --- .../repository/PossibleBoardRepository.java | 6 ++- .../api/contracts/ContractService.java | 37 ++++++++++++++++--- .../api/global/exception/ErrorCode.java | 1 + src/main/resources/static/danpat.yaml | 14 ++++++- 4 files changed, 48 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/example/api/board/repository/PossibleBoardRepository.java b/src/main/java/com/example/api/board/repository/PossibleBoardRepository.java index 8c0d3c5b..8a305994 100644 --- a/src/main/java/com/example/api/board/repository/PossibleBoardRepository.java +++ b/src/main/java/com/example/api/board/repository/PossibleBoardRepository.java @@ -9,6 +9,8 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.util.List; +import java.util.Optional; + import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; @@ -26,6 +28,6 @@ Integer deleteDuplicatedWorkTimeIncluded(@Param("startDateTime") final LocalDate List findScheduleFromCurrentMonth(@Param("employeeId")Long employeeId, @Param("currentMonth") LocalDateTime currentMonth); @Query("select p from PossibleBoard p where p.employee.accountId = :employeeId and p.startTime <= :endDateTime and p.endTime >= :startDateTime") - PossibleBoard findMatchingWorkHours(@Param("startDateTime") final LocalDateTime startDateTimeIncluded, - @Param("endDateTime") final LocalDateTime endDateTimeIncluded); + Optional findMatchingWorkHours(@Param("startDateTime") final LocalDateTime startDateTimeIncluded, + @Param("endDateTime") final LocalDateTime endDateTimeIncluded); } \ No newline at end of file diff --git a/src/main/java/com/example/api/contracts/ContractService.java b/src/main/java/com/example/api/contracts/ContractService.java index 82ff0a3b..5f2031e1 100644 --- a/src/main/java/com/example/api/contracts/ContractService.java +++ b/src/main/java/com/example/api/contracts/ContractService.java @@ -11,6 +11,7 @@ import java.time.LocalDate; +import java.util.ArrayList; import java.util.List; import com.example.api.domain.PossibleBoard; @@ -46,16 +47,40 @@ public void acceptContract(@Validated final AcceptContractCommand acceptContract updateAvailableWorkHours(acceptContractCommand, contract); } - private void updateAvailableWorkHours(AcceptContractCommand acceptContractCommand, Contract contract) { - Account user = accountRepository.findById(acceptContractCommand.contractId()).orElseThrow(() -> new BusinessException(ErrorCode.NULL_USER)); - PossibleBoard matchingWorkHours = possibleBoardRepository.findMatchingWorkHours(contract.getContractStartTime(), contract.getContractEndTime()); - PossibleBoard firstSplitWorkHour = new PossibleBoard(user, matchingWorkHours.getStartTime(), contract.getContractEndTime()); - PossibleBoard secondSplitWorkHour = new PossibleBoard(user, contract.getContractStartTime(), matchingWorkHours.getEndTime()); + public void updateAvailableWorkHours(AcceptContractCommand acceptContractCommand, Contract contract) { + Account user = accountRepository.findById(acceptContractCommand.contractId()) + .orElseThrow(() -> new BusinessException(ErrorCode.NULL_USER)); + PossibleBoard matchingWorkHours = possibleBoardRepository.findMatchingWorkHours(contract.getContractStartTime(), contract.getContractEndTime()) + .orElseThrow(() -> new BusinessException(ErrorCode.POSSIBLE_TIME_NULL_EXCEPTION)); + + // 예약 시간이 기존 근무 가능 시간과 완전히 일치하면 삭제 후 종료 + if (matchingWorkHours.getStartTime().equals(contract.getContractStartTime()) && + matchingWorkHours.getEndTime().equals(contract.getContractEndTime())) { + possibleBoardRepository.delete(matchingWorkHours); + return; + } + + List updatedWorkHours = new ArrayList<>(); + + // 앞쪽 시간이 남아 있다면 추가 + if (!matchingWorkHours.getStartTime().equals(contract.getContractStartTime())) { + updatedWorkHours.add(new PossibleBoard(user, matchingWorkHours.getStartTime(), contract.getContractStartTime())); + } + + // 뒷쪽 시간이 남아 있다면 추가 + if (!matchingWorkHours.getEndTime().equals(contract.getContractEndTime())) { + updatedWorkHours.add(new PossibleBoard(user, contract.getContractEndTime(), matchingWorkHours.getEndTime())); + } + + // 기존 근무 가능 시간 삭제 후, 새로운 시간 저장 possibleBoardRepository.delete(matchingWorkHours); - possibleBoardRepository.saveAll(List.of(firstSplitWorkHour, secondSplitWorkHour)); + if (!updatedWorkHours.isEmpty()) { + possibleBoardRepository.saveAll(updatedWorkHours); + } } + private Contract loadContract(final Long contractId) { return contractRepository.findById(contractId) .orElseThrow(); diff --git a/src/main/java/com/example/api/global/exception/ErrorCode.java b/src/main/java/com/example/api/global/exception/ErrorCode.java index 9f86ad2e..d2b49e9c 100644 --- a/src/main/java/com/example/api/global/exception/ErrorCode.java +++ b/src/main/java/com/example/api/global/exception/ErrorCode.java @@ -32,6 +32,7 @@ public enum ErrorCode { ACCOUNT_NOT_FOUND_EXCEPTION(HttpStatus.BAD_REQUEST, "-101", "찾을 수 없는 계정"), POSSIBLE_TIME_REGISTER_EXCEPTION(HttpStatus.BAD_REQUEST, "-401", "알바 가능 시간 등록 에러"), + POSSIBLE_TIME_NULL_EXCEPTION(HttpStatus.BAD_REQUEST, "-402", "알바 가능 시간 존재 에러"), CATEGORY_EXCEPTION(HttpStatus.BAD_REQUEST, "-601", "카테고리 에러"), diff --git a/src/main/resources/static/danpat.yaml b/src/main/resources/static/danpat.yaml index a5d463ab..e049d2c6 100644 --- a/src/main/resources/static/danpat.yaml +++ b/src/main/resources/static/danpat.yaml @@ -305,8 +305,12 @@ paths: example: - categoryId: 8 categoryName: "IT•인터넷" + subCategoryId: 8002 + subCategoryName: "웹/모바일기획" - categoryId: 9 categoryName: "교육•강사" + subCategoryId: 8002 + subCategoryName: "입시/보습학원" post: tags: - BoardController @@ -318,8 +322,10 @@ paths: $ref: "#/components/schemas/UpdatePreferredCategoriesRequest" example: categoryIds: - - 8 - - 9 + - categoryId: 8 + subCategoryId: 8002 + - categoryId: 9 + subCategoryId: 9002 required: true responses: "200": @@ -351,11 +357,15 @@ paths: $ref: "#/components/schemas/WorkHourResponse" example: - id: 101 + title: null startTime: "2024-02-01T09:00:00" endTime: "2024-02-01T18:00:00" + status: "AVAILABLE" - id: 102 + title: "김태영닷컴" startTime: "2024-02-02T10:00:00" endTime: "2024-02-02T19:00:00" + status: "COMPLETED" post: tags: - BoardController From 5b99fc01116cce0ede2675a5a409d0794125495e Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Sun, 16 Feb 2025 01:49:19 +0900 Subject: [PATCH 264/276] =?UTF-8?q?=EC=A3=BC=EC=86=8C=20=EB=B3=80=EA=B2=BD?= =?UTF-8?q?=EC=97=90=20=EB=94=B0=EB=A5=B8=20=EB=8C=80=EB=9F=89=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/api/domain/QAccount.java | 19 +- .../com/example/api/domain/QBusiness.java | 6 +- .../com/example/api/domain/QCityDistrict.java | 47 -- .../example/api/domain/QFlavoredDistrict.java | 8 +- .../com/example/api/domain/QInquiry.java | 2 +- .../QLocation.java} | 28 +- .../account/dto/SignUpEmployeeRequest.java | 7 +- .../account/dto/SignUpEmployerRequest.java | 46 +- .../account/repository/AccountRepository.java | 4 + .../repository/LocationRepository.java | 4 +- .../api/account/service/AccountService.java | 10 +- .../example/api/auth/service/AuthService.java | 2 +- .../api/board/controller/BoardController.java | 1 - .../response/FlavoredDistrictResponse.java | 5 +- .../dto/response/PersonalInfoResponse.java | 8 +- .../dto/update/UpdatePersonalInfoRequest.java | 5 +- .../UpdatePreferredDistrictsRequest.java | 4 +- .../api/board/service/BoardService.java | 13 +- .../api/board/service/EmployeeService.java | 3 +- .../api/business/BusinessQueryService.java | 6 +- .../api/business/BusinessRepository.java | 2 +- .../example/api/business/BusinessService.java | 2 + .../controller/BusinessController.java | 18 +- .../api/business/dto/AddBusinessCommand.java | 8 +- .../business/dto/BusinessDetailsResponse.java | 8 +- .../business/dto/ModifyBusinessCommand.java | 8 +- .../update/UpdateBusinessLocationHandler.java | 9 +- .../business/update/UpdateEmailHandler.java | 22 + .../update/UpdatePhoneNumberHandler.java | 23 + .../api/contracts/ContractRepository.java | 2 +- .../api/contracts/dto/BusinessInfoDTO.java | 5 +- .../java/com/example/api/domain/Account.java | 26 +- .../java/com/example/api/domain/Business.java | 12 +- .../com/example/api/domain/CityDistrict.java | 22 - .../example/api/domain/ExternalCareer.java | 1 + .../example/api/domain/FlavoredDistrict.java | 10 +- .../java/com/example/api/domain/Inquiry.java | 2 + .../Location.java} | 39 +- .../FlavoredDistrictRepository.java | 18 +- .../repository/OfferEmploymentRepository.java | 2 +- .../controller/EmployerController.java | 4 +- .../dto/EmployerBusinessesRequest.java | 5 +- .../controller/dto/LikeEmployeeDTO.java | 2 + .../api/employer/service/EmployerService.java | 5 +- .../setting/controller/SettingController.java | 39 ++ .../api/setting/dto/EmailConsentRequest.java | 7 + .../api/setting/dto/EmailConsentResponse.java | 6 + .../api/setting/service/SettingService.java | 28 + .../suggest/controller/SuggestController.java | 2 +- .../controller/dto/SuggestStatusDTO.java | 1 + .../request/OfferEmploymentDetailRequest.java | 1 + .../api/suggest/service/SuggestService.java | 1 + src/main/resources/static/danpat.yaml | 487 ++++++++++++------ .../employer/service/EmployerServiceTest.java | 8 +- .../OfferEmploymentServiceTest.java | 4 +- 55 files changed, 684 insertions(+), 383 deletions(-) delete mode 100644 src/main/generated/com/example/api/domain/QCityDistrict.java rename src/main/generated/com/example/api/{business/domain/QBusinessLocation.java => domain/QLocation.java} (53%) create mode 100644 src/main/java/com/example/api/business/update/UpdateEmailHandler.java create mode 100644 src/main/java/com/example/api/business/update/UpdatePhoneNumberHandler.java delete mode 100644 src/main/java/com/example/api/domain/CityDistrict.java rename src/main/java/com/example/api/{business/domain/BusinessLocation.java => domain/Location.java} (51%) create mode 100644 src/main/java/com/example/api/setting/controller/SettingController.java create mode 100644 src/main/java/com/example/api/setting/dto/EmailConsentRequest.java create mode 100644 src/main/java/com/example/api/setting/dto/EmailConsentResponse.java create mode 100644 src/main/java/com/example/api/setting/service/SettingService.java diff --git a/src/main/generated/com/example/api/domain/QAccount.java b/src/main/generated/com/example/api/domain/QAccount.java index 065f7888..4e0bfdc5 100644 --- a/src/main/generated/com/example/api/domain/QAccount.java +++ b/src/main/generated/com/example/api/domain/QAccount.java @@ -18,6 +18,8 @@ public class QAccount extends EntityPathBase { private static final long serialVersionUID = -1087167288L; + private static final PathInits INITS = PathInits.DIRECT2; + public static final QAccount account = new QAccount("account"); public final QBaseEntity _super = new QBaseEntity(this); @@ -41,6 +43,8 @@ public class QAccount extends EntityPathBase { public final StringPath introduction = createString("introduction"); + public final QLocation location; + public final StringPath loginId = createString("loginId"); public final StringPath name = createString("name"); @@ -69,15 +73,24 @@ public class QAccount extends EntityPathBase { public final NumberPath workCount = createNumber("workCount", Integer.class); public QAccount(String variable) { - super(Account.class, forVariable(variable)); + this(Account.class, forVariable(variable), INITS); } public QAccount(Path path) { - super(path.getType(), path.getMetadata()); + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); } public QAccount(PathMetadata metadata) { - super(Account.class, metadata); + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QAccount(PathMetadata metadata, PathInits inits) { + this(Account.class, metadata, inits); + } + + public QAccount(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.location = inits.isInitialized("location") ? new QLocation(forProperty("location")) : null; } } diff --git a/src/main/generated/com/example/api/domain/QBusiness.java b/src/main/generated/com/example/api/domain/QBusiness.java index 5492c02d..bc1267f3 100644 --- a/src/main/generated/com/example/api/domain/QBusiness.java +++ b/src/main/generated/com/example/api/domain/QBusiness.java @@ -35,7 +35,7 @@ public class QBusiness extends EntityPathBase { public final QAccount employer; - public final com.example.api.business.domain.QBusinessLocation location; + public final QLocation location; public final StringPath openDate = createString("openDate"); @@ -64,8 +64,8 @@ public QBusiness(PathMetadata metadata, PathInits inits) { public QBusiness(Class type, PathMetadata metadata, PathInits inits) { super(type, metadata, inits); - this.employer = inits.isInitialized("employer") ? new QAccount(forProperty("employer")) : null; - this.location = inits.isInitialized("location") ? new com.example.api.business.domain.QBusinessLocation(forProperty("location")) : null; + this.employer = inits.isInitialized("employer") ? new QAccount(forProperty("employer"), inits.get("employer")) : null; + this.location = inits.isInitialized("location") ? new QLocation(forProperty("location")) : null; } } diff --git a/src/main/generated/com/example/api/domain/QCityDistrict.java b/src/main/generated/com/example/api/domain/QCityDistrict.java deleted file mode 100644 index ff7a1724..00000000 --- a/src/main/generated/com/example/api/domain/QCityDistrict.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.example.api.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; - - -/** - * QCityDistrict is a Querydsl query type for CityDistrict - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QCityDistrict extends EntityPathBase { - - private static final long serialVersionUID = 922969182L; - - public static final QCityDistrict cityDistrict = new QCityDistrict("cityDistrict"); - - public final QBaseEntity _super = new QBaseEntity(this); - - //inherited - public final DateTimePath createdDate = _super.createdDate; - - public final StringPath district = createString("district"); - - public final NumberPath id = createNumber("id", Long.class); - - //inherited - public final DateTimePath updatedDate = _super.updatedDate; - - public QCityDistrict(String variable) { - super(CityDistrict.class, forVariable(variable)); - } - - public QCityDistrict(Path path) { - super(path.getType(), path.getMetadata()); - } - - public QCityDistrict(PathMetadata metadata) { - super(CityDistrict.class, metadata); - } - -} - diff --git a/src/main/generated/com/example/api/domain/QFlavoredDistrict.java b/src/main/generated/com/example/api/domain/QFlavoredDistrict.java index ff735ae4..62ffcca5 100644 --- a/src/main/generated/com/example/api/domain/QFlavoredDistrict.java +++ b/src/main/generated/com/example/api/domain/QFlavoredDistrict.java @@ -27,12 +27,12 @@ public class QFlavoredDistrict extends EntityPathBase { //inherited public final DateTimePath createdDate = _super.createdDate; - public final QCityDistrict district; - public final QAccount employee; public final NumberPath id = createNumber("id", Long.class); + public final QLocation location; + //inherited public final DateTimePath updatedDate = _super.updatedDate; @@ -54,8 +54,8 @@ public QFlavoredDistrict(PathMetadata metadata, PathInits inits) { public QFlavoredDistrict(Class type, PathMetadata metadata, PathInits inits) { super(type, metadata, inits); - this.district = inits.isInitialized("district") ? new QCityDistrict(forProperty("district")) : null; - this.employee = inits.isInitialized("employee") ? new QAccount(forProperty("employee")) : null; + this.employee = inits.isInitialized("employee") ? new QAccount(forProperty("employee"), inits.get("employee")) : null; + this.location = inits.isInitialized("location") ? new QLocation(forProperty("location")) : null; } } diff --git a/src/main/generated/com/example/api/domain/QInquiry.java b/src/main/generated/com/example/api/domain/QInquiry.java index b1d0cfbb..44ef3fa4 100644 --- a/src/main/generated/com/example/api/domain/QInquiry.java +++ b/src/main/generated/com/example/api/domain/QInquiry.java @@ -64,7 +64,7 @@ public QInquiry(PathMetadata metadata, PathInits inits) { public QInquiry(Class type, PathMetadata metadata, PathInits inits) { super(type, metadata, inits); - this.createdBy = inits.isInitialized("createdBy") ? new QAccount(forProperty("createdBy")) : null; + this.createdBy = inits.isInitialized("createdBy") ? new QAccount(forProperty("createdBy"), inits.get("createdBy")) : null; } } diff --git a/src/main/generated/com/example/api/business/domain/QBusinessLocation.java b/src/main/generated/com/example/api/domain/QLocation.java similarity index 53% rename from src/main/generated/com/example/api/business/domain/QBusinessLocation.java rename to src/main/generated/com/example/api/domain/QLocation.java index b8886256..e9355bcf 100644 --- a/src/main/generated/com/example/api/business/domain/QBusinessLocation.java +++ b/src/main/generated/com/example/api/domain/QLocation.java @@ -1,4 +1,4 @@ -package com.example.api.business.domain; +package com.example.api.domain; import static com.querydsl.core.types.PathMetadataFactory.*; @@ -10,16 +10,16 @@ /** - * QBusinessLocation is a Querydsl query type for BusinessLocation + * QLocation is a Querydsl query type for Location */ @Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QBusinessLocation extends EntityPathBase { +public class QLocation extends EntityPathBase { - private static final long serialVersionUID = 1235580438L; + private static final long serialVersionUID = 400775290L; - public static final QBusinessLocation businessLocation = new QBusinessLocation("businessLocation"); + 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 QBaseEntity _super = new QBaseEntity(this); public final StringPath address = createString("address"); @@ -28,23 +28,29 @@ public class QBusinessLocation extends EntityPathBase { public final StringPath detailAddress = createString("detailAddress"); + public final StringPath dong = createString("dong"); + public final NumberPath id = createNumber("id", Long.class); + public final StringPath sido = createString("sido"); + + public final StringPath sigugun = createString("sigugun"); + //inherited public final DateTimePath updatedDate = _super.updatedDate; public final StringPath zipcode = createString("zipcode"); - public QBusinessLocation(String variable) { - super(BusinessLocation.class, forVariable(variable)); + public QLocation(String variable) { + super(Location.class, forVariable(variable)); } - public QBusinessLocation(Path path) { + public QLocation(Path path) { super(path.getType(), path.getMetadata()); } - public QBusinessLocation(PathMetadata metadata) { - super(BusinessLocation.class, metadata); + public QLocation(PathMetadata metadata) { + super(Location.class, metadata); } } diff --git a/src/main/java/com/example/api/account/dto/SignUpEmployeeRequest.java b/src/main/java/com/example/api/account/dto/SignUpEmployeeRequest.java index a8f4ba3e..71e76a7e 100644 --- a/src/main/java/com/example/api/account/dto/SignUpEmployeeRequest.java +++ b/src/main/java/com/example/api/account/dto/SignUpEmployeeRequest.java @@ -2,6 +2,7 @@ import com.example.api.account.entity.Nationality; import com.example.api.account.entity.UserRole; +import com.example.api.domain.Location; import com.example.api.global.config.resolver.ValidEmail; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; @@ -24,6 +25,8 @@ public record SignUpEmployeeRequest( @NotBlank String phoneNumber, @NotNull - Boolean emailReceivable -) { + Boolean emailReceivable, + @NotNull + Location location + ) { } \ No newline at end of file diff --git a/src/main/java/com/example/api/account/dto/SignUpEmployerRequest.java b/src/main/java/com/example/api/account/dto/SignUpEmployerRequest.java index 7461466b..920602d9 100644 --- a/src/main/java/com/example/api/account/dto/SignUpEmployerRequest.java +++ b/src/main/java/com/example/api/account/dto/SignUpEmployerRequest.java @@ -1,6 +1,6 @@ package com.example.api.account.dto; -import com.example.api.business.domain.BusinessLocation; +import com.example.api.domain.Location; import com.example.api.account.entity.Nationality; import com.example.api.account.entity.UserRole; import com.example.api.global.config.resolver.ValidEmail; @@ -8,27 +8,27 @@ import jakarta.validation.constraints.NotNull; public record SignUpEmployerRequest( - @NotBlank - String loginId, // 로그인 id - @NotBlank - String password, // 비밀번호 - @ValidEmail - String email, // 이메일 - @NotBlank - String businessRegistrationNumber, // 사업자 번호 - @NotBlank - String businessName, // 회사명 - @NotBlank - String representationName, // 대표명 - @NotBlank - String businessOpenDate, // 개업연월일 - @NotNull - BusinessLocation location, - @NotNull - Nationality nationality, // 국적 - @NotNull - UserRole role, // 권한 - @NotBlank - String phoneNumber // 휴대폰 번호 + @NotBlank + String loginId, // 로그인 id + @NotBlank + String password, // 비밀번호 + @ValidEmail + String email, // 이메일 + @NotBlank + String businessRegistrationNumber, // 사업자 번호 + @NotBlank + String businessName, // 회사명 + @NotBlank + String representationName, // 대표명 + @NotBlank + String businessOpenDate, // 개업연월일 + @NotNull + Location location, // 가게 위치 (우편 주소 및 행정구역) + @NotNull + Nationality nationality, // 국적 + @NotNull + UserRole role, // 권한 + @NotBlank + String phoneNumber // 휴대폰 번호 ) { } \ No newline at end of file diff --git a/src/main/java/com/example/api/account/repository/AccountRepository.java b/src/main/java/com/example/api/account/repository/AccountRepository.java index 6a1befd1..ae33fc34 100644 --- a/src/main/java/com/example/api/account/repository/AccountRepository.java +++ b/src/main/java/com/example/api/account/repository/AccountRepository.java @@ -1,6 +1,7 @@ package com.example.api.account.repository; import com.example.api.domain.Account; +import com.example.api.setting.dto.EmailConsentResponse; import org.springframework.data.jpa.repository.EntityGraph; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; @@ -38,4 +39,7 @@ public interface AccountRepository extends JpaRepository { Optional findByEmployeeId(@Param("employeeId") Long employeeId); String findIntroductionByAccountId(Long accountId); + + @Query("select new com.example.api.setting.dto.EmailConsentResponse(a.emailReceivable) from Account a where a.accountId = :userId") + Optional findEmailReceivableById(@Param("userId") Long userId); } \ No newline at end of file diff --git a/src/main/java/com/example/api/account/repository/LocationRepository.java b/src/main/java/com/example/api/account/repository/LocationRepository.java index 4f2a6165..0dcbee34 100644 --- a/src/main/java/com/example/api/account/repository/LocationRepository.java +++ b/src/main/java/com/example/api/account/repository/LocationRepository.java @@ -1,9 +1,9 @@ package com.example.api.account.repository; -import com.example.api.business.domain.BusinessLocation; +import com.example.api.domain.Location; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @Repository -public interface LocationRepository extends JpaRepository { +public interface LocationRepository extends JpaRepository { } diff --git a/src/main/java/com/example/api/account/service/AccountService.java b/src/main/java/com/example/api/account/service/AccountService.java index dcc01d74..530f5540 100644 --- a/src/main/java/com/example/api/account/service/AccountService.java +++ b/src/main/java/com/example/api/account/service/AccountService.java @@ -2,7 +2,6 @@ import com.example.api.account.dto.*; import com.example.api.account.entity.Code; -import com.example.api.business.domain.BusinessLocation; import com.example.api.account.entity.UserRole; import com.example.api.account.repository.AccountRepository; import com.example.api.account.repository.CodeRepository; @@ -43,7 +42,6 @@ public class AccountService { private final BusinessRepository businessRepository; private final RestTemplate restTemplate; private final VendorProperties vendorProperties; - private final LocationRepository locationRepository; public Code sendEmail(@Validated final EmailRequest request) throws BusinessException { // 이미 가입된 이메일인지 검증 @@ -113,7 +111,8 @@ private Account saveEmployeeAccount(final SignUpEmployeeRequest request) { request.phoneNumber(), request.nationality(), roles, - request.emailReceivable() + request.emailReceivable(), + request.location() ); return accountRepository.save(account); } @@ -123,17 +122,16 @@ private void saveEmployerAccount(final SignUpEmployerRequest request) { Account account = new Account( request.loginId(), passwordEncoder.encode(request.password()), + request.representationName(), request.email(), request.phoneNumber(), request.nationality(), roles ); Account savedUser = accountRepository.save(account); - - BusinessLocation savedLocation = locationRepository.save(request.location()); Business business = new Business( request.businessName(), - savedLocation, + request.location(), request.representationName(), savedUser, request.businessOpenDate(), diff --git a/src/main/java/com/example/api/auth/service/AuthService.java b/src/main/java/com/example/api/auth/service/AuthService.java index ea941746..324b6de6 100644 --- a/src/main/java/com/example/api/auth/service/AuthService.java +++ b/src/main/java/com/example/api/auth/service/AuthService.java @@ -11,11 +11,11 @@ import com.example.api.global.exception.ErrorCode; import com.example.api.global.properties.JwtProperties; import jakarta.servlet.http.Cookie; -import jakarta.transaction.Transactional; import lombok.RequiredArgsConstructor; import org.jetbrains.annotations.NotNull; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import java.util.HashMap; diff --git a/src/main/java/com/example/api/board/controller/BoardController.java b/src/main/java/com/example/api/board/controller/BoardController.java index 6b759eae..eea26c2f 100644 --- a/src/main/java/com/example/api/board/controller/BoardController.java +++ b/src/main/java/com/example/api/board/controller/BoardController.java @@ -39,7 +39,6 @@ public ResponseEntity getPersonalInfo(@AuthenticationPrinc @GetMapping("/work-preferences/districts") public ResponseEntity> getPreferredDistricts(@AuthenticationPrincipal final Long employeeId){ - log.info("employee id: {}", employeeId); return ResponseEntity.ok(boardService.getPreferredDistricts(new EmployeeIdRequest(employeeId))); } diff --git a/src/main/java/com/example/api/board/dto/response/FlavoredDistrictResponse.java b/src/main/java/com/example/api/board/dto/response/FlavoredDistrictResponse.java index 14334884..61eea179 100644 --- a/src/main/java/com/example/api/board/dto/response/FlavoredDistrictResponse.java +++ b/src/main/java/com/example/api/board/dto/response/FlavoredDistrictResponse.java @@ -1,7 +1,8 @@ package com.example.api.board.dto.response; public record FlavoredDistrictResponse( - Long districtId, - String districtName + String sido, + String sigugun, + String dong ) { } \ No newline at end of file diff --git a/src/main/java/com/example/api/board/dto/response/PersonalInfoResponse.java b/src/main/java/com/example/api/board/dto/response/PersonalInfoResponse.java index 20d37cf0..4f5bb9e2 100644 --- a/src/main/java/com/example/api/board/dto/response/PersonalInfoResponse.java +++ b/src/main/java/com/example/api/board/dto/response/PersonalInfoResponse.java @@ -1,6 +1,7 @@ package com.example.api.board.dto.response; import com.example.api.domain.Account; +import com.example.api.domain.Location; public record PersonalInfoResponse( String name, @@ -13,7 +14,8 @@ public record PersonalInfoResponse( Integer workCount, String profile, String birthdate, - String callTime + String callTime, + Location location ) { public static PersonalInfoResponse of(Account user){ return new PersonalInfoResponse( @@ -27,7 +29,9 @@ public static PersonalInfoResponse of(Account user){ user.getWorkCount(), user.getProfileImage(), user.getBirthdate(), - user.getCallTime() + user.getCallTime(), + user.getLocation() ); } + } \ No newline at end of file diff --git a/src/main/java/com/example/api/board/dto/update/UpdatePersonalInfoRequest.java b/src/main/java/com/example/api/board/dto/update/UpdatePersonalInfoRequest.java index 13a1cbef..25301f5f 100644 --- a/src/main/java/com/example/api/board/dto/update/UpdatePersonalInfoRequest.java +++ b/src/main/java/com/example/api/board/dto/update/UpdatePersonalInfoRequest.java @@ -1,5 +1,7 @@ package com.example.api.board.dto.update; +import com.example.api.domain.Location; + public record UpdatePersonalInfoRequest( String name, String sex, @@ -8,6 +10,7 @@ public record UpdatePersonalInfoRequest( String email, String nickname, String birthdate, - String callTime + String callTime, + Location location ) implements UpdateAccountConditionCommand{ } diff --git a/src/main/java/com/example/api/board/dto/update/UpdatePreferredDistrictsRequest.java b/src/main/java/com/example/api/board/dto/update/UpdatePreferredDistrictsRequest.java index ad5499a7..f335f140 100644 --- a/src/main/java/com/example/api/board/dto/update/UpdatePreferredDistrictsRequest.java +++ b/src/main/java/com/example/api/board/dto/update/UpdatePreferredDistrictsRequest.java @@ -1,8 +1,10 @@ package com.example.api.board.dto.update; +import com.example.api.domain.Location; + import java.util.List; public record UpdatePreferredDistrictsRequest( - List districtIds + List locations ) implements UpdateAccountConditionCommand { } diff --git a/src/main/java/com/example/api/board/service/BoardService.java b/src/main/java/com/example/api/board/service/BoardService.java index 116db320..afa0fd8a 100644 --- a/src/main/java/com/example/api/board/service/BoardService.java +++ b/src/main/java/com/example/api/board/service/BoardService.java @@ -57,10 +57,7 @@ public PersonalInfoResponse getPersonalInfoResponse(final EmployeeIdRequest empl @Transactional(readOnly = true) public List getPreferredDistricts(final EmployeeIdRequest employeeIdRequest) { - log.info("employeeIdRequest={}", employeeIdRequest.employeeId()); - List allByEmployeeId = flavoredDistrictRepository.findAllByEmployeeId(employeeIdRequest.employeeId()); - log.info("allByEmployeeId: {}", allByEmployeeId); - return allByEmployeeId; + return flavoredDistrictRepository.findAllByEmployeeId(employeeIdRequest.employeeId()); } @Transactional(readOnly = true) @@ -118,8 +115,12 @@ public List updatePreferredDistrict( final EmployeeIdRequest employeeIdRequest, final UpdatePreferredDistrictsRequest request ) { - flavoredDistrictRepository.deleteByNotInIds(employeeIdRequest.employeeId(), request.districtIds()); - flavoredDistrictRepository.saveDistrictIds(employeeIdRequest.employeeId(), request.districtIds().toString()); + flavoredDistrictRepository.deleteAllByEmployeeId(employeeIdRequest.employeeId()); + Account user = accountRepository.findById(employeeIdRequest.employeeId()).orElseThrow(() -> new BusinessException(ErrorCode.NULL_USER)); + List willSaveLocation = request.locations().stream() + .map(location -> new FlavoredDistrict(location, user)) + .collect(Collectors.toList()); + flavoredDistrictRepository.saveAll(willSaveLocation); return flavoredDistrictRepository.findAllByEmployeeId(employeeIdRequest.employeeId()); } diff --git a/src/main/java/com/example/api/board/service/EmployeeService.java b/src/main/java/com/example/api/board/service/EmployeeService.java index b51e712b..e662d9ad 100644 --- a/src/main/java/com/example/api/board/service/EmployeeService.java +++ b/src/main/java/com/example/api/board/service/EmployeeService.java @@ -45,7 +45,8 @@ private UpdatePersonalInfoRequest getUpdateUserInfoRequest(UpdatePersonalInfoReq personalInfo.email(), personalInfo.nickname(), personalInfo.birthdate(), - personalInfo.callTime() + personalInfo.callTime(), + personalInfo.location() ); } } \ No newline at end of file diff --git a/src/main/java/com/example/api/business/BusinessQueryService.java b/src/main/java/com/example/api/business/BusinessQueryService.java index 8ddef3ab..4fc9af78 100644 --- a/src/main/java/com/example/api/business/BusinessQueryService.java +++ b/src/main/java/com/example/api/business/BusinessQueryService.java @@ -1,6 +1,6 @@ package com.example.api.business; -import com.example.api.business.domain.BusinessLocation; +import com.example.api.domain.Location; import com.example.api.business.dto.BusinessDetailsResponse; import com.example.api.business.dto.BusinessOwner; import com.example.api.business.dto.CategoryInfo; @@ -25,13 +25,13 @@ public class BusinessQueryService { public BusinessDetailsResponse loadDetails(@Validated final QueryBusinessDetailCommand queryBusinessDetailCommand) { final Business business = businessRepository.getDetails(queryBusinessDetailCommand.businessId()) .orElseThrow(() -> new BusinessException("해당 비즈니스를 찾을 수 없습니다.", ErrorCode.BUSINESS_DOMAIN_EXCEPTION)); - final BusinessLocation location = business.getLocation(); + final Location location = business.getLocation(); final Account account = business.getEmployer(); final List categoryInfos = business.getBusinessCategories().stream() .map(BusinessCategory::getSubCategory) .map(category -> new CategoryInfo(category.getSubCategoryId(), category.getSubCategoryName())) .toList(); final BusinessOwner owner = new BusinessOwner(account.getAccountId(), account.getName()); - return new BusinessDetailsResponse(business.getBusinessName(), business.getBusinessId(), owner, location, categoryInfos); + return new BusinessDetailsResponse(business.getBusinessName(), business.getBusinessId(), owner, location, categoryInfos, account.getPhoneNumber(), account.getEmail()); } } diff --git a/src/main/java/com/example/api/business/BusinessRepository.java b/src/main/java/com/example/api/business/BusinessRepository.java index f664922b..b58cb833 100644 --- a/src/main/java/com/example/api/business/BusinessRepository.java +++ b/src/main/java/com/example/api/business/BusinessRepository.java @@ -17,6 +17,6 @@ public interface BusinessRepository extends JpaRepository { @EntityGraph(attributePaths = {"location", "employer", "businessCategories.subCategory"}) Optional getDetails(@Param("businessId") final Long businessId); - @Query("select new com.example.api.employer.controller.dto.EmployerBusinessesRequest(b.businessName, b.location) from Business b where b.employer.accountId = :employerId order by b.location.id") + @Query("select new com.example.api.employer.controller.dto.EmployerBusinessesRequest(b.businessId, b.businessName, b.location) from Business b where b.employer.accountId = :employerId order by b.location.id") List findBusinessesByEmployerId(@Param("employerId")final Long employerId); } \ No newline at end of file diff --git a/src/main/java/com/example/api/business/BusinessService.java b/src/main/java/com/example/api/business/BusinessService.java index b92280af..ad640c02 100644 --- a/src/main/java/com/example/api/business/BusinessService.java +++ b/src/main/java/com/example/api/business/BusinessService.java @@ -39,6 +39,8 @@ public void updateBusiness(@Validated final ModifyBusinessCommand command) { @Transactional public void addBusiness(@Validated final AddBusinessCommand command) { Account requestMember = accountRepository.findById(command.requestMemberId()).orElseThrow(() -> new BusinessException(ErrorCode.NULL_USER)); + requestMember.setEmail(command.email()); + requestMember.setPhone(command.phoneNumber()); final Business business = new Business( command.businessName(), command.location(), diff --git a/src/main/java/com/example/api/business/controller/BusinessController.java b/src/main/java/com/example/api/business/controller/BusinessController.java index 5a638043..6a5549da 100644 --- a/src/main/java/com/example/api/business/controller/BusinessController.java +++ b/src/main/java/com/example/api/business/controller/BusinessController.java @@ -1,6 +1,6 @@ package com.example.api.business.controller; -import com.example.api.business.domain.BusinessLocation; +import com.example.api.domain.Location; import com.example.api.business.BusinessQueryService; import com.example.api.business.BusinessService; import com.example.api.business.dto.AddBusinessCommand; @@ -56,12 +56,14 @@ record AddBusinessRequest( String businessName, String businessRegistrationNumber, String businessOpenDate, - BusinessLocation location, + Location location, List subCategoryIds, - String representationName + String representationName, + String phoneNumber, + String email ) { AddBusinessCommand toCommand() { - return new AddBusinessCommand(requestMemberId, businessName, businessRegistrationNumber, businessOpenDate, location, subCategoryIds, representationName); + return new AddBusinessCommand(requestMemberId, businessName, businessRegistrationNumber, businessOpenDate, location, subCategoryIds, representationName, phoneNumber, email); } } @@ -69,12 +71,14 @@ record ModifyBusinessRequest( @NotNull Long businessId, String businessName, - BusinessLocation location, + Location location, String representationName, - List subCategoryIds + List subCategoryIds, + String phoneNumber, + String email ) { ModifyBusinessCommand toCommand() { - return new ModifyBusinessCommand(businessId, businessName, location, representationName, subCategoryIds); + return new ModifyBusinessCommand(businessId, businessName, location, representationName, subCategoryIds, phoneNumber, email); } } } diff --git a/src/main/java/com/example/api/business/dto/AddBusinessCommand.java b/src/main/java/com/example/api/business/dto/AddBusinessCommand.java index 64e1d759..a92ae29b 100644 --- a/src/main/java/com/example/api/business/dto/AddBusinessCommand.java +++ b/src/main/java/com/example/api/business/dto/AddBusinessCommand.java @@ -1,6 +1,6 @@ package com.example.api.business.dto; -import com.example.api.business.domain.BusinessLocation; +import com.example.api.domain.Location; import jakarta.validation.constraints.NotNull; import java.util.List; @@ -10,9 +10,11 @@ public record AddBusinessCommand( String businessName, String businessRegistrationNumber, String businessOpenDate, - BusinessLocation location, + Location location, List subCategoryIds, - String representationName + String representationName, + String phoneNumber, + String email ) { } diff --git a/src/main/java/com/example/api/business/dto/BusinessDetailsResponse.java b/src/main/java/com/example/api/business/dto/BusinessDetailsResponse.java index c4ae776a..00c4bca7 100644 --- a/src/main/java/com/example/api/business/dto/BusinessDetailsResponse.java +++ b/src/main/java/com/example/api/business/dto/BusinessDetailsResponse.java @@ -1,6 +1,6 @@ package com.example.api.business.dto; -import com.example.api.business.domain.BusinessLocation; +import com.example.api.domain.Location; import java.util.List; @@ -8,6 +8,8 @@ public record BusinessDetailsResponse( String businessName, Long businessId, BusinessOwner owner, - BusinessLocation location, - List categoryInfos) { + Location location, + List categoryInfos, + String phoneNumber, + String email) { } diff --git a/src/main/java/com/example/api/business/dto/ModifyBusinessCommand.java b/src/main/java/com/example/api/business/dto/ModifyBusinessCommand.java index 2114f030..b3fb72d3 100644 --- a/src/main/java/com/example/api/business/dto/ModifyBusinessCommand.java +++ b/src/main/java/com/example/api/business/dto/ModifyBusinessCommand.java @@ -1,6 +1,6 @@ package com.example.api.business.dto; -import com.example.api.business.domain.BusinessLocation; +import com.example.api.domain.Location; import jakarta.validation.constraints.NotNull; import java.util.List; @@ -8,8 +8,10 @@ public record ModifyBusinessCommand( @NotNull Long businessId, String businessName, - BusinessLocation location, + Location location, String representationName, - List categoryIds + List categoryIds, + String phoneNumber, + String email ) { } diff --git a/src/main/java/com/example/api/business/update/UpdateBusinessLocationHandler.java b/src/main/java/com/example/api/business/update/UpdateBusinessLocationHandler.java index cdd6a37e..8204d6e6 100644 --- a/src/main/java/com/example/api/business/update/UpdateBusinessLocationHandler.java +++ b/src/main/java/com/example/api/business/update/UpdateBusinessLocationHandler.java @@ -1,6 +1,6 @@ package com.example.api.business.update; -import com.example.api.business.domain.BusinessLocation; +import com.example.api.domain.Location; import com.example.api.business.dto.ModifyBusinessCommand; import com.example.api.domain.Business; import java.util.Objects; @@ -14,10 +14,13 @@ class UpdateBusinessLocationHandler implements BusinessUpdateHandler{ @Override public void update(Business business, ModifyBusinessCommand command) { if (Objects.nonNull(command.location())) { - final BusinessLocation location = new BusinessLocation( + final Location location = new Location( command.location().getZipcode(), command.location().getAddress(), - command.location().getDetailAddress()); + command.location().getDetailAddress(), + command.location().getSido(), + command.location().getSigugun(), + command.location().getDong()); business.setLocation(location); } } diff --git a/src/main/java/com/example/api/business/update/UpdateEmailHandler.java b/src/main/java/com/example/api/business/update/UpdateEmailHandler.java new file mode 100644 index 00000000..61ca80c2 --- /dev/null +++ b/src/main/java/com/example/api/business/update/UpdateEmailHandler.java @@ -0,0 +1,22 @@ +package com.example.api.business.update; + +import com.example.api.business.dto.ModifyBusinessCommand; +import com.example.api.domain.Account; +import com.example.api.domain.Business; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Service +@Transactional(propagation = Propagation.MANDATORY) +class UpdateEmailHandler implements BusinessUpdateHandler { + @Override + public void update(Business business, ModifyBusinessCommand command) { + if (Objects.nonNull(command.businessName())) { + Account employer = business.getEmployer(); + employer.setEmail(command.email()); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/example/api/business/update/UpdatePhoneNumberHandler.java b/src/main/java/com/example/api/business/update/UpdatePhoneNumberHandler.java new file mode 100644 index 00000000..35dc85c2 --- /dev/null +++ b/src/main/java/com/example/api/business/update/UpdatePhoneNumberHandler.java @@ -0,0 +1,23 @@ +package com.example.api.business.update; + +import com.example.api.business.domain.BusinessName; +import com.example.api.business.dto.ModifyBusinessCommand; +import com.example.api.domain.Account; +import com.example.api.domain.Business; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Service +@Transactional(propagation = Propagation.MANDATORY) +class UpdatePhoneNumberHandler implements BusinessUpdateHandler { + @Override + public void update(Business business, ModifyBusinessCommand command) { + if (Objects.nonNull(command.businessName())) { + Account employer = business.getEmployer(); + employer.setPhone(command.phoneNumber()); + } + } +} diff --git a/src/main/java/com/example/api/contracts/ContractRepository.java b/src/main/java/com/example/api/contracts/ContractRepository.java index 8641d9d1..93328322 100644 --- a/src/main/java/com/example/api/contracts/ContractRepository.java +++ b/src/main/java/com/example/api/contracts/ContractRepository.java @@ -56,7 +56,7 @@ public interface ContractRepository extends JpaRepository { List findContractScheduleByEmployeeId(@Param("employeeId") Long employeeId, @Param("currentMonth") LocalDateTime currentMonth); - @Query("select new com.example.api.suggest.controller.dto.request.OfferEmploymentDetailRequest(e.name, b.businessName, c.contractStartTime, c.contractEndTime) " + + @Query("select new com.example.api.suggest.controller.dto.request.OfferEmploymentDetailRequest(e.name, b.businessName, c.contractHourlyPay, c.contractStartTime, c.contractEndTime) " + "from Contract c " + "join c.offerEmployment oe " + "join oe.employee e " + diff --git a/src/main/java/com/example/api/contracts/dto/BusinessInfoDTO.java b/src/main/java/com/example/api/contracts/dto/BusinessInfoDTO.java index 64eb0dfc..940e8fce 100644 --- a/src/main/java/com/example/api/contracts/dto/BusinessInfoDTO.java +++ b/src/main/java/com/example/api/contracts/dto/BusinessInfoDTO.java @@ -1,6 +1,7 @@ package com.example.api.contracts.dto; -import com.example.api.business.domain.BusinessLocation; +import com.example.api.domain.Location; + import java.time.LocalDateTime; public record BusinessInfoDTO ( @@ -8,7 +9,7 @@ public record BusinessInfoDTO ( String representationName, LocalDateTime startTime, LocalDateTime endTime, - BusinessLocation location, + Location location, String businessPhone, LocalDateTime signedDate){ } \ 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 32ce5511..6868f760 100644 --- a/src/main/java/com/example/api/domain/Account.java +++ b/src/main/java/com/example/api/domain/Account.java @@ -51,11 +51,14 @@ public class Account extends BaseEntity { private String callTime; @Column(name = "ACCOUNT_INTRODUCTION") private String introduction; - @Column(name = "ACCOUNT_STAR_RATING", columnDefinition = "FLOAT DEFAULT 0.0f") + @OneToOne(cascade = CascadeType.ALL, orphanRemoval = true) + @JoinColumn(name = "ACCOUNT_LOCATION_ID", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) + private Location location; + @Column(name = "ACCOUNT_STAR_RATING", columnDefinition = "FLOAT DEFAULT 0.0") private Float starPoint; @Column(name = "ACCOUNT_WORK_COUNT", columnDefinition = "INTEGER DEFAULT 0") private int workCount; - @Column(name = "ACCOUNT_OPEN_STATUS", columnDefinition = "BOOLEAN DEFAULT true") + @Column(name = "ACCOUNT_OPEN_STATUS", columnDefinition = "TINYINT(1) DEFAULT 1") private boolean openStatus; @Column(name = "ACCOUNT_DELETED", columnDefinition = "BOOLEAN DEFAULT false") private boolean deleted = false; @@ -71,7 +74,7 @@ public Account(String name, String email, Collection roles) { this.roles = roles; } - public Account(String loginId, String password, String name, String nickname, String phoneNumber, String email, Nationality nationality, Collection roles, final Boolean emailReceivable) { + public Account(String loginId, String password, String name, String nickname, String phoneNumber, String email, Nationality nationality, Collection roles, Boolean emailReceivable, Location location) { this.loginId = loginId; this.password = password; this.name = name; @@ -84,11 +87,13 @@ public Account(String loginId, String password, String name, String nickname, St this.workCount = 0; this.openStatus = true; this.emailReceivable = emailReceivable; + this.location = location; } - public Account(String loginId, String password, String email, String phoneNumber, Nationality nationality, Collection roles) { + public Account(String loginId, String password, String name, String email, String phoneNumber, Nationality nationality, Collection roles) { this.loginId = loginId; this.password = password; + this.name = name; this.email = email; this.phoneNumber = phoneNumber; this.nationality = nationality; @@ -130,6 +135,7 @@ public void updateUserInfo(UpdatePersonalInfoRequest request){ this.nickname = request.nickname(); this.birthdate = request.birthdate(); this.callTime = request.callTime(); + this.location = request.location(); } public void setDeleted(boolean deleted){ @@ -147,4 +153,16 @@ public void setAccountId(long l) { public void setIntroduction(String introduction) { this.introduction = introduction; } + + public void setEmailReceivable(Boolean emailReceivable) { + this.emailReceivable = emailReceivable; + } + + public void setPhone(String phoneNumber) { + this.phoneNumber = phoneNumber; + } + + public void setEmail(String email) { + this.email = email; + } } \ No newline at end of file diff --git a/src/main/java/com/example/api/domain/Business.java b/src/main/java/com/example/api/domain/Business.java index a9e85022..b991130f 100644 --- a/src/main/java/com/example/api/domain/Business.java +++ b/src/main/java/com/example/api/domain/Business.java @@ -1,12 +1,10 @@ package com.example.api.domain; -import com.example.api.business.domain.BusinessLocation; import jakarta.persistence.*; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; -import java.time.LocalDate; import java.util.ArrayList; import java.util.List; @@ -35,7 +33,7 @@ public class Business extends BaseEntity { @OneToOne(fetch = LAZY, cascade = CascadeType.ALL, orphanRemoval = true) @JoinColumn(name = "BUSINESS_LOCATION", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) - private BusinessLocation location; + private Location location; @Column(name = "REPRESENTATION_NAME") private String representationName; @@ -50,7 +48,7 @@ public void setBusinessName(String businessName) { this.businessName = businessName; } - public void setLocation(BusinessLocation location) { + public void setLocation(Location location) { this.location = location; } @@ -58,13 +56,13 @@ public void setRepresentationName(String representationName) { this.representationName = representationName; } - public Business(String businessName, BusinessLocation location, String representationName) { + public Business(String businessName, Location location, String representationName) { this.businessName = businessName; this.location = location; this.representationName = representationName; } - public Business(String businessName, BusinessLocation location, String representationName, Account employer, String openDate, String registrationNumber) { + public Business(String businessName, Location location, String representationName, Account employer, String openDate, String registrationNumber) { this.businessName = businessName; this.location = location; this.representationName = representationName; @@ -73,7 +71,7 @@ public Business(String businessName, BusinessLocation location, String represent this.registrationNumber = registrationNumber; } - public Business(Account employer, String businessName, BusinessLocation location) { + public Business(Account employer, String businessName, Location location) { this.employer = employer; this.businessName = businessName; this.location = location; diff --git a/src/main/java/com/example/api/domain/CityDistrict.java b/src/main/java/com/example/api/domain/CityDistrict.java deleted file mode 100644 index e26d4657..00000000 --- a/src/main/java/com/example/api/domain/CityDistrict.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.example.api.domain; - -import jakarta.persistence.*; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Entity -@Getter -@NoArgsConstructor -@Table(name = "CITY_DISTRICT") -public class CityDistrict extends BaseEntity { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "CITY_DISTRICT_ID") - private Long id; - - private String district; - - public CityDistrict(String district) { - this.district = district; - } -} \ No newline at end of file diff --git a/src/main/java/com/example/api/domain/ExternalCareer.java b/src/main/java/com/example/api/domain/ExternalCareer.java index 510db52b..e8c4ce4a 100644 --- a/src/main/java/com/example/api/domain/ExternalCareer.java +++ b/src/main/java/com/example/api/domain/ExternalCareer.java @@ -15,6 +15,7 @@ public class ExternalCareer extends BaseEntity{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "EXTERNAL_CAREER_ID") private Long id; @ManyToOne(fetch = LAZY) diff --git a/src/main/java/com/example/api/domain/FlavoredDistrict.java b/src/main/java/com/example/api/domain/FlavoredDistrict.java index 3be4389b..407c0b32 100644 --- a/src/main/java/com/example/api/domain/FlavoredDistrict.java +++ b/src/main/java/com/example/api/domain/FlavoredDistrict.java @@ -10,7 +10,7 @@ @Getter @NoArgsConstructor @Table(name = "FLAVORED_DISTRICT", uniqueConstraints = { - @UniqueConstraint(columnNames = {"EMPLOYEE_ID", "CITY_DISTRICT_ID"}) + @UniqueConstraint(columnNames = {"EMPLOYEE_ID", "LOCATION_ID"}) }) public class FlavoredDistrict extends BaseEntity { @Id @@ -19,15 +19,15 @@ public class FlavoredDistrict extends BaseEntity { private Long id; @ManyToOne(fetch = LAZY) - @JoinColumn(name = "CITY_DISTRICT_ID", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) - private CityDistrict district; + @JoinColumn(name = "LOCATION_ID", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) + private Location location; @ManyToOne(fetch = LAZY) @JoinColumn(name = "EMPLOYEE_ID", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) private Account employee; - public FlavoredDistrict(CityDistrict district, Account employee) { - this.district = district; + public FlavoredDistrict(Location location, Account employee) { + this.location = location; this.employee = employee; } } \ No newline at end of file diff --git a/src/main/java/com/example/api/domain/Inquiry.java b/src/main/java/com/example/api/domain/Inquiry.java index b0161e37..908540d6 100644 --- a/src/main/java/com/example/api/domain/Inquiry.java +++ b/src/main/java/com/example/api/domain/Inquiry.java @@ -28,8 +28,10 @@ public class Inquiry extends BaseEntity { @Column(name = "SUB_INQUIRY_TYPE") private String subInquiryType; + @Column(name = "TITLE") private String title; + @Column(name = "CONTENT") private String content; @Enumerated(EnumType.STRING) diff --git a/src/main/java/com/example/api/business/domain/BusinessLocation.java b/src/main/java/com/example/api/domain/Location.java similarity index 51% rename from src/main/java/com/example/api/business/domain/BusinessLocation.java rename to src/main/java/com/example/api/domain/Location.java index 49acbdfb..a136ada6 100644 --- a/src/main/java/com/example/api/business/domain/BusinessLocation.java +++ b/src/main/java/com/example/api/domain/Location.java @@ -1,8 +1,8 @@ -package com.example.api.business.domain; +package com.example.api.domain; -import com.example.api.domain.BaseEntity; import com.fasterxml.jackson.annotation.JsonIgnore; import jakarta.persistence.*; +import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.ToString; @@ -11,8 +11,9 @@ @Entity @Getter @ToString -@Table(name = "BUSINESS_LOCATION") -public class BusinessLocation extends BaseEntity { +@EqualsAndHashCode +@Table(name = "LOCATION") +public class Location extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "LOCATION_UNIQUE_ID") @@ -24,26 +25,22 @@ public class BusinessLocation extends BaseEntity { private String address; @Column(name = "LOCATION_DETAIL_ADDRESS") private String detailAddress; + @Column(name = "LOCATION_SIDO") + private String sido; + @Column(name = "LOCATION_SIGUGUN") + private String sigugun; + @Column(name = "LOCATION_DONG") + private String dong; - public BusinessLocation() { + public Location() { } - public BusinessLocation(String zipcode, String address, String detailAddress) { - this.zipcode = zipcode; - this.address = address; + public Location(String dong, String sigugun, String sido, String detailAddress, String address, String zipcode) { + this.dong = dong; + this.sigugun = sigugun; + this.sido = sido; this.detailAddress = detailAddress; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - BusinessLocation location = (BusinessLocation) o; - return Objects.equals(id, location.id); - } - - @Override - public int hashCode() { - return Objects.hash(id); + this.address = address; + this.zipcode = zipcode; } } \ No newline at end of file diff --git a/src/main/java/com/example/api/domain/repository/FlavoredDistrictRepository.java b/src/main/java/com/example/api/domain/repository/FlavoredDistrictRepository.java index 49b81141..0b345dd6 100644 --- a/src/main/java/com/example/api/domain/repository/FlavoredDistrictRepository.java +++ b/src/main/java/com/example/api/domain/repository/FlavoredDistrictRepository.java @@ -10,23 +10,11 @@ import java.util.List; public interface FlavoredDistrictRepository extends JpaRepository { - @Query("select new com.example.api.board.dto.response.FlavoredDistrictResponse(fd.district.id, fd.district.district) " + + @Query("select new com.example.api.board.dto.response.FlavoredDistrictResponse(fd.location.sido, fd.location.sigugun, fd.location.dong) " + "from FlavoredDistrict fd where fd.employee.accountId = :employeeId") List findAllByEmployeeId(Long employeeId); @Modifying - @Query("DELETE FROM FlavoredDistrict p WHERE p.id NOT IN :ids AND p.employee.accountId = :employeeId") - void deleteByNotInIds(@Param("employeeId") Long employeeId, @Param("ids") List ids); - - @Modifying - @Query(value = "INSERT INTO FLAVORED_DISTRICT (CITY_DISTRICT_ID, EMPLOYEE_ID) " + - "SELECT temp.district_id, :accountId " + - "FROM JSON_TABLE(:districtIds, '$[*]' COLUMNS (district_id BIGINT PATH '$')) AS temp " + - "WHERE NOT EXISTS (" + - " SELECT 1 FROM FLAVORED_DISTRICT " + - " WHERE FLAVORED_DISTRICT.CITY_DISTRICT_ID = temp.district_id " + - " AND FLAVORED_DISTRICT.EMPLOYEE_ID = :accountId" + - ")", - nativeQuery = true) - void saveDistrictIds(@Param("accountId") Long accountId, @Param("districtIds") String districtIds); + @Query("DELETE FROM FlavoredDistrict p WHERE p.employee.accountId = :employeeId") + void deleteAllByEmployeeId(@Param("employeeId") Long employeeId); } \ No newline at end of file diff --git a/src/main/java/com/example/api/domain/repository/OfferEmploymentRepository.java b/src/main/java/com/example/api/domain/repository/OfferEmploymentRepository.java index e677cb1e..e5f4a941 100644 --- a/src/main/java/com/example/api/domain/repository/OfferEmploymentRepository.java +++ b/src/main/java/com/example/api/domain/repository/OfferEmploymentRepository.java @@ -23,7 +23,7 @@ public interface OfferEmploymentRepository extends JpaRepository findAllByBusinessBusinessId(long businessId); - @Query("select new com.example.api.suggest.controller.dto.request.OfferEmploymentDetailRequest(e.name, b.businessName, oe.suggestStartTime, oe.suggestEndTime) " + + @Query("select new com.example.api.suggest.controller.dto.request.OfferEmploymentDetailRequest(e.name, b.businessName, oe.suggestHourlyPay, oe.suggestStartTime, oe.suggestEndTime) " + "from OfferEmployment oe " + "join oe.employee e " + "join oe.business b " + diff --git a/src/main/java/com/example/api/employer/controller/EmployerController.java b/src/main/java/com/example/api/employer/controller/EmployerController.java index 7cc59cbe..676ea421 100644 --- a/src/main/java/com/example/api/employer/controller/EmployerController.java +++ b/src/main/java/com/example/api/employer/controller/EmployerController.java @@ -19,14 +19,14 @@ public class EmployerController { private final EmployerService employerService; @GetMapping("/favorites/employees") - public ResponseEntity getLikeEmployee(@AuthenticationPrincipal final Long employerId) { + public ResponseEntity> getLikeEmployee(@AuthenticationPrincipal final Long employerId) { EmployerIdRequest employerIdRequest = new EmployerIdRequest(employerId); List result = employerService.getLikeEmployee(employerIdRequest); return ResponseEntity.ok(result); } @GetMapping("/businesses") - public ResponseEntity getBusinessList(@AuthenticationPrincipal final Long employerId) { + public ResponseEntity> getBusinessList(@AuthenticationPrincipal final Long employerId) { EmployerIdRequest employerIdRequest = new EmployerIdRequest(employerId); List businesses = employerService.getEmployerBusinessList(employerIdRequest); return ResponseEntity.ok(businesses); diff --git a/src/main/java/com/example/api/employer/controller/dto/EmployerBusinessesRequest.java b/src/main/java/com/example/api/employer/controller/dto/EmployerBusinessesRequest.java index 44f11700..e32bf4e2 100644 --- a/src/main/java/com/example/api/employer/controller/dto/EmployerBusinessesRequest.java +++ b/src/main/java/com/example/api/employer/controller/dto/EmployerBusinessesRequest.java @@ -1,10 +1,11 @@ package com.example.api.employer.controller.dto; -import com.example.api.business.domain.BusinessLocation; +import com.example.api.domain.Location; import jakarta.validation.constraints.NotNull; public record EmployerBusinessesRequest( + @NotNull Long businessId, @NotNull String businessName, - @NotNull BusinessLocation businessLocation + @NotNull Location businessLocation ) { } \ No newline at end of file diff --git a/src/main/java/com/example/api/employer/controller/dto/LikeEmployeeDTO.java b/src/main/java/com/example/api/employer/controller/dto/LikeEmployeeDTO.java index 01e7e31f..e484e6b2 100644 --- a/src/main/java/com/example/api/employer/controller/dto/LikeEmployeeDTO.java +++ b/src/main/java/com/example/api/employer/controller/dto/LikeEmployeeDTO.java @@ -2,6 +2,7 @@ import com.example.api.board.dto.response.ExternalCareerResponse; import com.example.api.board.dto.response.FlavoredCategoryResponse; +import com.example.api.board.dto.response.FlavoredDistrictResponse; import lombok.AllArgsConstructor; import lombok.EqualsAndHashCode; import lombok.Getter; @@ -23,4 +24,5 @@ public class LikeEmployeeDTO { private long workCount; private List externalCareerList; private List flavoredCategoryList; + private List flavoredDistrictList; } diff --git a/src/main/java/com/example/api/employer/service/EmployerService.java b/src/main/java/com/example/api/employer/service/EmployerService.java index be189d16..59fb9662 100644 --- a/src/main/java/com/example/api/employer/service/EmployerService.java +++ b/src/main/java/com/example/api/employer/service/EmployerService.java @@ -6,6 +6,7 @@ import com.example.api.domain.repository.ExternalCareerRepository; import com.example.api.domain.repository.FlavoredCategoryRepository; import com.example.api.domain.Account; +import com.example.api.domain.repository.FlavoredDistrictRepository; import com.example.api.employer.controller.dto.EmployerBusinessesRequest; import com.example.api.employer.controller.dto.EmployerIdRequest; import com.example.api.employer.controller.dto.FavoriteEmployeeRequest; @@ -30,6 +31,7 @@ public class EmployerService { private final FlavoredCategoryRepository flavoredRepository; private final BusinessRepository businessRepository; private final AccountRepository accountRepository; + private final FlavoredDistrictRepository flavoredDistrictRepository; @Transactional(readOnly = true) public List getLikeEmployee(final EmployerIdRequest employerIdRequest) { @@ -47,7 +49,8 @@ public List getLikeEmployee(final EmployerIdRequest employerIdR employee.getStarPoint(), employee.getWorkCount(), externalCareerRepository.findAllByEmployeeId(employee.getAccountId()), - flavoredRepository.findAllByEmployeeId(employee.getAccountId()) + flavoredRepository.findAllByEmployeeId(employee.getAccountId()), + flavoredDistrictRepository.findAllByEmployeeId(employee.getAccountId()) ) ).collect(Collectors.toList()); } diff --git a/src/main/java/com/example/api/setting/controller/SettingController.java b/src/main/java/com/example/api/setting/controller/SettingController.java new file mode 100644 index 00000000..db163226 --- /dev/null +++ b/src/main/java/com/example/api/setting/controller/SettingController.java @@ -0,0 +1,39 @@ +package com.example.api.setting.controller; + +import com.example.api.account.repository.AccountRepository; +import com.example.api.board.dto.request.EmployeeIdRequest; +import com.example.api.global.exception.BusinessException; +import com.example.api.global.exception.ErrorCode; +import com.example.api.setting.dto.EmailConsentRequest; +import com.example.api.setting.dto.EmailConsentResponse; +import com.example.api.setting.service.SettingService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.ResponseEntity; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/api/v1/setting") +@RequiredArgsConstructor +@Slf4j +public class SettingController { + private final SettingService settingService; + private final AccountRepository accountRepository; + + @PostMapping("/email-consent") + public ResponseEntity updateEmailConsent( + @RequestParam("emailReceivable") final Boolean emailReceivable, + @AuthenticationPrincipal final Long memberId + ) { + return ResponseEntity.ok(settingService.updateEmailConsent(new EmailConsentRequest(emailReceivable, memberId))); + } + + @GetMapping("/email-consent") + public ResponseEntity getEmailConsent( + @AuthenticationPrincipal final Long memberId + ) { + EmailConsentResponse emailConsentResponse = accountRepository.findEmailReceivableById(memberId).orElseThrow(() -> new BusinessException(ErrorCode.NULL_USER)); + return ResponseEntity.ok(emailConsentResponse); + } +} diff --git a/src/main/java/com/example/api/setting/dto/EmailConsentRequest.java b/src/main/java/com/example/api/setting/dto/EmailConsentRequest.java new file mode 100644 index 00000000..7185d1a7 --- /dev/null +++ b/src/main/java/com/example/api/setting/dto/EmailConsentRequest.java @@ -0,0 +1,7 @@ +package com.example.api.setting.dto; + +public record EmailConsentRequest( + Boolean status, + Long userId +) { +} diff --git a/src/main/java/com/example/api/setting/dto/EmailConsentResponse.java b/src/main/java/com/example/api/setting/dto/EmailConsentResponse.java new file mode 100644 index 00000000..4eea9c24 --- /dev/null +++ b/src/main/java/com/example/api/setting/dto/EmailConsentResponse.java @@ -0,0 +1,6 @@ +package com.example.api.setting.dto; + +public record EmailConsentResponse( + Boolean emailReceivable +) { +} diff --git a/src/main/java/com/example/api/setting/service/SettingService.java b/src/main/java/com/example/api/setting/service/SettingService.java new file mode 100644 index 00000000..2e7e54d7 --- /dev/null +++ b/src/main/java/com/example/api/setting/service/SettingService.java @@ -0,0 +1,28 @@ +package com.example.api.setting.service; + +import com.example.api.account.repository.AccountRepository; +import com.example.api.board.dto.request.EmployeeIdRequest; +import com.example.api.domain.Account; +import com.example.api.global.exception.BusinessException; +import com.example.api.global.exception.ErrorCode; +import com.example.api.setting.dto.EmailConsentRequest; +import com.example.api.setting.dto.EmailConsentResponse; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +@Slf4j +public class SettingService { + private final AccountRepository accountRepository; + + @Transactional + public EmailConsentResponse updateEmailConsent(final EmailConsentRequest request) { + Account user = accountRepository.findById(request.userId()).orElseThrow(() -> new BusinessException(ErrorCode.NULL_USER)); + user.setEmailReceivable(request.status()); + accountRepository.save(user); + return new EmailConsentResponse(request.status()); + } +} diff --git a/src/main/java/com/example/api/suggest/controller/SuggestController.java b/src/main/java/com/example/api/suggest/controller/SuggestController.java index 51080d5b..bd0db263 100644 --- a/src/main/java/com/example/api/suggest/controller/SuggestController.java +++ b/src/main/java/com/example/api/suggest/controller/SuggestController.java @@ -18,7 +18,7 @@ public class SuggestController { private final SuggestService suggestService; @GetMapping("/api/v1/employment-suggests/status/{businessId}") - public ResponseEntity getSuggestStatus(@PathVariable() long businessId) { + public ResponseEntity> getSuggestStatus(@PathVariable() long businessId) { BusinessIdRequest businessIdRequest = new BusinessIdRequest(businessId); List suggestStatus = suggestService.getSuggestStatus(businessIdRequest); return ResponseEntity.ok(suggestStatus); diff --git a/src/main/java/com/example/api/suggest/controller/dto/SuggestStatusDTO.java b/src/main/java/com/example/api/suggest/controller/dto/SuggestStatusDTO.java index a0e86f8d..47d02ee0 100644 --- a/src/main/java/com/example/api/suggest/controller/dto/SuggestStatusDTO.java +++ b/src/main/java/com/example/api/suggest/controller/dto/SuggestStatusDTO.java @@ -11,6 +11,7 @@ public class SuggestStatusDTO { private String status; private String name; + private Integer hourlyPayment; private String businessName; private String workTime; // 채팅 방 번호 추가 diff --git a/src/main/java/com/example/api/suggest/controller/dto/request/OfferEmploymentDetailRequest.java b/src/main/java/com/example/api/suggest/controller/dto/request/OfferEmploymentDetailRequest.java index a0e9cb5d..873b7973 100644 --- a/src/main/java/com/example/api/suggest/controller/dto/request/OfferEmploymentDetailRequest.java +++ b/src/main/java/com/example/api/suggest/controller/dto/request/OfferEmploymentDetailRequest.java @@ -5,6 +5,7 @@ public record OfferEmploymentDetailRequest( String name, String businessName, + Integer hourlyPayment, LocalDateTime startTime, LocalDateTime endTime ) { diff --git a/src/main/java/com/example/api/suggest/service/SuggestService.java b/src/main/java/com/example/api/suggest/service/SuggestService.java index c469c5fb..a55ee02d 100644 --- a/src/main/java/com/example/api/suggest/service/SuggestService.java +++ b/src/main/java/com/example/api/suggest/service/SuggestService.java @@ -91,6 +91,7 @@ public SuggestStatusDTO makeSuggestStatusDTO(OfferEmploymentDetailRequest sugges return new SuggestStatusDTO( status, suggest.name(), + suggest.hourlyPayment(), suggest.businessName(), workTimeStr ); diff --git a/src/main/resources/static/danpat.yaml b/src/main/resources/static/danpat.yaml index e049d2c6..04c51f2a 100644 --- a/src/main/resources/static/danpat.yaml +++ b/src/main/resources/static/danpat.yaml @@ -12,6 +12,8 @@ paths: post: tags: - AccountController + summary: "사업자 번호 유효 확인" + description: "사업자 번호 유효 확인" operationId: verifyBusinessNumber requestBody: content: @@ -38,6 +40,8 @@ paths: post: tags: - AccountController + summary: "사장 회원가입 요청" + description: "사장 회원가입 요청" operationId: signUpEmployer requestBody: content: @@ -56,6 +60,9 @@ paths: zipcode: "12093" address: "경기도 남양주시 송산로339번길 25, 3층(별내동)" detailAddress: "101호" + sido: "경기" + sigugun: "남양주시" + dong: "별내동" nationality: "KOREAN" role: "EMPLOYER" phoneNumber: "010-1234-1234" @@ -72,6 +79,8 @@ paths: post: tags: - AccountController + summary: "이메일 확인용 코드 전송 요청" + description: "이메일 확인용 코드 전송 요청" operationId: sendEmailCode requestBody: content: @@ -93,6 +102,8 @@ paths: post: tags: - AccountController + summary: "이메일 확인" + description: "이메일 확인" operationId: verifyEmail requestBody: content: @@ -115,6 +126,8 @@ paths: post: tags: - AccountController + summary: "알바생 회원가입 요청" + description: "알바생 회원가입 요청" operationId: signUpEmployee requestBody: content: @@ -131,6 +144,14 @@ paths: "role": "EMPLOYEE" "phoneNumber": "010-1234-1234" "emailReceivable": true + "location": + zipcode: 12345 + address: "주소" + detailAddress: "상세주소" + sido: "경기" + sigugun: "남양주시" + dong: "별내동" + required: true responses: "200": @@ -144,6 +165,8 @@ paths: delete: tags: - AccountController + summary: "계정 삭제 요청" + description: "게정 삭제 요청" operationId: deleteAccount responses: "200": @@ -158,6 +181,8 @@ paths: tags: - AuthController operationId: login + summary: "로그인 요청" + description: "로그인 요청" requestBody: content: application/json: @@ -184,6 +209,8 @@ paths: post: tags: - AuthController + summary: "refreshToken으로 accessToken 재발급 요청" + description: "refreshToken으로 accessToken 재발급 요청" operationId: refresh requestBody: content: @@ -210,6 +237,8 @@ paths: post: tags: - AuthController + summary: "로그아웃 요청" + description: "로그아웃 요청" operationId: logout responses: "200": @@ -228,6 +257,8 @@ paths: post: tags: - BoardController + summary: "알바생이 이력서 공개 설정 변경 요청" + description: "알바생이 이력서 공개 설정 변경 요청" operationId: changeOpenStatus parameters: - name: open-status @@ -248,6 +279,8 @@ paths: get: tags: - BoardController + summary: "알바생이 선호 근무지 받기 요청" + description: "알바생이 선호 근무지 받기 요청" operationId: getPreferredDistricts responses: "200": @@ -266,6 +299,8 @@ paths: post: tags: - BoardController + summary: "알바생이 선호 근무지 추가 요청" + description: "알바생이 선호 근무지 추가 요청" operationId: updatePreferredDistricts requestBody: content: @@ -292,6 +327,8 @@ paths: get: tags: - BoardController + summary: "알바생이 선호 카테고리 받기 요청" + description: "알바생이 선호 카테고리 빋기 요청" operationId: getPreferredCategories responses: "200": @@ -314,6 +351,8 @@ paths: post: tags: - BoardController + summary: "알바생이 선호 카테고리 업데이트 요청" + description: "알바생이 선호 카테고리 업데이트 요청" operationId: updatePreferredCategories requestBody: content: @@ -345,6 +384,8 @@ paths: get: tags: - BoardController + summary: "알바생이 근무 가능 시간 받기 요청" + description: "알바생이 근무 가능 시간 받기 요청" operationId: getWorkHours responses: "200": @@ -369,6 +410,8 @@ paths: post: tags: - BoardController + summary: "알바생이 근무 가능 시간 추가 요청" + description: "알바생이 근무 가능 시간 추가 요청" operationId: updatePossibleTimes parameters: - name: requestMemberId @@ -406,6 +449,8 @@ paths: get: tags: - BoardController + summary: "알바생이 개인정보 받기 요청" + description: "알바생이 개인정보 받기 요청" operationId: getPersonalInfo responses: "200": @@ -429,6 +474,8 @@ paths: post: tags: - BoardController + summary: "알바생이 개인정보 적기 요청" + description: "알바생이 개인정보 적기 요청" operationId: updatePersonalInfo requestBody: content: @@ -436,12 +483,12 @@ paths: schema: $ref: "#/components/schemas/UpdatePersonalInfoRequest" example: - name: "김태영" - nickname: "김태일" - age: 25 - sex: "남" - email: "chulsoo@example.com" - phoneNumber: "010-1234-5678" + name: "김태영" + nickname: "김태일" + age: 25 + sex: "남" + email: "chulsoo@example.com" + phoneNumber: "010-1234-5678" required: true responses: "200": @@ -463,6 +510,8 @@ paths: get: tags: - BoardController + summary: "알바생이 외부경력 받기 요청" + description: "알바생이 외부경력 받기 요청" operationId: getExternalCareers responses: "200": @@ -487,6 +536,8 @@ paths: post: tags: - BoardController + summary: "알바생이 외부경력 업데이트 요청" + description: "알바생이 외부경력 업데이트 요청" operationId: updateExternalCareers requestBody: content: @@ -524,6 +575,8 @@ paths: get: tags: - BoardController + summary: "알바생이 내부 경력 받기 요청" + description: "알바생이 내부 경력 받기 요청" operationId: getInternalCareers responses: "200": @@ -543,6 +596,8 @@ paths: get: tags: - BoardController + summary: "알바생이 자기소개글 받기 요청" + description: "알바생이 자기소개글 받기 요청" operationId: getIntroduction responses: "200": @@ -552,10 +607,12 @@ paths: schema: type: object example: - introduction : "자기소개" + introduction: "자기소개" post: tags: - BoardController + summary: "알바생이 자기소개글 적기 요청" + description: "알바생이 자기소개글 적기 요청" operationId: postIntroduction requestBody: content: @@ -605,6 +662,8 @@ paths: post: tags: - OfferEmploymentController + summary: "사장님이 알바생에게 제안 요청하기" + description: "사장님이 알바생에게 제안 요청하기" operationId: sendOfferEmployment requestBody: content: @@ -633,6 +692,8 @@ paths: post: tags: - OfferEmploymentController + summary: "알바 종료 요청하기" + description: "알바 종료 요청하기" operationId: completeOfferEmployment requestBody: content: @@ -654,103 +715,110 @@ paths: success: true message: "성공적으로 종료되었습니다." /api/v1/contracts/suggests/chatroom: - post: - tags: - - SuggestController - operationId: createChatRoom - requestBody: - required: true + post: + tags: + - SuggestController + summary: "채팅방 생성 요청하기" + description: "채팅방 생성 요청하기" + operationId: createChatRoom + requestBody: + required: true + content: + application/json: + schema: + $ref: "#/components/schemas/AcceptSuggestCommand" + example: + suggestId: 1 + responses: + "200": + description: OK content: - application/json: + '*/*': schema: - $ref: "#/components/schemas/AcceptSuggestCommand" - example: - suggestId: 1 - responses: - "200": - description: OK - content: - '*/*': - schema: - type: string - example: "성공적으로 채팅방을 생성하였습니다." + type: string + example: "성공적으로 채팅방을 생성하였습니다." /api/v1/contracts/suggests/{suggestId}/accept: - post: - tags: + post: + tags: - SuggestController - operationId: acceptContractContact - parameters: + summary: "알바생이 제안 수락" + description: "알바생이 제안 수락" + operationId: acceptContractContact + parameters: - name: suggestId in: path required: true schema: type: integer format: int64 - responses: - "200": - description: OK - content: - '*/*': - schema: - type: object + responses: + "200": + description: OK + content: + '*/*': + schema: + type: object /api/v1/employment-suggests/status/{businessId}: - get: - tags: + get: + tags: - SuggestController - operationId: getSuggestStatus - parameters: + summary: "사장 마이페이지에서 특정 가게 체결 현황" + description: "사장 마이페이지에서 특정 가게 체결 현황" + operationId: getSuggestStatus + parameters: - name: businessId in: path required: true schema: type: integer format: int64 - responses: - "200": - description: OK - content: - '*/*': - schema: - type: string - example: - - status: "대기 중" - name: "알바생" - businessName: "김태영닷컴" - workTime: "2024.02.20 12:00~14:00" - /api/v1/contracts/employment-suggests: - get: - tags: - - SuggestController - operationId: getAllSuggest - parameters: - - name: employeeId - in: query - required: true - schema: - type: integer - format: int64 - responses: - "200": - description: OK - content: - '*/*': - schema: - type: array - items: - $ref: "#/components/schemas/SuggestedBusinessResponse" - example: - - businessId: 1 - suggestStartDateTime: "2024-02-01T09:00:00" - suggestEndDateTime: "2024-02-01T11:00:00" - suggestPartTimePayment: 10000 - suggestChecked: 1 - suggestAccepted: 0 - - businessId: 2 - suggestStartDateTime: "2024-02-01T09:00:00" - suggestEndDateTime: "2024-02-01T11:00:00" - suggestPartTimePayment: 10000 - suggestChecked: 1 - suggestAccepted: 1 + responses: + "200": + description: OK + content: + '*/*': + schema: + type: string + example: + - status: "대기 중" + name: "알바생" + hourlyPayment: 12000 + businessName: "김태영닷컴" + workTime: "2024.02.20 12:00~14:00" +# /api/v1/contracts/employment-suggests: +# get: +# tags: +# - SuggestController +# operationId: getAllSuggest +# parameters: +# - name: employeeId +# in: query +# required: true +# schema: +# type: integer +# format: int64 +# responses: +# "200": +# description: OK +# content: +# '*/*': +# schema: +# type: array +# items: +# $ref: "#/components/schemas/SuggestedBusinessResponse" +# example: +# - businessId: 1 +# suggestStartDateTime: "2024-02-01T09:00:00" +# suggestEndDateTime: "2024-02-01T11:00:00" +# suggestPartTimePayment: 10000 +# suggestChecked: 1 +# suggestAccepted: 0 +# - businessId: 2 +# suggestStartDateTime: "2024-02-01T09:00:00" +# suggestEndDateTime: "2024-02-01T11:00:00" +# suggestPartTimePayment: 10000 +# suggestChecked: 1 +# suggestAccepted: 1 /api/v1/support/announcements/{announcementId}: get: tags: @@ -780,15 +848,15 @@ paths: put: tags: - - announcement-controller + - announcement-controller operationId: updateAnnouncement parameters: - - name: announcementId - in: path - required: true - schema: - type: integer - format: int64 + - name: announcementId + in: path + required: true + schema: + type: integer + format: int64 requestBody: content: application/json: @@ -814,30 +882,32 @@ paths: viewCount: 200 delete: tags: - - announcement-controller + - announcement-controller operationId: deleteAnnouncement parameters: - - name: announcementId - in: path - required: true - schema: - type: integer - format: int64 + - name: announcementId + in: path + required: true + schema: + type: integer + format: int64 responses: "200": description: OK /api/v1/contracts/{contractId}: put: tags: - - ContractController + - ContractController + summary: "특정 계약 조건 변경하기" + description: "특정 계약 조건 변경하기" operationId: updateContractCondition parameters: - - name: contractId - in: path - required: true - schema: - type: integer - format: int64 + - name: contractId + in: path + required: true + schema: + type: integer + format: int64 requestBody: content: application/json: @@ -860,6 +930,8 @@ paths: post: tags: - ContractController + summary: "알바생이 특정 계약 수락하기(체결)" + description: "알바생이 특정 계약 수락하기(체결)" operationId: acceptContract parameters: - name: contractId @@ -879,6 +951,8 @@ paths: get: tags: - ContractController + summary: "특정 계약 조건 보기(채팅방 생성 후)" + description: "특정 계약 조건 보기(채팅방 생성 후)" operationId: getContractInfo parameters: - name: contractId @@ -915,6 +989,8 @@ paths: get: tags: - ContractController + summary: "알바생 마이페이지, 체결 현황 보기" + description: "알바생 마이페이지, 체결 현황 보기" operationId: getContractSchedule responses: "200": @@ -938,16 +1014,18 @@ paths: /api/v1/business: get: tags: - - BusinessController + - BusinessController + summary: "내 가게 정보 보기" + description: "내 가게 정보 보기" operationId: getMyBusiness parameters: - - name: businessId - in: query - required: true - schema: - type: integer - format: int64 - example: 1 + - name: businessId + in: query + required: true + schema: + type: integer + format: int64 + example: 1 responses: "200": description: OK @@ -968,9 +1046,13 @@ paths: categoryInfos: - subCategoryId: 1002 subCategoryName: "일반음식점" + email: "이메일" + phoneNumber: "전화번호" put: tags: - - BusinessController + - BusinessController + summary: "내 가게 정보 변경사항 전송하기" + description: "내 가게 정보 변경사항 전송하기" operationId: modifyMyBusiness requestBody: content: @@ -984,8 +1066,14 @@ paths: zipcode: "12093" address: "경기도 남양주시 송산로339번길 25, 3층(별내동)" detailAddress: "101호" + sido: "경기" + sigugun: "남양주시" + dong: "별내동" subCategoryIds: - - 8 + - 8002 + representationName: "대표자명" + phoneNumber: "전화번호" + email: "이메일" required: true responses: "200": @@ -997,7 +1085,9 @@ paths: example: "요청이 성공적으로 처리되었습니다." post: tags: - - BusinessController + - BusinessController + summary: "내 가게 정보 전송하기" + description: "내 가게 정보 전송하기" operationId: addBusiness requestBody: content: @@ -1014,8 +1104,10 @@ paths: address: "경기도 남양주시 송산로339번길 25, 3층(별내동)" detailAddress: "101호" subCategoryIds: - - 8 + - 8002 representationName: "김태영" + email: "이메일" + phoneNumber: "전화번호" required: true responses: "200": @@ -1028,7 +1120,7 @@ paths: /api/v1/support/inquiry: post: tags: - - inquiry-controller + - inquiry-controller operationId: createInquiry requestBody: content: @@ -1055,7 +1147,7 @@ paths: /api/v1/support/announcements: get: tags: - - announcement-controller + - announcement-controller operationId: getAnnouncements responses: "200": @@ -1079,7 +1171,7 @@ paths: viewCount: 89 post: tags: - - announcement-controller + - announcement-controller operationId: createAnnouncement requestBody: content: @@ -1107,12 +1199,12 @@ paths: /api/v1/info/my/reviews/{reviewId}/report: post: tags: - - ReviewReportController + - ReviewReportController operationId: reportReview parameters: - - name: reviewId - in: path - required: true + - name: reviewId + in: path + required: true requestBody: content: application/json: @@ -1134,7 +1226,9 @@ paths: /api/v1/contracts/review: post: tags: - - ContractReviewController + - ContractReviewController + summary: "리뷰 작성하기" + description: "리뷰 작성하기" operationId: addReview requestBody: content: @@ -1158,6 +1252,8 @@ paths: get: tags: - ContractReviewController + summary: "내가 쓴 리뷰 보기" + description: "내가 쓴 리뷰 보기" operationId: getMyReview responses: "200": @@ -1176,7 +1272,7 @@ paths: /api/search/search: post: tags: - - search-controller + - search-controller operationId: searchAccounts requestBody: content: @@ -1211,7 +1307,9 @@ paths: /api/v1/employer/favorites/employees: get: tags: - - EmployerController + - EmployerController + summary: "즐겨찾기한 알바생들 보기" + description: "즐겨찾기한 알바생들 보기" operationId: getLikeEmployee responses: "200": @@ -1242,8 +1340,19 @@ paths: flavoredCategoryList: - categoryId: 1 categoryName: "외식•음료" + subCategoryId: 1001 + subCategoryName: "전체" - categoryId: 2 categoryName: "유통•판매" + subCategoryId: 1001 + subCategoryName: "전체" + flavoredDistrictList: + - sido: "경기" + sigugun: "남양주시" + dong: "별내동" + - sido: "경기" + sigugun: "남양주시" + dong: "별내동" /api/v1/employer/favorites/employee/{employeeId}: put: tags: @@ -1292,14 +1401,16 @@ paths: /chat/summaries: get: tags: - - chat-controller + - chat-controller + summary: "채팅 미리보기 요약들" + description: "채팅 미리보기 요약들" operationId: getChatSummaries parameters: - - name: userIdRequest - in: query - required: true - schema: - $ref: "#/components/schemas/UserIdRequest" + - name: userIdRequest + in: query + required: true + schema: + $ref: "#/components/schemas/UserIdRequest" responses: "200": description: OK @@ -1320,22 +1431,24 @@ paths: /chat/room/{roomId}/chats: get: tags: - - chat-controller + - chat-controller + summary: "채팅방 채팅 내용 불러오기" + description: "채팅방 채팅 내용 불러오기" operationId: getMessages parameters: - - name: roomId - in: path - required: true - schema: - type: integer - format: int64 - example: 1 - - name: lastChatId - in: query - required: false - schema: - type: string - example: "1" + - name: roomId + in: path + required: true + schema: + type: integer + format: int64 + example: 1 + - name: lastChatId + in: query + required: false + schema: + type: string + example: "1" responses: "200": description: OK @@ -1363,7 +1476,9 @@ paths: /businesses: get: tags: - - EmployerController + - EmployerController + summary: "내 사업체들 보기" + description: "내 사업체들 보기" operationId: getBusinessList responses: "200": @@ -1373,16 +1488,24 @@ paths: schema: type: object example: - - businessName: "김태영닷컴" + - businessId : 10 + businessName: "김태영닷컴" businessLocation: zipcode: "12093" address: "경기도 남양주시 송산로339번길 25, 3층(별내동)" detailAddress: "101호" - - businessName: "김태영법조타운" + sido: "경기" + sigugun: "남양주시" + dong: "별내동" + - businessId : 11 + businessName: "김태영법조타운" businessLocation: zipcode: "404320" address: "인천광역시 서구 원당동 인천검단택지개발지구 C5-1-1BL" detailAddress: "101호" + sido: "인천" + sigugun: "서구" + dong: "원당동" /api/v1/support/my-inquiries: get: tags: @@ -1482,7 +1605,7 @@ paths: tags: - review-controller operationId: getReviewsByEmployee - parameters: [] + parameters: [ ] responses: "200": description: OK @@ -1562,6 +1685,47 @@ paths: employeeName: "김철수" - employeeId: 1002 employeeName: "이영희" + /api/v1/setting/email-consent: + get: + tags: + - SettingController + operationId: getEmailReceivable + summary: "이메일 수신 여부 설정값 받기" + description: "이메일 수신 여부 설정값 받기" + responses: + "200": + description: OK + content: + application/json: + schema: + items: + $ref: "#/components/schemas/EmailConsentResponse" + example: + emailReceivable: true + post: + tags: + - SettingController + summary: "이메일 수신 여부 변경 api" + description: "이메일 수신 여부 변경 api" + parameters: + - name: emailReceivable + in: query + description: "이메일 수신 동의 여부 (true 또는 false)" + required: true + schema: + type: boolean + example: true + responses: + "200": + description: "이메일 수신 여부 변경" + content: + application/json: + schema: + items: + $ref: "#/components/schemas/EmailConsentResponse" + example: + emailReceivable: true + components: schemas: AnnouncementRequest: @@ -2431,6 +2595,23 @@ components: properties: introduction: type: string + EmailConsentRequest: + type: object + properties: + status: + type: boolean + example: true + memberId: + type: integer + format: int64 + example: 123 + + EmailConsentResponse: + type: object + properties: + receivable: + type: boolean + example: true securitySchemes: JWT_TOKEN: diff --git a/src/test/java/com/example/api/employer/service/EmployerServiceTest.java b/src/test/java/com/example/api/employer/service/EmployerServiceTest.java index daebb266..ff3a26a8 100644 --- a/src/test/java/com/example/api/employer/service/EmployerServiceTest.java +++ b/src/test/java/com/example/api/employer/service/EmployerServiceTest.java @@ -1,6 +1,6 @@ package com.example.api.employer.service; -import com.example.api.business.domain.BusinessLocation; +import com.example.api.domain.Location; import com.example.api.account.repository.AccountRepository; import com.example.api.account.repository.LocationRepository; import com.example.api.business.BusinessRepository; @@ -33,9 +33,9 @@ class EmployerServiceTest { void setUp() { Account account = new Account(); accountRepository.save(account); - BusinessLocation location1 = new BusinessLocation("zipcode1", "address1", "detailAddress1"); - BusinessLocation location2 = new BusinessLocation("zipcode2", "address2", "detailAddress2"); - BusinessLocation location3 = new BusinessLocation("zipcode3", "address3", "detailAddress3"); + Location location1 = new Location("zipcode1", "address1", "detailAddress1"); + Location location2 = new Location("zipcode2", "address2", "detailAddress2"); + Location location3 = new Location("zipcode3", "address3", "detailAddress3"); locationRepository.save(location1); locationRepository.save(location2); locationRepository.save(location3); diff --git a/src/test/java/com/example/api/offeremployment/OfferEmploymentServiceTest.java b/src/test/java/com/example/api/offeremployment/OfferEmploymentServiceTest.java index e5dd902b..b31ccdda 100644 --- a/src/test/java/com/example/api/offeremployment/OfferEmploymentServiceTest.java +++ b/src/test/java/com/example/api/offeremployment/OfferEmploymentServiceTest.java @@ -1,6 +1,6 @@ package com.example.api.offeremployment; -import com.example.api.business.domain.BusinessLocation; +import com.example.api.domain.Location; import com.example.api.account.entity.Nationality; import com.example.api.account.entity.UserRole; import com.example.api.account.repository.AccountRepository; @@ -59,7 +59,7 @@ void setUp() { Business business = new Business( "My Coffee Shop", - new BusinessLocation(), + new Location(), "Bob", employer, LocalDate.of(2020, 1, 1), From e185bd208a7dedeca11d1def781d4b4d2c94fe1d Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Sun, 16 Feb 2025 02:33:51 +0900 Subject: [PATCH 265/276] =?UTF-8?q?yml=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/api/domain/FlavoredDistrict.java | 2 +- .../java/com/example/api/domain/Location.java | 2 + src/main/resources/static/danpat.yaml | 72 ++++++++++++++----- 3 files changed, 58 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/example/api/domain/FlavoredDistrict.java b/src/main/java/com/example/api/domain/FlavoredDistrict.java index 407c0b32..9a19f76e 100644 --- a/src/main/java/com/example/api/domain/FlavoredDistrict.java +++ b/src/main/java/com/example/api/domain/FlavoredDistrict.java @@ -18,7 +18,7 @@ public class FlavoredDistrict extends BaseEntity { @Column(name = "FLAVORED_DISTRICT_ID") private Long id; - @ManyToOne(fetch = LAZY) + @ManyToOne(fetch = LAZY, cascade = CascadeType.ALL) @JoinColumn(name = "LOCATION_ID", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) private Location location; diff --git a/src/main/java/com/example/api/domain/Location.java b/src/main/java/com/example/api/domain/Location.java index a136ada6..c04b604b 100644 --- a/src/main/java/com/example/api/domain/Location.java +++ b/src/main/java/com/example/api/domain/Location.java @@ -1,6 +1,7 @@ package com.example.api.domain; import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import jakarta.persistence.*; import lombok.EqualsAndHashCode; import lombok.Getter; @@ -12,6 +13,7 @@ @Getter @ToString @EqualsAndHashCode +@JsonIgnoreProperties({"createdDate", "updatedDate"}) @Table(name = "LOCATION") public class Location extends BaseEntity { @Id diff --git a/src/main/resources/static/danpat.yaml b/src/main/resources/static/danpat.yaml index 04c51f2a..c33de33f 100644 --- a/src/main/resources/static/danpat.yaml +++ b/src/main/resources/static/danpat.yaml @@ -292,10 +292,12 @@ paths: items: $ref: "#/components/schemas/FlavoredDistrictResponse" example: - - districtId: 1 - districtName: "서울 강남구" - - districtId: 5 - districtName: "대구 남구" + - sido: "경기" + sigugun: "남양주시" + dong: "별내동" + - sido: "경기" + sigugun: "남양주시" + dong: "별내면" post: tags: - BoardController @@ -307,6 +309,14 @@ paths: application/json: schema: $ref: "#/components/schemas/UpdatePreferredDistrictsRequest" + example: + locations: + - sido: "경기" + sigugun: "남양주시" + dong: "별내동" + - sido: "경기" + sigugun: "남양주시" + dong: "별내면" required: true responses: "200": @@ -319,10 +329,12 @@ paths: $ref: "#/components/schemas/FlavoredDistrictResponse" example: example: - - districtId: 1 - districtName: "서울 강남구" - - districtId: 5 - districtName: "대구 남구" + - sido: "경기" + sigugun: "남양주시" + dong: "별내동" + - sido: "경기" + sigugun: "남양주시" + dong: "별내면" /api/v1/possible-board/work-preferences/category: get: tags: @@ -460,7 +472,7 @@ paths: schema: $ref: "#/components/schemas/PersonalInfoResponse" example: - - name: "김태영" + name: "김태영" nickname: "김태일" age: 25 sex: "남" @@ -471,6 +483,13 @@ paths: callTime: "hh:mm~hh:mm" starPoint: 4.5 workCount: 100 + location: + zipcode: "12345" + address: "주소" + detailAddress: "상세 주소" + sido: "경기" + sigugun: "남양주시" + dong: "별내면" post: tags: - BoardController @@ -489,6 +508,15 @@ paths: sex: "남" email: "chulsoo@example.com" phoneNumber: "010-1234-5678" + birthdate: "yyyy:mm:dd" + callTime: "09:00 ~18:00" + location: + zipcode: "12345" + address: "주소" + detailAddress: "상세 주소" + sido: "경기" + sigugun: "남양주시" + dong: "별내면" required: true responses: "200": @@ -498,14 +526,24 @@ paths: schema: $ref: "#/components/schemas/PersonalInfoResponse" example: - - name: "김태영" - nickname: "김태일" - age: 25 - sex: "남" - email: "chulsoo@example.com" - phoneNumber: "010-1234-5678" - starPoint: 4.5 - workCount: 100 + name: "김태영" + nickname: "김태일" + age: 25 + sex: "남" + email: "chulsoo@example.com" + phoneNumber: "010-1234-5678" + profile: "https://danpat.s3.ap-northeast-2.amazonaws.com/user-uploads/1/profile.png" + birthdate: "yyyy.mm.dd" + callTime: "hh:mm~hh:mm" + starPoint: 4.5 + workCount: 100 + location: + zipcode: "12345" + address: "주소" + detailAddress: "상세 주소" + sido: "경기" + sigugun: "남양주시" + dong: "별내면" /api/v1/possible-board/external-career: get: tags: From 46c8be32bdfce77525c8e97eb36be18f53e283f8 Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Sun, 16 Feb 2025 19:25:04 +0900 Subject: [PATCH 266/276] suggest status column add --- .../com/example/api/domain/QContract.java | 2 - .../example/api/domain/QOfferEmployment.java | 10 +- .../api/board/service/BoardService.java | 3 +- .../api/board/service/EmployeeService.java | 4 +- .../example/api/contracts/ContractMapper.java | 3 +- .../api/contracts/ContractRepository.java | 11 +- .../api/contracts/ContractService.java | 17 ++- .../api/contracts/OfferRepository.java | 6 +- .../controller/ContractController.java | 7 +- .../dto/ContractScheduleResponse.java | 5 + .../dto/SuggestedBusinessResponse.java | 6 +- .../java/com/example/api/domain/Contract.java | 10 +- .../example/api/domain/OfferEmployment.java | 21 ++-- .../example/api/domain/ProposalStatus.java | 9 ++ .../repository/OfferEmploymentRepository.java | 16 +-- .../OfferEmploymentService.java | 19 ++- .../controller/OfferEmploymentController.java | 8 ++ .../dto/OfferEmploymentResponse.java | 7 +- .../entity/OfferEmploymentMapper.java | 58 +++++++++ .../suggest/controller/SuggestController.java | 24 ++-- .../controller/dto/SuggestStatusDTO.java | 23 ++-- .../request/OfferEmploymentDetailRequest.java | 6 +- .../api/suggest/service/SuggestService.java | 73 ++--------- src/main/resources/static/danpat.yaml | 119 ++++++++---------- 24 files changed, 227 insertions(+), 240 deletions(-) create mode 100644 src/main/java/com/example/api/domain/ProposalStatus.java create mode 100644 src/main/java/com/example/api/offeremployment/entity/OfferEmploymentMapper.java diff --git a/src/main/generated/com/example/api/domain/QContract.java b/src/main/generated/com/example/api/domain/QContract.java index 59932355..c6ae3403 100644 --- a/src/main/generated/com/example/api/domain/QContract.java +++ b/src/main/generated/com/example/api/domain/QContract.java @@ -32,8 +32,6 @@ public class QContract extends EntityPathBase { public final DateTimePath contractStartTime = createDateTime("contractStartTime", java.time.LocalDateTime.class); - public final BooleanPath contractSucceeded = createBoolean("contractSucceeded"); - //inherited public final DateTimePath createdDate = _super.createdDate; diff --git a/src/main/generated/com/example/api/domain/QOfferEmployment.java b/src/main/generated/com/example/api/domain/QOfferEmployment.java index 9f79f3ce..908f6848 100644 --- a/src/main/generated/com/example/api/domain/QOfferEmployment.java +++ b/src/main/generated/com/example/api/domain/QOfferEmployment.java @@ -28,22 +28,18 @@ public class QOfferEmployment extends EntityPathBase { public final QAccount employee; - public final DateTimePath suggestEndTime = createDateTime("suggestEndTime", java.time.LocalDateTime.class); + public final EnumPath status = createEnum("status", ProposalStatus.class); - public final BooleanPath suggestFinished = createBoolean("suggestFinished"); + public final DateTimePath suggestEndTime = createDateTime("suggestEndTime", java.time.LocalDateTime.class); public final NumberPath suggestHourlyPay = createNumber("suggestHourlyPay", Integer.class); public final NumberPath suggestId = createNumber("suggestId", Long.class); - public final BooleanPath suggestReaded = createBoolean("suggestReaded"); - public final DateTimePath suggestRegisterTime = createDateTime("suggestRegisterTime", java.time.LocalDateTime.class); public final DateTimePath suggestStartTime = createDateTime("suggestStartTime", java.time.LocalDateTime.class); - public final BooleanPath suggestSucceeded = createBoolean("suggestSucceeded"); - public QOfferEmployment(String variable) { this(OfferEmployment.class, forVariable(variable), INITS); } @@ -64,7 +60,7 @@ public QOfferEmployment(Class type, PathMetadata meta super(type, metadata, inits); this.business = inits.isInitialized("business") ? new QBusiness(forProperty("business"), inits.get("business")) : null; this.contract = inits.isInitialized("contract") ? new QContract(forProperty("contract"), inits.get("contract")) : null; - this.employee = inits.isInitialized("employee") ? new QAccount(forProperty("employee")) : null; + this.employee = inits.isInitialized("employee") ? new QAccount(forProperty("employee"), inits.get("employee")) : null; } } diff --git a/src/main/java/com/example/api/board/service/BoardService.java b/src/main/java/com/example/api/board/service/BoardService.java index afa0fd8a..e9d90564 100644 --- a/src/main/java/com/example/api/board/service/BoardService.java +++ b/src/main/java/com/example/api/board/service/BoardService.java @@ -18,7 +18,6 @@ import com.example.api.board.repository.PossibleBoardRepository; import com.example.api.global.exception.BusinessException; import com.example.api.global.exception.ErrorCode; -import com.fasterxml.jackson.databind.ObjectMapper; import com.github.jknack.handlebars.internal.lang3.tuple.Pair; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -82,7 +81,7 @@ public List getExternalCareers(final EmployeeIdRequest e @Transactional(readOnly = true) public List getInternalCareers(final EmployeeIdRequest employeeIdRequest) { - return offerEmploymentRepository.findAllByEmployeeId(employeeIdRequest.employeeId()); + return offerEmploymentRepository.findAllInternalCareerResponseByEmployeeId(employeeIdRequest.employeeId()); } @Transactional diff --git a/src/main/java/com/example/api/board/service/EmployeeService.java b/src/main/java/com/example/api/board/service/EmployeeService.java index e662d9ad..2b6ccd5d 100644 --- a/src/main/java/com/example/api/board/service/EmployeeService.java +++ b/src/main/java/com/example/api/board/service/EmployeeService.java @@ -9,10 +9,10 @@ import com.example.api.global.exception.BusinessException; import com.example.api.global.exception.ErrorCode; import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Repository; +import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -@Repository +@Service @RequiredArgsConstructor public class EmployeeService { private final AccountRepository accountRepository; diff --git a/src/main/java/com/example/api/contracts/ContractMapper.java b/src/main/java/com/example/api/contracts/ContractMapper.java index 5481b3bd..d8b9982b 100644 --- a/src/main/java/com/example/api/contracts/ContractMapper.java +++ b/src/main/java/com/example/api/contracts/ContractMapper.java @@ -15,8 +15,7 @@ public Contract notYetSucceeded(final OfferEmployment offerEmployment) { offerEmployment, offerEmployment.getSuggestStartTime(), offerEmployment.getSuggestEndTime(), - offerEmployment.getSuggestHourlyPay(), - false + offerEmployment.getSuggestHourlyPay() ); } } diff --git a/src/main/java/com/example/api/contracts/ContractRepository.java b/src/main/java/com/example/api/contracts/ContractRepository.java index 93328322..7092eab0 100644 --- a/src/main/java/com/example/api/contracts/ContractRepository.java +++ b/src/main/java/com/example/api/contracts/ContractRepository.java @@ -47,18 +47,13 @@ public interface ContractRepository extends JpaRepository { "join c.offerEmployment oe " + "join oe.employee e " + "join oe.business b " + - "where b.businessId = :businessId and c.contractSucceeded = true") + "where b.businessId = :businessId and oe.status = 'TERMINATED'") List findAvailableReviewsByBusinessId(@Param("businessId") Long businessId); - @Query("select new com.example.api.contracts.dto.ContractScheduleResponse(c.contractId, b.businessName, c.contractStartTime, c.contractEndTime) " + - "from Contract c inner join c.offerEmployment o inner join o.business b " + - "where o.employee.accountId = :employeeId and c.contractStartTime >= :currentMonth") - List findContractScheduleByEmployeeId(@Param("employeeId") Long employeeId, - @Param("currentMonth") LocalDateTime currentMonth); - - @Query("select new com.example.api.suggest.controller.dto.request.OfferEmploymentDetailRequest(e.name, b.businessName, c.contractHourlyPay, c.contractStartTime, c.contractEndTime) " + + @Query("select new com.example.api.suggest.controller.dto.request.OfferEmploymentDetailRequest(e.name, b.businessName, oe.status, c.contractHourlyPay, c.contractStartTime, c.contractEndTime, cr.chatRoomId) " + "from Contract c " + "join c.offerEmployment oe " + + "join ChatRoom cr on cr.offerEmployment.suggestId = oe.suggestId " + "join oe.employee e " + "join oe.business b " + "where c.contractId = :contractId") diff --git a/src/main/java/com/example/api/contracts/ContractService.java b/src/main/java/com/example/api/contracts/ContractService.java index 5f2031e1..9d7552ed 100644 --- a/src/main/java/com/example/api/contracts/ContractService.java +++ b/src/main/java/com/example/api/contracts/ContractService.java @@ -6,17 +6,17 @@ import com.example.api.contracts.dto.*; import com.example.api.contracts.update.UpdateContractConditionManager; import com.example.api.contracts.dto.UpdateContractConditionCommand; -import com.example.api.domain.Account; -import com.example.api.domain.Contract; +import com.example.api.domain.*; import java.time.LocalDate; import java.util.ArrayList; import java.util.List; -import com.example.api.domain.PossibleBoard; import com.example.api.global.exception.BusinessException; import com.example.api.global.exception.ErrorCode; +import com.example.api.offeremployment.entity.OfferEmploymentMapper; +import com.example.api.suggest.controller.dto.SuggestStatusDTO; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -31,7 +31,8 @@ public class ContractService { private final UpdateContractConditionManager updateContractConditionManager; private final PossibleBoardRepository possibleBoardRepository; private final AccountRepository accountRepository; - + private final OfferRepository offerRepository; + private final OfferEmploymentMapper offerEmploymentMapper; @Transactional public void updateContract(@Validated final UpdateContractConditionCommand updateContractConditionCommand) { @@ -42,7 +43,8 @@ public void updateContract(@Validated final UpdateContractConditionCommand updat @Transactional public void acceptContract(@Validated final AcceptContractCommand acceptContractCommand) { final Contract contract = loadContract(acceptContractCommand.contractId()); - contract.succeed(); + OfferEmployment oe = offerRepository.findById(acceptContractCommand.contractId()).orElseThrow(() -> new BusinessException(ErrorCode.CONTRACT_EXCEPTION)); + oe.setStatus(ProposalStatus.COMPLETED); // 계약 시간에 따른 근무 가능 시간 변경 updateAvailableWorkHours(acceptContractCommand, contract); } @@ -92,9 +94,4 @@ public ContractDTO getContractInfo(final AcceptContractCommand contractStatusCom EmployeeInfoDTO employeeDTO = contractRepository.findEmployeeDTOByContractId(contractStatusCommand.contractId()); return new ContractDTO(businessDTO, employeeDTO); } - - @Transactional(readOnly = true) - public List getContractSchedule(final EmployeeIdRequest employeeIdRequest) { - return contractRepository.findContractScheduleByEmployeeId(employeeIdRequest.employeeId(), LocalDate.now().atStartOfDay()); - } } \ No newline at end of file diff --git a/src/main/java/com/example/api/contracts/OfferRepository.java b/src/main/java/com/example/api/contracts/OfferRepository.java index f1d1236c..626a7a49 100644 --- a/src/main/java/com/example/api/contracts/OfferRepository.java +++ b/src/main/java/com/example/api/contracts/OfferRepository.java @@ -8,8 +8,4 @@ import org.springframework.data.repository.query.Param; public interface OfferRepository extends JpaRepository { - @Query("SELECT new com.example.api.contracts.dto.SuggestedBusinessResponse(offer.business.businessId, offer.suggestStartTime, offer.suggestEndTime, offer.suggestHourlyPay, offer.suggestReaded, offer.suggestSucceeded) " - + "FROM OfferEmployment offer " - + "WHERE offer.employee.accountId = :employeeId") - List queryEmployersSuggests(@Param("employeeId") final Long employeeId); -} +} \ No newline at end of file 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 43fbb7da..8b66b87b 100644 --- a/src/main/java/com/example/api/contracts/controller/ContractController.java +++ b/src/main/java/com/example/api/contracts/controller/ContractController.java @@ -7,6 +7,7 @@ import java.time.LocalDateTime; import java.util.List; +import com.example.api.suggest.controller.dto.SuggestStatusDTO; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; @@ -52,10 +53,4 @@ public ResponseEntity getContractInfo(@PathVariable(required = true ContractDTO contractDTO = contractService.getContractInfo(contractStatusCommand); return ResponseEntity.ok(contractDTO); } - - @GetMapping("/api/v1/contracts/schedule") - public ResponseEntity> getContractSchedule(@AuthenticationPrincipal Long employeeId){ - EmployeeIdRequest employeeIdRequest = new EmployeeIdRequest(employeeId); - return ResponseEntity.ok(contractService.getContractSchedule(employeeIdRequest)); - } } \ No newline at end of file diff --git a/src/main/java/com/example/api/contracts/dto/ContractScheduleResponse.java b/src/main/java/com/example/api/contracts/dto/ContractScheduleResponse.java index d11d8153..debb8d42 100644 --- a/src/main/java/com/example/api/contracts/dto/ContractScheduleResponse.java +++ b/src/main/java/com/example/api/contracts/dto/ContractScheduleResponse.java @@ -1,11 +1,16 @@ package com.example.api.contracts.dto; +import com.example.api.domain.ProposalStatus; + import java.time.LocalDateTime; public record ContractScheduleResponse( Long contractId, String businessName, + ProposalStatus status, + Long hourlyPayment, LocalDateTime startTime, LocalDateTime endTime + ) { } diff --git a/src/main/java/com/example/api/contracts/dto/SuggestedBusinessResponse.java b/src/main/java/com/example/api/contracts/dto/SuggestedBusinessResponse.java index 8f1dacd8..51ebd0c0 100644 --- a/src/main/java/com/example/api/contracts/dto/SuggestedBusinessResponse.java +++ b/src/main/java/com/example/api/contracts/dto/SuggestedBusinessResponse.java @@ -1,5 +1,7 @@ package com.example.api.contracts.dto; +import com.example.api.domain.ProposalStatus; + import java.time.LocalDateTime; public record SuggestedBusinessResponse( @@ -7,8 +9,6 @@ public record SuggestedBusinessResponse( LocalDateTime suggestStartDateTime, LocalDateTime suggestEndDateTime, Integer suggestPartTimePayment, - Boolean suggestChecked, - Boolean suggestAccepted - + ProposalStatus status ) { } \ No newline at end of file diff --git a/src/main/java/com/example/api/domain/Contract.java b/src/main/java/com/example/api/domain/Contract.java index 17329df2..a3b01922 100644 --- a/src/main/java/com/example/api/domain/Contract.java +++ b/src/main/java/com/example/api/domain/Contract.java @@ -27,23 +27,19 @@ public class Contract extends BaseEntity { private LocalDateTime contractEndTime; @Column(name = "CONTRACT_HOURLY_PAY") private int contractHourlyPay; - @Column(name = "CONTRACT_SUCCEDED", columnDefinition = "boolean DEFAULT false") - private boolean contractSucceeded; public Contract( final Long contractId, final OfferEmployment offerEmployment, final LocalDateTime contractStartTime, final LocalDateTime contractEndTime, - final int contractHourlyPay, - final boolean contractSucceeded + final int contractHourlyPay ) { this.contractId = contractId; this.offerEmployment = offerEmployment; this.contractStartTime = contractStartTime; this.contractEndTime = contractEndTime; this.contractHourlyPay = contractHourlyPay; - this.contractSucceeded = contractSucceeded; } public void updateHourlyPayment(final Integer hourlyPay) { @@ -61,8 +57,4 @@ public void updateEndDateTime(final LocalDateTime contractEndTime) { public boolean isValidContractRangeTime() { return this.contractStartTime.isBefore(this.contractEndTime); } - - public void succeed() { - this.contractSucceeded = true; - } } \ No newline at end of file diff --git a/src/main/java/com/example/api/domain/OfferEmployment.java b/src/main/java/com/example/api/domain/OfferEmployment.java index 8450283f..4ef854ce 100644 --- a/src/main/java/com/example/api/domain/OfferEmployment.java +++ b/src/main/java/com/example/api/domain/OfferEmployment.java @@ -1,5 +1,6 @@ package com.example.api.domain; +import com.example.api.account.entity.Nationality; import com.example.api.offeremployment.dto.OfferEmploymentCommand; import jakarta.persistence.*; import lombok.*; @@ -17,7 +18,6 @@ public class OfferEmployment { @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "SUGGEST_ID") private Long suggestId; - @OneToOne(fetch = LAZY) @JoinColumn(name = "BUSINESS_ID", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) private Business business; @@ -32,16 +32,12 @@ public class OfferEmployment { 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_STATUS") + @Enumerated(EnumType.STRING) + private ProposalStatus status; @Column(name = "SUGGEST_REGISTER_TIME") private LocalDateTime suggestRegisterTime; - @Column(name = "SUGGEST_FINISHED", columnDefinition = "boolean DEFAULT false") - private boolean suggestFinished; - public static OfferEmployment fromCommand(OfferEmploymentCommand offerEmploymentCommand, Account employee, Business business) { return new OfferEmployment( business, @@ -58,6 +54,7 @@ public OfferEmployment(Business business, Account employee, LocalDateTime sugges this.suggestStartTime = suggestStartTime; this.suggestEndTime = suggestEndTime; this.suggestHourlyPay = suggestHourlyPay; + this.status = ProposalStatus.PENDING; } @PrePersist @@ -65,11 +62,11 @@ protected void onCreate() { this.suggestRegisterTime = LocalDateTime.now(); } - public void succeeded() { - this.suggestSucceeded = true; - } - public void setContract(Contract contract) { this.contract = contract; } + + public void setStatus(ProposalStatus status) { + this.status = status; + } } \ No newline at end of file diff --git a/src/main/java/com/example/api/domain/ProposalStatus.java b/src/main/java/com/example/api/domain/ProposalStatus.java new file mode 100644 index 00000000..7ecdeac1 --- /dev/null +++ b/src/main/java/com/example/api/domain/ProposalStatus.java @@ -0,0 +1,9 @@ +package com.example.api.domain; + +public enum ProposalStatus { + PENDING, // 대기 중 + IN_PROGRESS, // 체결 중 + COMPLETED, // 체결 완료 + TERMINATED, // 종료 + FAILED, // 거절 +} diff --git a/src/main/java/com/example/api/domain/repository/OfferEmploymentRepository.java b/src/main/java/com/example/api/domain/repository/OfferEmploymentRepository.java index e5f4a941..d775275e 100644 --- a/src/main/java/com/example/api/domain/repository/OfferEmploymentRepository.java +++ b/src/main/java/com/example/api/domain/repository/OfferEmploymentRepository.java @@ -4,7 +4,6 @@ import com.example.api.domain.OfferEmployment; import com.example.api.suggest.controller.dto.request.OfferEmploymentDetailRequest; import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; @@ -18,21 +17,18 @@ public interface OfferEmploymentRepository extends JpaRepository findAllByEmployeeId(@Param("employeeId") long employeeId); + List findAllInternalCareerResponseByEmployeeId(@Param("employeeId") long employeeId); @Query("select o from OfferEmployment o where o.business.businessId = :businessId") - List findAllByBusinessBusinessId(long businessId); + List findAllByBusinessBusinessId(Long businessId); - @Query("select new com.example.api.suggest.controller.dto.request.OfferEmploymentDetailRequest(e.name, b.businessName, oe.suggestHourlyPay, oe.suggestStartTime, oe.suggestEndTime) " + + @Query("select o from OfferEmployment o where o.employee.accountId = :employeeId") + List findAllByEmployeeId(Long employeeId); + + @Query("select new com.example.api.suggest.controller.dto.request.OfferEmploymentDetailRequest(e.name, b.businessName, oe.status, oe.suggestHourlyPay, oe.suggestStartTime, oe.suggestEndTime, null) " + "from OfferEmployment oe " + "join oe.employee e " + "join oe.business b " + "where oe.suggestId = :offerEmploymentId") OfferEmploymentDetailRequest findSuggestByOfferEmploymentId(@Param("offerEmploymentId") Long offerEmploymentId); - - @Modifying - @Query("update OfferEmployment oe " + - "set oe.suggestFinished = true, oe.suggestEndTime = CURRENT_TIMESTAMP " + - "where oe.suggestId = :suggestId") - void updateSuggestStatusToFinishedBySuggestId(@Param("suggestId") Long suggestId); } \ No newline at end of file diff --git a/src/main/java/com/example/api/offeremployment/OfferEmploymentService.java b/src/main/java/com/example/api/offeremployment/OfferEmploymentService.java index e43bc0db..975d9f9b 100644 --- a/src/main/java/com/example/api/offeremployment/OfferEmploymentService.java +++ b/src/main/java/com/example/api/offeremployment/OfferEmploymentService.java @@ -5,13 +5,18 @@ import com.example.api.domain.Account; import com.example.api.domain.Business; import com.example.api.domain.OfferEmployment; +import com.example.api.domain.ProposalStatus; import com.example.api.domain.repository.OfferEmploymentRepository; +import com.example.api.global.exception.BusinessException; +import com.example.api.global.exception.ErrorCode; import com.example.api.offeremployment.dto.*; import com.example.api.review.repository.ReviewRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.Optional; + @Service @RequiredArgsConstructor public class OfferEmploymentService { @@ -37,12 +42,22 @@ public OfferEmploymentResponse sendOfferEmployment(final OfferEmploymentRequest } @Transactional - public void completeOfferEmployment(OfferEmploymentCompleteRequest completeRequest) { + public void completeOfferEmployment(final OfferEmploymentCompleteRequest completeRequest) { // offerEmployment를 종료로 변경, 종료 시간 업뎃 - offerEmploymentRepository.updateSuggestStatusToFinishedBySuggestId(completeRequest.suggestId()); + OfferEmployment oe = offerEmploymentRepository.findById(completeRequest.suggestId()).orElseThrow(() -> new BusinessException(ErrorCode.CONTRACT_EXCEPTION)); + oe.setStatus(ProposalStatus.TERMINATED); + offerEmploymentRepository.save(oe); // 알바생 평점 조정 Integer reviewScore = reviewRepository.findReviewStarPointBySuggestId(completeRequest.suggestId()); // 알바 횟수 count + 1 accountRepository.updateWorkCountAndStarPointBySuggestId(completeRequest.suggestId(), reviewScore); } + + @Transactional + public void refuseOfferEmployment(final OfferEmploymentCompleteRequest completeRequest) { + // offerEmployment를 거절로 변경 + OfferEmployment oe = offerEmploymentRepository.findById(completeRequest.suggestId()).orElseThrow(() -> new BusinessException(ErrorCode.CONTRACT_EXCEPTION)); + oe.setStatus(ProposalStatus.FAILED); + offerEmploymentRepository.save(oe); + } } \ No newline at end of file diff --git a/src/main/java/com/example/api/offeremployment/controller/OfferEmploymentController.java b/src/main/java/com/example/api/offeremployment/controller/OfferEmploymentController.java index 3fa02cd6..3ef0c056 100644 --- a/src/main/java/com/example/api/offeremployment/controller/OfferEmploymentController.java +++ b/src/main/java/com/example/api/offeremployment/controller/OfferEmploymentController.java @@ -34,4 +34,12 @@ public ResponseEntity completeOfferEmployment( offerEmploymentService.completeOfferEmployment(completeRequest); return ResponseEntity.ok("성공적으로 종료되었습니다."); } + + @PostMapping("/refuse") + public ResponseEntity refuseOfferEmployment( + @RequestBody final OfferEmploymentCompleteRequest completeRequest + ) { + offerEmploymentService.refuseOfferEmployment(completeRequest); + return ResponseEntity.ok("성공적으로 거절되었습니다."); + } } \ No newline at end of file diff --git a/src/main/java/com/example/api/offeremployment/dto/OfferEmploymentResponse.java b/src/main/java/com/example/api/offeremployment/dto/OfferEmploymentResponse.java index 6b917127..0213e94b 100644 --- a/src/main/java/com/example/api/offeremployment/dto/OfferEmploymentResponse.java +++ b/src/main/java/com/example/api/offeremployment/dto/OfferEmploymentResponse.java @@ -1,17 +1,16 @@ package com.example.api.offeremployment.dto; import com.example.api.domain.OfferEmployment; +import com.example.api.domain.ProposalStatus; public record OfferEmploymentResponse( Long suggestId, - boolean success, - String message + ProposalStatus status ) { public static OfferEmploymentResponse fromEntity(OfferEmployment offerEmployment) { return new OfferEmploymentResponse( offerEmployment.getSuggestId(), - offerEmployment.isSuggestSucceeded(), - offerEmployment.isSuggestSucceeded() ? "Offer succeeded" : "Offer pending" + offerEmployment.getStatus() ); } } diff --git a/src/main/java/com/example/api/offeremployment/entity/OfferEmploymentMapper.java b/src/main/java/com/example/api/offeremployment/entity/OfferEmploymentMapper.java new file mode 100644 index 00000000..4fa68476 --- /dev/null +++ b/src/main/java/com/example/api/offeremployment/entity/OfferEmploymentMapper.java @@ -0,0 +1,58 @@ +package com.example.api.offeremployment.entity; + +import com.example.api.contracts.ContractRepository; +import com.example.api.domain.OfferEmployment; +import com.example.api.domain.repository.OfferEmploymentRepository; +import com.example.api.suggest.controller.dto.SuggestStatusDTO; +import com.example.api.suggest.controller.dto.request.OfferEmploymentDetailRequest; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; + +@Service +@RequiredArgsConstructor +public class OfferEmploymentMapper { + private final ContractRepository contractRepository; + private final OfferEmploymentRepository offerEmploymentRepository; + private final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.MM.dd"); + + public List currentSuggestStatusCheck(List offerList) { + List suggestStatusDTOList = new ArrayList<>(); + for (OfferEmployment offer : offerList) { + if(contractRepository.existsById(offer.getSuggestId())) { + OfferEmploymentDetailRequest contractDetail = contractRepository.findContractByContractId(offer.getSuggestId()); + suggestStatusDTOList.add(makeSuggestStatusDTO(contractDetail)); + } else { + OfferEmploymentDetailRequest suggestDetail = offerEmploymentRepository.findSuggestByOfferEmploymentId(offer.getSuggestId()); + suggestStatusDTOList.add(makeSuggestStatusDTO(suggestDetail)); + } + } + return suggestStatusDTOList; + } + + public SuggestStatusDTO makeSuggestStatusDTO(OfferEmploymentDetailRequest suggest) { + String formattedDate = suggest.startTime().format(formatter); + + String workTimeStr = formattedDate + + " " + + String.format("%02d", suggest.startTime().getHour()) + + ":" + + String.format("%02d", suggest.startTime().getMinute()) + + "~" + + String.format("%02d", suggest.endTime().getHour()) + + ":" + + String.format("%02d", suggest.endTime().getMinute()); + + return new SuggestStatusDTO( + suggest.status(), + suggest.name(), + suggest.hourlyPayment(), + suggest.businessName(), + workTimeStr, + suggest.chatRoomId() + ); + } +} diff --git a/src/main/java/com/example/api/suggest/controller/SuggestController.java b/src/main/java/com/example/api/suggest/controller/SuggestController.java index bd0db263..9e5f808d 100644 --- a/src/main/java/com/example/api/suggest/controller/SuggestController.java +++ b/src/main/java/com/example/api/suggest/controller/SuggestController.java @@ -1,5 +1,6 @@ package com.example.api.suggest.controller; +import com.example.api.board.dto.request.EmployeeIdRequest; import com.example.api.contracts.dto.AcceptSuggestCommand; import com.example.api.contracts.dto.QueryAllSuggestsForMeCommand; import com.example.api.contracts.dto.SuggestedBusinessResponse; @@ -8,6 +9,7 @@ import com.example.api.suggest.service.SuggestService; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; +import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.*; import java.util.List; @@ -18,29 +20,27 @@ public class SuggestController { private final SuggestService suggestService; @GetMapping("/api/v1/employment-suggests/status/{businessId}") - public ResponseEntity> getSuggestStatus(@PathVariable() long businessId) { + public ResponseEntity> getBusinessSuggestStatus( + @PathVariable Long businessId) { BusinessIdRequest businessIdRequest = new BusinessIdRequest(businessId); - List suggestStatus = suggestService.getSuggestStatus(businessIdRequest); - return ResponseEntity.ok(suggestStatus); + return ResponseEntity.ok(suggestService.getBusinessSuggestStatus(businessIdRequest)); } - @GetMapping("/api/v1/contracts/employment-suggests") - public ResponseEntity> getAllSuggest( - @RequestParam(required = true) final Long employeeId + @GetMapping("/api/v1/employment-suggests/employee/status") + public ResponseEntity> getEmployeeSuggestStatus( + @AuthenticationPrincipal final Long employeeId ) { - final QueryAllSuggestsForMeCommand queryAllSuggestsForMeCommand = new QueryAllSuggestsForMeCommand(employeeId); - final List suggestedBusinesses = suggestService.getAllRelatedSuggests( - queryAllSuggestsForMeCommand); - return ResponseEntity.ok(suggestedBusinesses); + EmployeeIdRequest employeeIdRequest = new EmployeeIdRequest(employeeId); + return ResponseEntity.ok(suggestService.getEmployeeSuggestStatus(employeeIdRequest)); } @PostMapping("/api/v1/contracts/suggests/{suggestId}/accept") - public ResponseEntity acceptContractContact( + public ResponseEntity acceptContractContact( @PathVariable(required = true) final Long suggestId ) { final AcceptSuggestCommand acceptSuggestCommand = new AcceptSuggestCommand(suggestId); suggestService.acceptSuggest(acceptSuggestCommand); - return ResponseEntity.ok(null); + return ResponseEntity.ok("성공적으로 제안을 수락하였습니다."); } @PostMapping("/api/v1/contracts/suggests/chatroom") diff --git a/src/main/java/com/example/api/suggest/controller/dto/SuggestStatusDTO.java b/src/main/java/com/example/api/suggest/controller/dto/SuggestStatusDTO.java index 47d02ee0..fa89bb40 100644 --- a/src/main/java/com/example/api/suggest/controller/dto/SuggestStatusDTO.java +++ b/src/main/java/com/example/api/suggest/controller/dto/SuggestStatusDTO.java @@ -1,18 +1,13 @@ package com.example.api.suggest.controller.dto; -import lombok.*; +import com.example.api.domain.ProposalStatus; - -@Getter -@Setter -@EqualsAndHashCode -@AllArgsConstructor -@NoArgsConstructor -public class SuggestStatusDTO { - private String status; - private String name; - private Integer hourlyPayment; - private String businessName; - private String workTime; - // 채팅 방 번호 추가 +public record SuggestStatusDTO ( + ProposalStatus status, + String name, + Integer hourlyPayment, + String businessName, + String workTime, + Long chatRoomId +) { } diff --git a/src/main/java/com/example/api/suggest/controller/dto/request/OfferEmploymentDetailRequest.java b/src/main/java/com/example/api/suggest/controller/dto/request/OfferEmploymentDetailRequest.java index 873b7973..60675b70 100644 --- a/src/main/java/com/example/api/suggest/controller/dto/request/OfferEmploymentDetailRequest.java +++ b/src/main/java/com/example/api/suggest/controller/dto/request/OfferEmploymentDetailRequest.java @@ -1,12 +1,16 @@ package com.example.api.suggest.controller.dto.request; +import com.example.api.domain.ProposalStatus; + import java.time.LocalDateTime; public record OfferEmploymentDetailRequest( String name, String businessName, + ProposalStatus status, Integer hourlyPayment, LocalDateTime startTime, - LocalDateTime endTime + LocalDateTime endTime, + Long chatRoomId ) { } diff --git a/src/main/java/com/example/api/suggest/service/SuggestService.java b/src/main/java/com/example/api/suggest/service/SuggestService.java index a55ee02d..b16a6fae 100644 --- a/src/main/java/com/example/api/suggest/service/SuggestService.java +++ b/src/main/java/com/example/api/suggest/service/SuggestService.java @@ -1,5 +1,6 @@ package com.example.api.suggest.service; +import com.example.api.board.dto.request.EmployeeIdRequest; import com.example.api.chat.repository.ChatRoomRepository; import com.example.api.contracts.ContractMapper; import com.example.api.contracts.ContractRepository; @@ -9,22 +10,19 @@ import com.example.api.contracts.dto.SuggestedBusinessResponse; import com.example.api.domain.ChatRoom; import com.example.api.domain.Contract; +import com.example.api.domain.ProposalStatus; import com.example.api.domain.repository.OfferEmploymentRepository; import com.example.api.domain.OfferEmployment; -import com.example.api.global.exception.BusinessException; -import com.example.api.global.exception.ErrorCode; +import com.example.api.offeremployment.entity.OfferEmploymentMapper; import com.example.api.suggest.controller.dto.SuggestStatusDTO; import com.example.api.suggest.controller.dto.request.BusinessIdRequest; -import com.example.api.suggest.controller.dto.request.OfferEmploymentDetailRequest; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; -import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; -import java.util.ArrayList; import java.util.List; @Service @@ -37,75 +35,24 @@ public class SuggestService { private final ContractRepository contractRepository; private final ChatRoomRepository chatRoomRepository; private final ContractMapper contractMapper; + private final OfferEmploymentMapper offerEmploymentMapper; @Transactional(readOnly = true) - public List getSuggestStatus(final BusinessIdRequest businessIdRequest) { + public List getBusinessSuggestStatus(final BusinessIdRequest businessIdRequest) { List offerList = offerEmploymentRepository.findAllByBusinessBusinessId(businessIdRequest.BusinessId()); - return currentSuggestStatusCheck(offerList); - } - - private List currentSuggestStatusCheck(List offerList) { - List suggestStatusDTOList = new ArrayList<>(); - String status; - for (OfferEmployment offer : offerList) { - if (offer.isSuggestReaded() == false) { - status = "대기 중"; - } else if (offer.isSuggestReaded() == true && offer.isSuggestSucceeded() == false) { - status = "거절"; - } else if (offer.isSuggestReaded() && offer.isSuggestSucceeded() == true) { - Contract contract = contractRepository.findById(offer.getSuggestId()).orElseThrow(() -> new BusinessException(ErrorCode.CONTRACT_EXCEPTION)); - if(!contract.isContractSucceeded()) - status = "체결 중"; - else - status = "체결 완료"; - } else { - status = "알 수 없는 상태"; - } - - if(contractRepository.existsById(offer.getSuggestId())) { - OfferEmploymentDetailRequest contractDetail = contractRepository.findContractByContractId(offer.getSuggestId()); - suggestStatusDTOList.add(makeSuggestStatusDTO(contractDetail, status)); - } else { - OfferEmploymentDetailRequest suggestDetail = offerEmploymentRepository.findSuggestByOfferEmploymentId(offer.getSuggestId()); - suggestStatusDTOList.add(makeSuggestStatusDTO(suggestDetail, status)); - } - } - return suggestStatusDTOList; - } - - public SuggestStatusDTO makeSuggestStatusDTO(OfferEmploymentDetailRequest suggest, String status) { - String formattedDate = suggest.startTime().format(formatter); - - StringBuilder workTime = new StringBuilder(); - workTime.append(formattedDate) - .append(" ") - .append(String.format("%02d", suggest.startTime().getHour())) - .append(":") - .append(String.format("%02d", suggest.startTime().getMinute())) - .append("~") - .append(String.format("%02d", suggest.endTime().getHour())) - .append(":") - .append(String.format("%02d", suggest.endTime().getMinute())); - String workTimeStr = workTime.toString(); - - return new SuggestStatusDTO( - status, - suggest.name(), - suggest.hourlyPayment(), - suggest.businessName(), - workTimeStr - ); + return offerEmploymentMapper.currentSuggestStatusCheck(offerList); } @Transactional(readOnly = true) - public List getAllRelatedSuggests(final QueryAllSuggestsForMeCommand allSuggestsForMeCommand) { - return offerRepository.queryEmployersSuggests(allSuggestsForMeCommand.employeeId()); + public List getEmployeeSuggestStatus(final EmployeeIdRequest employeeIdRequest) { + List offerList = offerEmploymentRepository.findAllByEmployeeId(employeeIdRequest.employeeId()); + return offerEmploymentMapper.currentSuggestStatusCheck(offerList); } @Transactional public void acceptSuggest(@Validated final AcceptSuggestCommand acceptSuggestCommand) { final OfferEmployment offerEmployment = loadOffer(acceptSuggestCommand.suggestId()); - offerEmployment.succeeded(); + offerEmployment.setStatus(ProposalStatus.IN_PROGRESS); final Contract contract = contractMapper.notYetSucceeded(offerEmployment); offerEmployment.setContract(contract); diff --git a/src/main/resources/static/danpat.yaml b/src/main/resources/static/danpat.yaml index c33de33f..b84cb67c 100644 --- a/src/main/resources/static/danpat.yaml +++ b/src/main/resources/static/danpat.yaml @@ -4,7 +4,7 @@ info: description: 단팥 백엔드 API 명세서입니다. version: 1.0.0 servers: - - url: http://localhost:8080 + - url: http://43.201.78.102:8080 security: - JWT_TOKEN: [] paths: @@ -724,8 +724,7 @@ paths: $ref: "#/components/schemas/OfferEmploymentResponse" example: suggestId: 1 - success: false - message: "Offer pending" + message: "PENDING" /api/v1/offeremployment/complete: post: tags: @@ -750,8 +749,32 @@ paths: schema: type: string example: - success: true message: "성공적으로 종료되었습니다." + /api/v1/offeremployment/refuse: + post: + tags: + - OfferEmploymentController + summary: "알바생이 제안 거절 요청하기" + description: "알바생이 제안 거절 요청하기" + operationId: refuseOfferEmployment + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/OfferEmploymentCompleteRequest" + example: + suggestId: 1 + employeeId: 1001 + required: true + responses: + "200": + description: OK + content: + '*/*': + schema: + type: string + example: + message: "성공적으로 거절되었습니다." /api/v1/contracts/suggests/chatroom: post: tags: @@ -795,7 +818,8 @@ paths: content: '*/*': schema: - type: object + type: string + example: "성공적으로 제안을 수락하였습니다." /api/v1/employment-suggests/status/{businessId}: get: tags: @@ -818,45 +842,33 @@ paths: schema: type: string example: - - status: "대기 중" + - status: "COMPLETED" + name: "알바생" + hourlyPayment: 12000 + businessName: "김태영닷컴" + workTime: "2024.02.20 12:00~14:00" + chatRoomId: 1 + /api/v1/employment-suggests/employee/status: + get: + tags: + - SuggestController + summary: "알바 마이페이지에서 체결 현황" + description: "알바 마이페이지에서 체결 현황" + operationId: getEmployeeSuggestStatus + responses: + "200": + description: OK + content: + '*/*': + schema: + type: string + example: + - status: "COMPLETED" name: "알바생" hourlyPayment: 12000 businessName: "김태영닷컴" workTime: "2024.02.20 12:00~14:00" -# /api/v1/contracts/employment-suggests: -# get: -# tags: -# - SuggestController -# operationId: getAllSuggest -# parameters: -# - name: employeeId -# in: query -# required: true -# schema: -# type: integer -# format: int64 -# responses: -# "200": -# description: OK -# content: -# '*/*': -# schema: -# type: array -# items: -# $ref: "#/components/schemas/SuggestedBusinessResponse" -# example: -# - businessId: 1 -# suggestStartDateTime: "2024-02-01T09:00:00" -# suggestEndDateTime: "2024-02-01T11:00:00" -# suggestPartTimePayment: 10000 -# suggestChecked: 1 -# suggestAccepted: 0 -# - businessId: 2 -# suggestStartDateTime: "2024-02-01T09:00:00" -# suggestEndDateTime: "2024-02-01T11:00:00" -# suggestPartTimePayment: 10000 -# suggestChecked: 1 -# suggestAccepted: 1 + chatRoomId: 1 /api/v1/support/announcements/{announcementId}: get: tags: @@ -985,6 +997,7 @@ paths: '*/*': schema: type: string + example: "성공적으로 수락되었습니다." /api/v1/contracts/{contractId}/status: get: tags: @@ -1023,32 +1036,6 @@ paths: employeePhone: "010-9876-5432" starPoint: 4.7 workCount: 120 - /api/v1/contracts/schedule: - get: - tags: - - ContractController - summary: "알바생 마이페이지, 체결 현황 보기" - description: "알바생 마이페이지, 체결 현황 보기" - operationId: getContractSchedule - responses: - "200": - description: OK - content: - '*/*': - schema: - type: array - items: - $ref: "#/components/schemas/ContractScheduleResponse" - example: - - contractId: - businessName: - startTime: - endTime: - - contractId: - businessName: - startTime: - endTime: - /api/v1/business: get: tags: From f1183cdda09ef09a4ff7aa76e389d79588839085 Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Sun, 16 Feb 2025 20:42:46 +0900 Subject: [PATCH 267/276] =?UTF-8?q?api=20=EC=88=98=EC=A0=95=2025-02-16?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/account/repository/AccountRepository.java | 1 + .../board/repository/PossibleBoardRepository.java | 6 ++++-- .../example/api/business/BusinessRepository.java | 2 +- .../business/controller/BusinessController.java | 10 ++++++---- .../com/example/api/contracts/ContractService.java | 4 ++-- .../contracts/controller/ContractController.java | 13 ++++++------- .../api/contracts/dto/AcceptContractCommand.java | 3 ++- src/main/resources/static/danpat.yaml | 14 +++----------- 8 files changed, 25 insertions(+), 28 deletions(-) diff --git a/src/main/java/com/example/api/account/repository/AccountRepository.java b/src/main/java/com/example/api/account/repository/AccountRepository.java index ae33fc34..290f8e07 100644 --- a/src/main/java/com/example/api/account/repository/AccountRepository.java +++ b/src/main/java/com/example/api/account/repository/AccountRepository.java @@ -38,6 +38,7 @@ public interface AccountRepository extends JpaRepository { @Query("select a from Account a where a.accountId = :employeeId") Optional findByEmployeeId(@Param("employeeId") Long employeeId); + @Query("SELECT a.introduction FROM Account a WHERE a.accountId = :accountId") String findIntroductionByAccountId(Long accountId); @Query("select new com.example.api.setting.dto.EmailConsentResponse(a.emailReceivable) from Account a where a.accountId = :userId") diff --git a/src/main/java/com/example/api/board/repository/PossibleBoardRepository.java b/src/main/java/com/example/api/board/repository/PossibleBoardRepository.java index 8a305994..a9f0c9aa 100644 --- a/src/main/java/com/example/api/board/repository/PossibleBoardRepository.java +++ b/src/main/java/com/example/api/board/repository/PossibleBoardRepository.java @@ -28,6 +28,8 @@ Integer deleteDuplicatedWorkTimeIncluded(@Param("startDateTime") final LocalDate List findScheduleFromCurrentMonth(@Param("employeeId")Long employeeId, @Param("currentMonth") LocalDateTime currentMonth); @Query("select p from PossibleBoard p where p.employee.accountId = :employeeId and p.startTime <= :endDateTime and p.endTime >= :startDateTime") - Optional findMatchingWorkHours(@Param("startDateTime") final LocalDateTime startDateTimeIncluded, - @Param("endDateTime") final LocalDateTime endDateTimeIncluded); + Optional findMatchingWorkHours( + @Param("employeeId") final Long employeeId, + @Param("startDateTime") final LocalDateTime startDateTimeIncluded, + @Param("endDateTime") final LocalDateTime endDateTimeIncluded); } \ No newline at end of file diff --git a/src/main/java/com/example/api/business/BusinessRepository.java b/src/main/java/com/example/api/business/BusinessRepository.java index b58cb833..e776a7dd 100644 --- a/src/main/java/com/example/api/business/BusinessRepository.java +++ b/src/main/java/com/example/api/business/BusinessRepository.java @@ -13,7 +13,7 @@ @Repository public interface BusinessRepository extends JpaRepository { - @Query("SELECT b FROM Business b JOIN FETCH b.employer JOIN FETCH b.businessCategories WHERE b.businessId = :businessId") + @Query("SELECT b FROM Business b JOIN FETCH b.employer LEFT JOIN FETCH b.businessCategories WHERE b.businessId = :businessId") @EntityGraph(attributePaths = {"location", "employer", "businessCategories.subCategory"}) Optional getDetails(@Param("businessId") final Long businessId); diff --git a/src/main/java/com/example/api/business/controller/BusinessController.java b/src/main/java/com/example/api/business/controller/BusinessController.java index 6a5549da..210ae6e4 100644 --- a/src/main/java/com/example/api/business/controller/BusinessController.java +++ b/src/main/java/com/example/api/business/controller/BusinessController.java @@ -11,6 +11,7 @@ import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; +import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; @@ -44,9 +45,10 @@ public ResponseEntity modifyMyBusiness( @PostMapping public ResponseEntity addBusiness( - @RequestBody final AddBusinessRequest request + @RequestBody final AddBusinessRequest request, + @AuthenticationPrincipal final Long employerId ) { - final AddBusinessCommand command = request.toCommand(); + final AddBusinessCommand command = request.toCommand(employerId); businessService.addBusiness(command); return ResponseEntity.ok().body("요청이 성공적으로 처리되었습니다."); } @@ -62,8 +64,8 @@ record AddBusinessRequest( String phoneNumber, String email ) { - AddBusinessCommand toCommand() { - return new AddBusinessCommand(requestMemberId, businessName, businessRegistrationNumber, businessOpenDate, location, subCategoryIds, representationName, phoneNumber, email); + AddBusinessCommand toCommand(Long employerId) { + return new AddBusinessCommand(employerId, businessName, businessRegistrationNumber, businessOpenDate, location, subCategoryIds, representationName, phoneNumber, email); } } diff --git a/src/main/java/com/example/api/contracts/ContractService.java b/src/main/java/com/example/api/contracts/ContractService.java index 9d7552ed..ad887c21 100644 --- a/src/main/java/com/example/api/contracts/ContractService.java +++ b/src/main/java/com/example/api/contracts/ContractService.java @@ -50,10 +50,10 @@ public void acceptContract(@Validated final AcceptContractCommand acceptContract } public void updateAvailableWorkHours(AcceptContractCommand acceptContractCommand, Contract contract) { - Account user = accountRepository.findById(acceptContractCommand.contractId()) + Account user = accountRepository.findById(acceptContractCommand.employeeId()) .orElseThrow(() -> new BusinessException(ErrorCode.NULL_USER)); - PossibleBoard matchingWorkHours = possibleBoardRepository.findMatchingWorkHours(contract.getContractStartTime(), contract.getContractEndTime()) + PossibleBoard matchingWorkHours = possibleBoardRepository.findMatchingWorkHours(user.getAccountId(), contract.getContractStartTime(), contract.getContractEndTime()) .orElseThrow(() -> new BusinessException(ErrorCode.POSSIBLE_TIME_NULL_EXCEPTION)); // 예약 시간이 기존 근무 가능 시간과 완전히 일치하면 삭제 후 종료 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 8b66b87b..83c69afc 100644 --- a/src/main/java/com/example/api/contracts/controller/ContractController.java +++ b/src/main/java/com/example/api/contracts/controller/ContractController.java @@ -1,13 +1,10 @@ package com.example.api.contracts.controller; -import com.example.api.board.dto.request.EmployeeIdRequest; import com.example.api.contracts.ContractService; import com.example.api.contracts.dto.*; import java.time.LocalDateTime; -import java.util.List; -import com.example.api.suggest.controller.dto.SuggestStatusDTO; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; @@ -40,16 +37,18 @@ UpdateContractConditionCommand toCommand(final Long contractId) { @PostMapping("/api/v1/contracts/{contractId}/accepts") public ResponseEntity acceptContract( - @PathVariable(required = true) final Long contractId + @PathVariable(required = true) final Long contractId, + @AuthenticationPrincipal final Long employeeId ) { - final AcceptContractCommand acceptContractCommand = new AcceptContractCommand(contractId); + final AcceptContractCommand acceptContractCommand = new AcceptContractCommand(contractId, employeeId); contractService.acceptContract(acceptContractCommand); return ResponseEntity.ok("성공적으로 수락되었습니다."); } @GetMapping("/api/v1/contracts/{contractId}/status") - public ResponseEntity getContractInfo(@PathVariable(required = true) final Long contractId) { - final AcceptContractCommand contractStatusCommand = new AcceptContractCommand(contractId); + public ResponseEntity getContractInfo( + @PathVariable(required = true) final Long contractId) { + final AcceptContractCommand contractStatusCommand = new AcceptContractCommand(contractId, null); ContractDTO contractDTO = contractService.getContractInfo(contractStatusCommand); return ResponseEntity.ok(contractDTO); } diff --git a/src/main/java/com/example/api/contracts/dto/AcceptContractCommand.java b/src/main/java/com/example/api/contracts/dto/AcceptContractCommand.java index 19f53692..a9b40a42 100644 --- a/src/main/java/com/example/api/contracts/dto/AcceptContractCommand.java +++ b/src/main/java/com/example/api/contracts/dto/AcceptContractCommand.java @@ -4,6 +4,7 @@ public record AcceptContractCommand( @NonNull - Long contractId + Long contractId, + Long employeeId ) { } diff --git a/src/main/resources/static/danpat.yaml b/src/main/resources/static/danpat.yaml index b84cb67c..b306d25a 100644 --- a/src/main/resources/static/danpat.yaml +++ b/src/main/resources/static/danpat.yaml @@ -425,13 +425,6 @@ paths: summary: "알바생이 근무 가능 시간 추가 요청" description: "알바생이 근무 가능 시간 추가 요청" operationId: updatePossibleTimes - parameters: - - name: requestMemberId - in: query - required: true - schema: - type: integer - format: int64 requestBody: content: application/json: @@ -584,9 +577,9 @@ paths: $ref: "#/components/schemas/UpdateExternalCareerRequest" example: newExternalCareers: - - categoryId: 1 + - subCategoryId: 1002 workCount: 1 - - categoryId: 2 + - subCategoryId: 2002 workCount: 1 required: true responses: @@ -1120,7 +1113,6 @@ paths: schema: $ref: "#/components/schemas/AddBusinessRequest" example: - requestMemberId: 1 businessName: "김태영닷컴" businessRegistrationNumber: "12345" businessOpenDate: "250101" @@ -1498,7 +1490,7 @@ paths: receiverId: 1 sendTime: "2025-02-01T15:57:00.123Z" isRead: false - /businesses: + /api/v1/employer/businesses: get: tags: - EmployerController From 0401852e36415ffe06757e1c7140865cd23fc57a Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Sat, 22 Feb 2025 21:28:25 +0900 Subject: [PATCH 268/276] =?UTF-8?q?security=20config=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/auth/entitiy/QRefreshToken.java | 57 ----------- .../com/example/api/domain/QAccount.java | 97 ------------------- .../com/example/api/domain/QAnnouncement.java | 53 ---------- .../com/example/api/domain/QBaseEntity.java | 39 -------- .../com/example/api/domain/QBusiness.java | 72 -------------- .../example/api/domain/QBusinessCategory.java | 62 ------------ .../com/example/api/domain/QCategory.java | 47 --------- .../com/example/api/domain/QChatRoom.java | 53 ---------- .../com/example/api/domain/QContract.java | 65 ------------- .../example/api/domain/QExternalCareer.java | 64 ------------ .../example/api/domain/QFlavoredCategory.java | 65 ------------- .../example/api/domain/QFlavoredDistrict.java | 62 ------------ .../com/example/api/domain/QInquiry.java | 71 -------------- .../com/example/api/domain/QLocation.java | 57 ----------- .../example/api/domain/QOfferEmployment.java | 67 ------------- .../example/api/domain/QPossibleBoard.java | 63 ------------ .../com/example/api/domain/QReview.java | 69 ------------- .../com/example/api/domain/QReviewReport.java | 61 ------------ .../com/example/api/domain/QScrap.java | 62 ------------ .../com/example/api/domain/QSubCategory.java | 61 ------------ .../api/global/config/SecurityConfig.java | 15 ++- .../api/global/config/WebSocketConfig.java | 6 ++ .../example/api/health/HealthController.java | 12 +++ src/main/resources/application.properties | 5 +- .../static/{danpat.yaml => swagger.yaml} | 0 25 files changed, 32 insertions(+), 1253 deletions(-) delete mode 100644 src/main/generated/com/example/api/auth/entitiy/QRefreshToken.java delete mode 100644 src/main/generated/com/example/api/domain/QAccount.java delete mode 100644 src/main/generated/com/example/api/domain/QAnnouncement.java delete mode 100644 src/main/generated/com/example/api/domain/QBaseEntity.java delete mode 100644 src/main/generated/com/example/api/domain/QBusiness.java delete mode 100644 src/main/generated/com/example/api/domain/QBusinessCategory.java delete mode 100644 src/main/generated/com/example/api/domain/QCategory.java delete mode 100644 src/main/generated/com/example/api/domain/QChatRoom.java delete mode 100644 src/main/generated/com/example/api/domain/QContract.java delete mode 100644 src/main/generated/com/example/api/domain/QExternalCareer.java delete mode 100644 src/main/generated/com/example/api/domain/QFlavoredCategory.java delete mode 100644 src/main/generated/com/example/api/domain/QFlavoredDistrict.java delete mode 100644 src/main/generated/com/example/api/domain/QInquiry.java delete mode 100644 src/main/generated/com/example/api/domain/QLocation.java delete mode 100644 src/main/generated/com/example/api/domain/QOfferEmployment.java delete mode 100644 src/main/generated/com/example/api/domain/QPossibleBoard.java delete mode 100644 src/main/generated/com/example/api/domain/QReview.java delete mode 100644 src/main/generated/com/example/api/domain/QReviewReport.java delete mode 100644 src/main/generated/com/example/api/domain/QScrap.java delete mode 100644 src/main/generated/com/example/api/domain/QSubCategory.java create mode 100644 src/main/java/com/example/api/health/HealthController.java rename src/main/resources/static/{danpat.yaml => swagger.yaml} (100%) diff --git a/src/main/generated/com/example/api/auth/entitiy/QRefreshToken.java b/src/main/generated/com/example/api/auth/entitiy/QRefreshToken.java deleted file mode 100644 index ae3f4b01..00000000 --- a/src/main/generated/com/example/api/auth/entitiy/QRefreshToken.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.example.api.auth.entitiy; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; - - -/** - * QRefreshToken is a Querydsl query type for RefreshToken - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QRefreshToken extends EntityPathBase { - - private static final long serialVersionUID = -1655386265L; - - private static final PathInits INITS = PathInits.DIRECT2; - - public static final QRefreshToken refreshToken1 = new QRefreshToken("refreshToken1"); - - public final NumberPath id = createNumber("id", Long.class); - - public final BooleanPath isExpired = createBoolean("isExpired"); - - public final DateTimePath recentLogin = createDateTime("recentLogin", java.time.LocalDateTime.class); - - public final StringPath refreshToken = createString("refreshToken"); - - public final com.example.api.domain.QAccount user; - - public QRefreshToken(String variable) { - this(RefreshToken.class, forVariable(variable), INITS); - } - - public QRefreshToken(Path path) { - this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); - } - - public QRefreshToken(PathMetadata metadata) { - this(metadata, PathInits.getFor(metadata, INITS)); - } - - public QRefreshToken(PathMetadata metadata, PathInits inits) { - this(RefreshToken.class, metadata, inits); - } - - public QRefreshToken(Class type, PathMetadata metadata, PathInits inits) { - super(type, metadata, inits); - this.user = inits.isInitialized("user") ? new com.example.api.domain.QAccount(forProperty("user")) : null; - } - -} - diff --git a/src/main/generated/com/example/api/domain/QAccount.java b/src/main/generated/com/example/api/domain/QAccount.java deleted file mode 100644 index 4e0bfdc5..00000000 --- a/src/main/generated/com/example/api/domain/QAccount.java +++ /dev/null @@ -1,97 +0,0 @@ -package com.example.api.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; - - -/** - * QAccount is a Querydsl query type for Account - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QAccount extends EntityPathBase { - - private static final long serialVersionUID = -1087167288L; - - private static final PathInits INITS = PathInits.DIRECT2; - - public static final QAccount account = new QAccount("account"); - - public final QBaseEntity _super = new QBaseEntity(this); - - public final NumberPath accountId = createNumber("accountId", Long.class); - - public final NumberPath age = createNumber("age", Integer.class); - - public final StringPath birthdate = createString("birthdate"); - - public final StringPath callTime = createString("callTime"); - - //inherited - public final DateTimePath createdDate = _super.createdDate; - - public final BooleanPath deleted = createBoolean("deleted"); - - public final StringPath email = createString("email"); - - public final BooleanPath emailReceivable = createBoolean("emailReceivable"); - - public final StringPath introduction = createString("introduction"); - - public final QLocation location; - - public final StringPath loginId = createString("loginId"); - - public final StringPath name = createString("name"); - - public final EnumPath nationality = createEnum("nationality", com.example.api.account.entity.Nationality.class); - - public final StringPath nickname = createString("nickname"); - - public final BooleanPath openStatus = createBoolean("openStatus"); - - public final StringPath password = createString("password"); - - public final StringPath phoneNumber = createString("phoneNumber"); - - public final StringPath profileImage = createString("profileImage"); - - public final CollectionPath> roles = this.>createCollection("roles", com.example.api.account.entity.UserRole.class, EnumPath.class, PathInits.DIRECT2); - - public final StringPath sex = createString("sex"); - - public final NumberPath starPoint = createNumber("starPoint", Float.class); - - //inherited - public final DateTimePath updatedDate = _super.updatedDate; - - public final NumberPath workCount = createNumber("workCount", Integer.class); - - public QAccount(String variable) { - this(Account.class, forVariable(variable), INITS); - } - - public QAccount(Path path) { - this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); - } - - public QAccount(PathMetadata metadata) { - this(metadata, PathInits.getFor(metadata, INITS)); - } - - public QAccount(PathMetadata metadata, PathInits inits) { - this(Account.class, metadata, inits); - } - - public QAccount(Class type, PathMetadata metadata, PathInits inits) { - super(type, metadata, inits); - this.location = inits.isInitialized("location") ? new QLocation(forProperty("location")) : null; - } - -} - diff --git a/src/main/generated/com/example/api/domain/QAnnouncement.java b/src/main/generated/com/example/api/domain/QAnnouncement.java deleted file mode 100644 index 2280f648..00000000 --- a/src/main/generated/com/example/api/domain/QAnnouncement.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.example.api.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; - - -/** - * QAnnouncement is a Querydsl query type for Announcement - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QAnnouncement extends EntityPathBase { - - private static final long serialVersionUID = 1512577932L; - - public static final QAnnouncement announcement = new QAnnouncement("announcement"); - - public final QBaseEntity _super = new QBaseEntity(this); - - public final StringPath announcementContent = createString("announcementContent"); - - public final NumberPath announcementId = createNumber("announcementId", Long.class); - - public final StringPath announcementTitle = createString("announcementTitle"); - - public final StringPath announcementType = createString("announcementType"); - - //inherited - public final DateTimePath createdDate = _super.createdDate; - - //inherited - public final DateTimePath updatedDate = _super.updatedDate; - - public final NumberPath viewCount = createNumber("viewCount", Integer.class); - - public QAnnouncement(String variable) { - super(Announcement.class, forVariable(variable)); - } - - public QAnnouncement(Path path) { - super(path.getType(), path.getMetadata()); - } - - public QAnnouncement(PathMetadata metadata) { - super(Announcement.class, metadata); - } - -} - diff --git a/src/main/generated/com/example/api/domain/QBaseEntity.java b/src/main/generated/com/example/api/domain/QBaseEntity.java deleted file mode 100644 index 09c42891..00000000 --- a/src/main/generated/com/example/api/domain/QBaseEntity.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.example.api.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; - - -/** - * QBaseEntity is a Querydsl query type for BaseEntity - */ -@Generated("com.querydsl.codegen.DefaultSupertypeSerializer") -public class QBaseEntity extends EntityPathBase { - - private static final long serialVersionUID = 127095193L; - - public static final QBaseEntity baseEntity = new QBaseEntity("baseEntity"); - - public final DateTimePath createdDate = createDateTime("createdDate", java.time.LocalDateTime.class); - - public final DateTimePath updatedDate = createDateTime("updatedDate", java.time.LocalDateTime.class); - - public QBaseEntity(String variable) { - super(BaseEntity.class, forVariable(variable)); - } - - public QBaseEntity(Path path) { - super(path.getType(), path.getMetadata()); - } - - public QBaseEntity(PathMetadata metadata) { - super(BaseEntity.class, metadata); - } - -} - diff --git a/src/main/generated/com/example/api/domain/QBusiness.java b/src/main/generated/com/example/api/domain/QBusiness.java deleted file mode 100644 index bc1267f3..00000000 --- a/src/main/generated/com/example/api/domain/QBusiness.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.example.api.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; - - -/** - * QBusiness is a Querydsl query type for Business - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QBusiness extends EntityPathBase { - - private static final long serialVersionUID = 1647868037L; - - private static final PathInits INITS = PathInits.DIRECT2; - - public static final QBusiness business = new QBusiness("business"); - - public final QBaseEntity _super = new QBaseEntity(this); - - public final ListPath businessCategories = this.createList("businessCategories", BusinessCategory.class, QBusinessCategory.class, PathInits.DIRECT2); - - public final NumberPath businessId = createNumber("businessId", Long.class); - - public final StringPath businessName = createString("businessName"); - - //inherited - public final DateTimePath createdDate = _super.createdDate; - - public final QAccount employer; - - public final QLocation location; - - public final StringPath openDate = createString("openDate"); - - public final StringPath registrationNumber = createString("registrationNumber"); - - public final StringPath representationName = createString("representationName"); - - //inherited - public final DateTimePath updatedDate = _super.updatedDate; - - public QBusiness(String variable) { - this(Business.class, forVariable(variable), INITS); - } - - public QBusiness(Path path) { - this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); - } - - public QBusiness(PathMetadata metadata) { - this(metadata, PathInits.getFor(metadata, INITS)); - } - - public QBusiness(PathMetadata metadata, PathInits inits) { - this(Business.class, metadata, inits); - } - - public QBusiness(Class type, PathMetadata metadata, PathInits inits) { - super(type, metadata, inits); - this.employer = inits.isInitialized("employer") ? new QAccount(forProperty("employer"), inits.get("employer")) : null; - this.location = inits.isInitialized("location") ? new QLocation(forProperty("location")) : null; - } - -} - diff --git a/src/main/generated/com/example/api/domain/QBusinessCategory.java b/src/main/generated/com/example/api/domain/QBusinessCategory.java deleted file mode 100644 index d67bdd02..00000000 --- a/src/main/generated/com/example/api/domain/QBusinessCategory.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.example.api.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; - - -/** - * QBusinessCategory is a Querydsl query type for BusinessCategory - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QBusinessCategory extends EntityPathBase { - - private static final long serialVersionUID = -861191005L; - - private static final PathInits INITS = PathInits.DIRECT2; - - public static final QBusinessCategory businessCategory = new QBusinessCategory("businessCategory"); - - public final QBaseEntity _super = new QBaseEntity(this); - - public final QBusiness business; - - //inherited - public final DateTimePath createdDate = _super.createdDate; - - public final NumberPath id = createNumber("id", Long.class); - - public final QSubCategory subCategory; - - //inherited - public final DateTimePath updatedDate = _super.updatedDate; - - public QBusinessCategory(String variable) { - this(BusinessCategory.class, forVariable(variable), INITS); - } - - public QBusinessCategory(Path path) { - this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); - } - - public QBusinessCategory(PathMetadata metadata) { - this(metadata, PathInits.getFor(metadata, INITS)); - } - - public QBusinessCategory(PathMetadata metadata, PathInits inits) { - this(BusinessCategory.class, metadata, inits); - } - - public QBusinessCategory(Class type, PathMetadata metadata, PathInits inits) { - super(type, metadata, inits); - this.business = inits.isInitialized("business") ? new QBusiness(forProperty("business"), inits.get("business")) : null; - this.subCategory = inits.isInitialized("subCategory") ? new QSubCategory(forProperty("subCategory"), inits.get("subCategory")) : null; - } - -} - diff --git a/src/main/generated/com/example/api/domain/QCategory.java b/src/main/generated/com/example/api/domain/QCategory.java deleted file mode 100644 index 5065ce4c..00000000 --- a/src/main/generated/com/example/api/domain/QCategory.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.example.api.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; - - -/** - * QCategory is a Querydsl query type for Category - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QCategory extends EntityPathBase { - - private static final long serialVersionUID = -1449757245L; - - public static final QCategory category = new QCategory("category"); - - public final QBaseEntity _super = new QBaseEntity(this); - - public final NumberPath categoryId = createNumber("categoryId", Long.class); - - public final StringPath categoryName = createString("categoryName"); - - //inherited - public final DateTimePath createdDate = _super.createdDate; - - //inherited - public final DateTimePath updatedDate = _super.updatedDate; - - public QCategory(String variable) { - super(Category.class, forVariable(variable)); - } - - public QCategory(Path path) { - super(path.getType(), path.getMetadata()); - } - - public QCategory(PathMetadata metadata) { - super(Category.class, metadata); - } - -} - diff --git a/src/main/generated/com/example/api/domain/QChatRoom.java b/src/main/generated/com/example/api/domain/QChatRoom.java deleted file mode 100644 index b8542ca3..00000000 --- a/src/main/generated/com/example/api/domain/QChatRoom.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.example.api.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; - - -/** - * QChatRoom is a Querydsl query type for ChatRoom - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QChatRoom extends EntityPathBase { - - private static final long serialVersionUID = -62925544L; - - private static final PathInits INITS = PathInits.DIRECT2; - - public static final QChatRoom chatRoom = new QChatRoom("chatRoom"); - - public final NumberPath chatRoomId = createNumber("chatRoomId", Long.class); - - public final QOfferEmployment offerEmployment; - - public final DateTimePath suggestGeneratedDate = createDateTime("suggestGeneratedDate", java.time.LocalDateTime.class); - - public QChatRoom(String variable) { - this(ChatRoom.class, forVariable(variable), INITS); - } - - public QChatRoom(Path path) { - this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); - } - - public QChatRoom(PathMetadata metadata) { - this(metadata, PathInits.getFor(metadata, INITS)); - } - - public QChatRoom(PathMetadata metadata, PathInits inits) { - this(ChatRoom.class, metadata, inits); - } - - public QChatRoom(Class type, PathMetadata metadata, PathInits inits) { - super(type, metadata, inits); - this.offerEmployment = inits.isInitialized("offerEmployment") ? new QOfferEmployment(forProperty("offerEmployment"), inits.get("offerEmployment")) : null; - } - -} - diff --git a/src/main/generated/com/example/api/domain/QContract.java b/src/main/generated/com/example/api/domain/QContract.java deleted file mode 100644 index c6ae3403..00000000 --- a/src/main/generated/com/example/api/domain/QContract.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.example.api.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; - - -/** - * QContract is a Querydsl query type for Contract - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QContract extends EntityPathBase { - - private static final long serialVersionUID = -2067215913L; - - private static final PathInits INITS = PathInits.DIRECT2; - - public static final QContract contract = new QContract("contract"); - - public final QBaseEntity _super = new QBaseEntity(this); - - public final DateTimePath contractEndTime = createDateTime("contractEndTime", java.time.LocalDateTime.class); - - public final NumberPath contractHourlyPay = createNumber("contractHourlyPay", Integer.class); - - public final NumberPath contractId = createNumber("contractId", Long.class); - - public final DateTimePath contractStartTime = createDateTime("contractStartTime", java.time.LocalDateTime.class); - - //inherited - public final DateTimePath createdDate = _super.createdDate; - - public final QOfferEmployment offerEmployment; - - //inherited - public final DateTimePath updatedDate = _super.updatedDate; - - public QContract(String variable) { - this(Contract.class, forVariable(variable), INITS); - } - - public QContract(Path path) { - this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); - } - - public QContract(PathMetadata metadata) { - this(metadata, PathInits.getFor(metadata, INITS)); - } - - public QContract(PathMetadata metadata, PathInits inits) { - this(Contract.class, metadata, inits); - } - - public QContract(Class type, PathMetadata metadata, PathInits inits) { - super(type, metadata, inits); - this.offerEmployment = inits.isInitialized("offerEmployment") ? new QOfferEmployment(forProperty("offerEmployment"), inits.get("offerEmployment")) : null; - } - -} - diff --git a/src/main/generated/com/example/api/domain/QExternalCareer.java b/src/main/generated/com/example/api/domain/QExternalCareer.java deleted file mode 100644 index 34251764..00000000 --- a/src/main/generated/com/example/api/domain/QExternalCareer.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.example.api.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; - - -/** - * QExternalCareer is a Querydsl query type for ExternalCareer - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QExternalCareer extends EntityPathBase { - - private static final long serialVersionUID = 606757934L; - - private static final PathInits INITS = PathInits.DIRECT2; - - public static final QExternalCareer externalCareer = new QExternalCareer("externalCareer"); - - public final QBaseEntity _super = new QBaseEntity(this); - - //inherited - public final DateTimePath createdDate = _super.createdDate; - - public final QAccount employee; - - public final NumberPath id = createNumber("id", Long.class); - - public final QSubCategory subCategory; - - //inherited - public final DateTimePath updatedDate = _super.updatedDate; - - public final NumberPath workCount = createNumber("workCount", Integer.class); - - public QExternalCareer(String variable) { - this(ExternalCareer.class, forVariable(variable), INITS); - } - - public QExternalCareer(Path path) { - this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); - } - - public QExternalCareer(PathMetadata metadata) { - this(metadata, PathInits.getFor(metadata, INITS)); - } - - public QExternalCareer(PathMetadata metadata, PathInits inits) { - this(ExternalCareer.class, metadata, inits); - } - - public QExternalCareer(Class type, PathMetadata metadata, PathInits inits) { - super(type, metadata, inits); - this.employee = inits.isInitialized("employee") ? new QAccount(forProperty("employee")) : null; - this.subCategory = inits.isInitialized("subCategory") ? new QSubCategory(forProperty("subCategory"), inits.get("subCategory")) : null; - } - -} - diff --git a/src/main/generated/com/example/api/domain/QFlavoredCategory.java b/src/main/generated/com/example/api/domain/QFlavoredCategory.java deleted file mode 100644 index 7e4e6079..00000000 --- a/src/main/generated/com/example/api/domain/QFlavoredCategory.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.example.api.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; - - -/** - * QFlavoredCategory is a Querydsl query type for FlavoredCategory - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QFlavoredCategory extends EntityPathBase { - - private static final long serialVersionUID = -258789472L; - - private static final PathInits INITS = PathInits.DIRECT2; - - public static final QFlavoredCategory flavoredCategory = new QFlavoredCategory("flavoredCategory"); - - public final QBaseEntity _super = new QBaseEntity(this); - - public final QCategory category; - - //inherited - public final DateTimePath createdDate = _super.createdDate; - - public final QAccount employee; - - public final NumberPath flavoredCategoryId = createNumber("flavoredCategoryId", Long.class); - - public final QSubCategory subCategory; - - //inherited - public final DateTimePath updatedDate = _super.updatedDate; - - public QFlavoredCategory(String variable) { - this(FlavoredCategory.class, forVariable(variable), INITS); - } - - public QFlavoredCategory(Path path) { - this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); - } - - public QFlavoredCategory(PathMetadata metadata) { - this(metadata, PathInits.getFor(metadata, INITS)); - } - - public QFlavoredCategory(PathMetadata metadata, PathInits inits) { - this(FlavoredCategory.class, metadata, inits); - } - - public QFlavoredCategory(Class type, PathMetadata metadata, PathInits inits) { - super(type, metadata, inits); - this.category = inits.isInitialized("category") ? new QCategory(forProperty("category")) : null; - this.employee = inits.isInitialized("employee") ? new QAccount(forProperty("employee")) : null; - this.subCategory = inits.isInitialized("subCategory") ? new QSubCategory(forProperty("subCategory"), inits.get("subCategory")) : null; - } - -} - diff --git a/src/main/generated/com/example/api/domain/QFlavoredDistrict.java b/src/main/generated/com/example/api/domain/QFlavoredDistrict.java deleted file mode 100644 index 62ffcca5..00000000 --- a/src/main/generated/com/example/api/domain/QFlavoredDistrict.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.example.api.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; - - -/** - * QFlavoredDistrict is a Querydsl query type for FlavoredDistrict - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QFlavoredDistrict extends EntityPathBase { - - private static final long serialVersionUID = -20339152L; - - private static final PathInits INITS = PathInits.DIRECT2; - - public static final QFlavoredDistrict flavoredDistrict = new QFlavoredDistrict("flavoredDistrict"); - - public final QBaseEntity _super = new QBaseEntity(this); - - //inherited - public final DateTimePath createdDate = _super.createdDate; - - public final QAccount employee; - - public final NumberPath id = createNumber("id", Long.class); - - public final QLocation location; - - //inherited - public final DateTimePath updatedDate = _super.updatedDate; - - public QFlavoredDistrict(String variable) { - this(FlavoredDistrict.class, forVariable(variable), INITS); - } - - public QFlavoredDistrict(Path path) { - this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); - } - - public QFlavoredDistrict(PathMetadata metadata) { - this(metadata, PathInits.getFor(metadata, INITS)); - } - - public QFlavoredDistrict(PathMetadata metadata, PathInits inits) { - this(FlavoredDistrict.class, metadata, inits); - } - - public QFlavoredDistrict(Class type, PathMetadata metadata, PathInits inits) { - super(type, metadata, inits); - this.employee = inits.isInitialized("employee") ? new QAccount(forProperty("employee"), inits.get("employee")) : null; - this.location = inits.isInitialized("location") ? new QLocation(forProperty("location")) : null; - } - -} - diff --git a/src/main/generated/com/example/api/domain/QInquiry.java b/src/main/generated/com/example/api/domain/QInquiry.java deleted file mode 100644 index 44ef3fa4..00000000 --- a/src/main/generated/com/example/api/domain/QInquiry.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.example.api.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; - - -/** - * QInquiry is a Querydsl query type for Inquiry - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QInquiry extends EntityPathBase { - - private static final long serialVersionUID = 2045912162L; - - private static final PathInits INITS = PathInits.DIRECT2; - - public static final QInquiry inquiry = new QInquiry("inquiry"); - - public final QBaseEntity _super = new QBaseEntity(this); - - public final DateTimePath answerDate = createDateTime("answerDate", java.time.LocalDateTime.class); - - public final StringPath content = createString("content"); - - public final QAccount createdBy; - - //inherited - public final DateTimePath createdDate = _super.createdDate; - - public final NumberPath inquiryId = createNumber("inquiryId", Long.class); - - public final EnumPath inquiryStatus = createEnum("inquiryStatus", Inquiry.InquiryStatus.class); - - public final StringPath inquiryType = createString("inquiryType"); - - public final StringPath subInquiryType = createString("subInquiryType"); - - public final StringPath title = createString("title"); - - //inherited - public final DateTimePath updatedDate = _super.updatedDate; - - public QInquiry(String variable) { - this(Inquiry.class, forVariable(variable), INITS); - } - - public QInquiry(Path path) { - this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); - } - - public QInquiry(PathMetadata metadata) { - this(metadata, PathInits.getFor(metadata, INITS)); - } - - public QInquiry(PathMetadata metadata, PathInits inits) { - this(Inquiry.class, metadata, inits); - } - - public QInquiry(Class type, PathMetadata metadata, PathInits inits) { - super(type, metadata, inits); - this.createdBy = inits.isInitialized("createdBy") ? new QAccount(forProperty("createdBy"), inits.get("createdBy")) : null; - } - -} - diff --git a/src/main/generated/com/example/api/domain/QLocation.java b/src/main/generated/com/example/api/domain/QLocation.java deleted file mode 100644 index e9355bcf..00000000 --- a/src/main/generated/com/example/api/domain/QLocation.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.example.api.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; - - -/** - * QLocation is a Querydsl query type for Location - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QLocation extends EntityPathBase { - - private static final long serialVersionUID = 400775290L; - - public static final QLocation location = new QLocation("location"); - - public final QBaseEntity _super = new QBaseEntity(this); - - public final StringPath address = createString("address"); - - //inherited - public final DateTimePath createdDate = _super.createdDate; - - public final StringPath detailAddress = createString("detailAddress"); - - public final StringPath dong = createString("dong"); - - public final NumberPath id = createNumber("id", Long.class); - - public final StringPath sido = createString("sido"); - - public final StringPath sigugun = createString("sigugun"); - - //inherited - public final DateTimePath updatedDate = _super.updatedDate; - - public final StringPath zipcode = createString("zipcode"); - - public QLocation(String variable) { - super(Location.class, forVariable(variable)); - } - - public QLocation(Path path) { - super(path.getType(), path.getMetadata()); - } - - public QLocation(PathMetadata metadata) { - super(Location.class, metadata); - } - -} - diff --git a/src/main/generated/com/example/api/domain/QOfferEmployment.java b/src/main/generated/com/example/api/domain/QOfferEmployment.java deleted file mode 100644 index 908f6848..00000000 --- a/src/main/generated/com/example/api/domain/QOfferEmployment.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.example.api.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; - - -/** - * QOfferEmployment is a Querydsl query type for OfferEmployment - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QOfferEmployment extends EntityPathBase { - - private static final long serialVersionUID = -82696445L; - - private static final PathInits INITS = PathInits.DIRECT2; - - public static final QOfferEmployment offerEmployment = new QOfferEmployment("offerEmployment"); - - public final QBusiness business; - - public final QContract contract; - - public final QAccount employee; - - public final EnumPath status = createEnum("status", ProposalStatus.class); - - public final DateTimePath suggestEndTime = createDateTime("suggestEndTime", java.time.LocalDateTime.class); - - public final NumberPath suggestHourlyPay = createNumber("suggestHourlyPay", Integer.class); - - public final NumberPath suggestId = createNumber("suggestId", Long.class); - - public final DateTimePath suggestRegisterTime = createDateTime("suggestRegisterTime", java.time.LocalDateTime.class); - - public final DateTimePath suggestStartTime = createDateTime("suggestStartTime", java.time.LocalDateTime.class); - - public QOfferEmployment(String variable) { - this(OfferEmployment.class, forVariable(variable), INITS); - } - - public QOfferEmployment(Path path) { - this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); - } - - public QOfferEmployment(PathMetadata metadata) { - this(metadata, PathInits.getFor(metadata, INITS)); - } - - public QOfferEmployment(PathMetadata metadata, PathInits inits) { - this(OfferEmployment.class, metadata, inits); - } - - public QOfferEmployment(Class type, PathMetadata metadata, PathInits inits) { - super(type, metadata, inits); - this.business = inits.isInitialized("business") ? new QBusiness(forProperty("business"), inits.get("business")) : null; - this.contract = inits.isInitialized("contract") ? new QContract(forProperty("contract"), inits.get("contract")) : null; - this.employee = inits.isInitialized("employee") ? new QAccount(forProperty("employee"), inits.get("employee")) : null; - } - -} - diff --git a/src/main/generated/com/example/api/domain/QPossibleBoard.java b/src/main/generated/com/example/api/domain/QPossibleBoard.java deleted file mode 100644 index 23743abc..00000000 --- a/src/main/generated/com/example/api/domain/QPossibleBoard.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.example.api.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; - - -/** - * QPossibleBoard is a Querydsl query type for PossibleBoard - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QPossibleBoard extends EntityPathBase { - - private static final long serialVersionUID = -1378693552L; - - private static final PathInits INITS = PathInits.DIRECT2; - - public static final QPossibleBoard possibleBoard = new QPossibleBoard("possibleBoard"); - - public final QBaseEntity _super = new QBaseEntity(this); - - //inherited - public final DateTimePath createdDate = _super.createdDate; - - public final QAccount employee; - - public final DateTimePath endTime = createDateTime("endTime", java.time.LocalDateTime.class); - - public final NumberPath possibleId = createNumber("possibleId", Long.class); - - public final DateTimePath startTime = createDateTime("startTime", java.time.LocalDateTime.class); - - //inherited - public final DateTimePath updatedDate = _super.updatedDate; - - public QPossibleBoard(String variable) { - this(PossibleBoard.class, forVariable(variable), INITS); - } - - public QPossibleBoard(Path path) { - this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); - } - - public QPossibleBoard(PathMetadata metadata) { - this(metadata, PathInits.getFor(metadata, INITS)); - } - - public QPossibleBoard(PathMetadata metadata, PathInits inits) { - this(PossibleBoard.class, metadata, inits); - } - - public QPossibleBoard(Class type, PathMetadata metadata, PathInits inits) { - super(type, metadata, inits); - this.employee = inits.isInitialized("employee") ? new QAccount(forProperty("employee")) : null; - } - -} - diff --git a/src/main/generated/com/example/api/domain/QReview.java b/src/main/generated/com/example/api/domain/QReview.java deleted file mode 100644 index 7da09154..00000000 --- a/src/main/generated/com/example/api/domain/QReview.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.example.api.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; - - -/** - * QReview is a Querydsl query type for Review - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QReview extends EntityPathBase { - - private static final long serialVersionUID = 731127133L; - - private static final PathInits INITS = PathInits.DIRECT2; - - public static final QReview review = new QReview("review"); - - public final QBaseEntity _super = new QBaseEntity(this); - - public final QContract contract; - - //inherited - public final DateTimePath createdDate = _super.createdDate; - - public final QAccount employee; - - public final StringPath reviewContent = createString("reviewContent"); - - public final NumberPath reviewId = createNumber("reviewId", Long.class); - - public final NumberPath reviewStarPoint = createNumber("reviewStarPoint", Integer.class); - - //inherited - public final DateTimePath updatedDate = _super.updatedDate; - - public final QBusiness writer; - - public QReview(String variable) { - this(Review.class, forVariable(variable), INITS); - } - - public QReview(Path path) { - this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); - } - - public QReview(PathMetadata metadata) { - this(metadata, PathInits.getFor(metadata, INITS)); - } - - public QReview(PathMetadata metadata, PathInits inits) { - this(Review.class, metadata, inits); - } - - public QReview(Class type, PathMetadata metadata, PathInits inits) { - super(type, metadata, inits); - this.contract = inits.isInitialized("contract") ? new QContract(forProperty("contract"), inits.get("contract")) : null; - this.employee = inits.isInitialized("employee") ? new QAccount(forProperty("employee")) : null; - this.writer = inits.isInitialized("writer") ? new QBusiness(forProperty("writer"), inits.get("writer")) : null; - } - -} - diff --git a/src/main/generated/com/example/api/domain/QReviewReport.java b/src/main/generated/com/example/api/domain/QReviewReport.java deleted file mode 100644 index 2cafb825..00000000 --- a/src/main/generated/com/example/api/domain/QReviewReport.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.example.api.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; - - -/** - * QReviewReport is a Querydsl query type for ReviewReport - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QReviewReport extends EntityPathBase { - - private static final long serialVersionUID = 178201841L; - - private static final PathInits INITS = PathInits.DIRECT2; - - 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); - } - - public QReviewReport(Path path) { - this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); - } - - public QReviewReport(PathMetadata metadata) { - this(metadata, PathInits.getFor(metadata, INITS)); - } - - public QReviewReport(PathMetadata metadata, PathInits inits) { - this(ReviewReport.class, metadata, inits); - } - - public QReviewReport(Class type, PathMetadata metadata, PathInits inits) { - super(type, metadata, inits); - this.review = inits.isInitialized("review") ? new QReview(forProperty("review"), inits.get("review")) : null; - } - -} - diff --git a/src/main/generated/com/example/api/domain/QScrap.java b/src/main/generated/com/example/api/domain/QScrap.java deleted file mode 100644 index 6caf4631..00000000 --- a/src/main/generated/com/example/api/domain/QScrap.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.example.api.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; - - -/** - * QScrap is a Querydsl query type for Scrap - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QScrap extends EntityPathBase { - - private static final long serialVersionUID = -391197396L; - - private static final PathInits INITS = PathInits.DIRECT2; - - public static final QScrap scrap = new QScrap("scrap"); - - public final QBaseEntity _super = new QBaseEntity(this); - - //inherited - public final DateTimePath createdDate = _super.createdDate; - - public final QAccount employee; - - public final QAccount employer; - - public final NumberPath scrapId = createNumber("scrapId", Long.class); - - //inherited - public final DateTimePath updatedDate = _super.updatedDate; - - public QScrap(String variable) { - this(Scrap.class, forVariable(variable), INITS); - } - - public QScrap(Path path) { - this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); - } - - public QScrap(PathMetadata metadata) { - this(metadata, PathInits.getFor(metadata, INITS)); - } - - public QScrap(PathMetadata metadata, PathInits inits) { - this(Scrap.class, metadata, inits); - } - - public QScrap(Class type, PathMetadata metadata, PathInits inits) { - super(type, metadata, inits); - this.employee = inits.isInitialized("employee") ? new QAccount(forProperty("employee")) : null; - this.employer = inits.isInitialized("employer") ? new QAccount(forProperty("employer")) : null; - } - -} - diff --git a/src/main/generated/com/example/api/domain/QSubCategory.java b/src/main/generated/com/example/api/domain/QSubCategory.java deleted file mode 100644 index bb348463..00000000 --- a/src/main/generated/com/example/api/domain/QSubCategory.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.example.api.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; - - -/** - * QSubCategory is a Querydsl query type for SubCategory - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QSubCategory extends EntityPathBase { - - private static final long serialVersionUID = 300381305L; - - private static final PathInits INITS = PathInits.DIRECT2; - - public static final QSubCategory subCategory = new QSubCategory("subCategory"); - - public final QBaseEntity _super = new QBaseEntity(this); - - public final QCategory category; - - //inherited - public final DateTimePath createdDate = _super.createdDate; - - public final NumberPath subCategoryId = createNumber("subCategoryId", Long.class); - - public final StringPath subCategoryName = createString("subCategoryName"); - - //inherited - public final DateTimePath updatedDate = _super.updatedDate; - - public QSubCategory(String variable) { - this(SubCategory.class, forVariable(variable), INITS); - } - - public QSubCategory(Path path) { - this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); - } - - public QSubCategory(PathMetadata metadata) { - this(metadata, PathInits.getFor(metadata, INITS)); - } - - public QSubCategory(PathMetadata metadata, PathInits inits) { - this(SubCategory.class, metadata, inits); - } - - public QSubCategory(Class type, PathMetadata metadata, PathInits inits) { - super(type, metadata, inits); - this.category = inits.isInitialized("category") ? new QCategory(forProperty("category")) : null; - } - -} - 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 bc234c56..10f82950 100644 --- a/src/main/java/com/example/api/global/config/SecurityConfig.java +++ b/src/main/java/com/example/api/global/config/SecurityConfig.java @@ -54,9 +54,13 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti .exceptionHandling(exceptionHandling -> exceptionHandling.authenticationEntryPoint(new FailedAuthenticationEntryPoint())) .authorizeHttpRequests(authorize -> authorize - .requestMatchers("/**", "/error", "/favicon.ico", "/**/*.png", "/**/*.gif","/**/*.webp", "/**/*.svg", "/**/*.jpg", "/**/*.html", "/**/*.css", "/**/*.js").permitAll() - .requestMatchers("/api/auth/login", "/oauth2/**", "/swagger-ui/**", "/v3/api-docs/**", "/api/v1/account/**", "/aws", "/ws/**").permitAll() - .anyRequest().authenticated() + .requestMatchers("/ws", "/ws/**").permitAll() // ✅ WebSocket 요청 허용 + .requestMatchers("/swagger-ui/**", "/v3/api-docs/**").permitAll() // ✅ Swagger 문서 허용 + .requestMatchers("/api/auth/login", "/oauth2/**").permitAll() // ✅ 로그인 & OAuth2 허용 + .requestMatchers("/error", "/favicon.ico", "/**/*.png", "/**/*.gif", "/**/*.webp", "/**/*.svg", + "/**/*.jpg", "/**/*.html", "/**/*.css", "/**/*.js").permitAll() // ✅ 정적 리소스 허용 + .requestMatchers("/api/v1/account/**", "/aws", "/health").permitAll() // ✅ 특정 API 엔드포인트 허용 + .anyRequest().authenticated() // 🔥 그 외 모든 요청은 인증 필요 ) .oauth2Login(oauth2 -> oauth2 .authorizationEndpoint(authorizationEndpoint -> @@ -77,11 +81,14 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti @Bean public CorsConfigurationSource corsConfigurationSource() { CorsConfiguration corsConfiguration = new CorsConfiguration(); - corsConfiguration.setAllowedOrigins(List.of("http://localhost:3000", "http://localhost:8080")); + corsConfiguration.setAllowedOrigins(List.of("http://localhost:3000", "http://localhost:8080", "http://127.0.0.1:5500")); corsConfiguration.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE", "OPTIONS")); corsConfiguration.setAllowedHeaders(Arrays.asList("Authorization", "Content-Type")); corsConfiguration.setAllowCredentials(true); + corsConfiguration.addExposedHeader("Upgrade"); + corsConfiguration.addExposedHeader("Connection"); + UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**", corsConfiguration); return source; diff --git a/src/main/java/com/example/api/global/config/WebSocketConfig.java b/src/main/java/com/example/api/global/config/WebSocketConfig.java index c10411ac..4ab7eb08 100644 --- a/src/main/java/com/example/api/global/config/WebSocketConfig.java +++ b/src/main/java/com/example/api/global/config/WebSocketConfig.java @@ -12,14 +12,20 @@ public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { @Override public void configureMessageBroker(MessageBrokerRegistry config) { + // 클라이언트에서 구독할 경로(브로커) config.enableSimpleBroker("/room"); + // 클라이언트에서 메시지를 보낼 경로 config.setApplicationDestinationPrefixes("/chat"); } @Override public void registerStompEndpoints(StompEndpointRegistry registry) { + // web socket 연결을 위한 엔드포인트 registry.addEndpoint("/ws") .setAllowedOriginPatterns("*") .withSockJS(); + + registry.addEndpoint("/ws") + .setAllowedOriginPatterns("*"); } } \ No newline at end of file diff --git a/src/main/java/com/example/api/health/HealthController.java b/src/main/java/com/example/api/health/HealthController.java new file mode 100644 index 00000000..79414705 --- /dev/null +++ b/src/main/java/com/example/api/health/HealthController.java @@ -0,0 +1,12 @@ +package com.example.api.health; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class HealthController { + @GetMapping("/health") + public String health() { + return "OK"; + } +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index dc081787..bc8901eb 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -97,7 +97,8 @@ spring.servlet.multipart.max-file-size=10MB spring.servlet.multipart.max-request-size=10MB springdoc.swagger-ui.path=/swagger-ui.html -springdoc.swagger-ui.url=/danpat.yaml springdoc.api-docs.path=/v3/api-docs springdoc.default-consumes-media-type=application/json -springdoc.default-produces-media-type=application/json \ No newline at end of file +springdoc.default-produces-media-type=application/json + +spring.mvc.pathmatch.matching-strategy=ant_path_matcher \ No newline at end of file diff --git a/src/main/resources/static/danpat.yaml b/src/main/resources/static/swagger.yaml similarity index 100% rename from src/main/resources/static/danpat.yaml rename to src/main/resources/static/swagger.yaml From cd7ffaffb535ad12dbff87a1ee0a8cffdd30386b Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Sun, 23 Feb 2025 03:52:47 +0900 Subject: [PATCH 269/276] fix jwt authentication --- .../example/api/account/entity/UserRole.java | 4 +- .../auth/entitiy/JwtAuthenticationToken.java | 2 +- .../example/api/auth/service/AuthService.java | 1 + .../java/com/example/api/domain/Account.java | 1 + .../api/global/config/SecurityConfig.java | 25 +- .../api/global/config/WebSocketConfig.java | 1 + .../filter/JwtAuthenticationFilter.java | 8 +- .../OAuth2AuthenticationSuccessHandler.java | 1 + .../controller/OfferEmploymentController.java | 15 +- .../resources/application-local.properties | 107 +++++++ .../resources/application-prod.properties | 104 +++++++ src/main/resources/application.properties | 105 +------ src/main/resources/static/swagger.yaml | 4 +- .../api/aws/service/S3ServiceTest.java | 2 +- .../api/inquiry/InquiryServiceTest.java | 230 +++++++-------- .../OfferEmploymentServiceTest.java | 270 +++++++++--------- 16 files changed, 502 insertions(+), 378 deletions(-) create mode 100644 src/main/resources/application-local.properties create mode 100644 src/main/resources/application-prod.properties diff --git a/src/main/java/com/example/api/account/entity/UserRole.java b/src/main/java/com/example/api/account/entity/UserRole.java index cb7a2d1e..4789852d 100644 --- a/src/main/java/com/example/api/account/entity/UserRole.java +++ b/src/main/java/com/example/api/account/entity/UserRole.java @@ -6,8 +6,8 @@ import org.springframework.security.core.GrantedAuthority; public enum UserRole implements GrantedAuthority { - EMPLOYEE(0, "알바생"), - EMPLOYER(1, "사장"); + ROLE_EMPLOYEE(0, "알바생"), + ROLE_EMPLOYER(1, "사장"); private final Integer code; private final String description; diff --git a/src/main/java/com/example/api/auth/entitiy/JwtAuthenticationToken.java b/src/main/java/com/example/api/auth/entitiy/JwtAuthenticationToken.java index f867ceab..f2c18545 100644 --- a/src/main/java/com/example/api/auth/entitiy/JwtAuthenticationToken.java +++ b/src/main/java/com/example/api/auth/entitiy/JwtAuthenticationToken.java @@ -38,7 +38,7 @@ public void setAuthenticated(boolean authenticated) throws IllegalArgumentExcept if (authenticated) { throw new IllegalArgumentException("옳지 않은 과정을 통해 인증되었습니다."); } - super.setAuthenticated(false); + super.setAuthenticated(true); } @Override diff --git a/src/main/java/com/example/api/auth/service/AuthService.java b/src/main/java/com/example/api/auth/service/AuthService.java index 324b6de6..7b6b1207 100644 --- a/src/main/java/com/example/api/auth/service/AuthService.java +++ b/src/main/java/com/example/api/auth/service/AuthService.java @@ -67,6 +67,7 @@ private LoginSuccessResponse generateAuthToken(final Account user) { responseBody.put("userRole", role); responseBody.put("name", user.getName()); responseBody.put("profile", profile); + responseBody.put("nickname", user.getNickname()); return new LoginSuccessResponse(refreshTokenCookie, responseBody); } diff --git a/src/main/java/com/example/api/domain/Account.java b/src/main/java/com/example/api/domain/Account.java index 6868f760..bc24bb2d 100644 --- a/src/main/java/com/example/api/domain/Account.java +++ b/src/main/java/com/example/api/domain/Account.java @@ -9,6 +9,7 @@ import lombok.Getter; import java.util.Collection; +import java.util.List; @Entity @Getter 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 10f82950..7d9803c8 100644 --- a/src/main/java/com/example/api/global/config/SecurityConfig.java +++ b/src/main/java/com/example/api/global/config/SecurityConfig.java @@ -1,6 +1,7 @@ package com.example.api.global.config; import com.example.api.auth.entitiy.JwtAuthenticationProvider; +import com.example.api.auth.service.JwtTokenProvider; import com.example.api.global.config.filter.JwtAuthenticationFilter; import com.example.api.oauth2.entity.HttpCookieOAuth2AuthorizationRequestRepository; import com.example.api.oauth2.entity.handler.OAuth2AuthenticationFailureHandler; @@ -14,6 +15,7 @@ import org.springframework.security.authentication.ProviderManager; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.core.AuthenticationException; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.oauth2.client.userinfo.DefaultOAuth2UserService; @@ -37,14 +39,13 @@ @RequiredArgsConstructor public class SecurityConfig { private final JwtAuthenticationProvider jwtAuthenticationProvider; - private final JwtAuthenticationFilter jwtAuthenticationFilter; private final DefaultOAuth2UserService oauth2Service; private final HttpCookieOAuth2AuthorizationRequestRepository httpCookieOAuth2AuthorizationRequestRepository; private final OAuth2AuthenticationSuccessHandler oauth2AuthorizationSuccessHandler; private final OAuth2AuthenticationFailureHandler oAuth2AuthenticationFailureHandler; @Bean - public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { + public SecurityFilterChain securityFilterChain(HttpSecurity http, JwtTokenProvider jwtTokenProvider) throws Exception { http .cors(cors -> cors .configurationSource(corsConfigurationSource())) @@ -54,13 +55,14 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti .exceptionHandling(exceptionHandling -> exceptionHandling.authenticationEntryPoint(new FailedAuthenticationEntryPoint())) .authorizeHttpRequests(authorize -> authorize - .requestMatchers("/ws", "/ws/**").permitAll() // ✅ WebSocket 요청 허용 - .requestMatchers("/swagger-ui/**", "/v3/api-docs/**").permitAll() // ✅ Swagger 문서 허용 - .requestMatchers("/api/auth/login", "/oauth2/**").permitAll() // ✅ 로그인 & OAuth2 허용 + .requestMatchers("/ws", "/ws/**").permitAll() // WebSocket 요청 허용 + .requestMatchers("/swagger-ui/**", "/v3/api-docs/**", "/swagger.yaml").permitAll() // Swagger 문서 허용 + .requestMatchers("/api/v1/auth/login", "/oauth2/**").permitAll() // 로그인 & OAuth2 허용 .requestMatchers("/error", "/favicon.ico", "/**/*.png", "/**/*.gif", "/**/*.webp", "/**/*.svg", - "/**/*.jpg", "/**/*.html", "/**/*.css", "/**/*.js").permitAll() // ✅ 정적 리소스 허용 - .requestMatchers("/api/v1/account/**", "/aws", "/health").permitAll() // ✅ 특정 API 엔드포인트 허용 - .anyRequest().authenticated() // 🔥 그 외 모든 요청은 인증 필요 + "/**/*.jpg", "/**/*.html", "/**/*.css", "/**/*.js").permitAll() // 정적 리소스 허용 + .requestMatchers("/api/v1/account/**", "/aws", "/health", "/error").permitAll() // 특정 API 엔드포인트 허용 + .requestMatchers("/api/v1/possible-board", "/api/v1/possible-board/**").hasRole("EMPLOYEE") + .anyRequest().authenticated() // 그 외 모든 요청은 인증 필요 ) .oauth2Login(oauth2 -> oauth2 .authorizationEndpoint(authorizationEndpoint -> @@ -73,18 +75,19 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti .successHandler(oauth2AuthorizationSuccessHandler) .failureHandler(oAuth2AuthenticationFailureHandler) ) - .addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class); - + .addFilterBefore(new JwtAuthenticationFilter(jwtAuthenticationProvider, jwtTokenProvider), UsernamePasswordAuthenticationFilter.class) + .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)); return http.build(); } @Bean public CorsConfigurationSource corsConfigurationSource() { CorsConfiguration corsConfiguration = new CorsConfiguration(); - corsConfiguration.setAllowedOrigins(List.of("http://localhost:3000", "http://localhost:8080", "http://127.0.0.1:5500")); + corsConfiguration.setAllowedOrigins(List.of("http://localhost:3000", "http://localhost:8080", "https://www.danpat.store", "http://127.0.0.1:5500", "https://jiangxy.github.io/websocket-debug-tool/")); corsConfiguration.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE", "OPTIONS")); corsConfiguration.setAllowedHeaders(Arrays.asList("Authorization", "Content-Type")); corsConfiguration.setAllowCredentials(true); + corsConfiguration.setMaxAge(3600L); corsConfiguration.addExposedHeader("Upgrade"); corsConfiguration.addExposedHeader("Connection"); diff --git a/src/main/java/com/example/api/global/config/WebSocketConfig.java b/src/main/java/com/example/api/global/config/WebSocketConfig.java index 4ab7eb08..fae3dfd3 100644 --- a/src/main/java/com/example/api/global/config/WebSocketConfig.java +++ b/src/main/java/com/example/api/global/config/WebSocketConfig.java @@ -4,6 +4,7 @@ import org.springframework.messaging.simp.config.MessageBrokerRegistry; import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker; import org.springframework.web.socket.config.annotation.StompEndpointRegistry; +import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry; import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer; @Configuration diff --git a/src/main/java/com/example/api/global/config/filter/JwtAuthenticationFilter.java b/src/main/java/com/example/api/global/config/filter/JwtAuthenticationFilter.java index 62631452..c5b65140 100644 --- a/src/main/java/com/example/api/global/config/filter/JwtAuthenticationFilter.java +++ b/src/main/java/com/example/api/global/config/filter/JwtAuthenticationFilter.java @@ -37,6 +37,8 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse } Authentication authentication = jwtAuthenticationProvider.authenticate(new JwtAuthenticationToken(accessToken)); + + log.info("authentication : {}", authentication); SecurityContextHolder.getContext().setAuthentication(authentication); } @@ -53,16 +55,12 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse ); response.getWriter().write(new ObjectMapper().writeValueAsString(errorResponse)); - } finally { - SecurityContextHolder.clearContext(); } } @Override protected boolean shouldNotFilter(HttpServletRequest request) { String path = request.getRequestURI(); - - // 특정 API는 JWT 필터를 거치지 않도록 예외 처리 return path.startsWith("/api/v1/account/") || path.startsWith("/api/v1/auth/login"); } -} \ No newline at end of file +} diff --git a/src/main/java/com/example/api/oauth2/entity/handler/OAuth2AuthenticationSuccessHandler.java b/src/main/java/com/example/api/oauth2/entity/handler/OAuth2AuthenticationSuccessHandler.java index 7e3df792..0e04440b 100644 --- a/src/main/java/com/example/api/oauth2/entity/handler/OAuth2AuthenticationSuccessHandler.java +++ b/src/main/java/com/example/api/oauth2/entity/handler/OAuth2AuthenticationSuccessHandler.java @@ -82,6 +82,7 @@ private void generateResponseBody(HttpServletResponse response, UserDetailReques responseBody.put("userRole", userDetailRequest.authorities().stream().findFirst().toString()); responseBody.put("name", loginUser.getName()); responseBody.put("profile", profile); + responseBody.put("nickname", loginUser.getNickname()); response.setContentType("application/json"); response.setCharacterEncoding("UTF-8"); diff --git a/src/main/java/com/example/api/offeremployment/controller/OfferEmploymentController.java b/src/main/java/com/example/api/offeremployment/controller/OfferEmploymentController.java index 3ef0c056..5f60e4a6 100644 --- a/src/main/java/com/example/api/offeremployment/controller/OfferEmploymentController.java +++ b/src/main/java/com/example/api/offeremployment/controller/OfferEmploymentController.java @@ -5,9 +5,10 @@ import com.example.api.offeremployment.dto.OfferEmploymentRequest; import com.example.api.offeremployment.dto.OfferEmploymentResponse; import lombok.RequiredArgsConstructor; -import org.springframework.http.HttpStatus; -import org.springframework.http.HttpStatusCode; +import lombok.extern.slf4j.Slf4j; import org.springframework.http.ResponseEntity; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -16,6 +17,7 @@ @RestController @RequestMapping("/api/v1/offeremployment") @RequiredArgsConstructor +@Slf4j public class OfferEmploymentController { private final OfferEmploymentService offerEmploymentService; @@ -23,6 +25,15 @@ public class OfferEmploymentController { public ResponseEntity sendOfferEmployment( @RequestBody final OfferEmploymentRequest offerEmploymentRequest ) { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + if (authentication == null) { + log.error("인증 객체가 NULL입니다!"); + } else { + log.info("현재 사용자: {}", authentication.getName()); + log.info("현재 권한: {}", authentication.getAuthorities()); + } + + final OfferEmploymentResponse offerEmploymentResponse = offerEmploymentService.sendOfferEmployment(offerEmploymentRequest); return ResponseEntity.ok(offerEmploymentResponse); } diff --git a/src/main/resources/application-local.properties b/src/main/resources/application-local.properties new file mode 100644 index 00000000..ecdc6d13 --- /dev/null +++ b/src/main/resources/application-local.properties @@ -0,0 +1,107 @@ +spring.application.name=api + +spring.config.import=optional:file:.env[.properties] + +# mysql Database Configuration +spring.datasource.url=${MYSQL_URI} +spring.datasource.username=${MYSQL_INITDB_ROOT_USERNAME} +spring.datasource.password=${MYSQL_INITDB_ROOT_PASSWORD} +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver + +# JPA and Hibernate Configuration +spring.jpa.hibernate.ddl-auto=update +spring.jpa.show-sql=true +spring.jpa.properties.hibernate.format_sql=true +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect +spring.jpa.properties.hibernate.physical_naming_strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl + +# 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 + +# SMTP +spring.mail.host=smtp.gmail.com +spring.mail.port=587 +spring.mail.username=${spring_mail_username} +spring.mail.password=${spring_mail_password} +spring.mail.protocol=smtp +spring.mail.properties.mail.smtp.auth=true +spring.mail.properties.mail.smtp.starttls.enable=true +spring.mail.properties.mail.smtp.starttls.required=true +spring.mail.properties.mail.smtp.connectiontimeout=5000 +spring.mail.properties.mail.smtp.timeout=5000 +spring.mail.properties.mail.smtp.writetimeout=5000 +spring.mail.auth-code-expiration-millis=600000 + +# JWT +jwt.secret_key=${jwt.secret_key} +# 60? +jwt.access_token_valid_time=3600 +# 30? +jwt.refresh_token_valid_time=2592000 + +# mail code +code.length=6 +code.digit_range=10 + +# kakao Oauth2 ?? +spring.security.oauth2.client.registration.kakao.client-id=${KAKAO_CLIENT_ID} +spring.security.oauth2.client.registration.kakao.client-secret=${KAKAO_CLIENT_SECRET} +spring.security.oauth2.client.registration.kakao.redirect-uri={baseUrl}/oauth2/callback/{registrationId} +spring.security.oauth2.client.registration.kakao.authorization-grant-type=authorization_code +spring.security.oauth2.client.registration.kakao.client-authentication-method=client_secret_post +spring.security.oauth2.client.registration.kakao.scope=profile_nickname,account_email + +# kakao Oauth2 Provider ?? +spring.security.oauth2.client.provider.kakao.authorization-uri=https://kauth.kakao.com/oauth/authorize +spring.security.oauth2.client.provider.kakao.token-uri=https://kauth.kakao.com/oauth/token +spring.security.oauth2.client.provider.kakao.user-info-uri=https://kapi.kakao.com/v2/user/me +spring.security.oauth2.client.provider.kakao.user-name-attribute=id + +# naver Oauth2 ?? +spring.security.oauth2.client.registration.naver.client-id=${NAVER_CLIENT_ID} +spring.security.oauth2.client.registration.naver.client-secret=${NAVER_CLIENT_SECRET} +spring.security.oauth2.client.registration.naver.redirect-uri={baseUrl}/oauth2/callback/{registrationId} +spring.security.oauth2.client.registration.naver.authorization-grant-type=authorization_code +spring.security.oauth2.client.registration.naver.client-authentication-method=client_secret_basic +spring.security.oauth2.client.registration.naver.scope=name,email + +# naver Oauth2 Provider ?? +spring.security.oauth2.client.provider.naver.authorization-uri=https://nid.naver.com/oauth2.0/authorize +spring.security.oauth2.client.provider.naver.token-uri=https://nid.naver.com/oauth2.0/token +spring.security.oauth2.client.provider.naver.user-info-uri=https://openapi.naver.com/v1/nid/me +spring.security.oauth2.client.provider.naver.user-name-attribute=response + +# redirect allow path +app.oauth2.authorized-redirect-uris=* + +# vendor +vendor.api.base-url=https://api.odcloud.kr/api/nts-businessman/v1/validate +vendor.api.service-key=${VENDOR_API_SERVICE-KEY} + +cloud.aws.s3.bucket=danpat +cloud.aws.region.static=ap-northeast-2 +cloud.aws.stack.auto=false +cloud.aws.credentials.accessKey=${AWS_CREDENTIALS_ACCESSKEY} +cloud.aws.credentials.secretKey=${AWS_CREDENTIALS_SECRETKEY} + +spring.servlet.multipart.enabled=true +spring.servlet.multipart.max-file-size=10MB +spring.servlet.multipart.max-request-size=10MB + +springdoc.swagger-ui.path=/swagger-ui.html +springdoc.swagger-ui.url=/swagger.yaml +springdoc.api-docs.path=/v3/api-docs +springdoc.default-consumes-media-type=application/json +springdoc.default-produces-media-type=application/json + +spring.mvc.pathmatch.matching-strategy=ant_path_matcher + +# Mongo Database Configuration +spring.data.mongodb.auto-index-creation=true +spring.data.mongodb.uri=mongodb://localhost:27017/testdb +spring.data.mongodb.host=localhost \ No newline at end of file diff --git a/src/main/resources/application-prod.properties b/src/main/resources/application-prod.properties new file mode 100644 index 00000000..efdb0e79 --- /dev/null +++ b/src/main/resources/application-prod.properties @@ -0,0 +1,104 @@ +spring.application.name=api + +spring.config.import=optional:file:.env[.properties] + +# mysql Database Configuration +spring.datasource.url=${MYSQL_URI} +spring.datasource.username=${MYSQL_INITDB_ROOT_USERNAME} +spring.datasource.password=${MYSQL_INITDB_ROOT_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=update +spring.jpa.show-sql=true +spring.jpa.properties.hibernate.format_sql=true +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect +spring.jpa.properties.hibernate.physical_naming_strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl + +# Logging (Optional) +logging.file.name=/app/logs/application.log +logging.level.root=INFO +logging.level.org.springframework.security=DEBUG +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 + +# SMTP +spring.mail.host=smtp.gmail.com +spring.mail.port=587 +spring.mail.username=${spring_mail_username} +spring.mail.password=${spring_mail_password} +spring.mail.protocol=smtp +spring.mail.properties.mail.smtp.auth=true +spring.mail.properties.mail.smtp.starttls.enable=true +spring.mail.properties.mail.smtp.starttls.required=true +spring.mail.properties.mail.smtp.connectiontimeout=5000 +spring.mail.properties.mail.smtp.timeout=5000 +spring.mail.properties.mail.smtp.writetimeout=5000 +spring.mail.auth-code-expiration-millis=600000 + +# JWT +jwt.secret_key=${jwt.secret_key} +# 60? +jwt.access_token_valid_time=3600 +# 30? +jwt.refresh_token_valid_time=2592000 + +# mail code +code.length=6 +code.digit_range=10 + +# kakao Oauth2 ?? +spring.security.oauth2.client.registration.kakao.client-id=${KAKAO_CLIENT_ID} +spring.security.oauth2.client.registration.kakao.client-secret=${KAKAO_CLIENT_SECRET} +spring.security.oauth2.client.registration.kakao.redirect-uri={baseUrl}/oauth2/callback/{registrationId} +spring.security.oauth2.client.registration.kakao.authorization-grant-type=authorization_code +spring.security.oauth2.client.registration.kakao.client-authentication-method=client_secret_post +spring.security.oauth2.client.registration.kakao.scope=profile_nickname,account_email + +# kakao Oauth2 Provider ?? +spring.security.oauth2.client.provider.kakao.authorization-uri=https://kauth.kakao.com/oauth/authorize +spring.security.oauth2.client.provider.kakao.token-uri=https://kauth.kakao.com/oauth/token +spring.security.oauth2.client.provider.kakao.user-info-uri=https://kapi.kakao.com/v2/user/me +spring.security.oauth2.client.provider.kakao.user-name-attribute=id + +# naver Oauth2 ?? +spring.security.oauth2.client.registration.naver.client-id=${NAVER_CLIENT_ID} +spring.security.oauth2.client.registration.naver.client-secret=${NAVER_CLIENT_SECRET} +spring.security.oauth2.client.registration.naver.redirect-uri={baseUrl}/oauth2/callback/{registrationId} +spring.security.oauth2.client.registration.naver.authorization-grant-type=authorization_code +spring.security.oauth2.client.registration.naver.client-authentication-method=client_secret_basic +spring.security.oauth2.client.registration.naver.scope=name,email + +# naver Oauth2 Provider ?? +spring.security.oauth2.client.provider.naver.authorization-uri=https://nid.naver.com/oauth2.0/authorize +spring.security.oauth2.client.provider.naver.token-uri=https://nid.naver.com/oauth2.0/token +spring.security.oauth2.client.provider.naver.user-info-uri=https://openapi.naver.com/v1/nid/me +spring.security.oauth2.client.provider.naver.user-name-attribute=response + +# redirect allow path +app.oauth2.authorized-redirect-uris=* + +# vendor +vendor.api.base-url=https://api.odcloud.kr/api/nts-businessman/v1/validate +vendor.api.service-key=${VENDOR_API_SERVICE-KEY} + +cloud.aws.s3.bucket=danpat +cloud.aws.region.static=ap-northeast-2 +cloud.aws.stack.auto=false +cloud.aws.credentials.accessKey=${AWS_CREDENTIALS_ACCESSKEY} +cloud.aws.credentials.secretKey=${AWS_CREDENTIALS_SECRETKEY} + +spring.servlet.multipart.enabled=true +spring.servlet.multipart.max-file-size=10MB +spring.servlet.multipart.max-request-size=10MB + +springdoc.swagger-ui.path=/swagger-ui.html +springdoc.swagger-ui.url=/swagger.yaml +springdoc.api-docs.path=/v3/api-docs +springdoc.default-consumes-media-type=application/json +springdoc.default-produces-media-type=application/json + +spring.mvc.pathmatch.matching-strategy=ant_path_matcher \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index bc8901eb..a015c682 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,104 +1 @@ -spring.application.name=api - -spring.config.import=optional:file:.env[.properties] - -# mysql Database Configuration -spring.datasource.url=${MYSQL_URI} -spring.datasource.username=${MYSQL_INITDB_ROOT_USERNAME} -spring.datasource.password=${MYSQL_INITDB_ROOT_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=update -spring.jpa.show-sql=true -spring.jpa.properties.hibernate.format_sql=true -spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect -spring.jpa.properties.hibernate.physical_naming_strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl - -# 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 - -# SMTP -spring.mail.host=smtp.gmail.com -spring.mail.port=587 -spring.mail.username=${spring_mail_username} -spring.mail.password=${spring_mail_password} -spring.mail.protocol=smtp -spring.mail.properties.mail.smtp.auth=true -spring.mail.properties.mail.smtp.starttls.enable=true -spring.mail.properties.mail.smtp.starttls.required=true -spring.mail.properties.mail.smtp.connectiontimeout=5000 -spring.mail.properties.mail.smtp.timeout=5000 -spring.mail.properties.mail.smtp.writetimeout=5000 -spring.mail.auth-code-expiration-millis=600000 - -# JWT -jwt.secret_key=${jwt.secret_key} -# 60? -jwt.access_token_valid_time=3600 -# 30? -jwt.refresh_token_valid_time=2592000 - -# mail code -code.length=6 -code.digit_range=10 - -# kakao Oauth2 ?? -spring.security.oauth2.client.registration.kakao.client-id=${KAKAO_CLIENT_ID} -spring.security.oauth2.client.registration.kakao.client-secret=${KAKAO_CLIENT_SECRET} -spring.security.oauth2.client.registration.kakao.redirect-uri={baseUrl}/oauth2/callback/{registrationId} -spring.security.oauth2.client.registration.kakao.authorization-grant-type=authorization_code -spring.security.oauth2.client.registration.kakao.client-authentication-method=client_secret_post -spring.security.oauth2.client.registration.kakao.scope=profile_nickname,account_email - -# kakao Oauth2 Provider ?? -spring.security.oauth2.client.provider.kakao.authorization-uri=https://kauth.kakao.com/oauth/authorize -spring.security.oauth2.client.provider.kakao.token-uri=https://kauth.kakao.com/oauth/token -spring.security.oauth2.client.provider.kakao.user-info-uri=https://kapi.kakao.com/v2/user/me -spring.security.oauth2.client.provider.kakao.user-name-attribute=id - -# naver Oauth2 ?? -spring.security.oauth2.client.registration.naver.client-id=${NAVER_CLIENT_ID} -spring.security.oauth2.client.registration.naver.client-secret=${NAVER_CLIENT_SECRET} -spring.security.oauth2.client.registration.naver.redirect-uri={baseUrl}/oauth2/callback/{registrationId} -spring.security.oauth2.client.registration.naver.authorization-grant-type=authorization_code -spring.security.oauth2.client.registration.naver.client-authentication-method=client_secret_basic -spring.security.oauth2.client.registration.naver.scope=name,email - -# naver Oauth2 Provider ?? -spring.security.oauth2.client.provider.naver.authorization-uri=https://nid.naver.com/oauth2.0/authorize -spring.security.oauth2.client.provider.naver.token-uri=https://nid.naver.com/oauth2.0/token -spring.security.oauth2.client.provider.naver.user-info-uri=https://openapi.naver.com/v1/nid/me -spring.security.oauth2.client.provider.naver.user-name-attribute=response - -# redirect allow path -app.oauth2.authorized-redirect-uris=* - -# vendor -vendor.api.base-url=https://api.odcloud.kr/api/nts-businessman/v1/validate -vendor.api.service-key=${VENDOR_API_SERVICE-KEY} - -cloud.aws.s3.bucket=danpat -cloud.aws.region.static=ap-northeast-2 -cloud.aws.stack.auto=false -cloud.aws.credentials.accessKey=${AWS_CREDENTIALS_ACCESSKEY} -cloud.aws.credentials.secretKey=${AWS_CREDENTIALS_SECRETKEY} - -spring.servlet.multipart.enabled=true -spring.servlet.multipart.max-file-size=10MB -spring.servlet.multipart.max-request-size=10MB - -springdoc.swagger-ui.path=/swagger-ui.html -springdoc.api-docs.path=/v3/api-docs -springdoc.default-consumes-media-type=application/json -springdoc.default-produces-media-type=application/json - -spring.mvc.pathmatch.matching-strategy=ant_path_matcher \ No newline at end of file +spring.profiles.active=prod \ No newline at end of file diff --git a/src/main/resources/static/swagger.yaml b/src/main/resources/static/swagger.yaml index b306d25a..0fe39dcd 100644 --- a/src/main/resources/static/swagger.yaml +++ b/src/main/resources/static/swagger.yaml @@ -4,7 +4,7 @@ info: description: 단팥 백엔드 API 명세서입니다. version: 1.0.0 servers: - - url: http://43.201.78.102:8080 + - url: https://www.danpat.store security: - JWT_TOKEN: [] paths: @@ -702,7 +702,7 @@ paths: schema: $ref: "#/components/schemas/OfferEmploymentRequest" example: - employeeId: 1001 + employeeId: 2 businessId: 1 suggestHourlyPay: 10000 suggestStartTime: "2025-01-01T09:00:00" diff --git a/src/test/java/com/example/api/aws/service/S3ServiceTest.java b/src/test/java/com/example/api/aws/service/S3ServiceTest.java index 18ebe55d..8010957b 100644 --- a/src/test/java/com/example/api/aws/service/S3ServiceTest.java +++ b/src/test/java/com/example/api/aws/service/S3ServiceTest.java @@ -42,7 +42,7 @@ void setUp() { "pass01", // password "010-1234-5678", // phoneNumber "user-uploads/1/profile.png", // profileImage - List.of(UserRole.EMPLOYEE), // roles + List.of(UserRole.ROLE_EMPLOYEE), // roles "F", // sex 4.5f, // starPoint 10 // workCount diff --git a/src/test/java/com/example/api/inquiry/InquiryServiceTest.java b/src/test/java/com/example/api/inquiry/InquiryServiceTest.java index 9445e74f..6258fe84 100644 --- a/src/test/java/com/example/api/inquiry/InquiryServiceTest.java +++ b/src/test/java/com/example/api/inquiry/InquiryServiceTest.java @@ -1,115 +1,115 @@ -package com.example.api.inquiry; - -import com.example.api.account.entity.Nationality; -import com.example.api.account.entity.UserRole; -import com.example.api.account.repository.AccountRepository; -import com.example.api.domain.Account; -import com.example.api.domain.Inquiry; -import com.example.api.inquiry.dto.InquiryRequest; -import com.example.api.inquiry.dto.InquiryResponse; -import jakarta.annotation.PostConstruct; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.MethodOrderer; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.TestMethodOrder; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; - -import java.time.LocalDateTime; -import java.util.List; - -import static org.assertj.core.api.AssertionsForClassTypes.assertThat; - -@TestMethodOrder(MethodOrderer.OrderAnnotation.class) -@SpringBootTest -class InquiryServiceTest { - @Autowired - private InquiryService inquiryService; - - @Autowired - private InquiryRepository inquiryRepository; - - @Autowired - private AccountRepository accountRepository; - - @PostConstruct - void setUp() { - accountRepository.deleteAll(); - inquiryRepository.deleteAll(); - - Account account = new Account( - "user01", - "password123", - "Alice", - "nickname01", - "010-1234-5678", - "alice@example.com", - Nationality.KOREAN, - List.of(UserRole.EMPLOYEE), - false - ); - accountRepository.save(account); - } - - @Test - @DisplayName("문의 저장 및 저장된 문의 반환 테스트") - void saveInquiry_shouldSaveAndReturnInquiry() { - Account account = accountRepository.findById(1L).orElseThrow(); - InquiryRequest inquiryRequest = new InquiryRequest( - "General", - "Question", - "Test Title", - "Test Content", - account - ); - Inquiry result = inquiryService.saveInquiry(inquiryRequest, account); - assertThat(result).isNotNull(); - assertThat(result.getTitle()).isEqualTo("Test Title"); - } - - @Test - @DisplayName("계정 ID로 문의 조회 테스트") - void getInquiriesByAccountId_shouldReturnListOfInquiries() { - Account account = accountRepository.findById(1L).orElseThrow(); - Inquiry inquiry1 = new Inquiry(); - inquiry1.setInquiryId(1L); - inquiry1.setCreatedBy(account); - inquiry1.setInquiryType("General"); - inquiry1.setSubInquiryType("Question"); - inquiry1.setTitle("Inquiry 1"); - inquiry1.setContent("Content 1"); - inquiry1.setInquiryStatus(Inquiry.InquiryStatus.WAITING); - inquiry1.setAnswerDate(LocalDateTime.now()); - inquiryRepository.save(inquiry1); - - Inquiry inquiry2 = new Inquiry(); - inquiry2.setInquiryId(2L); - inquiry2.setCreatedBy(account); - inquiry2.setInquiryType("General"); - inquiry2.setSubInquiryType("Question"); - inquiry2.setTitle("Inquiry 2"); - inquiry2.setContent("Content 2"); - inquiry2.setInquiryStatus(Inquiry.InquiryStatus.COMPLETED); - inquiry2.setAnswerDate(LocalDateTime.now()); - inquiryRepository.save(inquiry2); - List result = inquiryService.getInquiriesByAccountId(account.getAccountId()); - assertThat(result.get(0).title()).isEqualTo("Inquiry 1"); - assertThat(result.get(1).title()).isEqualTo("Inquiry 2"); - } - - @Test - @DisplayName("문의 명령을 엔티티로 매핑 테스트") - void mapToInquiry_shouldMapCommandToInquiry() { - Account account = accountRepository.findById(1L).orElseThrow(); - InquiryRequest inquiryRequest = new InquiryRequest( - "General", - "Question", - "Test Title", - "Test Content", - account - ); - Inquiry inquiry = inquiryService.saveInquiry(inquiryRequest, account); - assertThat(inquiry).isNotNull(); - assertThat(inquiry.getTitle()).isEqualTo("Test Title"); - } -} \ No newline at end of file +//package com.example.api.inquiry; +// +//import com.example.api.account.entity.Nationality; +//import com.example.api.account.entity.UserRole; +//import com.example.api.account.repository.AccountRepository; +//import com.example.api.domain.Account; +//import com.example.api.domain.Inquiry; +//import com.example.api.inquiry.dto.InquiryRequest; +//import com.example.api.inquiry.dto.InquiryResponse; +//import jakarta.annotation.PostConstruct; +//import org.junit.jupiter.api.DisplayName; +//import org.junit.jupiter.api.MethodOrderer; +//import org.junit.jupiter.api.Test; +//import org.junit.jupiter.api.TestMethodOrder; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.boot.test.context.SpringBootTest; +// +//import java.time.LocalDateTime; +//import java.util.List; +// +//import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +// +//@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +//@SpringBootTest +//class InquiryServiceTest { +// @Autowired +// private InquiryService inquiryService; +// +// @Autowired +// private InquiryRepository inquiryRepository; +// +// @Autowired +// private AccountRepository accountRepository; +// +// @PostConstruct +// void setUp() { +// accountRepository.deleteAll(); +// inquiryRepository.deleteAll(); +// +// Account account = new Account( +// "user01", +// "password123", +// "Alice", +// "nickname01", +// "010-1234-5678", +// "alice@example.com", +// Nationality.KOREAN, +// List.of(UserRole.ROLE_EMPLOYEE), +// false +// ); +// accountRepository.save(account); +// } +// +// @Test +// @DisplayName("문의 저장 및 저장된 문의 반환 테스트") +// void saveInquiry_shouldSaveAndReturnInquiry() { +// Account account = accountRepository.findById(1L).orElseThrow(); +// InquiryRequest inquiryRequest = new InquiryRequest( +// "General", +// "Question", +// "Test Title", +// "Test Content", +// account +// ); +// Inquiry result = inquiryService.saveInquiry(inquiryRequest, account); +// assertThat(result).isNotNull(); +// assertThat(result.getTitle()).isEqualTo("Test Title"); +// } +// +// @Test +// @DisplayName("계정 ID로 문의 조회 테스트") +// void getInquiriesByAccountId_shouldReturnListOfInquiries() { +// Account account = accountRepository.findById(1L).orElseThrow(); +// Inquiry inquiry1 = new Inquiry(); +// inquiry1.setInquiryId(1L); +// inquiry1.setCreatedBy(account); +// inquiry1.setInquiryType("General"); +// inquiry1.setSubInquiryType("Question"); +// inquiry1.setTitle("Inquiry 1"); +// inquiry1.setContent("Content 1"); +// inquiry1.setInquiryStatus(Inquiry.InquiryStatus.WAITING); +// inquiry1.setAnswerDate(LocalDateTime.now()); +// inquiryRepository.save(inquiry1); +// +// Inquiry inquiry2 = new Inquiry(); +// inquiry2.setInquiryId(2L); +// inquiry2.setCreatedBy(account); +// inquiry2.setInquiryType("General"); +// inquiry2.setSubInquiryType("Question"); +// inquiry2.setTitle("Inquiry 2"); +// inquiry2.setContent("Content 2"); +// inquiry2.setInquiryStatus(Inquiry.InquiryStatus.COMPLETED); +// inquiry2.setAnswerDate(LocalDateTime.now()); +// inquiryRepository.save(inquiry2); +// List result = inquiryService.getInquiriesByAccountId(account.getAccountId()); +// assertThat(result.get(0).title()).isEqualTo("Inquiry 1"); +// assertThat(result.get(1).title()).isEqualTo("Inquiry 2"); +// } +// +// @Test +// @DisplayName("문의 명령을 엔티티로 매핑 테스트") +// void mapToInquiry_shouldMapCommandToInquiry() { +// Account account = accountRepository.findById(1L).orElseThrow(); +// InquiryRequest inquiryRequest = new InquiryRequest( +// "General", +// "Question", +// "Test Title", +// "Test Content", +// account +// ); +// Inquiry inquiry = inquiryService.saveInquiry(inquiryRequest, account); +// assertThat(inquiry).isNotNull(); +// assertThat(inquiry.getTitle()).isEqualTo("Test Title"); +// } +//} \ 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 b31ccdda..a7cd46f7 100644 --- a/src/test/java/com/example/api/offeremployment/OfferEmploymentServiceTest.java +++ b/src/test/java/com/example/api/offeremployment/OfferEmploymentServiceTest.java @@ -1,135 +1,135 @@ -package com.example.api.offeremployment; - -import com.example.api.domain.Location; -import com.example.api.account.entity.Nationality; -import com.example.api.account.entity.UserRole; -import com.example.api.account.repository.AccountRepository; -import com.example.api.business.BusinessRepository; -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; -import org.junit.jupiter.api.*; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; - -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.util.List; -import java.util.Optional; - -import static org.junit.jupiter.api.Assertions.*; - -@TestMethodOrder(MethodOrderer.OrderAnnotation.class) -@SpringBootTest -class OfferEmploymentServiceTest { - - @Autowired - private OfferEmploymentService offerEmploymentService; - - @Autowired - private AccountRepository accountRepository; - - @Autowired - private BusinessRepository businessRepository; - - @Autowired - private OfferEmploymentRepository offerEmploymentRepository; - - @PostConstruct - void setUp() { - offerEmploymentRepository.deleteAll(); - businessRepository.deleteAll(); - accountRepository.deleteAll(); - - Account employee = new Account( - "employee01", "password123", "Alice", "nickname1", "010-1234-5678", - "alice@example.com", Nationality.KOREAN, List.of(UserRole.EMPLOYEE), true - ); - accountRepository.save(employee); - - Account employer = new Account( - "employer01", "password456", "Bob", "nickname2", "010-9876-5432", - "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); - } - - @Test - @Order(1) - @DisplayName("정상적으로 고용 제안을 보낼 수 있다") - void sendOfferEmployment_ShouldSucceed() { - OfferEmploymentRequest request = new OfferEmploymentRequest( - 1L, - 1L, - 15000, - LocalDateTime.of(2025, 1, 1, 9, 0), - LocalDateTime.of(2025, 1, 1, 18, 0) - ); - - OfferEmploymentResponse response = offerEmploymentService.sendOfferEmployment(request); - - assertNotNull(response); - assertTrue(response.success()); - assertEquals("Offer succeeded", response.message()); - - Optional savedOfferEmployment = offerEmploymentRepository.findAll().stream().findFirst(); - assertTrue(savedOfferEmployment.isPresent()); - OfferEmployment offerEmployment = savedOfferEmployment.get(); - assertEquals(1L, offerEmployment.getEmployee().getAccountId()); - assertEquals(1L, offerEmployment.getBusiness().getBusinessId()); - assertEquals(15000, offerEmployment.getSuggestHourlyPay()); - } - - @Test - @Order(2) - @DisplayName("잘못된 알바 ID로 고용 제안을 보낼 경우 실패한다") - void sendOfferEmployment_InvalidEmployee_ShouldFail() { - OfferEmploymentRequest request = new OfferEmploymentRequest( - 999L, - 1L, - 15000, - LocalDateTime.of(2025, 1, 1, 9, 0), - LocalDateTime.of(2025, 1, 1, 18, 0) - ); - - IllegalArgumentException exception = assertThrows( - IllegalArgumentException.class, - () -> offerEmploymentService.sendOfferEmployment(request) - ); - assertEquals("Account not found with ID: 999", exception.getMessage()); - } - - @Test - @Order(3) - @DisplayName("잘못된 비즈니스 ID로 고용 제안을 보낼 경우 실패한다") - void sendOfferEmployment_InvalidBusiness_ShouldFail() { - OfferEmploymentRequest request = new OfferEmploymentRequest( - 1L, - 999L, - 15000, - LocalDateTime.of(2025, 1, 1, 9, 0), - LocalDateTime.of(2025, 1, 1, 18, 0) - ); - - IllegalArgumentException exception = assertThrows( - IllegalArgumentException.class, - () -> offerEmploymentService.sendOfferEmployment(request) - ); - assertEquals("Business not found with ID: 999", exception.getMessage()); - } -} - +//package com.example.api.offeremployment; +// +//import com.example.api.domain.Location; +//import com.example.api.account.entity.Nationality; +//import com.example.api.account.entity.UserRole; +//import com.example.api.account.repository.AccountRepository; +//import com.example.api.business.BusinessRepository; +//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; +//import org.junit.jupiter.api.*; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.boot.test.context.SpringBootTest; +// +//import java.time.LocalDate; +//import java.time.LocalDateTime; +//import java.util.List; +//import java.util.Optional; +// +//import static org.junit.jupiter.api.Assertions.*; +// +//@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +//@SpringBootTest +//class OfferEmploymentServiceTest { +// +// @Autowired +// private OfferEmploymentService offerEmploymentService; +// +// @Autowired +// private AccountRepository accountRepository; +// +// @Autowired +// private BusinessRepository businessRepository; +// +// @Autowired +// private OfferEmploymentRepository offerEmploymentRepository; +// +// @PostConstruct +// void setUp() { +// offerEmploymentRepository.deleteAll(); +// businessRepository.deleteAll(); +// accountRepository.deleteAll(); +// +// Account employee = new Account( +// "employee01", "password123", "Alice", "nickname1", "010-1234-5678", +// "alice@example.com", Nationality.KOREAN, List.of(UserRole.ROLE_EMPLOYEE), true +// ); +// accountRepository.save(employee); +// +// Account employer = new Account( +// "employer01", "password456", "Bob", "nickname2", "010-9876-5432", +// "bob@example.com", Nationality.KOREAN, List.of(UserRole.ROLE_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); +// } +// +// @Test +// @Order(1) +// @DisplayName("정상적으로 고용 제안을 보낼 수 있다") +// void sendOfferEmployment_ShouldSucceed() { +// OfferEmploymentRequest request = new OfferEmploymentRequest( +// 1L, +// 1L, +// 15000, +// LocalDateTime.of(2025, 1, 1, 9, 0), +// LocalDateTime.of(2025, 1, 1, 18, 0) +// ); +// +// OfferEmploymentResponse response = offerEmploymentService.sendOfferEmployment(request); +// +// assertNotNull(response); +// assertTrue(response.success()); +// assertEquals("Offer succeeded", response.message()); +// +// Optional savedOfferEmployment = offerEmploymentRepository.findAll().stream().findFirst(); +// assertTrue(savedOfferEmployment.isPresent()); +// OfferEmployment offerEmployment = savedOfferEmployment.get(); +// assertEquals(1L, offerEmployment.getEmployee().getAccountId()); +// assertEquals(1L, offerEmployment.getBusiness().getBusinessId()); +// assertEquals(15000, offerEmployment.getSuggestHourlyPay()); +// } +// +// @Test +// @Order(2) +// @DisplayName("잘못된 알바 ID로 고용 제안을 보낼 경우 실패한다") +// void sendOfferEmployment_InvalidEmployee_ShouldFail() { +// OfferEmploymentRequest request = new OfferEmploymentRequest( +// 999L, +// 1L, +// 15000, +// LocalDateTime.of(2025, 1, 1, 9, 0), +// LocalDateTime.of(2025, 1, 1, 18, 0) +// ); +// +// IllegalArgumentException exception = assertThrows( +// IllegalArgumentException.class, +// () -> offerEmploymentService.sendOfferEmployment(request) +// ); +// assertEquals("Account not found with ID: 999", exception.getMessage()); +// } +// +// @Test +// @Order(3) +// @DisplayName("잘못된 비즈니스 ID로 고용 제안을 보낼 경우 실패한다") +// void sendOfferEmployment_InvalidBusiness_ShouldFail() { +// OfferEmploymentRequest request = new OfferEmploymentRequest( +// 1L, +// 999L, +// 15000, +// LocalDateTime.of(2025, 1, 1, 9, 0), +// LocalDateTime.of(2025, 1, 1, 18, 0) +// ); +// +// IllegalArgumentException exception = assertThrows( +// IllegalArgumentException.class, +// () -> offerEmploymentService.sendOfferEmployment(request) +// ); +// assertEquals("Business not found with ID: 999", exception.getMessage()); +// } +//} +// From 8bdc5a3b607dd6b3b50d008d22942e9530479ef1 Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Sun, 23 Feb 2025 13:56:36 +0900 Subject: [PATCH 270/276] =?UTF-8?q?chat=20api=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/api/auth/service/AuthService.java | 3 + .../api/chat/controller/ChatController.java | 17 +-- .../dto/request/ChatSendRequest.java | 15 ++- .../controller/dto/request/ReadRequest.java | 2 +- .../controller/dto/response/ChatResponse.java | 12 ++ .../com/example/api/chat/dto/ChatSummary.java | 2 +- .../repository/CustomChatRepositoryImpl.java | 35 +++--- .../example/api/chat/service/ChatService.java | 32 ++++- .../api/chat/service/model/ChatSender.java | 2 +- .../java/com/example/api/domain/Chat.java | 27 ++-- .../java/com/example/api/domain/ChatRoom.java | 1 - .../example/api/domain/OfferEmployment.java | 1 - .../api/global/config/SecurityConfig.java | 2 +- .../filter/JwtAuthenticationFilter.java | 2 - .../OfferEmploymentService.java | 4 +- .../resources/application-local.properties | 1 + src/main/resources/static/swagger.yaml | 34 ++--- .../chat/repository/ChatRepositoryTest.java | 26 ++++ .../api/contracts/ContractServiceTest.java | 7 +- .../employer/service/EmployerServiceTest.java | 116 +++++++++--------- 20 files changed, 215 insertions(+), 126 deletions(-) create mode 100644 src/main/java/com/example/api/chat/controller/dto/response/ChatResponse.java create mode 100644 src/test/java/com/example/api/chat/repository/ChatRepositoryTest.java diff --git a/src/main/java/com/example/api/auth/service/AuthService.java b/src/main/java/com/example/api/auth/service/AuthService.java index 7b6b1207..b53a492c 100644 --- a/src/main/java/com/example/api/auth/service/AuthService.java +++ b/src/main/java/com/example/api/auth/service/AuthService.java @@ -114,6 +114,9 @@ public LoginSuccessResponse logout(@Validated final LoginUserRequest loginUserRe responseBody.put("accessToken", null); responseBody.put("userId", null); responseBody.put("userRole", null); + responseBody.put("name", null); + responseBody.put("profile", null); + responseBody.put("nickname", null); return new LoginSuccessResponse(null, responseBody); } diff --git a/src/main/java/com/example/api/chat/controller/ChatController.java b/src/main/java/com/example/api/chat/controller/ChatController.java index 5840f583..556420c2 100644 --- a/src/main/java/com/example/api/chat/controller/ChatController.java +++ b/src/main/java/com/example/api/chat/controller/ChatController.java @@ -3,10 +3,12 @@ import com.example.api.chat.controller.dto.request.ChatSendRequest; import com.example.api.chat.controller.dto.request.ReadRequest; import com.example.api.chat.controller.dto.request.UserIdRequest; +import com.example.api.chat.controller.dto.response.ChatResponse; import com.example.api.chat.controller.dto.response.ChatSummaryResponse; import com.example.api.chat.service.ChatService; import com.example.api.domain.Chat; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.http.ResponseEntity; import org.springframework.messaging.handler.annotation.MessageMapping; import org.springframework.messaging.handler.annotation.Payload; @@ -16,27 +18,28 @@ @RestController @RequiredArgsConstructor +@Slf4j public class ChatController { private final ChatService chatService; @MessageMapping("/send") - public void sendMessage(@Payload ChatSendRequest chatRequest) { + public void sendMessage(@Payload final ChatSendRequest chatRequest) { chatService.sendChat(chatRequest); } @MessageMapping("/read") - public void readMessage(@Payload ReadRequest readRequest) { + public void readMessage(@Payload final ReadRequest readRequest) { chatService.readChats(readRequest); } - @GetMapping("/chat/summaries") - public ResponseEntity getChatSummaries(@RequestBody UserIdRequest userIdRequest) { - return ResponseEntity.ok(chatService.getChatSummaries(userIdRequest)); + @GetMapping("/chat/summaries/{userId}") + public ResponseEntity getChatSummaries(final @PathVariable Long userId) { + return ResponseEntity.ok(chatService.getChatSummaries(new UserIdRequest(userId))); } @GetMapping("/chat/room/{roomId}/chats") - public ResponseEntity> getMessages(@PathVariable("roomId") Long chatRoomId, - @RequestParam(value = "lastChatId", required = false) String chatId) { + public ResponseEntity> getMessages(@PathVariable("roomId") final Long chatRoomId, + @RequestParam(value = "lastChatId", required = false) final String chatId) { return ResponseEntity.ok(chatService.getChats(chatRoomId,chatId)); } } \ No newline at end of file diff --git a/src/main/java/com/example/api/chat/controller/dto/request/ChatSendRequest.java b/src/main/java/com/example/api/chat/controller/dto/request/ChatSendRequest.java index e9de2004..394298cb 100644 --- a/src/main/java/com/example/api/chat/controller/dto/request/ChatSendRequest.java +++ b/src/main/java/com/example/api/chat/controller/dto/request/ChatSendRequest.java @@ -1,4 +1,17 @@ package com.example.api.chat.controller.dto.request; -public record ChatSendRequest(Long roomId, Long senderId, Long receiverId, String content) { +import lombok.Getter; +import lombok.Setter; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; + +@Getter +@Setter +@NoArgsConstructor // 기본 생성자 필수 +@AllArgsConstructor // 모든 필드를 포함하는 생성자 +public class ChatSendRequest { + private Long roomId; + private Long senderId; + private Long receiverId; + private String content; } diff --git a/src/main/java/com/example/api/chat/controller/dto/request/ReadRequest.java b/src/main/java/com/example/api/chat/controller/dto/request/ReadRequest.java index 9e14c097..f81009f3 100644 --- a/src/main/java/com/example/api/chat/controller/dto/request/ReadRequest.java +++ b/src/main/java/com/example/api/chat/controller/dto/request/ReadRequest.java @@ -1,4 +1,4 @@ package com.example.api.chat.controller.dto.request; -public record ReadRequest(Long roomId, Long userId) { +public record ReadRequest(Long roomId, Long receiverId) { } \ No newline at end of file diff --git a/src/main/java/com/example/api/chat/controller/dto/response/ChatResponse.java b/src/main/java/com/example/api/chat/controller/dto/response/ChatResponse.java new file mode 100644 index 00000000..006763f4 --- /dev/null +++ b/src/main/java/com/example/api/chat/controller/dto/response/ChatResponse.java @@ -0,0 +1,12 @@ +package com.example.api.chat.controller.dto.response; + +public record ChatResponse( + String id, + String content, + Long roomId, + Long senderId, + Long receiverId, + String sendTime, + Boolean isRead +) { +} diff --git a/src/main/java/com/example/api/chat/dto/ChatSummary.java b/src/main/java/com/example/api/chat/dto/ChatSummary.java index f23f3896..d144ee40 100644 --- a/src/main/java/com/example/api/chat/dto/ChatSummary.java +++ b/src/main/java/com/example/api/chat/dto/ChatSummary.java @@ -2,5 +2,5 @@ import java.util.Date; -public record ChatSummary(Long roomId, String lastMessageContent, Date lastMessageTime, Long numberOfUnreadMessages) { +public record ChatSummary(Long roomId, String lastMessageId, String lastMessageContent, String lastMessageTime, Long numberOfUnreadMessages) { } diff --git a/src/main/java/com/example/api/chat/repository/CustomChatRepositoryImpl.java b/src/main/java/com/example/api/chat/repository/CustomChatRepositoryImpl.java index a3deda94..b162f573 100644 --- a/src/main/java/com/example/api/chat/repository/CustomChatRepositoryImpl.java +++ b/src/main/java/com/example/api/chat/repository/CustomChatRepositoryImpl.java @@ -6,10 +6,7 @@ import org.bson.types.ObjectId; import org.springframework.data.domain.Sort; import org.springframework.data.mongodb.core.MongoTemplate; -import org.springframework.data.mongodb.core.aggregation.Aggregation; -import org.springframework.data.mongodb.core.aggregation.AggregationOperation; -import org.springframework.data.mongodb.core.aggregation.AggregationResults; -import org.springframework.data.mongodb.core.aggregation.ConditionalOperators; +import org.springframework.data.mongodb.core.aggregation.*; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Update; @@ -34,18 +31,18 @@ public void markChatsAsRead(Long chatRoomId, Long readBy) { mongoTemplate.updateMulti(query, update, Chat.class); } - @Override - public List findChats(Long chatRoomID, String lastChatId) { - Query query = new Query( - Criteria.where("roomId").is(chatRoomID) - ).with(Sort.by(Sort.Direction.DESC, "_id")).limit(100); + @Override + public List findChats(Long chatRoomID, String lastChatId) { + Query query = new Query( + Criteria.where("roomId").is(chatRoomID) + ).with(Sort.by(Sort.Direction.DESC, "_id")).limit(100); - if (lastChatId != null) { - query.addCriteria(Criteria.where("_id").lt(new ObjectId(lastChatId))); - } + if (lastChatId != null) { + query.addCriteria(Criteria.where("_id").lt(new ObjectId(lastChatId))); + } - return mongoTemplate.find(query, Chat.class); - } + return mongoTemplate.find(query, Chat.class); + } @@ -58,8 +55,12 @@ public List aggregateChatSummaries(List roomIds, Long memberI AggregationOperation group = Aggregation.group("roomId") .first("roomId").as("roomId") - .first("content").as("lastChatContent") - .first("sendTime").as("lastChatTime") + .first("content").as("lastMessageContent") + .first(DateOperators.DateToString.dateOf("sendTime") + .toString("%Y-%m-%d %H:%M") // ✅ 형식 설정 + .withTimezone(DateOperators.Timezone.valueOf("Asia/Seoul"))) // ✅ KST (UTC+9) 변환 + .as("lastMessageTime") + .first(ConvertOperators.ToString.toString("$_id")).as("lastMessageId") .sum(ConditionalOperators .when(new Criteria().andOperator( Criteria.where("receiverId").is(memberId), @@ -67,7 +68,7 @@ public List aggregateChatSummaries(List roomIds, Long memberI )) .then(1) .otherwise(0)) - .as("numberOfUnreadChats"); + .as("numberOfUnreadMessages"); Aggregation aggregation = Aggregation.newAggregation(match, sort, group); diff --git a/src/main/java/com/example/api/chat/service/ChatService.java b/src/main/java/com/example/api/chat/service/ChatService.java index d5aab5f2..4d8db6f0 100644 --- a/src/main/java/com/example/api/chat/service/ChatService.java +++ b/src/main/java/com/example/api/chat/service/ChatService.java @@ -3,6 +3,7 @@ import com.example.api.chat.controller.dto.request.UserIdRequest; import com.example.api.chat.controller.dto.request.ChatSendRequest; import com.example.api.chat.controller.dto.request.ReadRequest; +import com.example.api.chat.controller.dto.response.ChatResponse; import com.example.api.chat.controller.dto.response.ChatSummaryResponse; import com.example.api.chat.dto.ChatSummary; import com.example.api.chat.repository.ChatRepository; @@ -11,39 +12,49 @@ import com.example.api.domain.Chat; import com.example.api.domain.ChatRoom; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.time.Instant; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; import java.util.List; +import static com.example.api.domain.Chat.utcToKstConvert; +import static java.util.stream.Collectors.toList; + @Service @RequiredArgsConstructor +@Slf4j public class ChatService { private final ChatRepository chatRepository; private final ChatRoomRepository chatRoomRepository; private final ChatSender chatSender; @Transactional - public String sendChat(ChatSendRequest request) { + public String sendChat(final ChatSendRequest request) { + log.info("Send chat request: {}", request); Chat savedChat = saveChat(request); chatSender.send(savedChat); return "메세지 전송 성공~"; } - private Chat saveChat(ChatSendRequest request) { + private Chat saveChat(final ChatSendRequest request) { Chat chat = Chat.from(request); return chatRepository.save(chat); } @Transactional public String readChats(ReadRequest request) { - chatRepository.markChatsAsRead(request.roomId(), request.userId()); + chatRepository.markChatsAsRead(request.roomId(), request.receiverId()); chatSender.sendReadResponse(request); return "메세지 읽기 성공~"; } @Transactional(readOnly = true) - public ChatSummaryResponse getChatSummaries(UserIdRequest requestUserId) { + public ChatSummaryResponse getChatSummaries(final UserIdRequest requestUserId) { List chatRooms = chatRoomRepository.findByUserId(requestUserId.userId()); List chatRoomIds = chatRooms.stream().map(ChatRoom::getChatRoomId).toList(); List chatSummaries = chatRepository.aggregateChatSummaries(chatRoomIds, requestUserId.userId()); @@ -51,8 +62,17 @@ public ChatSummaryResponse getChatSummaries(UserIdRequest requestUserId) { } @Transactional(readOnly = true) - public List getChats(Long chatRoomId, String lastChatId) { - return chatRepository.findChats(chatRoomId,lastChatId); + public List getChats(Long chatRoomId, String lastChatId) { + return chatRepository.findChats(chatRoomId, lastChatId) + .stream().map(chat -> new ChatResponse( + chat.getId(), + chat.getContent(), + chat.getRoomId(), + chat.getSenderId(), + chat.getReceiverId(), + utcToKstConvert(chat.getSendTime()), + chat.getIsRead())) + .collect(toList()); } public List getChatRooms(Long userId) { diff --git a/src/main/java/com/example/api/chat/service/model/ChatSender.java b/src/main/java/com/example/api/chat/service/model/ChatSender.java index e827d378..8d9a4ec5 100644 --- a/src/main/java/com/example/api/chat/service/model/ChatSender.java +++ b/src/main/java/com/example/api/chat/service/model/ChatSender.java @@ -17,7 +17,7 @@ public void send(Chat chat) { } public void sendReadResponse(ReadRequest request) { - ReadResponse readResponse = new ReadResponse(request.userId()); + ReadResponse readResponse = new ReadResponse(request.receiverId()); messagingTemplate.convertAndSend("/room/" + request.roomId(), readResponse); } } diff --git a/src/main/java/com/example/api/domain/Chat.java b/src/main/java/com/example/api/domain/Chat.java index 3f4f6658..70b01c2f 100644 --- a/src/main/java/com/example/api/domain/Chat.java +++ b/src/main/java/com/example/api/domain/Chat.java @@ -2,14 +2,16 @@ import com.example.api.chat.controller.dto.request.ChatSendRequest; import jakarta.persistence.*; -import lombok.EqualsAndHashCode; import lombok.Getter; import org.springframework.data.mongodb.core.mapping.Document; +import java.time.Instant; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; import java.util.Date; @Getter -@EqualsAndHashCode @Document(collection = "chat") public class Chat { @Id @@ -21,15 +23,15 @@ public class Chat { private Date sendTime; private Boolean isRead; - protected Chat() { + public Chat() { } public static Chat from(ChatSendRequest chatSendRequest){ Chat chat = new Chat(); - chat.content = chatSendRequest.content(); - chat.roomId = chatSendRequest.roomId(); - chat.senderId = chatSendRequest.senderId(); - chat.receiverId = chatSendRequest.receiverId(); + chat.content = chatSendRequest.getContent(); + chat.roomId = chatSendRequest.getRoomId(); + chat.senderId = chatSendRequest.getSenderId(); + chat.receiverId = chatSendRequest.getReceiverId(); chat.sendTime = new Date(); chat.isRead = false; return chat; @@ -47,4 +49,15 @@ public String toString() { ", isRead=" + isRead + '}'; } + + public static String utcToKstConvert(Date sendTime){ + Instant utcInstant = sendTime.toInstant(); + + // KST (UTC+9)로 변환 + ZonedDateTime kstTime = utcInstant.atZone(ZoneId.of("Asia/Seoul")); + + // "YYYY-MM-DD HH:MM" 형식으로 출력 + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); + return kstTime.format(formatter); + } } \ 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 caf5f2aa..b8e7e57a 100644 --- a/src/main/java/com/example/api/domain/ChatRoom.java +++ b/src/main/java/com/example/api/domain/ChatRoom.java @@ -11,7 +11,6 @@ @Entity @Getter -@EqualsAndHashCode @Table(name = "CHAT_ROOM") @NoArgsConstructor public class ChatRoom { diff --git a/src/main/java/com/example/api/domain/OfferEmployment.java b/src/main/java/com/example/api/domain/OfferEmployment.java index 4ef854ce..5ed9a397 100644 --- a/src/main/java/com/example/api/domain/OfferEmployment.java +++ b/src/main/java/com/example/api/domain/OfferEmployment.java @@ -10,7 +10,6 @@ @Entity @Getter -@EqualsAndHashCode @Table(name = "OFFER_EMPLOYMENT") @NoArgsConstructor public class OfferEmployment { 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 7d9803c8..5e1a49e3 100644 --- a/src/main/java/com/example/api/global/config/SecurityConfig.java +++ b/src/main/java/com/example/api/global/config/SecurityConfig.java @@ -83,7 +83,7 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http, JwtTokenProvid @Bean public CorsConfigurationSource corsConfigurationSource() { CorsConfiguration corsConfiguration = new CorsConfiguration(); - corsConfiguration.setAllowedOrigins(List.of("http://localhost:3000", "http://localhost:8080", "https://www.danpat.store", "http://127.0.0.1:5500", "https://jiangxy.github.io/websocket-debug-tool/")); + corsConfiguration.setAllowedOrigins(List.of("http://localhost:3000", "http://localhost:8080", "https://www.danpat.store", "http://127.0.0.1:5500", "https://jiangxy.github.io")); corsConfiguration.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE", "OPTIONS")); corsConfiguration.setAllowedHeaders(Arrays.asList("Authorization", "Content-Type")); corsConfiguration.setAllowCredentials(true); diff --git a/src/main/java/com/example/api/global/config/filter/JwtAuthenticationFilter.java b/src/main/java/com/example/api/global/config/filter/JwtAuthenticationFilter.java index c5b65140..57e166a9 100644 --- a/src/main/java/com/example/api/global/config/filter/JwtAuthenticationFilter.java +++ b/src/main/java/com/example/api/global/config/filter/JwtAuthenticationFilter.java @@ -37,8 +37,6 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse } Authentication authentication = jwtAuthenticationProvider.authenticate(new JwtAuthenticationToken(accessToken)); - - log.info("authentication : {}", authentication); SecurityContextHolder.getContext().setAuthentication(authentication); } diff --git a/src/main/java/com/example/api/offeremployment/OfferEmploymentService.java b/src/main/java/com/example/api/offeremployment/OfferEmploymentService.java index 975d9f9b..28cc0d70 100644 --- a/src/main/java/com/example/api/offeremployment/OfferEmploymentService.java +++ b/src/main/java/com/example/api/offeremployment/OfferEmploymentService.java @@ -29,9 +29,9 @@ public class OfferEmploymentService { public OfferEmploymentResponse sendOfferEmployment(final OfferEmploymentRequest offerEmploymentRequest) { final OfferEmploymentCommand offerEmploymentCommand = offerEmploymentRequest.toCommand(); final Account employee = accountRepository.findById(offerEmploymentCommand.employeeId()) - .orElseThrow(() -> new IllegalArgumentException("Account not found with ID: " + offerEmploymentCommand.employeeId())); + .orElseThrow(() -> new BusinessException(ErrorCode.NULL_USER)); final Business business = businessRepository.findById(offerEmploymentCommand.businessId()) - .orElseThrow(() -> new IllegalArgumentException("Business not found with ID: " + offerEmploymentCommand.businessId())); + .orElseThrow(() -> new BusinessException(ErrorCode.BUSINESS_DOMAIN_EXCEPTION)); final OfferEmployment offerEmployment = OfferEmployment.fromCommand( offerEmploymentCommand, employee, diff --git a/src/main/resources/application-local.properties b/src/main/resources/application-local.properties index ecdc6d13..5859b1d3 100644 --- a/src/main/resources/application-local.properties +++ b/src/main/resources/application-local.properties @@ -18,6 +18,7 @@ spring.jpa.properties.hibernate.physical_naming_strategy: org.hibernate.boot.mod # Logging (Optional) logging.level.org.hibernate.SQL=DEBUG logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE +logging.level.org.springframework.web.socket=DEBUG 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 diff --git a/src/main/resources/static/swagger.yaml b/src/main/resources/static/swagger.yaml index 0fe39dcd..96ff6924 100644 --- a/src/main/resources/static/swagger.yaml +++ b/src/main/resources/static/swagger.yaml @@ -5,6 +5,7 @@ info: version: 1.0.0 servers: - url: https://www.danpat.store +# - url: http://localhost:8080 security: - JWT_TOKEN: [] paths: @@ -502,7 +503,7 @@ paths: email: "chulsoo@example.com" phoneNumber: "010-1234-5678" birthdate: "yyyy:mm:dd" - callTime: "09:00 ~18:00" + callTime: "09:00 ~ 18:00" location: zipcode: "12345" address: "주소" @@ -1415,19 +1416,20 @@ paths: schema: type: string example: "성공적으로 즐겨찾기를 삭제하였습니다." - /chat/summaries: + /chat/summaries/{userId}: get: tags: - - chat-controller + - ChatController summary: "채팅 미리보기 요약들" description: "채팅 미리보기 요약들" operationId: getChatSummaries parameters: - - name: userIdRequest - in: query + - name: userId + in: path required: true schema: - $ref: "#/components/schemas/UserIdRequest" + type: integer + format: int64 responses: "200": description: OK @@ -1438,17 +1440,19 @@ paths: example: chatSummaries: - roomId: 1 + "lastMessageId": "67ba9a9640cfc70856b32efb", lastMessageContent: "안녕하세요!" - lastMessageTime: "2025-02-01T15:51:55.626Z" + lastMessageTime: "2025-02-23 12:48" numberOfUnreadMessages: 2 - roomId: 2 + "lastMessageId": "67ba9a9640cfc70856b32efb", lastMessageContent: "알바 하실래요?" - lastMessageTime: "2025-02-01T15:51:55.626Z" + lastMessageTime: "2025-02-23 12:48" numberOfUnreadMessages: 2 /chat/room/{roomId}/chats: get: tags: - - chat-controller + - ChatController summary: "채팅방 채팅 내용 불러오기" description: "채팅방 채팅 내용 불러오기" operationId: getMessages @@ -1476,19 +1480,19 @@ paths: items: $ref: "#/components/schemas/Chat" example: - - id: "msg-12345" + - id: "67ba8e75e6b233324dcde1cd" content: "안녕하세요!" - roomId: 0 + roomId: 1 senderId: 1 receiverId: 2 - sendTime: "2025-02-01T15:56:28.378Z" + sendTime: "2025-02-23 11:37" isRead: true - - id: "msg-67890" + - id: "67ba8a7a7a9ed367fa9b120b" content: "네, 반갑습니다!" - roomId: 0 + roomId: 1 senderId: 2 receiverId: 1 - sendTime: "2025-02-01T15:57:00.123Z" + sendTime: "2025-02-23 11:39" isRead: false /api/v1/employer/businesses: get: diff --git a/src/test/java/com/example/api/chat/repository/ChatRepositoryTest.java b/src/test/java/com/example/api/chat/repository/ChatRepositoryTest.java new file mode 100644 index 00000000..504d3dd8 --- /dev/null +++ b/src/test/java/com/example/api/chat/repository/ChatRepositoryTest.java @@ -0,0 +1,26 @@ +package com.example.api.chat.repository; + +import com.example.api.chat.controller.dto.request.ChatSendRequest; +import com.example.api.domain.Chat; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import java.util.Date; + +@SpringBootTest +public class ChatRepositoryTest { + + @Autowired + private ChatRepository chatRepository; + + @Test + public void testSaveChat() { + ChatSendRequest request = new ChatSendRequest(1L, 1L, 2L, "테스트 메시지"); + Chat chat = Chat.from(request); + + // MongoDB에 저장 + chatRepository.save(chat); + + System.out.println("채팅 메시지 저장 완료!"); + } +} diff --git a/src/test/java/com/example/api/contracts/ContractServiceTest.java b/src/test/java/com/example/api/contracts/ContractServiceTest.java index e2c43b3a..84ab51bb 100644 --- a/src/test/java/com/example/api/contracts/ContractServiceTest.java +++ b/src/test/java/com/example/api/contracts/ContractServiceTest.java @@ -6,6 +6,7 @@ import com.example.api.domain.ChatRoom; import com.example.api.domain.Contract; import com.example.api.domain.OfferEmployment; +import com.example.api.domain.ProposalStatus; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -28,17 +29,13 @@ void shouldAcceptSuggestAndCreateChatRoom() { // 요청 수락 final OfferEmployment offerEmployment = loadOffer(acceptSuggestCommand.suggestId()); - offerEmployment.succeeded(); + offerEmployment.setStatus(ProposalStatus.IN_PROGRESS); // 채팅방 생성 createChatRoom(offerEmployment); OfferEmployment findOfferEmployment = offerRepository.findById(1L) .orElseThrow(() -> new AssertionError("요청이 존재하지 않습니다.")); - assertThat(findOfferEmployment.isSuggestSucceeded()) - .as("요청 수락으로 변경") - .isTrue(); - // Assert: 채팅방 생성 여부 검증 assertThat(chatRoomRepository.findById(1L)) .as("채팅방이 존재하지 않음") diff --git a/src/test/java/com/example/api/employer/service/EmployerServiceTest.java b/src/test/java/com/example/api/employer/service/EmployerServiceTest.java index ff3a26a8..a0973623 100644 --- a/src/test/java/com/example/api/employer/service/EmployerServiceTest.java +++ b/src/test/java/com/example/api/employer/service/EmployerServiceTest.java @@ -1,58 +1,58 @@ -package com.example.api.employer.service; - -import com.example.api.domain.Location; -import com.example.api.account.repository.AccountRepository; -import com.example.api.account.repository.LocationRepository; -import com.example.api.business.BusinessRepository; -import com.example.api.domain.Account; -import com.example.api.domain.Business; -import com.example.api.employer.controller.dto.EmployerBusinessesRequest; -import com.example.api.employer.controller.dto.EmployerIdRequest; -import org.assertj.core.api.Assertions; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; - -import java.util.ArrayList; -import java.util.List; - -@SpringBootTest -class EmployerServiceTest { - @Autowired - private EmployerService employerService; - @Autowired - private AccountRepository accountRepository; - @Autowired - private BusinessRepository businessRepository; - @Autowired - private LocationRepository locationRepository; - private List businessesList = new ArrayList<>(); - - @BeforeEach - void setUp() { - Account account = new Account(); - accountRepository.save(account); - Location location1 = new Location("zipcode1", "address1", "detailAddress1"); - Location location2 = new Location("zipcode2", "address2", "detailAddress2"); - Location location3 = new Location("zipcode3", "address3", "detailAddress3"); - locationRepository.save(location1); - locationRepository.save(location2); - locationRepository.save(location3); - Business business1 = new Business(account, "가게명1", location1); - Business business2 = new Business(account, "가게명2", location2); - Business business3 = new Business(account, "가게명3", location3); - businessRepository.save(business1); - businessRepository.save(business2); - businessRepository.save(business3); - businessesList.add(new EmployerBusinessesRequest(business1.getBusinessName(), business1.getLocation())); - businessesList.add(new EmployerBusinessesRequest(business2.getBusinessName(), business2.getLocation())); - businessesList.add(new EmployerBusinessesRequest(business3.getBusinessName(), business3.getLocation())); - } - - @Test - void testGetBusinessesByOwnerId(){ - List employerBusinessList = employerService.getEmployerBusinessList(new EmployerIdRequest(1L)); - Assertions.assertThat(employerBusinessList).isEqualTo(businessesList); - } -} \ No newline at end of file +//package com.example.api.employer.service; +// +//import com.example.api.domain.Location; +//import com.example.api.account.repository.AccountRepository; +//import com.example.api.account.repository.LocationRepository; +//import com.example.api.business.BusinessRepository; +//import com.example.api.domain.Account; +//import com.example.api.domain.Business; +//import com.example.api.employer.controller.dto.EmployerBusinessesRequest; +//import com.example.api.employer.controller.dto.EmployerIdRequest; +//import org.assertj.core.api.Assertions; +//import org.junit.jupiter.api.BeforeEach; +//import org.junit.jupiter.api.Test; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.boot.test.context.SpringBootTest; +// +//import java.util.ArrayList; +//import java.util.List; +// +//@SpringBootTest +//class EmployerServiceTest { +// @Autowired +// private EmployerService employerService; +// @Autowired +// private AccountRepository accountRepository; +// @Autowired +// private BusinessRepository businessRepository; +// @Autowired +// private LocationRepository locationRepository; +// private List businessesList = new ArrayList<>(); +// +//// @BeforeEach +//// void setUp() { +//// Account account = new Account(); +//// accountRepository.save(account); +//// Location location1 = new Location("zipcode1", "address1", "detailAddress1"); +//// Location location2 = new Location("zipcode2", "address2", "detailAddress2"); +//// Location location3 = new Location("zipcode3", "address3", "detailAddress3"); +//// locationRepository.save(location1); +//// locationRepository.save(location2); +//// locationRepository.save(location3); +//// Business business1 = new Business(account, "가게명1", location1); +//// Business business2 = new Business(account, "가게명2", location2); +//// Business business3 = new Business(account, "가게명3", location3); +//// businessRepository.save(business1); +//// businessRepository.save(business2); +//// businessRepository.save(business3); +//// businessesList.add(new EmployerBusinessesRequest(business1.getBusinessName(), business1.getLocation())); +//// businessesList.add(new EmployerBusinessesRequest(business2.getBusinessName(), business2.getLocation())); +//// businessesList.add(new EmployerBusinessesRequest(business3.getBusinessName(), business3.getLocation())); +// } +// +// @Test +// void testGetBusinessesByOwnerId(){ +// List employerBusinessList = employerService.getEmployerBusinessList(new EmployerIdRequest(1L)); +// Assertions.assertThat(employerBusinessList).isEqualTo(businessesList); +// } +//} \ No newline at end of file From 763eda411479abeb111e69a42921573ab45bcb54 Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Sun, 23 Feb 2025 15:15:38 +0900 Subject: [PATCH 271/276] =?UTF-8?q?chat=20summary=20null=20Object=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/api/chat/dto/ChatSummary.java | 8 +++++++- .../repository/CustomChatRepositoryImpl.java | 4 ++-- .../example/api/chat/service/ChatService.java | 16 ++++++++++++++-- src/main/resources/static/swagger.yaml | 4 ++-- 4 files changed, 25 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/example/api/chat/dto/ChatSummary.java b/src/main/java/com/example/api/chat/dto/ChatSummary.java index d144ee40..54254a57 100644 --- a/src/main/java/com/example/api/chat/dto/ChatSummary.java +++ b/src/main/java/com/example/api/chat/dto/ChatSummary.java @@ -1,6 +1,12 @@ package com.example.api.chat.dto; +import org.jetbrains.annotations.Nullable; + import java.util.Date; -public record ChatSummary(Long roomId, String lastMessageId, String lastMessageContent, String lastMessageTime, Long numberOfUnreadMessages) { +public record ChatSummary(Long roomId, + @Nullable String lastMessageId, + @Nullable String lastMessageContent, + @Nullable String lastMessageTime, + Long numberOfUnreadMessages) { } diff --git a/src/main/java/com/example/api/chat/repository/CustomChatRepositoryImpl.java b/src/main/java/com/example/api/chat/repository/CustomChatRepositoryImpl.java index b162f573..12fe0ac1 100644 --- a/src/main/java/com/example/api/chat/repository/CustomChatRepositoryImpl.java +++ b/src/main/java/com/example/api/chat/repository/CustomChatRepositoryImpl.java @@ -38,13 +38,13 @@ public List findChats(Long chatRoomID, String lastChatId) { ).with(Sort.by(Sort.Direction.DESC, "_id")).limit(100); if (lastChatId != null) { - query.addCriteria(Criteria.where("_id").lt(new ObjectId(lastChatId))); + query.addCriteria(Criteria.where("_id").lte(new ObjectId(lastChatId))); } return mongoTemplate.find(query, Chat.class); } - + @Override public List aggregateChatSummaries(List roomIds, Long memberId) { diff --git a/src/main/java/com/example/api/chat/service/ChatService.java b/src/main/java/com/example/api/chat/service/ChatService.java index 4d8db6f0..6b595cc2 100644 --- a/src/main/java/com/example/api/chat/service/ChatService.java +++ b/src/main/java/com/example/api/chat/service/ChatService.java @@ -21,6 +21,9 @@ import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; import static com.example.api.domain.Chat.utcToKstConvert; import static java.util.stream.Collectors.toList; @@ -58,7 +61,16 @@ public ChatSummaryResponse getChatSummaries(final UserIdRequest requestUserId) { List chatRooms = chatRoomRepository.findByUserId(requestUserId.userId()); List chatRoomIds = chatRooms.stream().map(ChatRoom::getChatRoomId).toList(); List chatSummaries = chatRepository.aggregateChatSummaries(chatRoomIds, requestUserId.userId()); - return new ChatSummaryResponse(chatSummaries); + + // 3️⃣ `chatSummaries`를 `roomId` 기준으로 Map으로 변환 (빠른 조회용) + Map chatSummaryMap = chatSummaries.stream() + .collect(Collectors.toMap(ChatSummary::roomId, Function.identity(), (existing, replacement) -> existing)); + + List completedSummaries = chatRoomIds.stream() + .map(roomId -> chatSummaryMap.getOrDefault(roomId, new ChatSummary(roomId, null, null, null, 0L))) + .collect(Collectors.toList()); + + return new ChatSummaryResponse(completedSummaries); } @Transactional(readOnly = true) @@ -78,4 +90,4 @@ public List getChats(Long chatRoomId, String lastChatId) { public List getChatRooms(Long userId) { return chatRoomRepository.findByUserId(userId); } -} \ No newline at end of file +} diff --git a/src/main/resources/static/swagger.yaml b/src/main/resources/static/swagger.yaml index 96ff6924..bcc5d4de 100644 --- a/src/main/resources/static/swagger.yaml +++ b/src/main/resources/static/swagger.yaml @@ -1440,12 +1440,12 @@ paths: example: chatSummaries: - roomId: 1 - "lastMessageId": "67ba9a9640cfc70856b32efb", + lastMessageId: "67ba9a9640cfc70856b32efb" lastMessageContent: "안녕하세요!" lastMessageTime: "2025-02-23 12:48" numberOfUnreadMessages: 2 - roomId: 2 - "lastMessageId": "67ba9a9640cfc70856b32efb", + lastMessageId: "67ba9a9640cfc70856b32efb" lastMessageContent: "알바 하실래요?" lastMessageTime: "2025-02-23 12:48" numberOfUnreadMessages: 2 From 7c9806d60fd22b860ebc0d2005ac6840768dec2b Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Sun, 23 Feb 2025 21:24:42 +0900 Subject: [PATCH 272/276] =?UTF-8?q?#108=20=EA=B3=B5=EC=A7=80=20=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=95=20=EC=BF=BC=EB=A6=AC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../announcement/AnnouncementRepository.java | 6 +++++- .../api/announcement/AnnouncementService.java | 21 +++++++++++++------ .../controller/AnnouncementController.java | 13 +++++++----- .../announcement/dto/PageNumberRequest.java | 4 ++++ .../api/chat/controller/ChatController.java | 2 +- src/main/resources/static/swagger.yaml | 19 ++++++++++++++--- .../AnnouncementControllerTest.java | 10 ++++++--- .../announcement/AnnouncementServiceTest.java | 12 ++++++++--- 8 files changed, 65 insertions(+), 22 deletions(-) create mode 100644 src/main/java/com/example/api/announcement/dto/PageNumberRequest.java diff --git a/src/main/java/com/example/api/announcement/AnnouncementRepository.java b/src/main/java/com/example/api/announcement/AnnouncementRepository.java index 4d899a31..7170b62a 100644 --- a/src/main/java/com/example/api/announcement/AnnouncementRepository.java +++ b/src/main/java/com/example/api/announcement/AnnouncementRepository.java @@ -1,6 +1,8 @@ package com.example.api.announcement; import com.example.api.domain.Announcement; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @@ -8,5 +10,7 @@ @Repository public interface AnnouncementRepository extends JpaRepository { - List findByAnnouncementTitleContaining(final String keyword); + Page findByAnnouncementTitleContaining(final String keyword, final Pageable pageable); + + Page findAllByOrderByCreatedDateDesc(final Pageable pageable); } diff --git a/src/main/java/com/example/api/announcement/AnnouncementService.java b/src/main/java/com/example/api/announcement/AnnouncementService.java index 05fc357e..bc79a838 100644 --- a/src/main/java/com/example/api/announcement/AnnouncementService.java +++ b/src/main/java/com/example/api/announcement/AnnouncementService.java @@ -2,9 +2,14 @@ import com.example.api.announcement.dto.AnnouncementCommand; import com.example.api.announcement.dto.AnnouncementResponse; +import com.example.api.announcement.dto.PageNumberRequest; import com.example.api.domain.Announcement; import jakarta.transaction.Transactional; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import java.util.List; @@ -28,9 +33,11 @@ public AnnouncementResponse createAnnouncement( } @Transactional - public List getAllAnnouncements() { - final List announcements = announcementRepository.findAll(); - return announcements.stream() + public List getAllAnnouncements(final PageNumberRequest pageRequest) { + + Pageable pageable = PageRequest.of(pageRequest.page()-1, 20, Sort.by("createdDate").descending()); + Page announcements = announcementRepository.findAllByOrderByCreatedDateDesc(pageable); + return announcements.getContent().stream() .map(AnnouncementResponse::new) .collect(Collectors.toList()); } @@ -66,10 +73,12 @@ public void deleteAnnouncement( @Transactional public List searchAnnouncements( - @Validated final String keyword + @Validated final String keyword, + final PageNumberRequest pageRequest ) { - final List announcements = announcementRepository.findByAnnouncementTitleContaining(keyword); - return announcements.stream() + Pageable pageable = PageRequest.of(pageRequest.page()-1, 20, Sort.by("createdDate").descending()); + final Page announcements = announcementRepository.findByAnnouncementTitleContaining(keyword, pageable); + return announcements.getContent().stream() .map(AnnouncementResponse::new) .collect(Collectors.toList()); } diff --git a/src/main/java/com/example/api/announcement/controller/AnnouncementController.java b/src/main/java/com/example/api/announcement/controller/AnnouncementController.java index 4f652856..2876b738 100644 --- a/src/main/java/com/example/api/announcement/controller/AnnouncementController.java +++ b/src/main/java/com/example/api/announcement/controller/AnnouncementController.java @@ -4,6 +4,7 @@ import com.example.api.announcement.dto.AnnouncementCommand; import com.example.api.announcement.dto.AnnouncementRequest; import com.example.api.announcement.dto.AnnouncementResponse; +import com.example.api.announcement.dto.PageNumberRequest; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -26,8 +27,9 @@ public ResponseEntity createAnnouncement( } @GetMapping - public ResponseEntity> getAnnouncements() { - final List responses = announcementService.getAllAnnouncements(); + public ResponseEntity> getAnnouncements( + @RequestParam(required = false, defaultValue = "1") final Integer page) { + final List responses = announcementService.getAllAnnouncements(new PageNumberRequest(page)); return ResponseEntity.ok(responses); } @@ -60,9 +62,10 @@ public ResponseEntity deleteAnnouncement( @GetMapping("/search") public ResponseEntity> searchAnnouncements( - @RequestParam(required = true) final String keyword + @RequestParam(required = true) final String keyword, + @RequestParam(required = false, defaultValue = "1") final Integer page ) { - final List responses = announcementService.searchAnnouncements(keyword); + final List responses = announcementService.searchAnnouncements(keyword, new PageNumberRequest(page)); return ResponseEntity.ok(responses); } -} +} \ No newline at end of file diff --git a/src/main/java/com/example/api/announcement/dto/PageNumberRequest.java b/src/main/java/com/example/api/announcement/dto/PageNumberRequest.java new file mode 100644 index 00000000..e33b6a87 --- /dev/null +++ b/src/main/java/com/example/api/announcement/dto/PageNumberRequest.java @@ -0,0 +1,4 @@ +package com.example.api.announcement.dto; + +public record PageNumberRequest(Integer page) { +} diff --git a/src/main/java/com/example/api/chat/controller/ChatController.java b/src/main/java/com/example/api/chat/controller/ChatController.java index 556420c2..7b3cc228 100644 --- a/src/main/java/com/example/api/chat/controller/ChatController.java +++ b/src/main/java/com/example/api/chat/controller/ChatController.java @@ -33,7 +33,7 @@ public void readMessage(@Payload final ReadRequest readRequest) { } @GetMapping("/chat/summaries/{userId}") - public ResponseEntity getChatSummaries(final @PathVariable Long userId) { + public ResponseEntity getChatSummaries(@PathVariable final Long userId) { return ResponseEntity.ok(chatService.getChatSummaries(new UserIdRequest(userId))); } diff --git a/src/main/resources/static/swagger.yaml b/src/main/resources/static/swagger.yaml index bcc5d4de..ed6cb63e 100644 --- a/src/main/resources/static/swagger.yaml +++ b/src/main/resources/static/swagger.yaml @@ -4,8 +4,8 @@ info: description: 단팥 백엔드 API 명세서입니다. version: 1.0.0 servers: - - url: https://www.danpat.store -# - url: http://localhost:8080 +# - url: https://www.danpat.store + - url: http://localhost:8080 security: - JWT_TOKEN: [] paths: @@ -1167,6 +1167,13 @@ paths: tags: - announcement-controller operationId: getAnnouncements + parameters: + - name: page + in: query + required: false + schema: + type: integer + example: 1 responses: "200": description: OK @@ -1576,7 +1583,13 @@ paths: required: true schema: type: string - example: "점검" + example: "긴급" + - name: page + in: query + required: false + schema: + type: integer + example: 1 responses: "200": description: OK diff --git a/src/test/java/com/example/api/announcement/AnnouncementControllerTest.java b/src/test/java/com/example/api/announcement/AnnouncementControllerTest.java index ce937219..0d61405d 100644 --- a/src/test/java/com/example/api/announcement/AnnouncementControllerTest.java +++ b/src/test/java/com/example/api/announcement/AnnouncementControllerTest.java @@ -3,11 +3,15 @@ import com.example.api.announcement.controller.AnnouncementController; import com.example.api.announcement.dto.AnnouncementRequest; import com.example.api.announcement.dto.AnnouncementResponse; +import com.example.api.announcement.dto.PageNumberRequest; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; import org.springframework.http.ResponseEntity; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; @@ -41,11 +45,11 @@ void createAnnouncement_success() { @Test void getAnnouncements_success() { final AnnouncementResponse response = createMockResponse(); - when(announcementService.getAllAnnouncements()) + when(announcementService.getAllAnnouncements(new PageNumberRequest(1))) .thenReturn(List.of(response)); - ResponseEntity> result = announcementController.getAnnouncements(); + ResponseEntity> result = announcementController.getAnnouncements(1); assertGetAnnouncementsResponse(result); - verify(announcementService, times(1)).getAllAnnouncements(); + verify(announcementService, times(1)).getAllAnnouncements(new PageNumberRequest(1)); } private AnnouncementRequest createMockRequest() { diff --git a/src/test/java/com/example/api/announcement/AnnouncementServiceTest.java b/src/test/java/com/example/api/announcement/AnnouncementServiceTest.java index d9c078ae..4666ff1a 100644 --- a/src/test/java/com/example/api/announcement/AnnouncementServiceTest.java +++ b/src/test/java/com/example/api/announcement/AnnouncementServiceTest.java @@ -2,12 +2,17 @@ import com.example.api.announcement.dto.AnnouncementCommand; import com.example.api.announcement.dto.AnnouncementResponse; +import com.example.api.announcement.dto.PageNumberRequest; import com.example.api.domain.Announcement; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; + import java.util.List; import java.util.Optional; import static org.assertj.core.api.Assertions.assertThat; @@ -54,11 +59,12 @@ void getAnnouncement_notFound() { void searchAnnouncements_success() { final String keyword = "공지"; final Announcement announcement = createMockAnnouncementWithTitle(keyword); - when(announcementRepository.findByAnnouncementTitleContaining(keyword)) + Pageable pageable = PageRequest.of(0, 20, Sort.by("createDate")); + when(announcementRepository.findByAnnouncementTitleContaining(keyword, pageable).getContent()) .thenReturn(List.of(announcement)); - List responses = announcementService.searchAnnouncements(keyword); + List responses = announcementService.searchAnnouncements(keyword, new PageNumberRequest(1)); assertSearchAnnouncementResponses(responses); - verify(announcementRepository, times(1)).findByAnnouncementTitleContaining(keyword); + verify(announcementRepository, times(1)).findByAnnouncementTitleContaining(keyword, pageable); } private AnnouncementCommand createMockCommand() { From efa00d6a4b427ffdc4e5ac2b9b4e3b5dd2427067 Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Sun, 23 Feb 2025 22:46:20 +0900 Subject: [PATCH 273/276] =?UTF-8?q?swagger=20file=20=EC=84=A4=EB=AA=85=20?= =?UTF-8?q?=EB=B3=B4=EC=B6=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ContractReviewController.java | 3 +- .../search/controller/SearchController.java | 3 +- src/main/resources/static/swagger.yaml | 28 ++++++++++++++----- 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/example/api/contracts/controller/ContractReviewController.java b/src/main/java/com/example/api/contracts/controller/ContractReviewController.java index 8a1f58f0..d123a74a 100644 --- a/src/main/java/com/example/api/contracts/controller/ContractReviewController.java +++ b/src/main/java/com/example/api/contracts/controller/ContractReviewController.java @@ -25,7 +25,6 @@ public class ContractReviewController { private final ContractReviewService contractReviewService; private final ReviewQueryService reviewQueryService; - /** * @param requestMemberId 고용자 ( employer ID ) 가 본인이 작성한 리뷰 목록 가져오기 * @return @@ -59,4 +58,4 @@ AddReviewCommand toCommand(final Long requestMemberId) { return new AddReviewCommand(requestMemberId, contractId, reviewContent, reviewScore); } } -} +} \ No newline at end of file diff --git a/src/main/java/com/example/api/search/controller/SearchController.java b/src/main/java/com/example/api/search/controller/SearchController.java index b8d56791..3bb5eeb3 100644 --- a/src/main/java/com/example/api/search/controller/SearchController.java +++ b/src/main/java/com/example/api/search/controller/SearchController.java @@ -28,5 +28,4 @@ public ResponseEntity> searchAccounts( final List results = searchService.searchAccounts(command); return ResponseEntity.ok(results); } -} - +} \ No newline at end of file diff --git a/src/main/resources/static/swagger.yaml b/src/main/resources/static/swagger.yaml index ed6cb63e..100082ce 100644 --- a/src/main/resources/static/swagger.yaml +++ b/src/main/resources/static/swagger.yaml @@ -867,6 +867,7 @@ paths: get: tags: - announcement-controller + summary: "공지사항 세부 조회" operationId: getAnnouncement parameters: - name: announcementId @@ -894,6 +895,7 @@ paths: tags: - announcement-controller operationId: updateAnnouncement + summary: "공지사항 업데이트" parameters: - name: announcementId in: path @@ -927,6 +929,7 @@ paths: delete: tags: - announcement-controller + summary: "공지사항 삭제" operationId: deleteAnnouncement parameters: - name: announcementId @@ -1138,7 +1141,8 @@ paths: /api/v1/support/inquiry: post: tags: - - inquiry-controller + - InquiryController + summary: "문의사항 작성" operationId: createInquiry requestBody: content: @@ -1166,6 +1170,7 @@ paths: get: tags: - announcement-controller + summary: "공지사항 리스트 조회(20개씩 조회)" operationId: getAnnouncements parameters: - name: page @@ -1197,6 +1202,7 @@ paths: post: tags: - announcement-controller + summary: "공지사항 작성" operationId: createAnnouncement requestBody: content: @@ -1225,6 +1231,7 @@ paths: post: tags: - ReviewReportController + summary: "리뷰 신고하기" operationId: reportReview parameters: - name: reviewId @@ -1297,7 +1304,8 @@ paths: /api/search/search: post: tags: - - search-controller + - SearchController + summary: "근무 가능 알바생 조회(알바 공고 검색)" operationId: searchAccounts requestBody: content: @@ -1537,7 +1545,8 @@ paths: /api/v1/support/my-inquiries: get: tags: - - inquiry-controller + - InquiryController + summary: "나의 문의사항 조회" operationId: getMyInquiries parameters: - name: accountId @@ -1576,6 +1585,7 @@ paths: get: tags: - announcement-controller + summary: "특정 키워드로 공지사항 검색(제목)" operationId: searchAnnouncements parameters: - name: keyword @@ -1608,8 +1618,9 @@ paths: /api/v1/review: get: tags: - - review-controller + - ReviewController operationId: getAllReviews + summary: "알바 후기 전체 조회" responses: "200": description: OK @@ -1637,8 +1648,9 @@ paths: /api/v1/review/{reviewId}: get: tags: - - review-controller + - ReviewController operationId: getReviewsByEmployee + summary: "특정 알바 후기 조회" parameters: [ ] responses: "200": @@ -1660,7 +1672,8 @@ paths: /api/v1/review/my/reviews: get: tags: - - review-controller + - ReviewController + summary: "나를 대상으로 작성된 리뷰 보기" operationId: getMyReviews parameters: - name: accountId @@ -1696,7 +1709,8 @@ paths: /api/v1/review/available: get: tags: - - review-controller + - ReviewController + summary: "작성할 수 있는 리뷰 목록 보기" operationId: getAvailableReviewTargets parameters: - name: businessId From edaed35adf8e9bace809ba84c73307c7a243684d Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Tue, 25 Feb 2025 20:31:48 +0900 Subject: [PATCH 274/276] review dynamic query change --- .../account/repository/AccountRepository.java | 2 + .../api/business/BusinessRepository.java | 2 + .../api/contracts/ContractRepository.java | 21 ++-- .../api/contracts/ContractReviewService.java | 9 +- .../api/contracts/ReviewQueryService.java | 23 +++-- .../controller/ContractReviewController.java | 22 +++-- .../api/contracts/dto/AddReviewCommand.java | 2 + .../example/api/domain/FlavoredCategory.java | 2 +- .../java/com/example/api/domain/Location.java | 2 - .../java/com/example/api/domain/Review.java | 7 +- .../api/global/exception/ErrorCode.java | 3 +- .../review/controller/ReviewController.java | 42 ++++---- .../api/review/dto/ReviewResponse.java | 10 +- .../repository/ReviewCustomRepository.java | 9 ++ .../ReviewCustomRepositoryImpl.java | 75 +++++++++++++++ .../review/repository/ReviewRepository.java | 19 ++-- .../api/review/service/ReviewService.java | 85 ++++++---------- .../search/controller/SearchController.java | 2 +- .../resources/application-local.properties | 9 +- .../resources/application-prod.properties | 6 +- src/main/resources/static/swagger.yaml | 96 ++++++++++++++++--- .../service/ContractReviewServiceTest.java | 15 +-- 22 files changed, 314 insertions(+), 149 deletions(-) create mode 100644 src/main/java/com/example/api/review/repository/ReviewCustomRepository.java create mode 100644 src/main/java/com/example/api/review/repository/ReviewCustomRepositoryImpl.java diff --git a/src/main/java/com/example/api/account/repository/AccountRepository.java b/src/main/java/com/example/api/account/repository/AccountRepository.java index 290f8e07..1872856b 100644 --- a/src/main/java/com/example/api/account/repository/AccountRepository.java +++ b/src/main/java/com/example/api/account/repository/AccountRepository.java @@ -43,4 +43,6 @@ public interface AccountRepository extends JpaRepository { @Query("select new com.example.api.setting.dto.EmailConsentResponse(a.emailReceivable) from Account a where a.accountId = :userId") Optional findEmailReceivableById(@Param("userId") Long userId); + + Optional findByAccountId(Long accountId); } \ No newline at end of file diff --git a/src/main/java/com/example/api/business/BusinessRepository.java b/src/main/java/com/example/api/business/BusinessRepository.java index e776a7dd..90a7fb50 100644 --- a/src/main/java/com/example/api/business/BusinessRepository.java +++ b/src/main/java/com/example/api/business/BusinessRepository.java @@ -19,4 +19,6 @@ public interface BusinessRepository extends JpaRepository { @Query("select new com.example.api.employer.controller.dto.EmployerBusinessesRequest(b.businessId, b.businessName, b.location) from Business b where b.employer.accountId = :employerId order by b.location.id") List findBusinessesByEmployerId(@Param("employerId")final Long employerId); + + Optional findByBusinessId(Long businessId); } \ No newline at end of file diff --git a/src/main/java/com/example/api/contracts/ContractRepository.java b/src/main/java/com/example/api/contracts/ContractRepository.java index 7092eab0..1b24765c 100644 --- a/src/main/java/com/example/api/contracts/ContractRepository.java +++ b/src/main/java/com/example/api/contracts/ContractRepository.java @@ -12,6 +12,8 @@ import com.example.api.domain.PossibleBoard; import com.example.api.review.dto.ReviewAvailableResponse; import com.example.api.suggest.controller.dto.request.OfferEmploymentDetailRequest; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; @@ -41,15 +43,6 @@ public interface ContractRepository extends JpaRepository { @Query("SELECT c FROM Contract c JOIN FETCH c.offerEmployment JOIN FETCH c.offerEmployment.business.employer WHERE c.contractId = :contractId") Optional loadContractWithOfferEmployment(@Param("contractId") final Long contractId); - @Query("select new com.example.api.review.dto." + - "ReviewAvailableResponse(e.accountId, e.name) " + - "from Contract c " + - "join c.offerEmployment oe " + - "join oe.employee e " + - "join oe.business b " + - "where b.businessId = :businessId and oe.status = 'TERMINATED'") - List findAvailableReviewsByBusinessId(@Param("businessId") Long businessId); - @Query("select new com.example.api.suggest.controller.dto.request.OfferEmploymentDetailRequest(e.name, b.businessName, oe.status, c.contractHourlyPay, c.contractStartTime, c.contractEndTime, cr.chatRoomId) " + "from Contract c " + "join c.offerEmployment oe " + @@ -65,4 +58,14 @@ public interface ContractRepository extends JpaRepository { "Join oe.business b on oe.business.businessId = b.businessId " + "where oe.employee.accountId = :employeeId and c.contractStartTime >= :currentMonth") List findScheduleFromCurrentMonth(@Param("employeeId")Long employeeId, @Param("currentMonth") LocalDateTime currentMonth); + + @Query("select new com.example.api.review.dto." + + "ReviewAvailableResponse(e.accountId, e.name) " + + "from Contract c " + + "join c.offerEmployment oe " + + "join oe.employee e " + + "join oe.business b " + + "where b.businessId = :businessId and oe.status = 'TERMINATED' " + + "and c.contractId not in (select r.contract.contractId from Review r)") + Page findAvailableReviewsByBusinessId(@Param("businessId") Long businessId, Pageable pageable); } diff --git a/src/main/java/com/example/api/contracts/ContractReviewService.java b/src/main/java/com/example/api/contracts/ContractReviewService.java index 31979af3..a66a80de 100644 --- a/src/main/java/com/example/api/contracts/ContractReviewService.java +++ b/src/main/java/com/example/api/contracts/ContractReviewService.java @@ -1,6 +1,9 @@ package com.example.api.contracts; +import com.example.api.account.repository.AccountRepository; +import com.example.api.business.BusinessRepository; import com.example.api.contracts.dto.AddReviewCommand; +import com.example.api.domain.Account; import com.example.api.domain.Business; import com.example.api.domain.Contract; import com.example.api.domain.Review; @@ -17,13 +20,17 @@ public class ContractReviewService { private final ContractRepository contractRepository; private final ReviewRepository reviewRepository; + private final BusinessRepository businessRepository; + private final AccountRepository accountRepository; @Transactional public void saveReview(@Validated final AddReviewCommand command) { final Contract contract = contractRepository.loadContractWithOfferEmployment(command.contractId()) .orElseThrow(); validateContractOwner(command.requestMemberId(), contract.getOfferEmployment().getBusiness()); - final Review review = new Review(command.reviewScore(), command.reviewContent(), contract); + Business business = businessRepository.findByBusinessId(command.businessId()).orElseThrow(() -> new BusinessException("해당 비즈니스를 찾을 수 없습니다.", ErrorCode.BUSINESS_DOMAIN_EXCEPTION)); + Account employee = accountRepository.findByAccountId(command.employeeId()).orElseThrow(() -> new BusinessException(ErrorCode.NULL_USER)); + final Review review = new Review(business, employee, command.reviewScore(), command.reviewContent(), contract); reviewRepository.save(review); } diff --git a/src/main/java/com/example/api/contracts/ReviewQueryService.java b/src/main/java/com/example/api/contracts/ReviewQueryService.java index 13620f54..72284b8a 100644 --- a/src/main/java/com/example/api/contracts/ReviewQueryService.java +++ b/src/main/java/com/example/api/contracts/ReviewQueryService.java @@ -1,12 +1,15 @@ package com.example.api.contracts; +import com.example.api.announcement.dto.PageNumberRequest; import com.example.api.contracts.dto.QueryEmployersReviewCommand; -import com.example.api.contracts.dto.ReviewResponse; -import com.example.api.domain.Review; import java.util.List; +import com.example.api.review.dto.ReviewResponse; import com.example.api.review.repository.ReviewRepository; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -16,14 +19,14 @@ public class ReviewQueryService { private final ReviewRepository reviewRepository; @Transactional(readOnly = true) - public List loadReviewsWithEmployerId(final QueryEmployersReviewCommand command) { - final List reviews = reviewRepository.loadReviewsByEmployerId(command.employerId()); - return reviews.stream() - .map(review -> new ReviewResponse( - review.getReviewId(), - review.getContract().getContractId(), - review.getReviewContent(), - review.getReviewStarPoint())) + public List loadReviewsWithEmployerId( + final QueryEmployersReviewCommand command, + final PageNumberRequest pageNumberRequest + ) { + Pageable pageable = PageRequest.of(pageNumberRequest.page()-1, 15, Sort.by("createdDate").descending()); + return reviewRepository.loadReviewsByEmployerId(command.employerId(), pageable).getContent() + .stream() + .map(ReviewResponse::from) .toList(); } } diff --git a/src/main/java/com/example/api/contracts/controller/ContractReviewController.java b/src/main/java/com/example/api/contracts/controller/ContractReviewController.java index d123a74a..46c7ddb4 100644 --- a/src/main/java/com/example/api/contracts/controller/ContractReviewController.java +++ b/src/main/java/com/example/api/contracts/controller/ContractReviewController.java @@ -1,10 +1,11 @@ package com.example.api.contracts.controller; +import com.example.api.announcement.dto.PageNumberRequest; import com.example.api.contracts.ReviewQueryService; import com.example.api.contracts.ContractReviewService; import com.example.api.contracts.dto.AddReviewCommand; import com.example.api.contracts.dto.QueryEmployersReviewCommand; -import com.example.api.contracts.dto.ReviewResponse; +import com.example.api.review.dto.ReviewResponse; import jakarta.validation.Valid; import jakarta.validation.constraints.NotNull; import java.util.List; @@ -12,11 +13,7 @@ import org.hibernate.validator.constraints.Range; import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; @RestController @RequiredArgsConstructor @@ -29,12 +26,13 @@ public class ContractReviewController { * @param requestMemberId 고용자 ( employer ID ) 가 본인이 작성한 리뷰 목록 가져오기 * @return */ - @GetMapping("/review/my") + @GetMapping("/review/my/employer") public ResponseEntity> getMyReview( - @AuthenticationPrincipal final Long requestMemberId + @AuthenticationPrincipal final Long requestMemberId, + @RequestParam final Integer page ) { final QueryEmployersReviewCommand command = new QueryEmployersReviewCommand(requestMemberId); - return ResponseEntity.ok(reviewQueryService.loadReviewsWithEmployerId(command)); + return ResponseEntity.ok(reviewQueryService.loadReviewsWithEmployerId(command, new PageNumberRequest(page))); } @PostMapping("/review") @@ -50,12 +48,16 @@ public ResponseEntity addReview( record AddReviewRequest( @NotNull Long contractId, + @NotNull + Long businessId, + @NotNull + Long employeeId, @Range(min = 0, max = 5) Integer reviewScore, String reviewContent ) { AddReviewCommand toCommand(final Long requestMemberId) { - return new AddReviewCommand(requestMemberId, contractId, reviewContent, reviewScore); + return new AddReviewCommand(requestMemberId, businessId, employeeId, contractId, reviewContent, reviewScore); } } } \ No newline at end of file diff --git a/src/main/java/com/example/api/contracts/dto/AddReviewCommand.java b/src/main/java/com/example/api/contracts/dto/AddReviewCommand.java index fbec28cf..9b9c973f 100644 --- a/src/main/java/com/example/api/contracts/dto/AddReviewCommand.java +++ b/src/main/java/com/example/api/contracts/dto/AddReviewCommand.java @@ -2,6 +2,8 @@ public record AddReviewCommand( Long requestMemberId, + Long businessId, + Long employeeId, Long contractId, String reviewContent, Integer reviewScore diff --git a/src/main/java/com/example/api/domain/FlavoredCategory.java b/src/main/java/com/example/api/domain/FlavoredCategory.java index 62bb4476..1c5ebdf2 100644 --- a/src/main/java/com/example/api/domain/FlavoredCategory.java +++ b/src/main/java/com/example/api/domain/FlavoredCategory.java @@ -12,7 +12,7 @@ @EqualsAndHashCode(callSuper = false) @NoArgsConstructor @Table(name = "FLAVORED_CATEGORY", uniqueConstraints = { - @UniqueConstraint(columnNames = {"EMPLOYEE_ID", "CATEGORY_ID"}) + @UniqueConstraint(columnNames = {"EMPLOYEE_ID", "SUB_CATEGORY_ID"}) }) public class FlavoredCategory extends BaseEntity{ @Id diff --git a/src/main/java/com/example/api/domain/Location.java b/src/main/java/com/example/api/domain/Location.java index c04b604b..58d74fe5 100644 --- a/src/main/java/com/example/api/domain/Location.java +++ b/src/main/java/com/example/api/domain/Location.java @@ -11,8 +11,6 @@ @Entity @Getter -@ToString -@EqualsAndHashCode @JsonIgnoreProperties({"createdDate", "updatedDate"}) @Table(name = "LOCATION") public class Location extends BaseEntity { diff --git a/src/main/java/com/example/api/domain/Review.java b/src/main/java/com/example/api/domain/Review.java index d84b5f2e..292ebd52 100644 --- a/src/main/java/com/example/api/domain/Review.java +++ b/src/main/java/com/example/api/domain/Review.java @@ -4,12 +4,13 @@ import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; +import org.checkerframework.checker.units.qual.A; @Entity @Getter @Table(name = "REVIEW") @NoArgsConstructor -@EqualsAndHashCode(callSuper = true) +@EqualsAndHashCode(callSuper = false) public class Review extends BaseEntity { @Id @Column(name ="REVIEW_ID") @@ -33,7 +34,9 @@ public class Review extends BaseEntity { @Column(name = "REVIEW_CONTENT") private String reviewContent; - public Review(int reviewStarPoint, String reviewContent, Contract contract) { + public Review(Business business, Account employee, Integer reviewStarPoint, String reviewContent, Contract contract) { + this.writer = business; + this.employee = employee; this.reviewStarPoint = reviewStarPoint; this.reviewContent = reviewContent; this.contract = contract; diff --git a/src/main/java/com/example/api/global/exception/ErrorCode.java b/src/main/java/com/example/api/global/exception/ErrorCode.java index d2b49e9c..7cce150f 100644 --- a/src/main/java/com/example/api/global/exception/ErrorCode.java +++ b/src/main/java/com/example/api/global/exception/ErrorCode.java @@ -28,7 +28,7 @@ public enum ErrorCode { FAIL_SEND_EMAIL(HttpStatus.INTERNAL_SERVER_ERROR, "-501", "이메일 전송에 실패하였습니다."), FAIL_SAVE_CODE(HttpStatus.INTERNAL_SERVER_ERROR, "-502", "코드 저장에 실패하였습니다."), - + REVIEW_NOT_FOUND_EXCEPTION(HttpStatus.BAD_REQUEST, "-501", "찾을 수 없는 리뷰"), ACCOUNT_NOT_FOUND_EXCEPTION(HttpStatus.BAD_REQUEST, "-101", "찾을 수 없는 계정"), POSSIBLE_TIME_REGISTER_EXCEPTION(HttpStatus.BAD_REQUEST, "-401", "알바 가능 시간 등록 에러"), @@ -36,7 +36,6 @@ public enum ErrorCode { CATEGORY_EXCEPTION(HttpStatus.BAD_REQUEST, "-601", "카테고리 에러"), - BUSINESS_DOMAIN_EXCEPTION(HttpStatus.BAD_REQUEST, "-700", "비즈니스 도메인 에러"), CONTRACT_EXCEPTION(HttpStatus.BAD_REQUEST, "-800", "계약 도메인 에러"), diff --git a/src/main/java/com/example/api/review/controller/ReviewController.java b/src/main/java/com/example/api/review/controller/ReviewController.java index f349203b..a5d141c8 100644 --- a/src/main/java/com/example/api/review/controller/ReviewController.java +++ b/src/main/java/com/example/api/review/controller/ReviewController.java @@ -1,12 +1,15 @@ package com.example.api.review.controller; +import com.example.api.announcement.dto.PageNumberRequest; +import com.example.api.board.dto.request.EmployeeIdRequest; import com.example.api.review.service.ReviewService; -import com.example.api.review.dto.ReviewCommand; import com.example.api.review.dto.ReviewResponse; import com.example.api.review.dto.ReviewAvailableCommand; import com.example.api.review.dto.ReviewAvailableResponse; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.http.ResponseEntity; +import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.*; import java.util.List; @@ -14,38 +17,45 @@ @RestController @RequestMapping("/api/v1/review") @RequiredArgsConstructor +@Slf4j public class ReviewController { private final ReviewService reviewService; @GetMapping // 리뷰 전체 조회 - public ResponseEntity> getAllReviews() { - final List reviews = reviewService.getAllReviews(); + public ResponseEntity> getAllReviews( + @RequestParam(defaultValue = "1", required = false) final Integer page, + @RequestParam(required = false) final String nickname + ) { + log.info("nickname = {}", nickname); + final List reviews = reviewService.getAllReviews(nickname, new PageNumberRequest(page)); return ResponseEntity.ok(reviews); } @GetMapping("/{reviewId}") // 리뷰 상세 조회 - public ResponseEntity> getReviewsByEmployee( - @PathVariable(required = true) Long reivewId + public ResponseEntity getReviewDetail( + @PathVariable final Long reviewId ) { - final List reviews = reviewService.getReviewsByEmployee(reivewId); - return ResponseEntity.ok(reviews); + ReviewResponse result = reviewService.getReviewDetail(reviewId); + return ResponseEntity.ok(result); } - @GetMapping("/my/reviews") + @GetMapping("/my/employee") // 나를 대상으로 작성된 리뷰 보기 public ResponseEntity> getMyReviews( - @RequestParam final Long accountId - ) { - final ReviewCommand reviewCommand = new ReviewCommand(accountId); - final List reviews = reviewService.getReviews(reviewCommand); + @AuthenticationPrincipal final Long accountId, + @RequestParam(defaultValue = "1", required = false) final Integer page + ) { + final List reviews = reviewService.getMyReviews(new EmployeeIdRequest(accountId), new PageNumberRequest(page)); return ResponseEntity.ok(reviews); } - @GetMapping("/available") + @GetMapping("/available") // 작성 가능한 리뷰 조회 public ResponseEntity> getAvailableReviewTargets( - @RequestParam(required = true) Long businessId + @RequestParam(required = true) Long businessId, + @RequestParam(defaultValue = "1", required = false) final Integer page ) { - ReviewAvailableCommand command = new ReviewAvailableCommand(businessId); - List availableEmployees = reviewService.getAvailableReviewTargets(command); + List availableEmployees = reviewService.getAvailableReviewTargets( + new ReviewAvailableCommand(businessId), + new PageNumberRequest(page)); return ResponseEntity.ok(availableEmployees); } } diff --git a/src/main/java/com/example/api/review/dto/ReviewResponse.java b/src/main/java/com/example/api/review/dto/ReviewResponse.java index cf42c2ec..1750963b 100644 --- a/src/main/java/com/example/api/review/dto/ReviewResponse.java +++ b/src/main/java/com/example/api/review/dto/ReviewResponse.java @@ -5,8 +5,10 @@ public record ReviewResponse( Long reviewId, //Id - String businessName, Long businessId, + String businessName, + Long employeeId, + String employeeNickname, LocalDateTime contractStartTime, LocalDateTime contractEndTime, int reviewStarPoint, @@ -15,8 +17,10 @@ public record ReviewResponse( public static ReviewResponse from(final Review review) { return new ReviewResponse( review.getReviewId(), - review.getContract().getOfferEmployment().getBusiness().getBusinessName(), - review.getContract().getOfferEmployment().getBusiness().getBusinessId(), + review.getWriter().getBusinessId(), + review.getWriter().getBusinessName(), + review.getEmployee().getAccountId(), + review.getEmployee().getNickname(), review.getContract().getContractStartTime(), review.getContract().getContractEndTime(), review.getReviewStarPoint(), diff --git a/src/main/java/com/example/api/review/repository/ReviewCustomRepository.java b/src/main/java/com/example/api/review/repository/ReviewCustomRepository.java new file mode 100644 index 00000000..d66a7fdd --- /dev/null +++ b/src/main/java/com/example/api/review/repository/ReviewCustomRepository.java @@ -0,0 +1,9 @@ +package com.example.api.review.repository; + +import com.example.api.review.dto.ReviewResponse; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; + +public interface ReviewCustomRepository { + Page findReviews(String nickname, Pageable pageable); +} diff --git a/src/main/java/com/example/api/review/repository/ReviewCustomRepositoryImpl.java b/src/main/java/com/example/api/review/repository/ReviewCustomRepositoryImpl.java new file mode 100644 index 00000000..7dff6141 --- /dev/null +++ b/src/main/java/com/example/api/review/repository/ReviewCustomRepositoryImpl.java @@ -0,0 +1,75 @@ +package com.example.api.review.repository; + +import com.example.api.domain.QAccount; +import com.example.api.domain.QBusiness; +import com.example.api.domain.QContract; +import com.example.api.domain.QReview; +import com.example.api.review.dto.ReviewResponse; +import com.querydsl.core.BooleanBuilder; +import com.querydsl.core.types.Predicate; +import com.querydsl.core.types.Projections; +import com.querydsl.core.util.StringUtils; +import com.querydsl.jpa.impl.JPAQueryFactory; +import jakarta.persistence.EntityManager; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Optional; + +import static com.querydsl.core.util.StringUtils.isNullOrEmpty; + + +@Repository +public class ReviewCustomRepositoryImpl implements ReviewCustomRepository { + private final JPAQueryFactory queryFactory; + private final QReview review = QReview.review; + private final QContract contract = QContract.contract; + private final QAccount employee = QAccount.account; + private final QBusiness business = QBusiness.business; + + public ReviewCustomRepositoryImpl(EntityManager entityManager) { + this.queryFactory = new JPAQueryFactory(entityManager); + } + + @Override + public Page findReviews(String nickname, Pageable pageable) { + List content = queryFactory + .select(Projections.constructor(ReviewResponse.class, + review.reviewId, + business.businessId, + business.businessName, + employee.accountId, + employee.nickname, + contract.contractStartTime, + contract.contractEndTime, + review.reviewStarPoint, + review.reviewContent + )) + .from(review) + .join(review.contract, contract) + .join(review.employee, employee) + .join(review.writer, business) + .where(nicknameContains(nickname)) + .offset(pageable.getOffset()) + .limit(pageable.getPageSize()) + .fetch(); + + long total = Optional.ofNullable(queryFactory + .select(review.count()) + .from(review) + .join(review.contract, contract) + .join(review.employee, employee) + .join(review.writer, business) + .where(nicknameContains(nickname)) + .fetchOne()).orElse(0L); + + return new PageImpl<>(content, pageable, total); + } + + private Predicate nicknameContains(String nickname) { + return !isNullOrEmpty(nickname) ? employee.nickname.contains(nickname) : null; + } +} \ No newline at end of file diff --git a/src/main/java/com/example/api/review/repository/ReviewRepository.java b/src/main/java/com/example/api/review/repository/ReviewRepository.java index 48576190..53bb82cf 100644 --- a/src/main/java/com/example/api/review/repository/ReviewRepository.java +++ b/src/main/java/com/example/api/review/repository/ReviewRepository.java @@ -1,6 +1,8 @@ package com.example.api.review.repository; import com.example.api.domain.Review; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; @@ -9,25 +11,16 @@ import java.util.List; @Repository -public interface ReviewRepository extends JpaRepository { - - @Query("SELECT r FROM Review r " + - "JOIN FETCH r.contract c " + - "WHERE c.offerEmployment.business.businessId = :employerId") - List loadReviewsByEmployerId(@Param("employerId") Long employerId); - - @Query("SELECT r FROM Review r " + - "WHERE (:reviewId IS NULL OR r.reviewId = :reviewId)") - List findReviewsByDynamicQuery(@Param("reviewId") Long reviewId); +public interface ReviewRepository extends JpaRepository, ReviewCustomRepository { @Query("SELECT r FROM Review r " + "JOIN FETCH r.writer b " + "JOIN FETCH r.employee a " + "JOIN FETCH r.contract c " + - "WHERE a.accountId = :accountId") - List findReviewsByAccountIdWithDetails(@Param("accountId") Long accountId); + "WHERE c.offerEmployment.business.businessId = :employerId") + Page loadReviewsByEmployerId(@Param("employerId") Long employerId, Pageable pageable); - List findReviewsByEmployee_AccountId(Long accountId); + Page findAllByEmployee_AccountId(Long accountId, Pageable pageable); @Query("select r.reviewStarPoint from Review r where r.reviewId = :suggestId") Integer findReviewStarPointBySuggestId(@Param("suggestId") Long suggestId); diff --git a/src/main/java/com/example/api/review/service/ReviewService.java b/src/main/java/com/example/api/review/service/ReviewService.java index 4a3f9f12..f0fbdc5f 100644 --- a/src/main/java/com/example/api/review/service/ReviewService.java +++ b/src/main/java/com/example/api/review/service/ReviewService.java @@ -1,84 +1,61 @@ package com.example.api.review.service; +import com.example.api.announcement.dto.PageNumberRequest; +import com.example.api.board.dto.request.EmployeeIdRequest; import com.example.api.contracts.ContractRepository; +import com.example.api.domain.Review; +import com.example.api.global.exception.BusinessException; +import com.example.api.global.exception.ErrorCode; import com.example.api.review.dto.ReviewResponse; import com.example.api.review.dto.ReviewAvailableCommand; import com.example.api.review.dto.ReviewAvailableResponse; import com.example.api.review.repository.ReviewRepository; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import java.util.List; -import com.example.api.domain.Review; -import com.example.api.review.dto.ReviewCommand; - -import java.time.LocalDateTime; - @Service @RequiredArgsConstructor public class ReviewService { private final ReviewRepository reviewRepository; private final ContractRepository contractRepository; - @Transactional - public List getAllReviews() { - return reviewRepository.findReviewsByDynamicQuery(null) - .stream() - .map(ReviewResponse::from) - .toList(); - } - - @Transactional - public List getReviewsByEmployee(@Validated final Long reviewId) { - return reviewRepository.findReviewsByDynamicQuery(reviewId) - .stream() - .map(ReviewResponse::from) - .toList(); - } - - @Transactional - public List getReviews(@Validated final ReviewCommand reviewCommand) { - final List reviews = reviewRepository.findReviewsByEmployee_AccountId(reviewCommand.accountId()); - return mapToReviewResponses(reviews); + @Transactional(readOnly = true) // 리뷰 전체 조회 + public List getAllReviews(final String nickname, final PageNumberRequest pageNumberRequest) { + Pageable pageable = PageRequest.of(pageNumberRequest.page()-1 , 15, Sort.by("createdDate").descending()); + return reviewRepository.findReviews(nickname, pageable).getContent(); } - @Transactional - public List getReviewsByEmployeeWithDetails(@Validated final ReviewCommand reviewCommand) { - final List reviews = reviewRepository.findReviewsByAccountIdWithDetails(reviewCommand.accountId()); - return mapToReviewResponses(reviews); + @Transactional(readOnly = true) // 리뷰 상세 조회 + public ReviewResponse getReviewDetail( + @Validated final Long reviewId + ) { + Review review = reviewRepository.findById(reviewId).orElseThrow(() -> new BusinessException(ErrorCode.REVIEW_NOT_FOUND_EXCEPTION)); + return ReviewResponse.from(review); } - private List mapToReviewResponses(final List reviews) { - return reviews.stream() - .map(this::mapToReviewResponse) + @Transactional(readOnly = true) // 나를 대상으로 쓰인 리뷰 조회 + public List getMyReviews( + @Validated final EmployeeIdRequest employeeIdRequest, + final PageNumberRequest pageNumberRequest + ) { + Pageable pageable = PageRequest.of(pageNumberRequest.page()-1 , 15, Sort.by("createdDate").descending()); + return reviewRepository.findAllByEmployee_AccountId(employeeIdRequest.employeeId(), pageable).stream() + .map(ReviewResponse::from) .toList(); } - private ReviewResponse mapToReviewResponse(final Review review) { - final String businessName = review.getContract().getOfferEmployment().getBusiness().getBusinessName(); - final Long businessId = review.getContract().getOfferEmployment().getBusiness().getBusinessId(); - final LocalDateTime contractStartTime = review.getContract().getContractStartTime(); - final LocalDateTime contractEndTime = review.getContract().getContractEndTime(); - final int reviewStarPoint = review.getReviewStarPoint(); - final String reviewContent = review.getReviewContent(); - - return new ReviewResponse( - review.getReviewId(), - businessName, - businessId, - contractStartTime, - contractEndTime, - reviewStarPoint, - reviewContent - ); - } - - @Transactional + @Transactional(readOnly = true) // 작성 가능한 리뷰 조회 public List getAvailableReviewTargets( - final ReviewAvailableCommand command) { - return contractRepository.findAvailableReviewsByBusinessId(command.businessId()); + final ReviewAvailableCommand command, + final PageNumberRequest pageNumberRequest) { + Pageable pageable = PageRequest.of(pageNumberRequest.page()-1 , 15, Sort.by("createdDate").descending()); + return contractRepository.findAvailableReviewsByBusinessId(command.businessId(), pageable).getContent(); } } \ No newline at end of file diff --git a/src/main/java/com/example/api/search/controller/SearchController.java b/src/main/java/com/example/api/search/controller/SearchController.java index 3bb5eeb3..c5a2e8ca 100644 --- a/src/main/java/com/example/api/search/controller/SearchController.java +++ b/src/main/java/com/example/api/search/controller/SearchController.java @@ -16,7 +16,7 @@ public class SearchController { private final SearchService searchService; - @PostMapping("/search") + @GetMapping("/search") public ResponseEntity> searchAccounts( @RequestBody @Validated final SearchRequest request ) { diff --git a/src/main/resources/application-local.properties b/src/main/resources/application-local.properties index 5859b1d3..e8b3c295 100644 --- a/src/main/resources/application-local.properties +++ b/src/main/resources/application-local.properties @@ -13,7 +13,7 @@ spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true spring.jpa.properties.hibernate.format_sql=true spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect -spring.jpa.properties.hibernate.physical_naming_strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl +spring.jpa.properties.hibernate.physical_naming_strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl # Logging (Optional) logging.level.org.hibernate.SQL=DEBUG @@ -105,4 +105,9 @@ spring.mvc.pathmatch.matching-strategy=ant_path_matcher # Mongo Database Configuration spring.data.mongodb.auto-index-creation=true spring.data.mongodb.uri=mongodb://localhost:27017/testdb -spring.data.mongodb.host=localhost \ No newline at end of file +spring.data.mongodb.host=localhost + +# UTF-8 Encoding +server.servlet.encoding.force=true +server.servlet.encoding.charset=UTF-8 +server.servlet.encoding.enabled=true diff --git a/src/main/resources/application-prod.properties b/src/main/resources/application-prod.properties index efdb0e79..b174900e 100644 --- a/src/main/resources/application-prod.properties +++ b/src/main/resources/application-prod.properties @@ -101,4 +101,8 @@ springdoc.api-docs.path=/v3/api-docs springdoc.default-consumes-media-type=application/json springdoc.default-produces-media-type=application/json -spring.mvc.pathmatch.matching-strategy=ant_path_matcher \ No newline at end of file +spring.mvc.pathmatch.matching-strategy=ant_path_matcher + +server.servlet.encoding.force=true +server.servlet.encoding.charset=UTF-8 +server.servlet.encoding.enabled=true diff --git a/src/main/resources/static/swagger.yaml b/src/main/resources/static/swagger.yaml index 100082ce..3ba36f2b 100644 --- a/src/main/resources/static/swagger.yaml +++ b/src/main/resources/static/swagger.yaml @@ -4,8 +4,8 @@ info: description: 단팥 백엔드 API 명세서입니다. version: 1.0.0 servers: -# - url: https://www.danpat.store - - url: http://localhost:8080 + - url: https://www.danpat.store +# - url: http://localhost:8080 security: - JWT_TOKEN: [] paths: @@ -1269,6 +1269,8 @@ paths: $ref: "#/components/schemas/AddReviewRequest" example: contractId: 9 + businessId: 9 + employeeId: 9 reviewScore: 5 reviewContent: "일 잘하네요" required: true @@ -1280,13 +1282,21 @@ paths: schema: type: string example: "리뷰가 성공적으로 작성되었습니다." - /api/v1/contracts/review/my: + /api/v1/contracts/review/my/employer: get: tags: - ContractReviewController - summary: "내가 쓴 리뷰 보기" - description: "내가 쓴 리뷰 보기" + summary: "사장 본인이 쓴 리뷰 보기" + description: "사장 본인이 쓴 리뷰 보기" operationId: getMyReview + parameters: + - name: page + in: query + required: false + schema: + type: integer + format: int64 + example: 1 responses: "200": description: OK @@ -1298,11 +1308,25 @@ paths: $ref: "#/components/schemas/ReviewResponse" example: - reviewId: 1 - contractId: 9 - reviewContent: "일 잘하네요" - reviewScore: 5 + businessName: "테스트 사업장" + businessId: 10 + employeeId: 3 + employeeNickname: "닉네임" + contractStartTime: "2025-01-01T09:00:00" + contractEndTime: "2025-01-01T18:00:00" + reviewStarPoint: 5 + reviewContent: "훌륭한 작업이었습니다!" + - reviewId: 2 + businessName: "스타트업 컴퍼니" + businessId: 20 + employeeId: 3 + employeeNickname: "닉네임" + contractStartTime: "2025-01-05T10:00:00" + contractEndTime: "2025-01-05T19:00:00" + reviewStarPoint: 4 + reviewContent: "업무 진행이 원활했습니다." /api/search/search: - post: + get: tags: - SearchController summary: "근무 가능 알바생 조회(알바 공고 검색)" @@ -1621,6 +1645,20 @@ paths: - ReviewController operationId: getAllReviews summary: "알바 후기 전체 조회" + parameters: + - name: nickname + in: query + required: false + schema: + type: string + example: "단팥" + - name: page + in: query + required: false + schema: + type: integer + format: int64 + example: 1 responses: "200": description: OK @@ -1633,7 +1671,9 @@ paths: example: - reviewId: 1 businessName: "테스트 사업장" - businessId: 10 + businessId: 1 + employeeId: 2 + employeeNickname: "닉네임1" contractStartTime: "2025-01-01T09:00:00" contractEndTime: "2025-01-01T18:00:00" reviewStarPoint: 5 @@ -1641,6 +1681,8 @@ paths: - reviewId: 2 businessName: "또 다른 사업장" businessId: 20 + employeeId: 3, + employeeNickname: "닉네임2", contractStartTime: "2025-01-02T09:00:00" contractEndTime: "2025-01-02T18:00:00" reviewStarPoint: 4 @@ -1651,7 +1693,13 @@ paths: - ReviewController operationId: getReviewsByEmployee summary: "특정 알바 후기 조회" - parameters: [ ] + parameters: + - name: reviewId + in: path + required: true + schema: + type: integer + format: int64 responses: "200": description: OK @@ -1669,19 +1717,20 @@ paths: contractEndTime: "2025-01-01T18:00:00" reviewStarPoint: 5 reviewContent: "훌륭한 작업이었습니다!" - /api/v1/review/my/reviews: + /api/v1/review/my/employee: get: tags: - ReviewController - summary: "나를 대상으로 작성된 리뷰 보기" + summary: "나를(알바생) 대상으로 작성된 리뷰 보기" operationId: getMyReviews parameters: - - name: accountId + - name: page in: query - required: true + required: false schema: type: integer format: int64 + example: 1 responses: "200": description: OK @@ -1695,6 +1744,8 @@ paths: - reviewId: 1 businessName: "테스트 사업장" businessId: 10 + employeeId: 3 + employeeNickname: "닉네임" contractStartTime: "2025-01-01T09:00:00" contractEndTime: "2025-01-01T18:00:00" reviewStarPoint: 5 @@ -1702,6 +1753,8 @@ paths: - reviewId: 2 businessName: "스타트업 컴퍼니" businessId: 20 + employeeId: 3 + employeeNickname: "닉네임" contractStartTime: "2025-01-05T10:00:00" contractEndTime: "2025-01-05T19:00:00" reviewStarPoint: 4 @@ -1719,6 +1772,13 @@ paths: schema: type: integer format: int64 + - name: page + in: query + required: false + schema: + type: integer + format: int64 + example: 1 responses: "200": description: OK @@ -2273,6 +2333,12 @@ components: contractId: type: integer format: int64 + businessId: + type: integer + format: int64 + employeeId: + type: integer + format: int64 reviewScore: type: integer format: int32 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 cee0eac1..66aac3ae 100644 --- a/src/test/java/com/example/api/review/service/ContractReviewServiceTest.java +++ b/src/test/java/com/example/api/review/service/ContractReviewServiceTest.java @@ -2,7 +2,8 @@ import static org.assertj.core.api.Assertions.assertThat; -import com.example.api.review.dto.ReviewCommand; +import com.example.api.announcement.dto.PageNumberRequest; +import com.example.api.board.dto.request.EmployeeIdRequest; import com.example.api.review.dto.ReviewResponse; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -21,18 +22,18 @@ void setUp() { } @Test - void testGetReviews() { - ReviewCommand reviewCommand = new ReviewCommand(1L); - List reviews = reviewService.getReviews(reviewCommand); + void testGetMyReviews() { + EmployeeIdRequest employeeIdRequest = new EmployeeIdRequest(1L); + List reviews = reviewService.getMyReviews(employeeIdRequest, new PageNumberRequest(1)); assertThat(reviews).isNotEmpty(); assertThat(reviews.get(0).businessName()).isEqualTo("Tech Solutions Inc."); assertThat(reviews.get(0).reviewContent()).isEqualTo("Good work"); } @Test - void testGetReviewsWhenNoReviews() { - ReviewCommand reviewCommand = new ReviewCommand(999L); - List reviews = reviewService.getReviews(reviewCommand); + void testGetReviewsWhenNoMyReviews() { + EmployeeIdRequest employeeIdRequest = new EmployeeIdRequest(999L); + List reviews = reviewService.getMyReviews(employeeIdRequest, new PageNumberRequest(1)); assertThat(reviews).isEmpty(); } } From f67def7bba1375e657e5e95f2ffcf5494b35084a Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Wed, 5 Mar 2025 19:18:17 +0900 Subject: [PATCH 275/276] contract review modify, delete api --- .../api/auth/entitiy/QRefreshToken.java | 57 +++++ .../com/example/api/domain/QAccount.java | 97 ++++++++ .../com/example/api/domain/QAnnouncement.java | 53 ++++ .../com/example/api/domain/QBaseEntity.java | 39 +++ .../com/example/api/domain/QBusiness.java | 72 ++++++ .../example/api/domain/QBusinessCategory.java | 62 +++++ .../com/example/api/domain/QCategory.java | 47 ++++ .../com/example/api/domain/QChatRoom.java | 53 ++++ .../com/example/api/domain/QContract.java | 65 +++++ .../example/api/domain/QExternalCareer.java | 64 +++++ .../example/api/domain/QFlavoredCategory.java | 65 +++++ .../example/api/domain/QFlavoredDistrict.java | 62 +++++ .../com/example/api/domain/QInquiry.java | 71 ++++++ .../com/example/api/domain/QLocation.java | 57 +++++ .../example/api/domain/QOfferEmployment.java | 67 +++++ .../example/api/domain/QPossibleBoard.java | 63 +++++ .../com/example/api/domain/QReview.java | 69 ++++++ .../com/example/api/domain/QReviewReport.java | 61 +++++ .../com/example/api/domain/QScrap.java | 62 +++++ .../com/example/api/domain/QSubCategory.java | 61 +++++ .../account/repository/AccountRepository.java | 3 +- .../api/auth/controller/AuthController.java | 4 +- .../example/api/auth/service/AuthService.java | 4 + .../api/auth/service/JwtTokenProvider.java | 5 +- .../example/api/business/BusinessService.java | 3 +- .../api/contracts/ContractRepository.java | 2 +- .../api/contracts/ContractReviewService.java | 18 ++ .../api/contracts/ContractService.java | 5 - .../controller/ContractReviewController.java | 19 ++ .../contracts/dto/DeleteReviewRequest.java | 6 + .../update/ContractReviewManager.java | 19 ++ .../contracts/update/ReviewUpdateHandler.java | 9 + .../update/UpdateReviewContentHandler.java | 22 ++ .../update/UpdateReviewScoreHandler.java | 21 ++ .../com/example/api/domain/PossibleBoard.java | 3 +- .../example/api/domain/ProposalStatus.java | 8 +- .../java/com/example/api/domain/Review.java | 8 + .../api/global/config/SecurityConfig.java | 2 +- .../filter/JwtAuthenticationFilter.java | 9 + .../OAuth2AuthenticationSuccessHandler.java | 1 + .../review/controller/ReviewController.java | 4 +- .../api/review/dto/ModifyReviewRequest.java | 8 + .../ReviewCustomRepositoryImpl.java | 2 - .../example/api/search/SearchRepository.java | 23 -- .../com/example/api/search/SearchService.java | 35 --- .../search/controller/SearchController.java | 14 +- .../example/api/search/dto/SearchCommand.java | 28 ++- .../example/api/search/dto/SearchRequest.java | 33 ++- .../api/search/dto/SearchResponse.java | 34 ++- .../repository/AccountCustomRepository.java | 16 ++ .../AccountCustomRepositoryImpl.java | 106 ++++++++ .../api/search/service/SearchService.java | 56 +++++ .../resources/application-local.properties | 2 + .../resources/application-prod.properties | 4 +- src/main/resources/static/swagger.yaml | 228 +++++++++++++++--- .../api/search/SearchIntegrationTest.java | 129 +++++----- 56 files changed, 1946 insertions(+), 194 deletions(-) create mode 100644 src/main/generated/com/example/api/auth/entitiy/QRefreshToken.java create mode 100644 src/main/generated/com/example/api/domain/QAccount.java create mode 100644 src/main/generated/com/example/api/domain/QAnnouncement.java create mode 100644 src/main/generated/com/example/api/domain/QBaseEntity.java create mode 100644 src/main/generated/com/example/api/domain/QBusiness.java create mode 100644 src/main/generated/com/example/api/domain/QBusinessCategory.java create mode 100644 src/main/generated/com/example/api/domain/QCategory.java create mode 100644 src/main/generated/com/example/api/domain/QChatRoom.java create mode 100644 src/main/generated/com/example/api/domain/QContract.java create mode 100644 src/main/generated/com/example/api/domain/QExternalCareer.java create mode 100644 src/main/generated/com/example/api/domain/QFlavoredCategory.java create mode 100644 src/main/generated/com/example/api/domain/QFlavoredDistrict.java create mode 100644 src/main/generated/com/example/api/domain/QInquiry.java create mode 100644 src/main/generated/com/example/api/domain/QLocation.java create mode 100644 src/main/generated/com/example/api/domain/QOfferEmployment.java create mode 100644 src/main/generated/com/example/api/domain/QPossibleBoard.java create mode 100644 src/main/generated/com/example/api/domain/QReview.java create mode 100644 src/main/generated/com/example/api/domain/QReviewReport.java create mode 100644 src/main/generated/com/example/api/domain/QScrap.java create mode 100644 src/main/generated/com/example/api/domain/QSubCategory.java create mode 100644 src/main/java/com/example/api/contracts/dto/DeleteReviewRequest.java create mode 100644 src/main/java/com/example/api/contracts/update/ContractReviewManager.java create mode 100644 src/main/java/com/example/api/contracts/update/ReviewUpdateHandler.java create mode 100644 src/main/java/com/example/api/contracts/update/UpdateReviewContentHandler.java create mode 100644 src/main/java/com/example/api/contracts/update/UpdateReviewScoreHandler.java create mode 100644 src/main/java/com/example/api/review/dto/ModifyReviewRequest.java delete mode 100644 src/main/java/com/example/api/search/SearchRepository.java delete mode 100644 src/main/java/com/example/api/search/SearchService.java create mode 100644 src/main/java/com/example/api/search/repository/AccountCustomRepository.java create mode 100644 src/main/java/com/example/api/search/repository/AccountCustomRepositoryImpl.java create mode 100644 src/main/java/com/example/api/search/service/SearchService.java diff --git a/src/main/generated/com/example/api/auth/entitiy/QRefreshToken.java b/src/main/generated/com/example/api/auth/entitiy/QRefreshToken.java new file mode 100644 index 00000000..4b87737f --- /dev/null +++ b/src/main/generated/com/example/api/auth/entitiy/QRefreshToken.java @@ -0,0 +1,57 @@ +package com.example.api.auth.entitiy; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QRefreshToken is a Querydsl query type for RefreshToken + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QRefreshToken extends EntityPathBase { + + private static final long serialVersionUID = -1655386265L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QRefreshToken refreshToken1 = new QRefreshToken("refreshToken1"); + + public final NumberPath id = createNumber("id", Long.class); + + public final BooleanPath isExpired = createBoolean("isExpired"); + + public final DateTimePath recentLogin = createDateTime("recentLogin", java.time.LocalDateTime.class); + + public final StringPath refreshToken = createString("refreshToken"); + + public final com.example.api.domain.QAccount user; + + public QRefreshToken(String variable) { + this(RefreshToken.class, forVariable(variable), INITS); + } + + public QRefreshToken(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QRefreshToken(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QRefreshToken(PathMetadata metadata, PathInits inits) { + this(RefreshToken.class, metadata, inits); + } + + public QRefreshToken(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.user = inits.isInitialized("user") ? new com.example.api.domain.QAccount(forProperty("user"), inits.get("user")) : null; + } + +} + diff --git a/src/main/generated/com/example/api/domain/QAccount.java b/src/main/generated/com/example/api/domain/QAccount.java new file mode 100644 index 00000000..4e0bfdc5 --- /dev/null +++ b/src/main/generated/com/example/api/domain/QAccount.java @@ -0,0 +1,97 @@ +package com.example.api.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QAccount is a Querydsl query type for Account + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QAccount extends EntityPathBase { + + private static final long serialVersionUID = -1087167288L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QAccount account = new QAccount("account"); + + public final QBaseEntity _super = new QBaseEntity(this); + + public final NumberPath accountId = createNumber("accountId", Long.class); + + public final NumberPath age = createNumber("age", Integer.class); + + public final StringPath birthdate = createString("birthdate"); + + public final StringPath callTime = createString("callTime"); + + //inherited + public final DateTimePath createdDate = _super.createdDate; + + public final BooleanPath deleted = createBoolean("deleted"); + + public final StringPath email = createString("email"); + + public final BooleanPath emailReceivable = createBoolean("emailReceivable"); + + public final StringPath introduction = createString("introduction"); + + public final QLocation location; + + public final StringPath loginId = createString("loginId"); + + public final StringPath name = createString("name"); + + public final EnumPath nationality = createEnum("nationality", com.example.api.account.entity.Nationality.class); + + public final StringPath nickname = createString("nickname"); + + public final BooleanPath openStatus = createBoolean("openStatus"); + + public final StringPath password = createString("password"); + + public final StringPath phoneNumber = createString("phoneNumber"); + + public final StringPath profileImage = createString("profileImage"); + + public final CollectionPath> roles = this.>createCollection("roles", com.example.api.account.entity.UserRole.class, EnumPath.class, PathInits.DIRECT2); + + public final StringPath sex = createString("sex"); + + public final NumberPath starPoint = createNumber("starPoint", Float.class); + + //inherited + public final DateTimePath updatedDate = _super.updatedDate; + + public final NumberPath workCount = createNumber("workCount", Integer.class); + + public QAccount(String variable) { + this(Account.class, forVariable(variable), INITS); + } + + public QAccount(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QAccount(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QAccount(PathMetadata metadata, PathInits inits) { + this(Account.class, metadata, inits); + } + + public QAccount(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.location = inits.isInitialized("location") ? new QLocation(forProperty("location")) : null; + } + +} + diff --git a/src/main/generated/com/example/api/domain/QAnnouncement.java b/src/main/generated/com/example/api/domain/QAnnouncement.java new file mode 100644 index 00000000..2280f648 --- /dev/null +++ b/src/main/generated/com/example/api/domain/QAnnouncement.java @@ -0,0 +1,53 @@ +package com.example.api.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QAnnouncement is a Querydsl query type for Announcement + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QAnnouncement extends EntityPathBase { + + private static final long serialVersionUID = 1512577932L; + + public static final QAnnouncement announcement = new QAnnouncement("announcement"); + + public final QBaseEntity _super = new QBaseEntity(this); + + public final StringPath announcementContent = createString("announcementContent"); + + public final NumberPath announcementId = createNumber("announcementId", Long.class); + + public final StringPath announcementTitle = createString("announcementTitle"); + + public final StringPath announcementType = createString("announcementType"); + + //inherited + public final DateTimePath createdDate = _super.createdDate; + + //inherited + public final DateTimePath updatedDate = _super.updatedDate; + + public final NumberPath viewCount = createNumber("viewCount", Integer.class); + + public QAnnouncement(String variable) { + super(Announcement.class, forVariable(variable)); + } + + public QAnnouncement(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QAnnouncement(PathMetadata metadata) { + super(Announcement.class, metadata); + } + +} + diff --git a/src/main/generated/com/example/api/domain/QBaseEntity.java b/src/main/generated/com/example/api/domain/QBaseEntity.java new file mode 100644 index 00000000..09c42891 --- /dev/null +++ b/src/main/generated/com/example/api/domain/QBaseEntity.java @@ -0,0 +1,39 @@ +package com.example.api.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QBaseEntity is a Querydsl query type for BaseEntity + */ +@Generated("com.querydsl.codegen.DefaultSupertypeSerializer") +public class QBaseEntity extends EntityPathBase { + + private static final long serialVersionUID = 127095193L; + + public static final QBaseEntity baseEntity = new QBaseEntity("baseEntity"); + + public final DateTimePath createdDate = createDateTime("createdDate", java.time.LocalDateTime.class); + + public final DateTimePath updatedDate = createDateTime("updatedDate", java.time.LocalDateTime.class); + + public QBaseEntity(String variable) { + super(BaseEntity.class, forVariable(variable)); + } + + public QBaseEntity(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QBaseEntity(PathMetadata metadata) { + super(BaseEntity.class, metadata); + } + +} + diff --git a/src/main/generated/com/example/api/domain/QBusiness.java b/src/main/generated/com/example/api/domain/QBusiness.java new file mode 100644 index 00000000..bc1267f3 --- /dev/null +++ b/src/main/generated/com/example/api/domain/QBusiness.java @@ -0,0 +1,72 @@ +package com.example.api.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QBusiness is a Querydsl query type for Business + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QBusiness extends EntityPathBase { + + private static final long serialVersionUID = 1647868037L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QBusiness business = new QBusiness("business"); + + public final QBaseEntity _super = new QBaseEntity(this); + + public final ListPath businessCategories = this.createList("businessCategories", BusinessCategory.class, QBusinessCategory.class, PathInits.DIRECT2); + + public final NumberPath businessId = createNumber("businessId", Long.class); + + public final StringPath businessName = createString("businessName"); + + //inherited + public final DateTimePath createdDate = _super.createdDate; + + public final QAccount employer; + + public final QLocation location; + + public final StringPath openDate = createString("openDate"); + + public final StringPath registrationNumber = createString("registrationNumber"); + + public final StringPath representationName = createString("representationName"); + + //inherited + public final DateTimePath updatedDate = _super.updatedDate; + + public QBusiness(String variable) { + this(Business.class, forVariable(variable), INITS); + } + + public QBusiness(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QBusiness(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QBusiness(PathMetadata metadata, PathInits inits) { + this(Business.class, metadata, inits); + } + + public QBusiness(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.employer = inits.isInitialized("employer") ? new QAccount(forProperty("employer"), inits.get("employer")) : null; + this.location = inits.isInitialized("location") ? new QLocation(forProperty("location")) : null; + } + +} + diff --git a/src/main/generated/com/example/api/domain/QBusinessCategory.java b/src/main/generated/com/example/api/domain/QBusinessCategory.java new file mode 100644 index 00000000..d67bdd02 --- /dev/null +++ b/src/main/generated/com/example/api/domain/QBusinessCategory.java @@ -0,0 +1,62 @@ +package com.example.api.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QBusinessCategory is a Querydsl query type for BusinessCategory + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QBusinessCategory extends EntityPathBase { + + private static final long serialVersionUID = -861191005L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QBusinessCategory businessCategory = new QBusinessCategory("businessCategory"); + + public final QBaseEntity _super = new QBaseEntity(this); + + public final QBusiness business; + + //inherited + public final DateTimePath createdDate = _super.createdDate; + + public final NumberPath id = createNumber("id", Long.class); + + public final QSubCategory subCategory; + + //inherited + public final DateTimePath updatedDate = _super.updatedDate; + + public QBusinessCategory(String variable) { + this(BusinessCategory.class, forVariable(variable), INITS); + } + + public QBusinessCategory(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QBusinessCategory(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QBusinessCategory(PathMetadata metadata, PathInits inits) { + this(BusinessCategory.class, metadata, inits); + } + + public QBusinessCategory(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.business = inits.isInitialized("business") ? new QBusiness(forProperty("business"), inits.get("business")) : null; + this.subCategory = inits.isInitialized("subCategory") ? new QSubCategory(forProperty("subCategory"), inits.get("subCategory")) : null; + } + +} + diff --git a/src/main/generated/com/example/api/domain/QCategory.java b/src/main/generated/com/example/api/domain/QCategory.java new file mode 100644 index 00000000..5065ce4c --- /dev/null +++ b/src/main/generated/com/example/api/domain/QCategory.java @@ -0,0 +1,47 @@ +package com.example.api.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QCategory is a Querydsl query type for Category + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QCategory extends EntityPathBase { + + private static final long serialVersionUID = -1449757245L; + + public static final QCategory category = new QCategory("category"); + + public final QBaseEntity _super = new QBaseEntity(this); + + public final NumberPath categoryId = createNumber("categoryId", Long.class); + + public final StringPath categoryName = createString("categoryName"); + + //inherited + public final DateTimePath createdDate = _super.createdDate; + + //inherited + public final DateTimePath updatedDate = _super.updatedDate; + + public QCategory(String variable) { + super(Category.class, forVariable(variable)); + } + + public QCategory(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QCategory(PathMetadata metadata) { + super(Category.class, metadata); + } + +} + diff --git a/src/main/generated/com/example/api/domain/QChatRoom.java b/src/main/generated/com/example/api/domain/QChatRoom.java new file mode 100644 index 00000000..b8542ca3 --- /dev/null +++ b/src/main/generated/com/example/api/domain/QChatRoom.java @@ -0,0 +1,53 @@ +package com.example.api.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QChatRoom is a Querydsl query type for ChatRoom + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QChatRoom extends EntityPathBase { + + private static final long serialVersionUID = -62925544L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QChatRoom chatRoom = new QChatRoom("chatRoom"); + + public final NumberPath chatRoomId = createNumber("chatRoomId", Long.class); + + public final QOfferEmployment offerEmployment; + + public final DateTimePath suggestGeneratedDate = createDateTime("suggestGeneratedDate", java.time.LocalDateTime.class); + + public QChatRoom(String variable) { + this(ChatRoom.class, forVariable(variable), INITS); + } + + public QChatRoom(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QChatRoom(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QChatRoom(PathMetadata metadata, PathInits inits) { + this(ChatRoom.class, metadata, inits); + } + + public QChatRoom(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.offerEmployment = inits.isInitialized("offerEmployment") ? new QOfferEmployment(forProperty("offerEmployment"), inits.get("offerEmployment")) : null; + } + +} + diff --git a/src/main/generated/com/example/api/domain/QContract.java b/src/main/generated/com/example/api/domain/QContract.java new file mode 100644 index 00000000..c6ae3403 --- /dev/null +++ b/src/main/generated/com/example/api/domain/QContract.java @@ -0,0 +1,65 @@ +package com.example.api.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QContract is a Querydsl query type for Contract + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QContract extends EntityPathBase { + + private static final long serialVersionUID = -2067215913L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QContract contract = new QContract("contract"); + + public final QBaseEntity _super = new QBaseEntity(this); + + public final DateTimePath contractEndTime = createDateTime("contractEndTime", java.time.LocalDateTime.class); + + public final NumberPath contractHourlyPay = createNumber("contractHourlyPay", Integer.class); + + public final NumberPath contractId = createNumber("contractId", Long.class); + + public final DateTimePath contractStartTime = createDateTime("contractStartTime", java.time.LocalDateTime.class); + + //inherited + public final DateTimePath createdDate = _super.createdDate; + + public final QOfferEmployment offerEmployment; + + //inherited + public final DateTimePath updatedDate = _super.updatedDate; + + public QContract(String variable) { + this(Contract.class, forVariable(variable), INITS); + } + + public QContract(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QContract(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QContract(PathMetadata metadata, PathInits inits) { + this(Contract.class, metadata, inits); + } + + public QContract(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.offerEmployment = inits.isInitialized("offerEmployment") ? new QOfferEmployment(forProperty("offerEmployment"), inits.get("offerEmployment")) : null; + } + +} + diff --git a/src/main/generated/com/example/api/domain/QExternalCareer.java b/src/main/generated/com/example/api/domain/QExternalCareer.java new file mode 100644 index 00000000..f3a68a08 --- /dev/null +++ b/src/main/generated/com/example/api/domain/QExternalCareer.java @@ -0,0 +1,64 @@ +package com.example.api.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QExternalCareer is a Querydsl query type for ExternalCareer + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QExternalCareer extends EntityPathBase { + + private static final long serialVersionUID = 606757934L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QExternalCareer externalCareer = new QExternalCareer("externalCareer"); + + public final QBaseEntity _super = new QBaseEntity(this); + + //inherited + public final DateTimePath createdDate = _super.createdDate; + + public final QAccount employee; + + public final NumberPath id = createNumber("id", Long.class); + + public final QSubCategory subCategory; + + //inherited + public final DateTimePath updatedDate = _super.updatedDate; + + public final NumberPath workCount = createNumber("workCount", Integer.class); + + public QExternalCareer(String variable) { + this(ExternalCareer.class, forVariable(variable), INITS); + } + + public QExternalCareer(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QExternalCareer(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QExternalCareer(PathMetadata metadata, PathInits inits) { + this(ExternalCareer.class, metadata, inits); + } + + public QExternalCareer(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.employee = inits.isInitialized("employee") ? new QAccount(forProperty("employee"), inits.get("employee")) : null; + this.subCategory = inits.isInitialized("subCategory") ? new QSubCategory(forProperty("subCategory"), inits.get("subCategory")) : null; + } + +} + diff --git a/src/main/generated/com/example/api/domain/QFlavoredCategory.java b/src/main/generated/com/example/api/domain/QFlavoredCategory.java new file mode 100644 index 00000000..1d58ef9b --- /dev/null +++ b/src/main/generated/com/example/api/domain/QFlavoredCategory.java @@ -0,0 +1,65 @@ +package com.example.api.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QFlavoredCategory is a Querydsl query type for FlavoredCategory + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QFlavoredCategory extends EntityPathBase { + + private static final long serialVersionUID = -258789472L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QFlavoredCategory flavoredCategory = new QFlavoredCategory("flavoredCategory"); + + public final QBaseEntity _super = new QBaseEntity(this); + + public final QCategory category; + + //inherited + public final DateTimePath createdDate = _super.createdDate; + + public final QAccount employee; + + public final NumberPath flavoredCategoryId = createNumber("flavoredCategoryId", Long.class); + + public final QSubCategory subCategory; + + //inherited + public final DateTimePath updatedDate = _super.updatedDate; + + public QFlavoredCategory(String variable) { + this(FlavoredCategory.class, forVariable(variable), INITS); + } + + public QFlavoredCategory(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QFlavoredCategory(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QFlavoredCategory(PathMetadata metadata, PathInits inits) { + this(FlavoredCategory.class, metadata, inits); + } + + public QFlavoredCategory(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.category = inits.isInitialized("category") ? new QCategory(forProperty("category")) : null; + this.employee = inits.isInitialized("employee") ? new QAccount(forProperty("employee"), inits.get("employee")) : null; + this.subCategory = inits.isInitialized("subCategory") ? new QSubCategory(forProperty("subCategory"), inits.get("subCategory")) : null; + } + +} + diff --git a/src/main/generated/com/example/api/domain/QFlavoredDistrict.java b/src/main/generated/com/example/api/domain/QFlavoredDistrict.java new file mode 100644 index 00000000..62ffcca5 --- /dev/null +++ b/src/main/generated/com/example/api/domain/QFlavoredDistrict.java @@ -0,0 +1,62 @@ +package com.example.api.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QFlavoredDistrict is a Querydsl query type for FlavoredDistrict + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QFlavoredDistrict extends EntityPathBase { + + private static final long serialVersionUID = -20339152L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QFlavoredDistrict flavoredDistrict = new QFlavoredDistrict("flavoredDistrict"); + + public final QBaseEntity _super = new QBaseEntity(this); + + //inherited + public final DateTimePath createdDate = _super.createdDate; + + public final QAccount employee; + + public final NumberPath id = createNumber("id", Long.class); + + public final QLocation location; + + //inherited + public final DateTimePath updatedDate = _super.updatedDate; + + public QFlavoredDistrict(String variable) { + this(FlavoredDistrict.class, forVariable(variable), INITS); + } + + public QFlavoredDistrict(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QFlavoredDistrict(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QFlavoredDistrict(PathMetadata metadata, PathInits inits) { + this(FlavoredDistrict.class, metadata, inits); + } + + public QFlavoredDistrict(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.employee = inits.isInitialized("employee") ? new QAccount(forProperty("employee"), inits.get("employee")) : null; + this.location = inits.isInitialized("location") ? new QLocation(forProperty("location")) : null; + } + +} + diff --git a/src/main/generated/com/example/api/domain/QInquiry.java b/src/main/generated/com/example/api/domain/QInquiry.java new file mode 100644 index 00000000..44ef3fa4 --- /dev/null +++ b/src/main/generated/com/example/api/domain/QInquiry.java @@ -0,0 +1,71 @@ +package com.example.api.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QInquiry is a Querydsl query type for Inquiry + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QInquiry extends EntityPathBase { + + private static final long serialVersionUID = 2045912162L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QInquiry inquiry = new QInquiry("inquiry"); + + public final QBaseEntity _super = new QBaseEntity(this); + + public final DateTimePath answerDate = createDateTime("answerDate", java.time.LocalDateTime.class); + + public final StringPath content = createString("content"); + + public final QAccount createdBy; + + //inherited + public final DateTimePath createdDate = _super.createdDate; + + public final NumberPath inquiryId = createNumber("inquiryId", Long.class); + + public final EnumPath inquiryStatus = createEnum("inquiryStatus", Inquiry.InquiryStatus.class); + + public final StringPath inquiryType = createString("inquiryType"); + + public final StringPath subInquiryType = createString("subInquiryType"); + + public final StringPath title = createString("title"); + + //inherited + public final DateTimePath updatedDate = _super.updatedDate; + + public QInquiry(String variable) { + this(Inquiry.class, forVariable(variable), INITS); + } + + public QInquiry(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QInquiry(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QInquiry(PathMetadata metadata, PathInits inits) { + this(Inquiry.class, metadata, inits); + } + + public QInquiry(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.createdBy = inits.isInitialized("createdBy") ? new QAccount(forProperty("createdBy"), inits.get("createdBy")) : null; + } + +} + diff --git a/src/main/generated/com/example/api/domain/QLocation.java b/src/main/generated/com/example/api/domain/QLocation.java new file mode 100644 index 00000000..e9355bcf --- /dev/null +++ b/src/main/generated/com/example/api/domain/QLocation.java @@ -0,0 +1,57 @@ +package com.example.api.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QLocation is a Querydsl query type for Location + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QLocation extends EntityPathBase { + + private static final long serialVersionUID = 400775290L; + + public static final QLocation location = new QLocation("location"); + + public final QBaseEntity _super = new QBaseEntity(this); + + public final StringPath address = createString("address"); + + //inherited + public final DateTimePath createdDate = _super.createdDate; + + public final StringPath detailAddress = createString("detailAddress"); + + public final StringPath dong = createString("dong"); + + public final NumberPath id = createNumber("id", Long.class); + + public final StringPath sido = createString("sido"); + + public final StringPath sigugun = createString("sigugun"); + + //inherited + public final DateTimePath updatedDate = _super.updatedDate; + + public final StringPath zipcode = createString("zipcode"); + + public QLocation(String variable) { + super(Location.class, forVariable(variable)); + } + + public QLocation(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QLocation(PathMetadata metadata) { + super(Location.class, metadata); + } + +} + diff --git a/src/main/generated/com/example/api/domain/QOfferEmployment.java b/src/main/generated/com/example/api/domain/QOfferEmployment.java new file mode 100644 index 00000000..908f6848 --- /dev/null +++ b/src/main/generated/com/example/api/domain/QOfferEmployment.java @@ -0,0 +1,67 @@ +package com.example.api.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QOfferEmployment is a Querydsl query type for OfferEmployment + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QOfferEmployment extends EntityPathBase { + + private static final long serialVersionUID = -82696445L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QOfferEmployment offerEmployment = new QOfferEmployment("offerEmployment"); + + public final QBusiness business; + + public final QContract contract; + + public final QAccount employee; + + public final EnumPath status = createEnum("status", ProposalStatus.class); + + public final DateTimePath suggestEndTime = createDateTime("suggestEndTime", java.time.LocalDateTime.class); + + public final NumberPath suggestHourlyPay = createNumber("suggestHourlyPay", Integer.class); + + public final NumberPath suggestId = createNumber("suggestId", Long.class); + + public final DateTimePath suggestRegisterTime = createDateTime("suggestRegisterTime", java.time.LocalDateTime.class); + + public final DateTimePath suggestStartTime = createDateTime("suggestStartTime", java.time.LocalDateTime.class); + + public QOfferEmployment(String variable) { + this(OfferEmployment.class, forVariable(variable), INITS); + } + + public QOfferEmployment(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QOfferEmployment(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QOfferEmployment(PathMetadata metadata, PathInits inits) { + this(OfferEmployment.class, metadata, inits); + } + + public QOfferEmployment(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.business = inits.isInitialized("business") ? new QBusiness(forProperty("business"), inits.get("business")) : null; + this.contract = inits.isInitialized("contract") ? new QContract(forProperty("contract"), inits.get("contract")) : null; + this.employee = inits.isInitialized("employee") ? new QAccount(forProperty("employee"), inits.get("employee")) : null; + } + +} + diff --git a/src/main/generated/com/example/api/domain/QPossibleBoard.java b/src/main/generated/com/example/api/domain/QPossibleBoard.java new file mode 100644 index 00000000..da77cfcf --- /dev/null +++ b/src/main/generated/com/example/api/domain/QPossibleBoard.java @@ -0,0 +1,63 @@ +package com.example.api.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QPossibleBoard is a Querydsl query type for PossibleBoard + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QPossibleBoard extends EntityPathBase { + + private static final long serialVersionUID = -1378693552L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QPossibleBoard possibleBoard = new QPossibleBoard("possibleBoard"); + + public final QBaseEntity _super = new QBaseEntity(this); + + //inherited + public final DateTimePath createdDate = _super.createdDate; + + public final QAccount employee; + + public final DateTimePath endTime = createDateTime("endTime", java.time.LocalDateTime.class); + + public final NumberPath possibleId = createNumber("possibleId", Long.class); + + public final DateTimePath startTime = createDateTime("startTime", java.time.LocalDateTime.class); + + //inherited + public final DateTimePath updatedDate = _super.updatedDate; + + public QPossibleBoard(String variable) { + this(PossibleBoard.class, forVariable(variable), INITS); + } + + public QPossibleBoard(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QPossibleBoard(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QPossibleBoard(PathMetadata metadata, PathInits inits) { + this(PossibleBoard.class, metadata, inits); + } + + public QPossibleBoard(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.employee = inits.isInitialized("employee") ? new QAccount(forProperty("employee"), inits.get("employee")) : null; + } + +} + diff --git a/src/main/generated/com/example/api/domain/QReview.java b/src/main/generated/com/example/api/domain/QReview.java new file mode 100644 index 00000000..48680bb6 --- /dev/null +++ b/src/main/generated/com/example/api/domain/QReview.java @@ -0,0 +1,69 @@ +package com.example.api.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QReview is a Querydsl query type for Review + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QReview extends EntityPathBase { + + private static final long serialVersionUID = 731127133L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QReview review = new QReview("review"); + + public final QBaseEntity _super = new QBaseEntity(this); + + public final QContract contract; + + //inherited + public final DateTimePath createdDate = _super.createdDate; + + public final QAccount employee; + + public final StringPath reviewContent = createString("reviewContent"); + + public final NumberPath reviewId = createNumber("reviewId", Long.class); + + public final NumberPath reviewStarPoint = createNumber("reviewStarPoint", Integer.class); + + //inherited + public final DateTimePath updatedDate = _super.updatedDate; + + public final QBusiness writer; + + public QReview(String variable) { + this(Review.class, forVariable(variable), INITS); + } + + public QReview(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QReview(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QReview(PathMetadata metadata, PathInits inits) { + this(Review.class, metadata, inits); + } + + public QReview(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.contract = inits.isInitialized("contract") ? new QContract(forProperty("contract"), inits.get("contract")) : null; + this.employee = inits.isInitialized("employee") ? new QAccount(forProperty("employee"), inits.get("employee")) : null; + this.writer = inits.isInitialized("writer") ? new QBusiness(forProperty("writer"), inits.get("writer")) : null; + } + +} + diff --git a/src/main/generated/com/example/api/domain/QReviewReport.java b/src/main/generated/com/example/api/domain/QReviewReport.java new file mode 100644 index 00000000..2cafb825 --- /dev/null +++ b/src/main/generated/com/example/api/domain/QReviewReport.java @@ -0,0 +1,61 @@ +package com.example.api.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QReviewReport is a Querydsl query type for ReviewReport + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QReviewReport extends EntityPathBase { + + private static final long serialVersionUID = 178201841L; + + private static final PathInits INITS = PathInits.DIRECT2; + + 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); + } + + public QReviewReport(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QReviewReport(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QReviewReport(PathMetadata metadata, PathInits inits) { + this(ReviewReport.class, metadata, inits); + } + + public QReviewReport(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.review = inits.isInitialized("review") ? new QReview(forProperty("review"), inits.get("review")) : null; + } + +} + diff --git a/src/main/generated/com/example/api/domain/QScrap.java b/src/main/generated/com/example/api/domain/QScrap.java new file mode 100644 index 00000000..24d7d408 --- /dev/null +++ b/src/main/generated/com/example/api/domain/QScrap.java @@ -0,0 +1,62 @@ +package com.example.api.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QScrap is a Querydsl query type for Scrap + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QScrap extends EntityPathBase { + + private static final long serialVersionUID = -391197396L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QScrap scrap = new QScrap("scrap"); + + public final QBaseEntity _super = new QBaseEntity(this); + + //inherited + public final DateTimePath createdDate = _super.createdDate; + + public final QAccount employee; + + public final QAccount employer; + + public final NumberPath scrapId = createNumber("scrapId", Long.class); + + //inherited + public final DateTimePath updatedDate = _super.updatedDate; + + public QScrap(String variable) { + this(Scrap.class, forVariable(variable), INITS); + } + + public QScrap(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QScrap(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QScrap(PathMetadata metadata, PathInits inits) { + this(Scrap.class, metadata, inits); + } + + public QScrap(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.employee = inits.isInitialized("employee") ? new QAccount(forProperty("employee"), inits.get("employee")) : null; + this.employer = inits.isInitialized("employer") ? new QAccount(forProperty("employer"), inits.get("employer")) : null; + } + +} + diff --git a/src/main/generated/com/example/api/domain/QSubCategory.java b/src/main/generated/com/example/api/domain/QSubCategory.java new file mode 100644 index 00000000..bb348463 --- /dev/null +++ b/src/main/generated/com/example/api/domain/QSubCategory.java @@ -0,0 +1,61 @@ +package com.example.api.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QSubCategory is a Querydsl query type for SubCategory + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QSubCategory extends EntityPathBase { + + private static final long serialVersionUID = 300381305L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QSubCategory subCategory = new QSubCategory("subCategory"); + + public final QBaseEntity _super = new QBaseEntity(this); + + public final QCategory category; + + //inherited + public final DateTimePath createdDate = _super.createdDate; + + public final NumberPath subCategoryId = createNumber("subCategoryId", Long.class); + + public final StringPath subCategoryName = createString("subCategoryName"); + + //inherited + public final DateTimePath updatedDate = _super.updatedDate; + + public QSubCategory(String variable) { + this(SubCategory.class, forVariable(variable), INITS); + } + + public QSubCategory(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QSubCategory(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QSubCategory(PathMetadata metadata, PathInits inits) { + this(SubCategory.class, metadata, inits); + } + + public QSubCategory(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.category = inits.isInitialized("category") ? new QCategory(forProperty("category")) : null; + } + +} + diff --git a/src/main/java/com/example/api/account/repository/AccountRepository.java b/src/main/java/com/example/api/account/repository/AccountRepository.java index 1872856b..7a418b4e 100644 --- a/src/main/java/com/example/api/account/repository/AccountRepository.java +++ b/src/main/java/com/example/api/account/repository/AccountRepository.java @@ -1,6 +1,7 @@ package com.example.api.account.repository; import com.example.api.domain.Account; +import com.example.api.search.repository.AccountCustomRepository; import com.example.api.setting.dto.EmailConsentResponse; import org.springframework.data.jpa.repository.EntityGraph; import org.springframework.data.jpa.repository.JpaRepository; @@ -10,7 +11,7 @@ import java.util.Optional; -public interface AccountRepository extends JpaRepository { +public interface AccountRepository extends JpaRepository, AccountCustomRepository { boolean existsByLoginId(String loginId); boolean existsByEmail(String email); diff --git a/src/main/java/com/example/api/auth/controller/AuthController.java b/src/main/java/com/example/api/auth/controller/AuthController.java index 594b00bb..c03801aa 100644 --- a/src/main/java/com/example/api/auth/controller/AuthController.java +++ b/src/main/java/com/example/api/auth/controller/AuthController.java @@ -32,9 +32,9 @@ public ResponseEntity> login( @PostMapping("/refresh") public ResponseEntity> refresh( - @Valid @RequestBody final RefreshTokenRequest refreshTokenRequest, + @Valid @CookieValue(value = "refreshToken") final String refreshToken, HttpServletResponse response) { - LoginSuccessResponse loginSuccessResponse = authService.refreshAuthToken(refreshTokenRequest); + LoginSuccessResponse loginSuccessResponse = authService.refreshAuthToken(new RefreshTokenRequest(refreshToken)); response.addCookie(loginSuccessResponse.refreshTokenCookie()); return ResponseEntity.ok(loginSuccessResponse.responseBody()); } diff --git a/src/main/java/com/example/api/auth/service/AuthService.java b/src/main/java/com/example/api/auth/service/AuthService.java index b53a492c..a1f3fca1 100644 --- a/src/main/java/com/example/api/auth/service/AuthService.java +++ b/src/main/java/com/example/api/auth/service/AuthService.java @@ -12,6 +12,7 @@ import com.example.api.global.properties.JwtProperties; import jakarta.servlet.http.Cookie; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.jetbrains.annotations.NotNull; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; @@ -23,6 +24,7 @@ @Service @RequiredArgsConstructor +@Slf4j public class AuthService { private final AccountRepository accountRepository; private final PasswordEncoder passwordEncoder; @@ -68,6 +70,7 @@ private LoginSuccessResponse generateAuthToken(final Account user) { responseBody.put("name", user.getName()); responseBody.put("profile", profile); responseBody.put("nickname", user.getNickname()); + responseBody.put("email", user.getEmail()); return new LoginSuccessResponse(refreshTokenCookie, responseBody); } @@ -117,6 +120,7 @@ public LoginSuccessResponse logout(@Validated final LoginUserRequest loginUserRe responseBody.put("name", null); responseBody.put("profile", null); responseBody.put("nickname", null); + responseBody.put("email", null); return new LoginSuccessResponse(null, responseBody); } diff --git a/src/main/java/com/example/api/auth/service/JwtTokenProvider.java b/src/main/java/com/example/api/auth/service/JwtTokenProvider.java index ef24c590..a4791950 100644 --- a/src/main/java/com/example/api/auth/service/JwtTokenProvider.java +++ b/src/main/java/com/example/api/auth/service/JwtTokenProvider.java @@ -8,12 +8,14 @@ import io.jsonwebtoken.security.Keys; import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import java.util.Date; @Component @RequiredArgsConstructor +@Slf4j public class JwtTokenProvider { private final JwtProperties jwtProperties; @@ -71,7 +73,8 @@ public Long getUserIdFromToken(final String token) { .getBody(); return claims.get("userId", Long.class); } catch (ExpiredJwtException e) { - throw new BusinessException(ErrorCode.EXPIRED_ACCESS_TOKEN); + log.info("getUserIdFromToken Error: {}", token); + throw new BusinessException(ErrorCode.EXPIRED_REFRESH_TOKEN); } catch (Exception e) { throw new BusinessException(ErrorCode.INVALID_TOKEN); } diff --git a/src/main/java/com/example/api/business/BusinessService.java b/src/main/java/com/example/api/business/BusinessService.java index ad640c02..0bffa0a8 100644 --- a/src/main/java/com/example/api/business/BusinessService.java +++ b/src/main/java/com/example/api/business/BusinessService.java @@ -34,6 +34,7 @@ public void updateBusiness(@Validated final ModifyBusinessCommand command) { final Business targetBusiness = businessRepository.findById(command.businessId()) .orElseThrow(); businessUpdateManager.update(targetBusiness, command); + businessRepository.save(targetBusiness); } @Transactional @@ -60,4 +61,4 @@ private List loadCategories(final List categoryIds, fina .map(subCategory -> new BusinessCategory(business, subCategory)) .toList(); } -} +} \ No newline at end of file diff --git a/src/main/java/com/example/api/contracts/ContractRepository.java b/src/main/java/com/example/api/contracts/ContractRepository.java index 1b24765c..4e358d94 100644 --- a/src/main/java/com/example/api/contracts/ContractRepository.java +++ b/src/main/java/com/example/api/contracts/ContractRepository.java @@ -65,7 +65,7 @@ public interface ContractRepository extends JpaRepository { "join c.offerEmployment oe " + "join oe.employee e " + "join oe.business b " + - "where b.businessId = :businessId and oe.status = 'TERMINATED' " + + "where b.businessId = :businessId and oe.status = 'COMPLETED' " + "and c.contractId not in (select r.contract.contractId from Review r)") Page findAvailableReviewsByBusinessId(@Param("businessId") Long businessId, Pageable pageable); } diff --git a/src/main/java/com/example/api/contracts/ContractReviewService.java b/src/main/java/com/example/api/contracts/ContractReviewService.java index a66a80de..8be602cc 100644 --- a/src/main/java/com/example/api/contracts/ContractReviewService.java +++ b/src/main/java/com/example/api/contracts/ContractReviewService.java @@ -3,12 +3,16 @@ import com.example.api.account.repository.AccountRepository; import com.example.api.business.BusinessRepository; import com.example.api.contracts.dto.AddReviewCommand; +import com.example.api.contracts.dto.DeleteReviewRequest; +import com.example.api.contracts.update.ContractReviewManager; import com.example.api.domain.Account; import com.example.api.domain.Business; import com.example.api.domain.Contract; import com.example.api.domain.Review; import com.example.api.global.exception.BusinessException; import com.example.api.global.exception.ErrorCode; +import com.example.api.review.dto.ModifyReviewRequest; +import com.example.api.review.dto.ReviewResponse; import com.example.api.review.repository.ReviewRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -22,6 +26,7 @@ public class ContractReviewService { private final ReviewRepository reviewRepository; private final BusinessRepository businessRepository; private final AccountRepository accountRepository; + private final ContractReviewManager contractReviewManager; @Transactional public void saveReview(@Validated final AddReviewCommand command) { @@ -39,4 +44,17 @@ private void validateContractOwner(final Long requestMemberId, final Business bu throw new BusinessException("본인의 계약에만 리뷰가 가능합니다", ErrorCode.CONTRACT_EXCEPTION); } } + + @Transactional + public ReviewResponse modifyReview(@Validated final ModifyReviewRequest command) { + Review review = reviewRepository.findById(command.reviewId()).orElseThrow(() -> new BusinessException(ErrorCode.REVIEW_NOT_FOUND_EXCEPTION)); + contractReviewManager.update(review, command); + Review savedReview = reviewRepository.save(review); + return ReviewResponse.from(savedReview); + } + + @Transactional + public void deleteReview(final DeleteReviewRequest deleteReviewRequest) { + reviewRepository.deleteById(deleteReviewRequest.reviewId()); + } } \ No newline at end of file diff --git a/src/main/java/com/example/api/contracts/ContractService.java b/src/main/java/com/example/api/contracts/ContractService.java index ad887c21..10253426 100644 --- a/src/main/java/com/example/api/contracts/ContractService.java +++ b/src/main/java/com/example/api/contracts/ContractService.java @@ -1,22 +1,18 @@ package com.example.api.contracts; import com.example.api.account.repository.AccountRepository; -import com.example.api.board.dto.request.EmployeeIdRequest; import com.example.api.board.repository.PossibleBoardRepository; import com.example.api.contracts.dto.*; import com.example.api.contracts.update.UpdateContractConditionManager; import com.example.api.contracts.dto.UpdateContractConditionCommand; import com.example.api.domain.*; -import java.time.LocalDate; - import java.util.ArrayList; import java.util.List; import com.example.api.global.exception.BusinessException; import com.example.api.global.exception.ErrorCode; import com.example.api.offeremployment.entity.OfferEmploymentMapper; -import com.example.api.suggest.controller.dto.SuggestStatusDTO; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -82,7 +78,6 @@ public void updateAvailableWorkHours(AcceptContractCommand acceptContractCommand } } - private Contract loadContract(final Long contractId) { return contractRepository.findById(contractId) .orElseThrow(); diff --git a/src/main/java/com/example/api/contracts/controller/ContractReviewController.java b/src/main/java/com/example/api/contracts/controller/ContractReviewController.java index 46c7ddb4..b3298660 100644 --- a/src/main/java/com/example/api/contracts/controller/ContractReviewController.java +++ b/src/main/java/com/example/api/contracts/controller/ContractReviewController.java @@ -4,7 +4,10 @@ import com.example.api.contracts.ReviewQueryService; import com.example.api.contracts.ContractReviewService; import com.example.api.contracts.dto.AddReviewCommand; +import com.example.api.contracts.dto.DeleteReviewRequest; import com.example.api.contracts.dto.QueryEmployersReviewCommand; +import com.example.api.review.dto.ModifyReviewRequest; +import com.example.api.review.dto.ReviewAvailableResponse; import com.example.api.review.dto.ReviewResponse; import jakarta.validation.Valid; import jakarta.validation.constraints.NotNull; @@ -60,4 +63,20 @@ AddReviewCommand toCommand(final Long requestMemberId) { return new AddReviewCommand(requestMemberId, businessId, employeeId, contractId, reviewContent, reviewScore); } } + + @PutMapping("/review/modify") // 리뷰 수정 + public ResponseEntity modifyReview( + @RequestBody ModifyReviewRequest modifyReviewRequest + ) { + ReviewResponse updatedReview = contractReviewService.modifyReview(modifyReviewRequest); + return ResponseEntity.ok(updatedReview); + } + + @DeleteMapping("/review/delete") // 리뷰 삭제 + public ResponseEntity deleteReview( + @RequestParam final Long reviewId + ) { + contractReviewService.deleteReview(new DeleteReviewRequest(reviewId)); + return ResponseEntity.ok("리뷰 삭제하였습니다"); + } } \ No newline at end of file diff --git a/src/main/java/com/example/api/contracts/dto/DeleteReviewRequest.java b/src/main/java/com/example/api/contracts/dto/DeleteReviewRequest.java new file mode 100644 index 00000000..ffd0416e --- /dev/null +++ b/src/main/java/com/example/api/contracts/dto/DeleteReviewRequest.java @@ -0,0 +1,6 @@ +package com.example.api.contracts.dto; + +public record DeleteReviewRequest( + Long reviewId +) { +} \ No newline at end of file diff --git a/src/main/java/com/example/api/contracts/update/ContractReviewManager.java b/src/main/java/com/example/api/contracts/update/ContractReviewManager.java new file mode 100644 index 00000000..8124f2ac --- /dev/null +++ b/src/main/java/com/example/api/contracts/update/ContractReviewManager.java @@ -0,0 +1,19 @@ +package com.example.api.contracts.update; + +import com.example.api.domain.Review; +import com.example.api.review.dto.ModifyReviewRequest; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@RequiredArgsConstructor +public class ContractReviewManager { + private final List updateHandlers; + + public void update(final Review review, final ModifyReviewRequest command) { + updateHandlers.stream() + .forEach(reviewUpdateHandler -> reviewUpdateHandler.update(review, command)); + } +} diff --git a/src/main/java/com/example/api/contracts/update/ReviewUpdateHandler.java b/src/main/java/com/example/api/contracts/update/ReviewUpdateHandler.java new file mode 100644 index 00000000..e4c9c1e7 --- /dev/null +++ b/src/main/java/com/example/api/contracts/update/ReviewUpdateHandler.java @@ -0,0 +1,9 @@ +package com.example.api.contracts.update; + + +import com.example.api.domain.Review; +import com.example.api.review.dto.ModifyReviewRequest; + +public interface ReviewUpdateHandler { + void update(final Review review, final ModifyReviewRequest command); +} diff --git a/src/main/java/com/example/api/contracts/update/UpdateReviewContentHandler.java b/src/main/java/com/example/api/contracts/update/UpdateReviewContentHandler.java new file mode 100644 index 00000000..02f48b00 --- /dev/null +++ b/src/main/java/com/example/api/contracts/update/UpdateReviewContentHandler.java @@ -0,0 +1,22 @@ +package com.example.api.contracts.update; + +import com.example.api.domain.Review; +import com.example.api.review.dto.ModifyReviewRequest; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + + +@Service +@Transactional(propagation = Propagation.MANDATORY) +class UpdateReviewContentHandler implements ReviewUpdateHandler { + + @Override + public void update(Review review, ModifyReviewRequest command) { + if (Objects.nonNull(command.reviewContent())) { + review.setReviewContent(command.reviewContent()); + } + } +} diff --git a/src/main/java/com/example/api/contracts/update/UpdateReviewScoreHandler.java b/src/main/java/com/example/api/contracts/update/UpdateReviewScoreHandler.java new file mode 100644 index 00000000..34c1af67 --- /dev/null +++ b/src/main/java/com/example/api/contracts/update/UpdateReviewScoreHandler.java @@ -0,0 +1,21 @@ +package com.example.api.contracts.update; + +import com.example.api.domain.Review; +import com.example.api.review.dto.ModifyReviewRequest; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Service +@Transactional(propagation = Propagation.MANDATORY) +class UpdateReviewScoreHandler implements ReviewUpdateHandler { + + @Override + public void update(Review review, ModifyReviewRequest command) { + if (Objects.nonNull(command.reviewScore())) { + review.setReviewStarPoint(command.reviewScore()); + } + } +} diff --git a/src/main/java/com/example/api/domain/PossibleBoard.java b/src/main/java/com/example/api/domain/PossibleBoard.java index 856a0ae7..3c51c2a8 100644 --- a/src/main/java/com/example/api/domain/PossibleBoard.java +++ b/src/main/java/com/example/api/domain/PossibleBoard.java @@ -36,5 +36,4 @@ public PossibleBoard(final Account employee, final LocalDateTime startTime, fina this.startTime = startTime; this.endTime = endTime; } -} - +} \ No newline at end of file diff --git a/src/main/java/com/example/api/domain/ProposalStatus.java b/src/main/java/com/example/api/domain/ProposalStatus.java index 7ecdeac1..476cf050 100644 --- a/src/main/java/com/example/api/domain/ProposalStatus.java +++ b/src/main/java/com/example/api/domain/ProposalStatus.java @@ -1,9 +1,9 @@ package com.example.api.domain; public enum ProposalStatus { - PENDING, // 대기 중 - IN_PROGRESS, // 체결 중 - COMPLETED, // 체결 완료 - TERMINATED, // 종료 + PENDING, // 알바 제안 대기 중 + IN_PROGRESS, // 알바 계약 체결 중 + COMPLETED, // 알바 체결 완료 + TERMINATED, // 알바 종료 FAILED, // 거절 } diff --git a/src/main/java/com/example/api/domain/Review.java b/src/main/java/com/example/api/domain/Review.java index 292ebd52..2a32655e 100644 --- a/src/main/java/com/example/api/domain/Review.java +++ b/src/main/java/com/example/api/domain/Review.java @@ -41,6 +41,14 @@ public Review(Business business, Account employee, Integer reviewStarPoint, Stri this.reviewContent = reviewContent; this.contract = contract; } + + public void setReviewStarPoint(int reviewStarPoint) { + this.reviewStarPoint = reviewStarPoint; + } + + public void setReviewContent(String reviewContent) { + this.reviewContent = reviewContent; + } } 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 5e1a49e3..88984e64 100644 --- a/src/main/java/com/example/api/global/config/SecurityConfig.java +++ b/src/main/java/com/example/api/global/config/SecurityConfig.java @@ -57,7 +57,7 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http, JwtTokenProvid .authorizeHttpRequests(authorize -> authorize .requestMatchers("/ws", "/ws/**").permitAll() // WebSocket 요청 허용 .requestMatchers("/swagger-ui/**", "/v3/api-docs/**", "/swagger.yaml").permitAll() // Swagger 문서 허용 - .requestMatchers("/api/v1/auth/login", "/oauth2/**").permitAll() // 로그인 & OAuth2 허용 + .requestMatchers("/api/v1/auth/login", "/api/v1/auth/refresh","/oauth2/**").permitAll() // 로그인 & OAuth2 허용 .requestMatchers("/error", "/favicon.ico", "/**/*.png", "/**/*.gif", "/**/*.webp", "/**/*.svg", "/**/*.jpg", "/**/*.html", "/**/*.css", "/**/*.js").permitAll() // 정적 리소스 허용 .requestMatchers("/api/v1/account/**", "/aws", "/health", "/error").permitAll() // 특정 API 엔드포인트 허용 diff --git a/src/main/java/com/example/api/global/config/filter/JwtAuthenticationFilter.java b/src/main/java/com/example/api/global/config/filter/JwtAuthenticationFilter.java index 57e166a9..a3eaf5d1 100644 --- a/src/main/java/com/example/api/global/config/filter/JwtAuthenticationFilter.java +++ b/src/main/java/com/example/api/global/config/filter/JwtAuthenticationFilter.java @@ -30,9 +30,18 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { try { + String requestURI = request.getRequestURI(); + + // 🔹 refresh 요청은 필터 검증 제외 + if (requestURI.equals("/api/v1/auth/refresh")) { + filterChain.doFilter(request, response); + return; + } + String accessToken = jwtTokenProvider.extractAccessToken(request); if (accessToken != null) { if (!jwtTokenProvider.isNotExpiredToken(accessToken)) { + log.info("ExpiredToken: {}", accessToken); throw new BusinessException(ErrorCode.EXPIRED_ACCESS_TOKEN.getErrorDescription(), ErrorCode.EXPIRED_ACCESS_TOKEN); } diff --git a/src/main/java/com/example/api/oauth2/entity/handler/OAuth2AuthenticationSuccessHandler.java b/src/main/java/com/example/api/oauth2/entity/handler/OAuth2AuthenticationSuccessHandler.java index 0e04440b..402c0a32 100644 --- a/src/main/java/com/example/api/oauth2/entity/handler/OAuth2AuthenticationSuccessHandler.java +++ b/src/main/java/com/example/api/oauth2/entity/handler/OAuth2AuthenticationSuccessHandler.java @@ -83,6 +83,7 @@ private void generateResponseBody(HttpServletResponse response, UserDetailReques responseBody.put("name", loginUser.getName()); responseBody.put("profile", profile); responseBody.put("nickname", loginUser.getNickname()); + responseBody.put("email", loginUser.getEmail()); response.setContentType("application/json"); response.setCharacterEncoding("UTF-8"); diff --git a/src/main/java/com/example/api/review/controller/ReviewController.java b/src/main/java/com/example/api/review/controller/ReviewController.java index a5d141c8..76e13a7a 100644 --- a/src/main/java/com/example/api/review/controller/ReviewController.java +++ b/src/main/java/com/example/api/review/controller/ReviewController.java @@ -2,6 +2,7 @@ import com.example.api.announcement.dto.PageNumberRequest; import com.example.api.board.dto.request.EmployeeIdRequest; +import com.example.api.review.dto.ModifyReviewRequest; import com.example.api.review.service.ReviewService; import com.example.api.review.dto.ReviewResponse; import com.example.api.review.dto.ReviewAvailableCommand; @@ -26,7 +27,6 @@ public ResponseEntity> getAllReviews( @RequestParam(defaultValue = "1", required = false) final Integer page, @RequestParam(required = false) final String nickname ) { - log.info("nickname = {}", nickname); final List reviews = reviewService.getAllReviews(nickname, new PageNumberRequest(page)); return ResponseEntity.ok(reviews); } @@ -58,4 +58,4 @@ public ResponseEntity> getAvailableReviewTargets( new PageNumberRequest(page)); return ResponseEntity.ok(availableEmployees); } -} +} \ No newline at end of file diff --git a/src/main/java/com/example/api/review/dto/ModifyReviewRequest.java b/src/main/java/com/example/api/review/dto/ModifyReviewRequest.java new file mode 100644 index 00000000..4890b57b --- /dev/null +++ b/src/main/java/com/example/api/review/dto/ModifyReviewRequest.java @@ -0,0 +1,8 @@ +package com.example.api.review.dto; + +public record ModifyReviewRequest( + Long reviewId, + Integer reviewScore, + String reviewContent +) { +} diff --git a/src/main/java/com/example/api/review/repository/ReviewCustomRepositoryImpl.java b/src/main/java/com/example/api/review/repository/ReviewCustomRepositoryImpl.java index 7dff6141..1c084945 100644 --- a/src/main/java/com/example/api/review/repository/ReviewCustomRepositoryImpl.java +++ b/src/main/java/com/example/api/review/repository/ReviewCustomRepositoryImpl.java @@ -5,10 +5,8 @@ import com.example.api.domain.QContract; import com.example.api.domain.QReview; import com.example.api.review.dto.ReviewResponse; -import com.querydsl.core.BooleanBuilder; import com.querydsl.core.types.Predicate; import com.querydsl.core.types.Projections; -import com.querydsl.core.util.StringUtils; import com.querydsl.jpa.impl.JPAQueryFactory; import jakarta.persistence.EntityManager; import org.springframework.data.domain.Page; diff --git a/src/main/java/com/example/api/search/SearchRepository.java b/src/main/java/com/example/api/search/SearchRepository.java deleted file mode 100644 index 57782fac..00000000 --- a/src/main/java/com/example/api/search/SearchRepository.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.example.api.search; - -import com.example.api.domain.Account; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; - -import java.time.LocalDateTime; -import java.util.List; - -public interface SearchRepository extends JpaRepository { - @Query("SELECT DISTINCT a FROM Account a " + - "JOIN PossibleBoard pb ON pb.employee = a " + - "JOIN FlavoredCategory fc ON fc.employee = a " + - "WHERE (:category IS NULL OR fc.category.categoryName = :category) " + - "AND (:startTime IS NULL OR pb.startTime <= :startTime) " + - "AND (:endTime IS NULL OR pb.endTime >= :endTime)") - List searchAccountsByCategoryAndTime( - @Param("category") String category, - @Param("startTime") LocalDateTime startTime, - @Param("endTime") LocalDateTime endTime - ); -} \ No newline at end of file diff --git a/src/main/java/com/example/api/search/SearchService.java b/src/main/java/com/example/api/search/SearchService.java deleted file mode 100644 index e1e75a7a..00000000 --- a/src/main/java/com/example/api/search/SearchService.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.example.api.search; - -import com.example.api.search.dto.SearchCommand; -import com.example.api.search.dto.SearchResponse; -import com.example.api.domain.Account; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; -import java.util.stream.Collectors; - -@Service -@RequiredArgsConstructor -public class SearchService { - private final SearchRepository searchRepository; - - @Transactional(readOnly = true) - public List searchAccounts(final SearchCommand command) { - final List accounts = searchRepository.searchAccountsByCategoryAndTime( - command.category(), - command.startTime(), - command.endTime() - ); - return accounts.stream() - .map(account -> new SearchResponse( - account.getName(), - account.getSex(), - account.getAge(), - account.getStarPoint(), - account.getWorkCount() - )) - .collect(Collectors.toList()); - } -} \ No newline at end of file diff --git a/src/main/java/com/example/api/search/controller/SearchController.java b/src/main/java/com/example/api/search/controller/SearchController.java index c5a2e8ca..818787fc 100644 --- a/src/main/java/com/example/api/search/controller/SearchController.java +++ b/src/main/java/com/example/api/search/controller/SearchController.java @@ -1,7 +1,7 @@ package com.example.api.search.controller; -import com.example.api.search.SearchService; -import com.example.api.search.dto.SearchCommand; +import com.example.api.announcement.dto.PageNumberRequest; +import com.example.api.search.service.SearchService; import com.example.api.search.dto.SearchRequest; import com.example.api.search.dto.SearchResponse; import lombok.RequiredArgsConstructor; @@ -18,14 +18,10 @@ public class SearchController { @GetMapping("/search") public ResponseEntity> searchAccounts( - @RequestBody @Validated final SearchRequest request + @ModelAttribute @Validated final SearchRequest request, + @RequestParam(required = false, defaultValue = "1") final Integer page ) { - final SearchCommand command = new SearchCommand( - request.category(), - request.startTime(), - request.endTime() - ); - final List results = searchService.searchAccounts(command); + final List results = searchService.searchAccounts(request, new PageNumberRequest(page)); return ResponseEntity.ok(results); } } \ No newline at end of file diff --git a/src/main/java/com/example/api/search/dto/SearchCommand.java b/src/main/java/com/example/api/search/dto/SearchCommand.java index 6dfc0f5f..3d8e0970 100644 --- a/src/main/java/com/example/api/search/dto/SearchCommand.java +++ b/src/main/java/com/example/api/search/dto/SearchCommand.java @@ -1,12 +1,32 @@ package com.example.api.search.dto; +import org.springframework.format.annotation.DateTimeFormat; + import java.time.LocalDateTime; public record SearchCommand( - String category, - LocalDateTime startTime, - LocalDateTime endTime -) {} + Long employeeId, + String sido, + String sigugun, + String dong, + Long subCategoryId, + @DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm") + LocalDateTime startDateTime, + @DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm") + LocalDateTime endDateTime +) { + public static SearchCommand of(SearchRequest searchRequest, Long employeeId){ + return new SearchCommand( + employeeId, + searchRequest.sido(), + searchRequest.sigugun(), + searchRequest.dong(), + searchRequest.subCategoryId(), + searchRequest.getStartDateTime(), + searchRequest.getEndDateTime() + ); + } +} diff --git a/src/main/java/com/example/api/search/dto/SearchRequest.java b/src/main/java/com/example/api/search/dto/SearchRequest.java index fa269bde..251848fa 100644 --- a/src/main/java/com/example/api/search/dto/SearchRequest.java +++ b/src/main/java/com/example/api/search/dto/SearchRequest.java @@ -1,10 +1,35 @@ package com.example.api.search.dto; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDate; import java.time.LocalDateTime; +import java.time.LocalTime; public record SearchRequest( - String category, - LocalDateTime startTime, - LocalDateTime endTime -) {} + String sido, + String sigugun, + String dong, + Long subCategoryId, + @DateTimeFormat(pattern = "yyyy-MM-dd") + LocalDate date, + @DateTimeFormat(pattern = "HH:mm") + LocalTime startTime, + @DateTimeFormat(pattern = "HH:mm") + LocalTime endTime +) { + public LocalDateTime getStartDateTime() { + if (this.date == null || this.startTime == null) { + return null; + } + return LocalDateTime.of(this.date, this.startTime); + } + + public LocalDateTime getEndDateTime(){ + if (this.date == null || this.endTime == null) { + return null; + } + return LocalDateTime.of(this.date, this.endTime); + } +} \ No newline at end of file diff --git a/src/main/java/com/example/api/search/dto/SearchResponse.java b/src/main/java/com/example/api/search/dto/SearchResponse.java index 9ed7732c..eeae9a57 100644 --- a/src/main/java/com/example/api/search/dto/SearchResponse.java +++ b/src/main/java/com/example/api/search/dto/SearchResponse.java @@ -1,9 +1,35 @@ package com.example.api.search.dto; +import com.example.api.board.dto.response.ExternalCareerResponse; +import com.example.api.board.dto.response.FlavoredCategoryResponse; +import com.example.api.board.dto.response.FlavoredDistrictResponse; + +import java.util.List; + public record SearchResponse( + Long employeeId, String name, String sex, - int age, - float starPoint, - int workCount -) {} + Integer age, + Float starPoint, + Integer workCount, + List externalCareerList, + List flavoredCategoryList, + List flavoredDistrictList +) { + public SearchResponse(Long employeeId, String name, String sex, Integer age, Float starPoint, Integer workCount) { + this(employeeId, name, sex, age, starPoint, workCount, List.of(), List.of(), List.of()); + } + + public SearchResponse(Long employeeId, String name, String sex, Integer age, Float starPoint, Integer workCount, List externalCareerList, List flavoredCategoryList, List flavoredDistrictList) { + this.employeeId = employeeId; + this.name = name; + this.sex = sex; + this.age = age; + this.starPoint = starPoint; + this.workCount = workCount; + this.externalCareerList = externalCareerList; + this.flavoredCategoryList = flavoredCategoryList; + this.flavoredDistrictList = flavoredDistrictList; + } +} \ No newline at end of file diff --git a/src/main/java/com/example/api/search/repository/AccountCustomRepository.java b/src/main/java/com/example/api/search/repository/AccountCustomRepository.java new file mode 100644 index 00000000..3027b4df --- /dev/null +++ b/src/main/java/com/example/api/search/repository/AccountCustomRepository.java @@ -0,0 +1,16 @@ +package com.example.api.search.repository; + +import com.example.api.domain.Account; +import com.example.api.search.dto.SearchRequest; +import com.example.api.search.dto.SearchResponse; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +import java.time.LocalDateTime; +import java.util.List; + +public interface AccountCustomRepository { + Page findAvailableMembersByLocationAndCategoryAndDateTime(SearchRequest searchRequest, Pageable pageable); +} \ No newline at end of file diff --git a/src/main/java/com/example/api/search/repository/AccountCustomRepositoryImpl.java b/src/main/java/com/example/api/search/repository/AccountCustomRepositoryImpl.java new file mode 100644 index 00000000..db147282 --- /dev/null +++ b/src/main/java/com/example/api/search/repository/AccountCustomRepositoryImpl.java @@ -0,0 +1,106 @@ +package com.example.api.search.repository; + +import com.example.api.domain.*; +import com.example.api.search.dto.SearchRequest; +import com.example.api.search.dto.SearchResponse; +import com.querydsl.core.BooleanBuilder; +import com.querydsl.core.types.Projections; +import com.querydsl.core.types.dsl.Expressions; +import com.querydsl.jpa.impl.JPAQueryFactory; +import jakarta.persistence.EntityManager; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Optional; + +import static org.springframework.util.StringUtils.*; + +@Repository +public class AccountCustomRepositoryImpl implements AccountCustomRepository { + private final JPAQueryFactory queryFactory; + private final QAccount employee = QAccount.account; + private final QPossibleBoard possibleBoard = QPossibleBoard.possibleBoard; + private final QFlavoredCategory flavoredCategory = QFlavoredCategory.flavoredCategory; + private final QFlavoredDistrict flavoredDistrict = QFlavoredDistrict.flavoredDistrict; + + public AccountCustomRepositoryImpl(EntityManager entityManager) { + this.queryFactory = new JPAQueryFactory(entityManager); + } + + @Override + public Page findAvailableMembersByLocationAndCategoryAndDateTime(SearchRequest searchRequest, Pageable pageable) { + BooleanBuilder builder = new BooleanBuilder(); + builderConditionCheck(searchRequest, builder); + + List content = queryFactory.select(Projections.constructor(SearchResponse.class, + employee.accountId, + employee.name, + employee.sex, + employee.age, + employee.starPoint, + employee.workCount + )).from(employee) + .join(possibleBoard).on(employee.accountId.eq(possibleBoard.employee.accountId)) + .join(flavoredCategory).on(employee.accountId.eq(flavoredCategory.employee.accountId)) + .join(flavoredDistrict).on(employee.accountId.eq(flavoredDistrict.employee.accountId)) + .where(builder) + .groupBy(employee.accountId) + .offset(pageable.getOffset()) + .limit(pageable.getPageSize()) + .fetch(); + + long total = Optional.ofNullable(queryFactory + .select(employee.accountId.countDistinct()) + .from(employee) + .join(possibleBoard).on(employee.accountId.eq(possibleBoard.employee.accountId)) + .join(flavoredCategory).on(employee.accountId.eq(flavoredCategory.employee.accountId)) + .join(flavoredDistrict).on(employee.accountId.eq(flavoredDistrict.employee.accountId)) + .where(builder) + .fetchOne()).orElse(0L); + + return new PageImpl<>(content, pageable, total); + } + + private void builderConditionCheck(SearchRequest searchRequest, BooleanBuilder builder) { + if (hasText(searchRequest.sido()) && hasText(searchRequest.sigugun()) && hasText(searchRequest.dong())){ + builder.and(flavoredDistrict.location.sido.eq(searchRequest.sido())) + .and(flavoredDistrict.location.sigugun.eq(searchRequest.sigugun())) + .and(flavoredDistrict.location.dong.eq(searchRequest.dong())); + } + + if (searchRequest.getStartDateTime() != null) { + builder.and(possibleBoard.startTime.loe(searchRequest.getStartDateTime())); + } + + if (searchRequest.getEndDateTime() != null) { + builder.and(possibleBoard.endTime.goe(searchRequest.getEndDateTime())); + } + + if (searchRequest.date() != null) { + builder.and(possibleBoard.startTime.year().eq(searchRequest.date().getYear())) + .and(possibleBoard.startTime.month().eq(searchRequest.date().getMonthValue())) + .and(possibleBoard.startTime.dayOfMonth().eq(searchRequest.date().getDayOfMonth())); + } + + if (searchRequest.startTime() != null) { + builder.and( + Expressions.stringTemplate("TIME({0})", possibleBoard.startTime) + .loe(searchRequest.startTime().toString()) + ); + } + + if (searchRequest.endTime() != null) { + builder.and( + Expressions.stringTemplate("TIME({0})", possibleBoard.endTime) + .goe(searchRequest.endTime().toString()) + ); + } + + if(searchRequest.subCategoryId() != null) { + builder.and(flavoredCategory.subCategory.subCategoryId.eq(searchRequest.subCategoryId())); + } + } +} diff --git a/src/main/java/com/example/api/search/service/SearchService.java b/src/main/java/com/example/api/search/service/SearchService.java new file mode 100644 index 00000000..e3707c3e --- /dev/null +++ b/src/main/java/com/example/api/search/service/SearchService.java @@ -0,0 +1,56 @@ +package com.example.api.search.service; + +import com.example.api.account.repository.AccountRepository; +import com.example.api.announcement.dto.PageNumberRequest; +import com.example.api.domain.repository.ExternalCareerRepository; +import com.example.api.domain.repository.FlavoredCategoryRepository; +import com.example.api.domain.repository.FlavoredDistrictRepository; +import com.example.api.search.dto.SearchRequest; +import com.example.api.search.dto.SearchResponse; +import lombok.RequiredArgsConstructor; +import org.jetbrains.annotations.NotNull; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.function.Function; +import java.util.stream.Collectors; + +@Service +@RequiredArgsConstructor +public class SearchService { + private final AccountRepository accountRepository; + private final ExternalCareerRepository externalCareerRepository; + private final FlavoredCategoryRepository flavoredCategoryRepository; + private final FlavoredDistrictRepository flavoredDistrictRepository; + + @Transactional(readOnly = true) + public List searchAccounts(final SearchRequest request, final PageNumberRequest pageNumberRequest) { + Pageable pageable = PageRequest.of(pageNumberRequest.page() - 1, 5, Sort.by("createdDate")); + List content = accountRepository.findAvailableMembersByLocationAndCategoryAndDateTime(request, pageable).getContent(); + + Function transformer = addDetailsToSearchResponse(); + + return content.stream() + .map(transformer) + .collect(Collectors.toList()); + } + + @NotNull + private Function addDetailsToSearchResponse() { + return response -> new SearchResponse( + response.employeeId(), + response.name(), + response.sex(), + response.age(), + response.starPoint(), + response.workCount(), + externalCareerRepository.findAllByEmployeeId(response.employeeId()), + flavoredCategoryRepository.findAllByEmployeeId(response.employeeId()), + flavoredDistrictRepository.findAllByEmployeeId(response.employeeId()) + ); + } +} \ No newline at end of file diff --git a/src/main/resources/application-local.properties b/src/main/resources/application-local.properties index e8b3c295..25c2a59b 100644 --- a/src/main/resources/application-local.properties +++ b/src/main/resources/application-local.properties @@ -111,3 +111,5 @@ spring.data.mongodb.host=localhost server.servlet.encoding.force=true server.servlet.encoding.charset=UTF-8 server.servlet.encoding.enabled=true + +spring.jackson.time-zone=Asia/Seoul \ No newline at end of file diff --git a/src/main/resources/application-prod.properties b/src/main/resources/application-prod.properties index b174900e..9afa8781 100644 --- a/src/main/resources/application-prod.properties +++ b/src/main/resources/application-prod.properties @@ -13,7 +13,7 @@ spring.data.mongodb.auto-index-creation=true # JPA and Hibernate Configuration spring.jpa.hibernate.ddl-auto=update -spring.jpa.show-sql=true +#spring.jpa.show-sql=true spring.jpa.properties.hibernate.format_sql=true spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect spring.jpa.properties.hibernate.physical_naming_strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl @@ -106,3 +106,5 @@ spring.mvc.pathmatch.matching-strategy=ant_path_matcher server.servlet.encoding.force=true server.servlet.encoding.charset=UTF-8 server.servlet.encoding.enabled=true + +spring.jackson.time-zone=Asia/Seoul diff --git a/src/main/resources/static/swagger.yaml b/src/main/resources/static/swagger.yaml index 3ba36f2b..4e161d34 100644 --- a/src/main/resources/static/swagger.yaml +++ b/src/main/resources/static/swagger.yaml @@ -206,6 +206,10 @@ paths: accessToken: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." userId: "123" userRole: "EMPLOYEE" + name: "이름" + profile: "프로필" + nickname: "닉네임" + email: "이메일" /api/v1/auth/refresh: post: tags: @@ -213,14 +217,6 @@ paths: summary: "refreshToken으로 accessToken 재발급 요청" description: "refreshToken으로 accessToken 재발급 요청" operationId: refresh - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/RefreshTokenRequest" - example: - refreshToken: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." - required: true responses: "200": description: OK @@ -234,6 +230,10 @@ paths: accessToken: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." userId: "123" userRole: "EMPLOYEE" + name: "이름" + profile: "프로필" + nickname: "닉네임" + email: "이메일" /api/v1/auth/logout: post: tags: @@ -254,6 +254,10 @@ paths: accessToken: null userId: null userRole: null + name: null + profile: null + nickname: null + email: null /api/v1/possible-board: post: tags: @@ -1325,22 +1329,105 @@ paths: contractEndTime: "2025-01-05T19:00:00" reviewStarPoint: 4 reviewContent: "업무 진행이 원활했습니다." + /api/v1/contracts/review/modify: + put: + tags: + - ContractReviewController + summary: "리뷰 수정하기" + description: "리뷰 수정하기" + operationId: modifyReview + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/ModifyReviewRequest" + responses: + "200": + description: OK + content: + '*/*': + example: "성공적으로 삭제되었습니다." + /api/v1/contracts/review/delete: + delete: + tags: + - ContractReviewController + summary: "리뷰 삭제하기" + description: "리뷰 삭제하기" + operationId: modifyReview + parameters: + - name: reviewId + in: query + required: true + schema: + type: integer + format: int64 + example: 1 + responses: + "200": + description: OK + content: + '*/*': + example: "성공적으로 삭제되었습니다." /api/search/search: get: tags: - SearchController summary: "근무 가능 알바생 조회(알바 공고 검색)" operationId: searchAccounts - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/SearchRequest" - example: - category: "IT" - startTime: "2025-01-01T09:00:00" - endTime: "2025-01-01T18:00:00" - required: true + parameters: + - name: sido + in: query + required: false + schema: + type: string + example: "경기" + - name: sigugun + in: query + required: false + schema: + type: string + example: "남양주시" + - name: dong + in: query + required: false + schema: + type: string + example: "별내동" + - name: subCategoryId + in: query + required: false + schema: + type: integer + format: int64 + example: 8002 + - name: date + in: query + required: false + schema: + type: string + format: date + example: "2025-02-26" + - name: startTime + in: query + required: false + schema: + type: string + format: time + example : "14:00" + - name: endTime + in: query + required: false + schema: + type: string + format: time + example: "16:00" + - name: page + in: query + required: false + schema: + type: integer + example: 1 + responses: "200": description: OK @@ -1351,16 +1438,72 @@ paths: items: $ref: "#/components/schemas/SearchResponse" example: - - name: "John Doe" + - employeeId : 2 + name: "John Doe" sex: "Male" age: 30 starPoint: 4.5 - workCount: 50 - - name: "Jane Smith" + workCount: 7 + externalCareerList: + - externalCareerId: 1 + category: + - categoryId: 1 + categoryName: "외식•음료" + workCount: 1 + - externalCareerId: 2 + category: + - categoryId: 2 + categoryName: "유통•판매" + workCount: 1 + flavoredCategoryList: + - categoryId: 1 + categoryName: "외식•음료" + subCategoryId: 1001 + subCategoryName: "전체" + - categoryId: 2 + categoryName: "유통•판매" + subCategoryId: 1001 + subCategoryName: "전체" + flavoredDistrictList: + - sido: "경기" + sigugun: "남양주시" + dong: "별내동" + - sido: "경기" + sigugun: "남양주시" + dong: "별내동" + - employeeId : 3 + name: "Jane Smith" sex: "Female" age: 28 starPoint: 4.8 - workCount: 60 + workCount: 5 + externalCareerList: + - externalCareerId: 1 + category: + - categoryId: 1 + categoryName: "외식•음료" + workCount: 1 + - externalCareerId: 2 + category: + - categoryId: 2 + categoryName: "유통•판매" + workCount: 1 + flavoredCategoryList: + - categoryId: 1 + categoryName: "외식•음료" + subCategoryId: 1001 + subCategoryName: "전체" + - categoryId: 2 + categoryName: "유통•판매" + subCategoryId: 1001 + subCategoryName: "전체" + flavoredDistrictList: + - sido: "경기" + sigugun: "남양주시" + dong: "별내동" + - sido: "경기" + sigugun: "남양주시" + dong: "별내동" /api/v1/employer/favorites/employees: get: tags: @@ -1682,7 +1825,7 @@ paths: businessName: "또 다른 사업장" businessId: 20 employeeId: 3, - employeeNickname: "닉네임2", + employeeNickname: "닉네임2" contractStartTime: "2025-01-02T09:00:00" contractEndTime: "2025-01-02T18:00:00" reviewStarPoint: 4 @@ -2487,17 +2630,29 @@ components: SearchRequest: type: object properties: - category: + sido: + type: string + sigugun: type: string + dong: + type: string + categoryId: + type: integer + date: + type: string + format: date startTime: type: string - format: date-time + pattern: "^([0-1][0-9]|2[0-3]):([0-5][0-9])$" + example: "09:00" endTime: - type: string - format: date-time + pattern: "^([0-1][0-9]|2[0-3]):([0-5][0-9])$" + example: "09:00" SearchResponse: type: object properties: + employeeId: + type: integer name: type: string sex: @@ -2511,6 +2666,12 @@ components: workCount: type: integer format: int32 + externalCareerList: + type: array + flavoredCategoryList: + type: array + flavoredDistrictList: + type: array UserIdRequest: type: object properties: @@ -2727,6 +2888,19 @@ components: type: boolean example: true + ModifyReviewRequest: + type: object + properties: + reviewId: + type: integer + example: 2 + reviewScore: + type: integer + example: 5 + reviewContent: + type: string + example: "일 잘하네여" + securitySchemes: JWT_TOKEN: type: http diff --git a/src/test/java/com/example/api/search/SearchIntegrationTest.java b/src/test/java/com/example/api/search/SearchIntegrationTest.java index 6ace3c64..438d14e6 100644 --- a/src/test/java/com/example/api/search/SearchIntegrationTest.java +++ b/src/test/java/com/example/api/search/SearchIntegrationTest.java @@ -1,65 +1,64 @@ -package com.example.api.search; - -import com.example.api.search.dto.SearchCommand; -import com.example.api.search.dto.SearchResponse; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.web.servlet.MockMvc; - -import java.time.LocalDateTime; -import java.util.List; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; - -@SpringBootTest -@AutoConfigureMockMvc -class SearchIntegrationTest { - - @Autowired - private MockMvc mockMvc; - - @Autowired - private SearchService searchService; - - @Test - void testSearchAccountsFromService() { - LocalDateTime startTime = LocalDateTime.of(2024, 11, 5, 9, 0); - LocalDateTime endTime = LocalDateTime.of(2024, 11, 5, 17, 0); - - SearchCommand command = new SearchCommand("IT Services", startTime, endTime); - - List results = searchService.searchAccounts(command); - - assertEquals(1, results.size()); - SearchResponse response = results.get(0); - assertEquals("John Doe", response.name()); - assertEquals("Male", response.sex()); - assertEquals(30, response.age()); - assertEquals(3.5f, response.starPoint()); - assertEquals(3, response.workCount()); - } - - @Test - void testSearchAccountsFromController() throws Exception { - mockMvc.perform(post("/api/search/search") - .contentType("application/json") - .content(""" - { - "category": "IT Services", - "startTime": "2024-11-05T09:00:00", - "endTime": "2024-11-05T17:00:00" - } - """)) - .andExpect(status().isOk()) - .andExpect(jsonPath("$[0].name").value("John Doe")) - .andExpect(jsonPath("$[0].sex").value("Male")) - .andExpect(jsonPath("$[0].age").value(30)) - .andExpect(jsonPath("$[0].starPoint").value(3.5)) - .andExpect(jsonPath("$[0].workCount").value(3)); - } -} +//package com.example.api.search; +// +//import com.example.api.search.dto.SearchCommand; +//import com.example.api.search.dto.SearchRequest; +//import com.example.api.search.dto.SearchResponse; +//import org.junit.jupiter.api.Test; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +//import org.springframework.boot.test.context.SpringBootTest; +//import org.springframework.test.web.servlet.MockMvc; +// +//import java.time.LocalDateTime; +//import java.util.List; +// +//import static org.junit.jupiter.api.Assertions.assertEquals; +//import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +//import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +//import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +// +//@SpringBootTest +//@AutoConfigureMockMvc +//class SearchIntegrationTest { +// +// @Autowired +// private MockMvc mockMvc; +// +// @Autowired +// private SearchService searchService; +// +// @Test +// void testSearchAccountsFromService() { +// LocalDateTime startTime = LocalDateTime.of(2024, 11, 5, 9, 0); +// LocalDateTime endTime = LocalDateTime.of(2024, 11, 5, 17, 0); +// +// List results = searchService.searchAccounts(new SearchRequest("sido")); +// +// assertEquals(1, results.size()); +// SearchResponse response = results.get(0); +// assertEquals("John Doe", response.name()); +// assertEquals("Male", response.sex()); +// assertEquals(30, response.age()); +// assertEquals(3.5f, response.starPoint()); +// assertEquals(3, response.workCount()); +// } +// +// @Test +// void testSearchAccountsFromController() throws Exception { +// mockMvc.perform(post("/api/search/search") +// .contentType("application/json") +// .content(""" +// { +// "category": "IT Services", +// "startTime": "2024-11-05T09:00:00", +// "endTime": "2024-11-05T17:00:00" +// } +// """)) +// .andExpect(status().isOk()) +// .andExpect(jsonPath("$[0].name").value("John Doe")) +// .andExpect(jsonPath("$[0].sex").value("Male")) +// .andExpect(jsonPath("$[0].age").value(30)) +// .andExpect(jsonPath("$[0].starPoint").value(3.5)) +// .andExpect(jsonPath("$[0].workCount").value(3)); +// } +//} From 0b3272d7e44d653c3d0010c607fcb9c62e61c955 Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Fri, 7 Mar 2025 10:52:40 +0900 Subject: [PATCH 276/276] review, search no permission accept --- .../api/announcement/AnnouncementService.java | 4 +- .../api/board/controller/BoardController.java | 16 +++++- .../repository/PossibleBoardRepository.java | 7 +-- .../api/board/service/BoardService.java | 8 +++ .../api/contracts/ReviewQueryService.java | 2 +- .../api/global/config/SecurityConfig.java | 5 +- .../filter/JwtAuthenticationFilter.java | 10 +++- .../ReviewCustomRepositoryImpl.java | 1 + .../api/review/service/ReviewService.java | 6 +- .../AccountCustomRepositoryImpl.java | 1 + src/main/resources/static/swagger.yaml | 56 +++++++++++++++++-- 11 files changed, 94 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/example/api/announcement/AnnouncementService.java b/src/main/java/com/example/api/announcement/AnnouncementService.java index bc79a838..be2d2d66 100644 --- a/src/main/java/com/example/api/announcement/AnnouncementService.java +++ b/src/main/java/com/example/api/announcement/AnnouncementService.java @@ -35,7 +35,7 @@ public AnnouncementResponse createAnnouncement( @Transactional public List getAllAnnouncements(final PageNumberRequest pageRequest) { - Pageable pageable = PageRequest.of(pageRequest.page()-1, 20, Sort.by("createdDate").descending()); + Pageable pageable = PageRequest.of(pageRequest.page()-1, 20, Sort.by(Sort.Direction.DESC, "createdDate")); Page announcements = announcementRepository.findAllByOrderByCreatedDateDesc(pageable); return announcements.getContent().stream() .map(AnnouncementResponse::new) @@ -76,7 +76,7 @@ public List searchAnnouncements( @Validated final String keyword, final PageNumberRequest pageRequest ) { - Pageable pageable = PageRequest.of(pageRequest.page()-1, 20, Sort.by("createdDate").descending()); + Pageable pageable = PageRequest.of(pageRequest.page()-1, 20, Sort.by(Sort.Direction.DESC,"createdDate")); final Page announcements = announcementRepository.findByAnnouncementTitleContaining(keyword, pageable); return announcements.getContent().stream() .map(AnnouncementResponse::new) diff --git a/src/main/java/com/example/api/board/controller/BoardController.java b/src/main/java/com/example/api/board/controller/BoardController.java index eea26c2f..eac73bf1 100644 --- a/src/main/java/com/example/api/board/controller/BoardController.java +++ b/src/main/java/com/example/api/board/controller/BoardController.java @@ -106,13 +106,25 @@ public ResponseEntity> updateExternalCareers( } @PostMapping("/work-hours") - public ResponseEntity updatePossibleTimes( + public ResponseEntity> updatePossibleTimes( @RequestBody final AddPossibleTimeRequest addPossibleTimeRequest, @AuthenticationPrincipal final Long requestMemberId ) { final AddPossibleTimeCommand addPossibleTimeCommand = addPossibleTimeRequest.toCommand(requestMemberId); boardService.addPossibleBoard(addPossibleTimeCommand); - return ResponseEntity.ok().build(); + List workHours = boardService.getWorkHours(new EmployeeIdRequest(requestMemberId)); + return ResponseEntity.ok(workHours); + } + + @PostMapping("/work-hours/delete") + public ResponseEntity> deletePossibleTimes( + @RequestBody final AddPossibleTimeRequest addPossibleTimeRequest, + @AuthenticationPrincipal final Long requestMemberId + ) { + final AddPossibleTimeCommand addPossibleTimeCommand = addPossibleTimeRequest.toCommand(requestMemberId); + boardService.deletePossibleTimes(addPossibleTimeCommand); + List workHours = boardService.getWorkHours(new EmployeeIdRequest(requestMemberId)); + return ResponseEntity.ok(workHours); } @PostMapping() diff --git a/src/main/java/com/example/api/board/repository/PossibleBoardRepository.java b/src/main/java/com/example/api/board/repository/PossibleBoardRepository.java index a9f0c9aa..9883cadf 100644 --- a/src/main/java/com/example/api/board/repository/PossibleBoardRepository.java +++ b/src/main/java/com/example/api/board/repository/PossibleBoardRepository.java @@ -1,12 +1,7 @@ package com.example.api.board.repository; -import com.example.api.board.dto.response.WorkHourResponse; -import com.example.api.domain.Category; -import com.example.api.domain.Contract; -import com.example.api.domain.ExternalCareer; import com.example.api.domain.PossibleBoard; -import java.time.LocalDate; import java.time.LocalDateTime; import java.util.List; import java.util.Optional; @@ -21,7 +16,7 @@ public interface PossibleBoardRepository extends JpaRepository { @Modifying @Query("DELETE FROM PossibleBoard possible WHERE (possible.startTime <= :endDateTime AND possible.endTime >= :startDateTime)") - Integer deleteDuplicatedWorkTimeIncluded(@Param("startDateTime") final LocalDateTime startDateTimeIncluded, + void deleteDuplicatedWorkTimeIncluded(@Param("startDateTime") final LocalDateTime startDateTimeIncluded, @Param("endDateTime") final LocalDateTime endDateTimeIncluded); @Query("select p from PossibleBoard p where p.employee.accountId = :employeeId and p.startTime >= :currentMonth") diff --git a/src/main/java/com/example/api/board/service/BoardService.java b/src/main/java/com/example/api/board/service/BoardService.java index e9d90564..927c4fdf 100644 --- a/src/main/java/com/example/api/board/service/BoardService.java +++ b/src/main/java/com/example/api/board/service/BoardService.java @@ -211,4 +211,12 @@ public IntroductionResponse postIntroduction( accountRepository.save(user); return new IntroductionResponse(request.introduction()); } + + @Transactional + public void deletePossibleTimes(AddPossibleTimeCommand addPossibleTimeCommand) { + final List possibleTimes = addPossibleTimeCommand.possibleTimes().stream() + .map(possibleTimeRange -> new PossibleTime(possibleTimeRange.startTime(), possibleTimeRange.endTime())) + .collect(Collectors.toList()); + deleteDuplicatedPeriod(possibleTimes); + } } \ No newline at end of file diff --git a/src/main/java/com/example/api/contracts/ReviewQueryService.java b/src/main/java/com/example/api/contracts/ReviewQueryService.java index 72284b8a..43caddf8 100644 --- a/src/main/java/com/example/api/contracts/ReviewQueryService.java +++ b/src/main/java/com/example/api/contracts/ReviewQueryService.java @@ -23,7 +23,7 @@ public List loadReviewsWithEmployerId( final QueryEmployersReviewCommand command, final PageNumberRequest pageNumberRequest ) { - Pageable pageable = PageRequest.of(pageNumberRequest.page()-1, 15, Sort.by("createdDate").descending()); + Pageable pageable = PageRequest.of(pageNumberRequest.page()-1, 15, Sort.by(Sort.Direction.DESC,"createdDate")); return reviewRepository.loadReviewsByEmployerId(command.employerId(), pageable).getContent() .stream() .map(ReviewResponse::from) 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 88984e64..c2af82aa 100644 --- a/src/main/java/com/example/api/global/config/SecurityConfig.java +++ b/src/main/java/com/example/api/global/config/SecurityConfig.java @@ -60,7 +60,7 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http, JwtTokenProvid .requestMatchers("/api/v1/auth/login", "/api/v1/auth/refresh","/oauth2/**").permitAll() // 로그인 & OAuth2 허용 .requestMatchers("/error", "/favicon.ico", "/**/*.png", "/**/*.gif", "/**/*.webp", "/**/*.svg", "/**/*.jpg", "/**/*.html", "/**/*.css", "/**/*.js").permitAll() // 정적 리소스 허용 - .requestMatchers("/api/v1/account/**", "/aws", "/health", "/error").permitAll() // 특정 API 엔드포인트 허용 + .requestMatchers("/api/v1/account/**", "/aws", "/api/v1/review", "/api/search/search", "/health", "/error").permitAll() // 특정 API 엔드포인트 허용 .requestMatchers("/api/v1/possible-board", "/api/v1/possible-board/**").hasRole("EMPLOYEE") .anyRequest().authenticated() // 그 외 모든 요청은 인증 필요 ) @@ -83,7 +83,8 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http, JwtTokenProvid @Bean public CorsConfigurationSource corsConfigurationSource() { CorsConfiguration corsConfiguration = new CorsConfiguration(); - corsConfiguration.setAllowedOrigins(List.of("http://localhost:3000", "http://localhost:8080", "https://www.danpat.store", "http://127.0.0.1:5500", "https://jiangxy.github.io")); + corsConfiguration.setAllowedOrigins(List.of("http://localhost:3000", "http://localhost:8080", "https://www.danpat.store", + "http://127.0.0.1:5500", "https://jiangxy.github.io", "https://kauth.kakao.com")); corsConfiguration.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE", "OPTIONS")); corsConfiguration.setAllowedHeaders(Arrays.asList("Authorization", "Content-Type")); corsConfiguration.setAllowCredentials(true); diff --git a/src/main/java/com/example/api/global/config/filter/JwtAuthenticationFilter.java b/src/main/java/com/example/api/global/config/filter/JwtAuthenticationFilter.java index a3eaf5d1..c65ad462 100644 --- a/src/main/java/com/example/api/global/config/filter/JwtAuthenticationFilter.java +++ b/src/main/java/com/example/api/global/config/filter/JwtAuthenticationFilter.java @@ -18,6 +18,7 @@ import org.springframework.web.filter.OncePerRequestFilter; import java.io.IOException; +import java.util.List; import java.util.Map; @Component @@ -68,6 +69,13 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse @Override protected boolean shouldNotFilter(HttpServletRequest request) { String path = request.getRequestURI(); - return path.startsWith("/api/v1/account/") || path.startsWith("/api/v1/auth/login"); + List notFilterURIs = List.of("/api/v1/review", "/api/search/search"); + + if (notFilterURIs.stream().anyMatch(path::equals)) { + return true; + } + + return path.startsWith("/api/v1/account") || path.startsWith("/api/v1/auth/login"); } + } diff --git a/src/main/java/com/example/api/review/repository/ReviewCustomRepositoryImpl.java b/src/main/java/com/example/api/review/repository/ReviewCustomRepositoryImpl.java index 1c084945..c18357b0 100644 --- a/src/main/java/com/example/api/review/repository/ReviewCustomRepositoryImpl.java +++ b/src/main/java/com/example/api/review/repository/ReviewCustomRepositoryImpl.java @@ -53,6 +53,7 @@ public Page findReviews(String nickname, Pageable pageable) { .where(nicknameContains(nickname)) .offset(pageable.getOffset()) .limit(pageable.getPageSize()) + .orderBy(review.createdDate.desc()) .fetch(); long total = Optional.ofNullable(queryFactory diff --git a/src/main/java/com/example/api/review/service/ReviewService.java b/src/main/java/com/example/api/review/service/ReviewService.java index f0fbdc5f..c19cbefc 100644 --- a/src/main/java/com/example/api/review/service/ReviewService.java +++ b/src/main/java/com/example/api/review/service/ReviewService.java @@ -28,7 +28,7 @@ public class ReviewService { @Transactional(readOnly = true) // 리뷰 전체 조회 public List getAllReviews(final String nickname, final PageNumberRequest pageNumberRequest) { - Pageable pageable = PageRequest.of(pageNumberRequest.page()-1 , 15, Sort.by("createdDate").descending()); + Pageable pageable = PageRequest.of(pageNumberRequest.page()-1 , 15, Sort.by(Sort.Direction.DESC, "createdDate")); return reviewRepository.findReviews(nickname, pageable).getContent(); } @@ -45,7 +45,7 @@ public List getMyReviews( @Validated final EmployeeIdRequest employeeIdRequest, final PageNumberRequest pageNumberRequest ) { - Pageable pageable = PageRequest.of(pageNumberRequest.page()-1 , 15, Sort.by("createdDate").descending()); + Pageable pageable = PageRequest.of(pageNumberRequest.page()-1 , 15, Sort.by(Sort.Direction.DESC,"createdDate")); return reviewRepository.findAllByEmployee_AccountId(employeeIdRequest.employeeId(), pageable).stream() .map(ReviewResponse::from) .toList(); @@ -55,7 +55,7 @@ public List getMyReviews( public List getAvailableReviewTargets( final ReviewAvailableCommand command, final PageNumberRequest pageNumberRequest) { - Pageable pageable = PageRequest.of(pageNumberRequest.page()-1 , 15, Sort.by("createdDate").descending()); + Pageable pageable = PageRequest.of(pageNumberRequest.page()-1 , 15, Sort.by(Sort.Direction.DESC,"createdDate")); return contractRepository.findAvailableReviewsByBusinessId(command.businessId(), pageable).getContent(); } } \ No newline at end of file diff --git a/src/main/java/com/example/api/search/repository/AccountCustomRepositoryImpl.java b/src/main/java/com/example/api/search/repository/AccountCustomRepositoryImpl.java index db147282..8bad9f7d 100644 --- a/src/main/java/com/example/api/search/repository/AccountCustomRepositoryImpl.java +++ b/src/main/java/com/example/api/search/repository/AccountCustomRepositoryImpl.java @@ -50,6 +50,7 @@ public Page findAvailableMembersByLocationAndCategoryAndDateTime .groupBy(employee.accountId) .offset(pageable.getOffset()) .limit(pageable.getPageSize()) + .orderBy(employee.createdDate.desc()) .fetch(); long total = Optional.ofNullable(queryFactory diff --git a/src/main/resources/static/swagger.yaml b/src/main/resources/static/swagger.yaml index 4e161d34..5108201b 100644 --- a/src/main/resources/static/swagger.yaml +++ b/src/main/resources/static/swagger.yaml @@ -450,11 +450,57 @@ paths: schema: type: object example: - possibleTimes: - - startTime: "2025-02-10T09:00:00" - endTime: "2025-02-10T18:00:00" - - startTime: "2025-02-13T10:00:00" - endTime: "2025-02-13T19:00:00" + - id: 101 + title: null + startTime: "2024-02-01T09:00:00" + endTime: "2024-02-01T18:00:00" + status: "AVAILABLE" + - id: 102 + title: "김태영닷컴" + startTime: "2024-02-02T10:00:00" + endTime: "2024-02-02T19:00:00" + status: "COMPLETED" + /api/v1/possible-board/work-hours/delete: + post: + tags: + - BoardController + summary: "알바생이 근무 가능 시간 삭제 요청" + description: "알바생이 근무 가능 시간 삭제 요청" + operationId: deletePossibleTimes + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/AddPossibleTimeRequest" + example: + possibleTimes: + - startTime: "2025-02-10T09:00:00" + endTime: "2025-02-10T18:00:00" + - startTime: "2025-02-13T10:00:00" + endTime: "2025-02-13T19:00:00" + required: true + responses: + "200": + description: OK + content: + '*/*': + schema: + type: object + example: + - id: 101 + title: null + startTime: "2024-02-01T09:00:00" + endTime: "2024-02-01T18:00:00" + status: "AVAILABLE" + - id: 102 + title: "김태영닷컴" + startTime: "2024-02-02T10:00:00" + endTime: "2024-02-02T19:00:00" + status: "COMPLETED" + + + + /api/v1/possible-board/personal-info: get: tags: