From c5949a1820d03174b6c6e0d64e4203499d26c884 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B2=A8=EB=9D=BC?= Date: Wed, 14 May 2025 22:06:38 +0900 Subject: [PATCH 1/7] =?UTF-8?q?[#46]=20Feat:=20=EA=B5=AC=EC=A7=81=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=20=EC=A1=B0=ED=9A=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../parentsgowork/server/domain/{Bookmark.java => JobInfo.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/main/java/com/parentsgowork/server/domain/{Bookmark.java => JobInfo.java} (100%) diff --git a/src/main/java/com/parentsgowork/server/domain/Bookmark.java b/src/main/java/com/parentsgowork/server/domain/JobInfo.java similarity index 100% rename from src/main/java/com/parentsgowork/server/domain/Bookmark.java rename to src/main/java/com/parentsgowork/server/domain/JobInfo.java From 4301d323d7da2b9adb5c96922290481cbdf76c21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B2=A8=EB=9D=BC?= Date: Wed, 14 May 2025 22:06:51 +0900 Subject: [PATCH 2/7] =?UTF-8?q?[#46]=20Feat:=20=EA=B5=AC=EC=A7=81=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=20=EC=A1=B0=ED=9A=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../parentsgowork/server/domain/JobInfo.java | 28 ++------- .../com/parentsgowork/server/domain/User.java | 2 +- .../web/controller/JobInfoController.java | 61 +++++++++++++++++++ .../web/dto/JobInfoDTO/JobInfoRequestDTO.java | 19 ++++++ .../dto/JobInfoDTO/JobInfoResponseDTO.java | 40 ++++++++++++ 5 files changed, 126 insertions(+), 24 deletions(-) create mode 100644 src/main/java/com/parentsgowork/server/web/controller/JobInfoController.java create mode 100644 src/main/java/com/parentsgowork/server/web/dto/JobInfoDTO/JobInfoRequestDTO.java create mode 100644 src/main/java/com/parentsgowork/server/web/dto/JobInfoDTO/JobInfoResponseDTO.java diff --git a/src/main/java/com/parentsgowork/server/domain/JobInfo.java b/src/main/java/com/parentsgowork/server/domain/JobInfo.java index b9156be..f3794a9 100644 --- a/src/main/java/com/parentsgowork/server/domain/JobInfo.java +++ b/src/main/java/com/parentsgowork/server/domain/JobInfo.java @@ -11,7 +11,7 @@ @Builder @NoArgsConstructor(access = AccessLevel.PROTECTED) @AllArgsConstructor -public class Bookmark extends BaseEntity { +public class JobInfo extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -23,30 +23,12 @@ public class Bookmark extends BaseEntity { private User user; @Column - private Long jobId; + private String title; @Column - private String companyName; + private String content; - @Column - private String jobTitle; - - @Column - private String pay; - - @Column - private String time; - - @Column - private String location; - - @Column - private String deadline; - - @Column - private String registrationDate; - - @Column(columnDefinition = "TEXT") - private String detailUrl; +// @Column(columnDefinition = "TEXT") +// private String url; } diff --git a/src/main/java/com/parentsgowork/server/domain/User.java b/src/main/java/com/parentsgowork/server/domain/User.java index fadd674..b729607 100644 --- a/src/main/java/com/parentsgowork/server/domain/User.java +++ b/src/main/java/com/parentsgowork/server/domain/User.java @@ -63,7 +63,7 @@ public class User extends BaseEntity { private RefreshToken refreshToken; @OneToMany(mappedBy = "user", cascade = CascadeType.ALL) - private List bookmarks; + private List bookmarks; @OneToMany(mappedBy = "user", cascade = CascadeType.ALL) private List policyInfos; diff --git a/src/main/java/com/parentsgowork/server/web/controller/JobInfoController.java b/src/main/java/com/parentsgowork/server/web/controller/JobInfoController.java new file mode 100644 index 0000000..d17dee7 --- /dev/null +++ b/src/main/java/com/parentsgowork/server/web/controller/JobInfoController.java @@ -0,0 +1,61 @@ +package com.parentsgowork.server.web.controller; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.parentsgowork.server.web.dto.JobInfoDTO.JobInfoResponseDTO; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; +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 org.springframework.web.client.RestTemplate; + +import java.util.List; +import java.util.stream.Collectors; + +@Tag(name = "JobInfo", description = "구직정보 API") +@RestController +@RequiredArgsConstructor +@RequestMapping("/jobInfo") +public class JobInfoController { + + @Value("${seoul.openapi.key}") + private String apiKey; + + private final RestTemplate restTemplate = new RestTemplate(); + private final ObjectMapper objectMapper = new ObjectMapper(); + + @GetMapping("") + public ResponseEntity> getParsedJobInfo() { + int start = 1; + int end = 3; + String url = String.format( + "http://openapi.seoul.go.kr:8088/%s/json/GetJobInfo/%d/%d/", + apiKey, start, end + ); + + String rawJson = restTemplate.getForObject(url, String.class); + + try { + JobInfoResponseDTO response = objectMapper.readValue(rawJson, JobInfoResponseDTO.class); + + List resultList = + response.getJobInfo().getRow().stream() + .map(row -> JobInfoResponseDTO.SaveJobResultDTO.builder() + .title(row.getTitle()) + .content(row.getContent()) + .build()) + .collect(Collectors.toList()); + + + return ResponseEntity.ok(resultList); + + } catch (Exception e) { + return ResponseEntity.status(500).build(); + } + } + + +} diff --git a/src/main/java/com/parentsgowork/server/web/dto/JobInfoDTO/JobInfoRequestDTO.java b/src/main/java/com/parentsgowork/server/web/dto/JobInfoDTO/JobInfoRequestDTO.java new file mode 100644 index 0000000..c280790 --- /dev/null +++ b/src/main/java/com/parentsgowork/server/web/dto/JobInfoDTO/JobInfoRequestDTO.java @@ -0,0 +1,19 @@ +package com.parentsgowork.server.web.dto.JobInfoDTO; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +public class JobInfoRequestDTO { + + @Getter + @Builder + @NoArgsConstructor + @AllArgsConstructor + public static class SaveJobInfoDTO { + private String title; + private String content; + private String url; + } +} diff --git a/src/main/java/com/parentsgowork/server/web/dto/JobInfoDTO/JobInfoResponseDTO.java b/src/main/java/com/parentsgowork/server/web/dto/JobInfoDTO/JobInfoResponseDTO.java new file mode 100644 index 0000000..f0fa6ad --- /dev/null +++ b/src/main/java/com/parentsgowork/server/web/dto/JobInfoDTO/JobInfoResponseDTO.java @@ -0,0 +1,40 @@ +package com.parentsgowork.server.web.dto.JobInfoDTO; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.*; + +import java.util.List; + +@Getter +@JsonIgnoreProperties(ignoreUnknown = true) +public class JobInfoResponseDTO { + + @JsonProperty("GetJobInfo") + private JobInfoWrapper jobInfo; + + @Getter + @JsonIgnoreProperties(ignoreUnknown = true) + public static class JobInfoWrapper { + private List row; + } + + @Getter + @JsonIgnoreProperties(ignoreUnknown = true) + public static class Row { + @JsonProperty("JO_SJ") + private String title; + + @JsonProperty("DTY_CN") + private String content; + } + + @Getter + @Builder + @NoArgsConstructor + @AllArgsConstructor + public static class SaveJobResultDTO { + private String title; + private String content; + } +} From 479b0161df452ceef5275f0d2037731abb1d10f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B2=A8=EB=9D=BC?= Date: Wed, 14 May 2025 22:46:17 +0900 Subject: [PATCH 3/7] =?UTF-8?q?Feat:=20=EA=B5=AC=EC=A7=81=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=20=EB=B6=81=EB=A7=88=ED=81=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../apiPayload/exception/JobInfoCrawlingHandler.java | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 src/main/java/com/parentsgowork/server/apiPayload/exception/JobInfoCrawlingHandler.java diff --git a/src/main/java/com/parentsgowork/server/apiPayload/exception/JobInfoCrawlingHandler.java b/src/main/java/com/parentsgowork/server/apiPayload/exception/JobInfoCrawlingHandler.java deleted file mode 100644 index 55b8081..0000000 --- a/src/main/java/com/parentsgowork/server/apiPayload/exception/JobInfoCrawlingHandler.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.parentsgowork.server.apiPayload.exception; - -import com.parentsgowork.server.apiPayload.code.BaseErrorCode; - -public class JobInfoCrawlingHandler extends GeneralException { - public JobInfoCrawlingHandler(BaseErrorCode code) { - super(code); - } -} From 9568d96f07ee709882a75b9c8fecff2cfe29510b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B2=A8=EB=9D=BC?= Date: Wed, 14 May 2025 22:47:02 +0900 Subject: [PATCH 4/7] =?UTF-8?q?Feat:=20=EA=B5=AC=EC=A7=81=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=20=EB=B6=81=EB=A7=88=ED=81=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../apiPayload/code/status/ErrorStatus.java | 5 +- .../apiPayload/exception/JobInfoHandler.java | 9 ++++ .../server/converter/JobInfoConverter.java | 41 ++++++++++++++++ .../server/repository/JobInfoRepository.java | 17 +++++++ .../jobInfoService/JobInfoCommandService.java | 11 +++++ .../JobInfoCommandServiceImpl.java | 47 +++++++++++++++++++ .../jobInfoService/JobInfoQueryService.java | 4 ++ .../JobInfoQueryServiceImpl.java | 4 ++ .../web/controller/JobInfoController.java | 33 +++++++++---- .../specification/JobInfoSpecification.java | 34 ++++++++++++++ .../web/dto/JobInfoDTO/JobInfoRequestDTO.java | 1 - .../dto/JobInfoDTO/JobInfoResponseDTO.java | 29 +++++++++++- 12 files changed, 222 insertions(+), 13 deletions(-) create mode 100644 src/main/java/com/parentsgowork/server/apiPayload/exception/JobInfoHandler.java create mode 100644 src/main/java/com/parentsgowork/server/converter/JobInfoConverter.java create mode 100644 src/main/java/com/parentsgowork/server/repository/JobInfoRepository.java create mode 100644 src/main/java/com/parentsgowork/server/service/jobInfoService/JobInfoCommandService.java create mode 100644 src/main/java/com/parentsgowork/server/service/jobInfoService/JobInfoCommandServiceImpl.java create mode 100644 src/main/java/com/parentsgowork/server/service/jobInfoService/JobInfoQueryService.java create mode 100644 src/main/java/com/parentsgowork/server/service/jobInfoService/JobInfoQueryServiceImpl.java create mode 100644 src/main/java/com/parentsgowork/server/web/controller/specification/JobInfoSpecification.java diff --git a/src/main/java/com/parentsgowork/server/apiPayload/code/status/ErrorStatus.java b/src/main/java/com/parentsgowork/server/apiPayload/code/status/ErrorStatus.java index dc3fa6d..6fe5d19 100644 --- a/src/main/java/com/parentsgowork/server/apiPayload/code/status/ErrorStatus.java +++ b/src/main/java/com/parentsgowork/server/apiPayload/code/status/ErrorStatus.java @@ -46,8 +46,9 @@ public enum ErrorStatus implements BaseErrorCode { EMAIL_ENCODING_FAIL(HttpStatus.INTERNAL_SERVER_ERROR, "AUTH5002", "이메일 내용 인코딩에 실패했습니다."), // 북마크 관련 에러 - EDUCATION_INFO_NOT_FOUND(HttpStatus.NOT_FOUND, "BOOKMARK4001", "북마크한 교육정보가 존재하지 않습니다."), - POLICY_INFO_NOT_FOUND(HttpStatus.NOT_FOUND, "BOOKMARK4002", "북마크한 정책정보가 존재하지 않습니다."); + EDUCATION_INFO_NOT_FOUND(HttpStatus.NOT_FOUND, "BOOKMARK4001", "교육정보가 존재하지 않습니다."), + POLICY_INFO_NOT_FOUND(HttpStatus.NOT_FOUND, "BOOKMARK4002", "정책정보가 존재하지 않습니다."), + JOB_INFO_NOT_FOUND(HttpStatus.NOT_FOUND, "BOOKMARK4003", "구직정보가 존재하지 않습니다."); diff --git a/src/main/java/com/parentsgowork/server/apiPayload/exception/JobInfoHandler.java b/src/main/java/com/parentsgowork/server/apiPayload/exception/JobInfoHandler.java new file mode 100644 index 0000000..0c9316d --- /dev/null +++ b/src/main/java/com/parentsgowork/server/apiPayload/exception/JobInfoHandler.java @@ -0,0 +1,9 @@ +package com.parentsgowork.server.apiPayload.exception; + +import com.parentsgowork.server.apiPayload.code.BaseErrorCode; + +public class JobInfoHandler extends GeneralException { + public JobInfoHandler(BaseErrorCode code) { + super(code); + } +} diff --git a/src/main/java/com/parentsgowork/server/converter/JobInfoConverter.java b/src/main/java/com/parentsgowork/server/converter/JobInfoConverter.java new file mode 100644 index 0000000..efcd4e2 --- /dev/null +++ b/src/main/java/com/parentsgowork/server/converter/JobInfoConverter.java @@ -0,0 +1,41 @@ +package com.parentsgowork.server.converter; + +import com.parentsgowork.server.domain.JobInfo; +import com.parentsgowork.server.web.dto.JobInfoDTO.JobInfoResponseDTO; + +import java.util.List; +import java.util.stream.Collectors; + +public class JobInfoConverter { + + public static JobInfoResponseDTO.AddJobResultDTO toAddJobResultDTO(JobInfo jobInfo) { + return JobInfoResponseDTO.AddJobResultDTO.builder() + .title(jobInfo.getTitle()) + .content(jobInfo.getContent()) + .build(); + } + + public static List getJobInfoListDTO(List jobInfos) { + return jobInfos.stream() + .map(job -> JobInfoResponseDTO.JobInfoResultDTO.builder() + .title(job.getTitle()) + .content(job.getContent()) + .build()) + .collect(Collectors.toList()); + } + + public static JobInfoResponseDTO.JobInfoDetailDTO getJobInfoDetailDTO(JobInfo jobInfo) { + return JobInfoResponseDTO.JobInfoDetailDTO.builder() + .title(jobInfo.getTitle()) + .content(jobInfo.getContent()) + .build(); + } + + + public static JobInfoResponseDTO.DeleteJobInfoDTO DeleteJobInfoDTO(JobInfo jobInfo) { + return JobInfoResponseDTO.DeleteJobInfoDTO.builder() + .id(jobInfo.getId()) + .message("저장한 구직정보를 삭제하였습니다.") + .build(); + } +} diff --git a/src/main/java/com/parentsgowork/server/repository/JobInfoRepository.java b/src/main/java/com/parentsgowork/server/repository/JobInfoRepository.java new file mode 100644 index 0000000..f754ca2 --- /dev/null +++ b/src/main/java/com/parentsgowork/server/repository/JobInfoRepository.java @@ -0,0 +1,17 @@ +package com.parentsgowork.server.repository; + +import com.parentsgowork.server.domain.JobInfo; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +import java.util.List; +import java.util.Optional; + +public interface JobInfoRepository extends JpaRepository { + @Query("SELECT ji FROM EducationInfo ji " + + "WHERE ji. user.id = :userId") + List findJobInfoList(@Param("userId") Long userId); + + Optional findByIdAndUserId(@Param("jobInfoId") Long jobInfoId, @Param("userId") Long userId); +} diff --git a/src/main/java/com/parentsgowork/server/service/jobInfoService/JobInfoCommandService.java b/src/main/java/com/parentsgowork/server/service/jobInfoService/JobInfoCommandService.java new file mode 100644 index 0000000..984ae8b --- /dev/null +++ b/src/main/java/com/parentsgowork/server/service/jobInfoService/JobInfoCommandService.java @@ -0,0 +1,11 @@ +package com.parentsgowork.server.service.jobInfoService; + +import com.parentsgowork.server.web.dto.JobInfoDTO.JobInfoRequestDTO; +import com.parentsgowork.server.web.dto.JobInfoDTO.JobInfoResponseDTO; + +import java.util.List; + +public interface JobInfoCommandService { + + List addJobInfo(Long userId, List saveJobInfoDTOList); +} diff --git a/src/main/java/com/parentsgowork/server/service/jobInfoService/JobInfoCommandServiceImpl.java b/src/main/java/com/parentsgowork/server/service/jobInfoService/JobInfoCommandServiceImpl.java new file mode 100644 index 0000000..b3d47a5 --- /dev/null +++ b/src/main/java/com/parentsgowork/server/service/jobInfoService/JobInfoCommandServiceImpl.java @@ -0,0 +1,47 @@ +package com.parentsgowork.server.service.jobInfoService; + +import com.parentsgowork.server.apiPayload.code.status.ErrorStatus; +import com.parentsgowork.server.apiPayload.exception.JobInfoHandler; +import com.parentsgowork.server.converter.JobInfoConverter; +import com.parentsgowork.server.domain.JobInfo; +import com.parentsgowork.server.domain.User; +import com.parentsgowork.server.repository.JobInfoRepository; +import com.parentsgowork.server.repository.UserRepository; +import com.parentsgowork.server.web.dto.JobInfoDTO.JobInfoRequestDTO; +import com.parentsgowork.server.web.dto.JobInfoDTO.JobInfoResponseDTO; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.stream.Collectors; + +@Service +@RequiredArgsConstructor +@Slf4j +public class JobInfoCommandServiceImpl implements JobInfoCommandService { + + private final UserRepository userRepository; + private final JobInfoRepository jobInfoRepository; + + @Override + public List addJobInfo(Long userId, List saveJobInfoDTOList) { + User user = userRepository.findById(userId) + .orElseThrow(() -> new JobInfoHandler(ErrorStatus.USER_NOT_FOUND)); + + List jobInfos = saveJobInfoDTOList.stream() + .map(dto -> JobInfo.builder() + .title(dto.getTitle()) + .content(dto.getContent()) + .user(user) + .build()) + .collect(Collectors.toList()); + + jobInfoRepository.saveAll(jobInfos); + + return jobInfos.stream() + .map(JobInfoConverter::toAddJobResultDTO) + .collect(Collectors.toList()); + } + +} diff --git a/src/main/java/com/parentsgowork/server/service/jobInfoService/JobInfoQueryService.java b/src/main/java/com/parentsgowork/server/service/jobInfoService/JobInfoQueryService.java new file mode 100644 index 0000000..f64a545 --- /dev/null +++ b/src/main/java/com/parentsgowork/server/service/jobInfoService/JobInfoQueryService.java @@ -0,0 +1,4 @@ +package com.parentsgowork.server.service.jobInfoService; + +public interface JobInfoQueryService { +} diff --git a/src/main/java/com/parentsgowork/server/service/jobInfoService/JobInfoQueryServiceImpl.java b/src/main/java/com/parentsgowork/server/service/jobInfoService/JobInfoQueryServiceImpl.java new file mode 100644 index 0000000..91b6c41 --- /dev/null +++ b/src/main/java/com/parentsgowork/server/service/jobInfoService/JobInfoQueryServiceImpl.java @@ -0,0 +1,4 @@ +package com.parentsgowork.server.service.jobInfoService; + +public class JobInfoQueryServiceImpl { +} diff --git a/src/main/java/com/parentsgowork/server/web/controller/JobInfoController.java b/src/main/java/com/parentsgowork/server/web/controller/JobInfoController.java index d17dee7..a9e0627 100644 --- a/src/main/java/com/parentsgowork/server/web/controller/JobInfoController.java +++ b/src/main/java/com/parentsgowork/server/web/controller/JobInfoController.java @@ -1,15 +1,18 @@ package com.parentsgowork.server.web.controller; import com.fasterxml.jackson.databind.ObjectMapper; +import com.parentsgowork.server.apiPayload.ApiResponse; +import com.parentsgowork.server.service.jobInfoService.JobInfoCommandService; +import com.parentsgowork.server.web.controller.specification.JobInfoSpecification; +import com.parentsgowork.server.web.dto.JobInfoDTO.JobInfoRequestDTO; import com.parentsgowork.server.web.dto.JobInfoDTO.JobInfoResponseDTO; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Value; 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 org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.web.bind.annotation.*; import org.springframework.web.client.RestTemplate; import java.util.List; @@ -19,7 +22,7 @@ @RestController @RequiredArgsConstructor @RequestMapping("/jobInfo") -public class JobInfoController { +public class JobInfoController implements JobInfoSpecification { @Value("${seoul.openapi.key}") private String apiKey; @@ -27,8 +30,10 @@ public class JobInfoController { private final RestTemplate restTemplate = new RestTemplate(); private final ObjectMapper objectMapper = new ObjectMapper(); - @GetMapping("") - public ResponseEntity> getParsedJobInfo() { + private final JobInfoCommandService jobInfoCommandService; + + @GetMapping("/search") + public ResponseEntity> getParsedJobInfo() { int start = 1; int end = 3; String url = String.format( @@ -41,9 +46,9 @@ public ResponseEntity> getParsedJobInf try { JobInfoResponseDTO response = objectMapper.readValue(rawJson, JobInfoResponseDTO.class); - List resultList = + List resultList = response.getJobInfo().getRow().stream() - .map(row -> JobInfoResponseDTO.SaveJobResultDTO.builder() + .map(row -> JobInfoResponseDTO.JobInfoResultDTO.builder() .title(row.getTitle()) .content(row.getContent()) .build()) @@ -57,5 +62,15 @@ public ResponseEntity> getParsedJobInf } } + @PostMapping("/add") + public ApiResponse> addJobInfo(@RequestBody List saveJobInfoDTOList) { + + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + Long userId = (Long) authentication.getPrincipal(); + + List response = jobInfoCommandService.addJobInfo(userId, saveJobInfoDTOList); + return ApiResponse.onSuccess(response); + } + } diff --git a/src/main/java/com/parentsgowork/server/web/controller/specification/JobInfoSpecification.java b/src/main/java/com/parentsgowork/server/web/controller/specification/JobInfoSpecification.java new file mode 100644 index 0000000..1b85329 --- /dev/null +++ b/src/main/java/com/parentsgowork/server/web/controller/specification/JobInfoSpecification.java @@ -0,0 +1,34 @@ +package com.parentsgowork.server.web.controller.specification; + +import com.parentsgowork.server.apiPayload.ApiResponse; +import com.parentsgowork.server.web.dto.JobInfoDTO.JobInfoRequestDTO; +import com.parentsgowork.server.web.dto.JobInfoDTO.JobInfoResponseDTO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestBody; + +import java.util.List; + +public interface JobInfoSpecification { + + @GetMapping("/search") + @Operation(summary = "구직정보 저장", description = "저장하고 싶은 구직정보의 title과 content값을 보내주세요.") + @ApiResponses({ + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "COMMON200", description = "⭕ SUCCESS, 성공"), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "COMMON400", description = "❌ BAD, 잘못된 요청", content = @Content(schema = @Schema(implementation = ApiResponse.class))) + }) + ResponseEntity> getParsedJobInfo(); + + @GetMapping("/add") + @Operation(summary = "구직정보 저장", description = "저장하고 싶은 구직정보의 title과 content값을 보내주세요.") + @ApiResponses({ + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "COMMON200", description = "⭕ SUCCESS, 성공"), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "COMMON400", description = "❌ BAD, 잘못된 요청", content = @Content(schema = @Schema(implementation = ApiResponse.class))) + }) + ApiResponse> addJobInfo(@RequestBody List saveJobInfoDTOList); + +} diff --git a/src/main/java/com/parentsgowork/server/web/dto/JobInfoDTO/JobInfoRequestDTO.java b/src/main/java/com/parentsgowork/server/web/dto/JobInfoDTO/JobInfoRequestDTO.java index c280790..b5c4e7c 100644 --- a/src/main/java/com/parentsgowork/server/web/dto/JobInfoDTO/JobInfoRequestDTO.java +++ b/src/main/java/com/parentsgowork/server/web/dto/JobInfoDTO/JobInfoRequestDTO.java @@ -14,6 +14,5 @@ public class JobInfoRequestDTO { public static class SaveJobInfoDTO { private String title; private String content; - private String url; } } diff --git a/src/main/java/com/parentsgowork/server/web/dto/JobInfoDTO/JobInfoResponseDTO.java b/src/main/java/com/parentsgowork/server/web/dto/JobInfoDTO/JobInfoResponseDTO.java index f0fa6ad..3fb0679 100644 --- a/src/main/java/com/parentsgowork/server/web/dto/JobInfoDTO/JobInfoResponseDTO.java +++ b/src/main/java/com/parentsgowork/server/web/dto/JobInfoDTO/JobInfoResponseDTO.java @@ -33,8 +33,35 @@ public static class Row { @Builder @NoArgsConstructor @AllArgsConstructor - public static class SaveJobResultDTO { + public static class JobInfoResultDTO { private String title; private String content; } + + @Getter + @Builder + @NoArgsConstructor + @AllArgsConstructor + public static class AddJobResultDTO { + private String title; + private String content; + } + + @Getter + @Builder + @NoArgsConstructor + @AllArgsConstructor + public static class JobInfoDetailDTO { + private String title; + private String content; + } + + @Getter + @Builder + @NoArgsConstructor + @AllArgsConstructor + public static class DeleteJobInfoDTO { + private Long id; + private String message; + } } From a3ccb643aa8782827c2ce5fedce64cafbfca0350 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B2=A8=EB=9D=BC?= Date: Wed, 14 May 2025 22:51:28 +0900 Subject: [PATCH 5/7] =?UTF-8?q?Refactor:=20=EA=B5=AC=EC=A7=81=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=20=EB=AA=85=EC=84=B8=EC=84=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/controller/specification/JobInfoSpecification.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/parentsgowork/server/web/controller/specification/JobInfoSpecification.java b/src/main/java/com/parentsgowork/server/web/controller/specification/JobInfoSpecification.java index 1b85329..5241f7d 100644 --- a/src/main/java/com/parentsgowork/server/web/controller/specification/JobInfoSpecification.java +++ b/src/main/java/com/parentsgowork/server/web/controller/specification/JobInfoSpecification.java @@ -16,7 +16,7 @@ public interface JobInfoSpecification { @GetMapping("/search") - @Operation(summary = "구직정보 저장", description = "저장하고 싶은 구직정보의 title과 content값을 보내주세요.") + @Operation(summary = "구직정보 조회", description = "구직정보를 조회합니다.") @ApiResponses({ @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "COMMON200", description = "⭕ SUCCESS, 성공"), @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "COMMON400", description = "❌ BAD, 잘못된 요청", content = @Content(schema = @Schema(implementation = ApiResponse.class))) From c2e33b51dcbe10f1748db783e43c5307f81e08cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B2=A8=EB=9D=BC?= Date: Wed, 14 May 2025 22:55:01 +0900 Subject: [PATCH 6/7] =?UTF-8?q?=EA=B5=AC=EC=A7=81=EC=A0=95=EB=B3=B4=20dto?= =?UTF-8?q?=20=EC=84=A4=EB=AA=85=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/web/dto/JobInfoDTO/JobInfoRequestDTO.java | 1 + .../server/web/dto/JobInfoDTO/JobInfoResponseDTO.java | 2 ++ 2 files changed, 3 insertions(+) diff --git a/src/main/java/com/parentsgowork/server/web/dto/JobInfoDTO/JobInfoRequestDTO.java b/src/main/java/com/parentsgowork/server/web/dto/JobInfoDTO/JobInfoRequestDTO.java index b5c4e7c..4027b55 100644 --- a/src/main/java/com/parentsgowork/server/web/dto/JobInfoDTO/JobInfoRequestDTO.java +++ b/src/main/java/com/parentsgowork/server/web/dto/JobInfoDTO/JobInfoRequestDTO.java @@ -7,6 +7,7 @@ public class JobInfoRequestDTO { + // 구직정보 저장 시 dto @Getter @Builder @NoArgsConstructor diff --git a/src/main/java/com/parentsgowork/server/web/dto/JobInfoDTO/JobInfoResponseDTO.java b/src/main/java/com/parentsgowork/server/web/dto/JobInfoDTO/JobInfoResponseDTO.java index 3fb0679..459192f 100644 --- a/src/main/java/com/parentsgowork/server/web/dto/JobInfoDTO/JobInfoResponseDTO.java +++ b/src/main/java/com/parentsgowork/server/web/dto/JobInfoDTO/JobInfoResponseDTO.java @@ -47,6 +47,7 @@ public static class AddJobResultDTO { private String content; } + // 저장한 구직정보 상세페이지 dto @Getter @Builder @NoArgsConstructor @@ -56,6 +57,7 @@ public static class JobInfoDetailDTO { private String content; } + // 저장한 구직정보 삭제 dto @Getter @Builder @NoArgsConstructor From 0eec4019b6b6e4d18d5eab04a9bbb8584d7429bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B2=A8=EB=9D=BC?= Date: Wed, 14 May 2025 23:25:53 +0900 Subject: [PATCH 7/7] =?UTF-8?q?Feat:=20=EB=82=B4=EA=B0=80=20=EC=A0=80?= =?UTF-8?q?=EC=9E=A5=ED=95=9C=20=EA=B5=AC=EC=A7=81=EC=A0=95=EB=B3=B4=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/repository/JobInfoRepository.java | 2 +- .../jobInfoService/JobInfoCommandService.java | 3 ++ .../JobInfoCommandServiceImpl.java | 14 +++++++ .../jobInfoService/JobInfoQueryService.java | 7 ++++ .../JobInfoQueryServiceImpl.java | 38 ++++++++++++++++++- .../web/controller/JobInfoController.java | 28 ++++++++++++++ .../specification/JobInfoSpecification.java | 27 +++++++++++++ 7 files changed, 117 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/parentsgowork/server/repository/JobInfoRepository.java b/src/main/java/com/parentsgowork/server/repository/JobInfoRepository.java index f754ca2..a6a0c4c 100644 --- a/src/main/java/com/parentsgowork/server/repository/JobInfoRepository.java +++ b/src/main/java/com/parentsgowork/server/repository/JobInfoRepository.java @@ -9,7 +9,7 @@ import java.util.Optional; public interface JobInfoRepository extends JpaRepository { - @Query("SELECT ji FROM EducationInfo ji " + + @Query("SELECT ji FROM JobInfo ji " + "WHERE ji. user.id = :userId") List findJobInfoList(@Param("userId") Long userId); diff --git a/src/main/java/com/parentsgowork/server/service/jobInfoService/JobInfoCommandService.java b/src/main/java/com/parentsgowork/server/service/jobInfoService/JobInfoCommandService.java index 984ae8b..5758d7b 100644 --- a/src/main/java/com/parentsgowork/server/service/jobInfoService/JobInfoCommandService.java +++ b/src/main/java/com/parentsgowork/server/service/jobInfoService/JobInfoCommandService.java @@ -8,4 +8,7 @@ public interface JobInfoCommandService { List addJobInfo(Long userId, List saveJobInfoDTOList); + + JobInfoResponseDTO.DeleteJobInfoDTO delete(Long userId, Long jobInfoId); + } diff --git a/src/main/java/com/parentsgowork/server/service/jobInfoService/JobInfoCommandServiceImpl.java b/src/main/java/com/parentsgowork/server/service/jobInfoService/JobInfoCommandServiceImpl.java index b3d47a5..5dcce22 100644 --- a/src/main/java/com/parentsgowork/server/service/jobInfoService/JobInfoCommandServiceImpl.java +++ b/src/main/java/com/parentsgowork/server/service/jobInfoService/JobInfoCommandServiceImpl.java @@ -44,4 +44,18 @@ public List addJobInfo(Long userId, List new JobInfoHandler(ErrorStatus.USER_NOT_FOUND)); + + JobInfo jobInfo = jobInfoRepository.findByIdAndUserId(jobInfoId, userId) + .orElseThrow(() -> new JobInfoHandler(ErrorStatus.JOB_INFO_NOT_FOUND)); + + jobInfoRepository.deleteById(jobInfoId); + + return JobInfoConverter.DeleteJobInfoDTO(jobInfo); + } + } diff --git a/src/main/java/com/parentsgowork/server/service/jobInfoService/JobInfoQueryService.java b/src/main/java/com/parentsgowork/server/service/jobInfoService/JobInfoQueryService.java index f64a545..327d575 100644 --- a/src/main/java/com/parentsgowork/server/service/jobInfoService/JobInfoQueryService.java +++ b/src/main/java/com/parentsgowork/server/service/jobInfoService/JobInfoQueryService.java @@ -1,4 +1,11 @@ package com.parentsgowork.server.service.jobInfoService; +import com.parentsgowork.server.web.dto.JobInfoDTO.JobInfoResponseDTO; + +import java.util.List; + public interface JobInfoQueryService { + + List getJobInfoList(Long userId); + JobInfoResponseDTO.JobInfoDetailDTO getJobInfoDetails(Long userId, Long jobInfoId); } diff --git a/src/main/java/com/parentsgowork/server/service/jobInfoService/JobInfoQueryServiceImpl.java b/src/main/java/com/parentsgowork/server/service/jobInfoService/JobInfoQueryServiceImpl.java index 91b6c41..ca384d8 100644 --- a/src/main/java/com/parentsgowork/server/service/jobInfoService/JobInfoQueryServiceImpl.java +++ b/src/main/java/com/parentsgowork/server/service/jobInfoService/JobInfoQueryServiceImpl.java @@ -1,4 +1,40 @@ package com.parentsgowork.server.service.jobInfoService; -public class JobInfoQueryServiceImpl { +import com.parentsgowork.server.apiPayload.code.status.ErrorStatus; +import com.parentsgowork.server.apiPayload.exception.JobInfoHandler; +import com.parentsgowork.server.converter.JobInfoConverter; +import com.parentsgowork.server.domain.JobInfo; +import com.parentsgowork.server.repository.JobInfoRepository; +import com.parentsgowork.server.web.dto.JobInfoDTO.JobInfoResponseDTO; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@RequiredArgsConstructor +public class JobInfoQueryServiceImpl implements JobInfoQueryService { + + private final JobInfoRepository jobInfoRepository; + + @Override + public List getJobInfoList(Long userId) { + + List jobInfos = jobInfoRepository.findJobInfoList(userId); + + if(jobInfos == null || jobInfos.isEmpty()) { + throw new JobInfoHandler(ErrorStatus.JOB_INFO_NOT_FOUND); + } + + return JobInfoConverter.getJobInfoListDTO(jobInfos); + } + + @Override + public JobInfoResponseDTO.JobInfoDetailDTO getJobInfoDetails(Long userId, Long jobInfoId) { + + JobInfo jobInfo = jobInfoRepository.findByIdAndUserId(jobInfoId, userId) + .orElseThrow(() -> new JobInfoHandler(ErrorStatus.JOB_INFO_NOT_FOUND)); + + return JobInfoConverter.getJobInfoDetailDTO(jobInfo); + } } diff --git a/src/main/java/com/parentsgowork/server/web/controller/JobInfoController.java b/src/main/java/com/parentsgowork/server/web/controller/JobInfoController.java index a9e0627..943fa78 100644 --- a/src/main/java/com/parentsgowork/server/web/controller/JobInfoController.java +++ b/src/main/java/com/parentsgowork/server/web/controller/JobInfoController.java @@ -3,6 +3,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.parentsgowork.server.apiPayload.ApiResponse; import com.parentsgowork.server.service.jobInfoService.JobInfoCommandService; +import com.parentsgowork.server.service.jobInfoService.JobInfoQueryService; import com.parentsgowork.server.web.controller.specification.JobInfoSpecification; import com.parentsgowork.server.web.dto.JobInfoDTO.JobInfoRequestDTO; import com.parentsgowork.server.web.dto.JobInfoDTO.JobInfoResponseDTO; @@ -31,6 +32,7 @@ public class JobInfoController implements JobInfoSpecification { private final ObjectMapper objectMapper = new ObjectMapper(); private final JobInfoCommandService jobInfoCommandService; + private final JobInfoQueryService jobInfoQueryService; @GetMapping("/search") public ResponseEntity> getParsedJobInfo() { @@ -72,5 +74,31 @@ public ApiResponse> addJobInfo(@Request return ApiResponse.onSuccess(response); } + @GetMapping("") + public ApiResponse> getJobInfoList() { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + Long userId = (Long) authentication.getPrincipal(); + + List response = jobInfoQueryService.getJobInfoList(userId); + return ApiResponse.onSuccess(response); + } + + @GetMapping("/{jobInfoId}") + public ApiResponse getJobInfoDetails(@PathVariable Long jobInfoId) { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + Long userId = (Long) authentication.getPrincipal(); + + JobInfoResponseDTO.JobInfoDetailDTO response = jobInfoQueryService.getJobInfoDetails(userId, jobInfoId); + return ApiResponse.onSuccess(response); + } + + @DeleteMapping("/{jobInfoId}") + public ApiResponse deleteJobInfo(@PathVariable("jobInfoId") Long jobInfoId) { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + Long userId = (Long) authentication.getPrincipal(); + + JobInfoResponseDTO.DeleteJobInfoDTO response = jobInfoCommandService.delete(jobInfoId, userId); + return ApiResponse.onSuccess(response); + } } diff --git a/src/main/java/com/parentsgowork/server/web/controller/specification/JobInfoSpecification.java b/src/main/java/com/parentsgowork/server/web/controller/specification/JobInfoSpecification.java index 5241f7d..dda73a5 100644 --- a/src/main/java/com/parentsgowork/server/web/controller/specification/JobInfoSpecification.java +++ b/src/main/java/com/parentsgowork/server/web/controller/specification/JobInfoSpecification.java @@ -3,12 +3,15 @@ import com.parentsgowork.server.apiPayload.ApiResponse; import com.parentsgowork.server.web.dto.JobInfoDTO.JobInfoRequestDTO; import com.parentsgowork.server.web.dto.JobInfoDTO.JobInfoResponseDTO; +import com.parentsgowork.server.web.dto.PolicyInfoDTO.PolicyInfoResponseDTO; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponses; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import java.util.List; @@ -31,4 +34,28 @@ public interface JobInfoSpecification { }) ApiResponse> addJobInfo(@RequestBody List saveJobInfoDTOList); + @GetMapping("") + @Operation(summary = "내가 저장한 구직정보 리스트 조회", description = "내가 저장한 구직정보 리스트를 조회합니다.") + @ApiResponses({ + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "COMMON200", description = "⭕ SUCCESS, 성공"), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "COMMON400", description = "❌ BAD, 잘못된 요청", content = @Content(schema = @Schema(implementation = ApiResponse.class))) + }) + ApiResponse> getJobInfoList(); + + @GetMapping("/{jobInfoId}") + @Operation(summary = "특정 구직정보 조회", description = "내가 저장한 특정 구직정보를 조회합니다. 구직정보 아이디 값을 보내주세요.") + @ApiResponses({ + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "COMMON200", description = "⭕ SUCCESS, 성공"), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "COMMON400", description = "❌ BAD, 잘못된 요청", content = @Content(schema = @Schema(implementation = ApiResponse.class))) + }) + ApiResponse getJobInfoDetails(@PathVariable Long jobInfoId); + + @DeleteMapping("/{jobInfoId}") + @Operation(summary = "내가 저장한 구직정보 삭제", description = "내가 저장한 특정 구직정보를 삭제합니다.") + @ApiResponses({ + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "COMMON200", description = "⭕ SUCCESS, 성공"), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "COMMON400", description = "❌ BAD, 잘못된 요청", content = @Content(schema = @Schema(implementation = ApiResponse.class))) + }) + ApiResponse deleteJobInfo(@PathVariable("jobInfoId") Long jobInfoId); + }