From e7f1d1d310e4b6277e6170e09abc241ec4b4bae7 Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Wed, 29 Jan 2025 17:39:43 +0900 Subject: [PATCH 1/4] =?UTF-8?q?#103=20=EC=9D=B4=EB=A0=A5=EC=84=9C=20api=20?= =?UTF-8?q?6=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 5365d8154c2140236c42122aa960e761a4a757cc Mon Sep 17 00:00:00 2001 From: taeyeongKims Date: Wed, 29 Jan 2025 19:08:50 +0900 Subject: [PATCH 2/4] =?UTF-8?q?#103=EC=B2=B4=EA=B2=B0=EB=90=9C=20=EA=B3=84?= =?UTF-8?q?=C3=AC=20=C2=95=C2=BD=20=EC=8A=A4=EC=BC=80=EC=A5=B4=20=EA=B0=80?= =?UTF-8?q?=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 4df5a106291ef473e6359fa3506f8c548aaaaad1 Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Fri, 31 Jan 2025 17:39:15 +0900 Subject: [PATCH 3/4] . --- .../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 5c935d2c7af318c17df86bbfed724c9e12d225d8 Mon Sep 17 00:00:00 2001 From: taeyeongkims Date: Fri, 31 Jan 2025 17:45:24 +0900 Subject: [PATCH 4/4] 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); -}