Skip to content

Commit

Permalink
Merge pull request #175 from ITZipProject/feature/resume
Browse files Browse the repository at this point in the history
πŸ› οΈ λ¦¬νŒ©ν† λ§ :  μ—…λ°μ΄νŠΈ μ½”λ“œ μž‘μ„± 및 성곡 ν…ŒμŠ€νŠΈ μ½”λ“œ μž‘μ„± μ™„λ£Œ
  • Loading branch information
hanseu9839 authored Nov 7, 2024
2 parents 6604cb2 + e569c30 commit 146ba8f
Show file tree
Hide file tree
Showing 61 changed files with 522 additions and 323 deletions.
2 changes: 2 additions & 0 deletions src/main/java/darkoverload/itzip/ItzipApplication.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@
@EnableScheduling
@SpringBootApplication
public class ItzipApplication {

public static void main(String[] args) {
SpringApplication.run(ItzipApplication.class, args);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
import org.springframework.web.bind.annotation.*;



@Slf4j
@RestController
@RequestMapping("/job-info")
Expand Down Expand Up @@ -54,5 +53,4 @@ public String scrapJobInfo(@SwaggerRequestBody(description = "μ±„μš©μ •λ³΄ 슀
return jobInfoService.jobInfoScrap(request);
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,12 @@

import darkoverload.itzip.feature.job.entity.JobInfoScrapEntity;

import java.util.List;
import java.util.Optional;

public interface CustomJobInfoScrapRepository {
void bulkDeleteByPositionIds(List<Long> positionIds);

Optional<JobInfoScrapEntity> findByJobInfoId(Long id,String email);

}
Original file line number Diff line number Diff line change
Expand Up @@ -3,32 +3,37 @@

import com.querydsl.jpa.impl.JPAQueryFactory;
import darkoverload.itzip.feature.job.entity.JobInfoScrapEntity;
import darkoverload.itzip.feature.job.entity.QJobInfoEntity;
import darkoverload.itzip.feature.job.entity.QJobInfoScrapEntity;
import darkoverload.itzip.feature.user.entity.QUserEntity;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Optional;

@Repository
@RequiredArgsConstructor
public class CustomJobInfoScrapRepositoryImpl implements CustomJobInfoScrapRepository{
public class CustomJobInfoScrapRepositoryImpl implements CustomJobInfoScrapRepository {

private final JPAQueryFactory queryFactory;
private final QJobInfoScrapEntity jobInfoScrapEntity = QJobInfoScrapEntity.jobInfoScrapEntity;


@Override
public void bulkDeleteByPositionIds(List<Long> positionIds) {
queryFactory.delete(jobInfoScrapEntity)
.where(jobInfoScrapEntity.jobInfo.positionId.in(positionIds))
.execute();
}

@Override
public Optional<JobInfoScrapEntity> findByJobInfoId(Long id, String email) {
JobInfoScrapEntity scrap = queryFactory.selectFrom(jobInfoScrapEntity)
.where(
(jobInfoScrapEntity.jobInfo.id.eq(id))
.and(jobInfoScrapEntity.user.email.eq(email))
JobInfoScrapEntity scrap = queryFactory.selectFrom(jobInfoScrapEntity)
.where(
(jobInfoScrapEntity.jobInfo.id.eq(id))
.and(jobInfoScrapEntity.user.email.eq(email))
).fetchOne();

return Optional.ofNullable(scrap);
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,10 @@
@Component
@RequiredArgsConstructor
public class JobInfoScheduler {
private static final String JOB_INFO_SCHEDULER_CON = "1 30 0 * * *";

private final JobInfoRepository jobInfoRepository;
private final JobInfoConnectService service;

/**
* Saramin APIμ—μ„œ μ΅œμ‹  JobInfo 데이터λ₯Ό 가져와 λ°μ΄ν„°λ² μ΄μŠ€μ™€ λΉ„κ΅ν•˜μ—¬
* μ‚­μ œ, μ—…λ°μ΄νŠΈ, μ‚½μž… μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” λ©”μ„œλ“œμž…λ‹ˆλ‹€. 이 λ©”μ„œλ“œλŠ” 맀일 00:30에 μ‹€ν–‰λ©λ‹ˆλ‹€.
Expand All @@ -28,8 +28,9 @@ public class JobInfoScheduler {
*
* @Scheduled(cron = "1 30 0 * * *") 크둠 ν‘œν˜„μ‹μ„ μ‚¬μš©ν•˜μ—¬ 맀일 01:30에 μ‹€ν–‰λ©λ‹ˆλ‹€.
*/

@Transactional
@Scheduled(cron = "1 30 0 * * *")
@Scheduled(cron = JOB_INFO_SCHEDULER_CON)
public void jobInfoConnectApi() {
// λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ λͺ¨λ“  JobInfo 데이터λ₯Ό μ‘°νšŒν•˜κ³ , 도메인 객체 리슀트둜 λ³€ν™˜
List<JobInfo> dbList = jobInfoRepository.findAll().stream().map(JobInfoEntity::convertToDomain).toList();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import darkoverload.itzip.feature.job.domain.JobInfo;
import darkoverload.itzip.feature.job.entity.JobInfoEntity;
import darkoverload.itzip.feature.job.repository.JobInfoRepository;
import darkoverload.itzip.feature.job.repository.JobInfoScrapRepository;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
Expand All @@ -17,6 +18,7 @@
public class JobInfoConnectServiceImpl implements JobInfoConnectService {

private final JobInfoRepository jobInfoRepository;
private final JobInfoScrapRepository jobInfoScrapRepository;

@Value("${job.api-url}")
private String jobUrl;
Expand Down Expand Up @@ -63,14 +65,14 @@ public Long jobInfoDelete(List<JobInfo> apiDataList, List<JobInfo> dbList) {
// dbListκ°€ λΉ„μ–΄μžˆμ„ 경우, μ¦‰μ‹œ λ°˜ν™˜ν•˜μ—¬ μΆ”κ°€ μž‘μ—…μ„ 방지
if(dbList.isEmpty()) return 0L;


List<Long> deleteList = makeDeleteList(apiDataList, dbList);


long totalDeletedCount = 0L;
// batchSizeλ₯Ό μ„€μ •ν•˜μ—¬ 500κ°œμ”© λ‚˜λˆ„μ–΄ μ‚­μ œ μž‘μ—…μ„ μˆ˜ν–‰ (λŒ€λŸ‰ μ‚­μ œ μ‹œ μ„±λŠ₯ μ΅œμ ν™”)
for(int i=0; i < deleteList.size(); i+= 500){
List<Long> batch = deleteList.subList(i, Math.min(i + 500, deleteList.size()));
jobInfoScrapRepository.bulkDeleteByPositionIds(batch);
totalDeletedCount += jobInfoRepository.bulkDeleteByPositionIds(batch);
}

Expand Down Expand Up @@ -169,8 +171,6 @@ private boolean checkNotEquals(JobInfo dbJobInfo, JobInfo apiJobInfo) {
|| !dbJobInfo.getIndustryName().equals(apiJobInfo.getIndustryName()) // μ‚°μ—… 이름 비ꡐ
|| !dbJobInfo.getLocationCode().equals(apiJobInfo.getLocationCode()) // μœ„μΉ˜ μ½”λ“œ 비ꡐ
|| !dbJobInfo.getLocationName().equals(apiJobInfo.getLocationName()) // μœ„μΉ˜ 이름 비ꡐ
|| !dbJobInfo.getJobTypeCode().equals(apiJobInfo.getJobTypeCode()) // 직무 μœ ν˜• μ½”λ“œ 비ꡐ
|| !dbJobInfo.getJobTypeName().equals(apiJobInfo.getJobTypeName()) // 직무 μœ ν˜• 이름 비ꡐ
|| !dbJobInfo.getJobMidCode().equals(apiJobInfo.getJobMidCode()) // 쀑간 직무 μ½”λ“œ 비ꡐ
|| !dbJobInfo.getJobMidName().equals(apiJobInfo.getJobMidName()) // 쀑간 직무 이름 비ꡐ
|| !dbJobInfo.getJobName().equals(apiJobInfo.getJobName()) // 직무 이름 비ꡐ
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import darkoverload.itzip.feature.resume.controller.request.CreateResumeRequest;
import darkoverload.itzip.feature.resume.controller.request.UpdateResumeRequest;
import darkoverload.itzip.feature.resume.controller.response.CreateResumeResponse;
import darkoverload.itzip.feature.resume.controller.response.UpdateResumeResponse;
import darkoverload.itzip.feature.resume.service.resume.ResumeService;
import darkoverload.itzip.global.config.response.code.CommonExceptionCode;
import darkoverload.itzip.global.config.response.code.CommonResponseCode;
Expand Down Expand Up @@ -44,13 +45,11 @@ public CreateResumeResponse createResume(@Valid @RequestBody CreateResumeRequest
description = "이λ ₯μ„œ μˆ˜μ • μ‹œ 객체 λ¦¬μŠ€νŠΈμ— μ‘΄μž¬ν•˜λŠ” κ°’ 체크"
)
@PatchMapping("")
public String updateResume(@SwaggerRequestBody(description = "이λ ₯μ„œ μˆ˜μ • 정보", content= @Content(
public UpdateResumeResponse updateResume(@SwaggerRequestBody(description = "이λ ₯μ„œ μˆ˜μ • 정보", content= @Content(
schema = @Schema(implementation = UpdateResumeRequest.class)
)) @Valid @RequestBody UpdateResumeRequest request) {

service.update(request);

return "이λ ₯μ„œ μˆ˜μ •μ„ μ„±κ³΅ν•˜μ˜€μŠ΅λ‹ˆλ‹€.";
return service.update(request);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,9 @@ public class CreateResumeRequest {

private Long userId;


@Builder
public CreateResumeRequest(List<darkoverload.itzip.feature.resume.dto.achievement.AchievementDto> achievements, List<QualificationDto> qualifications, List<MySkillsDto> mySkills, List<ActivityDto> activities, List<CareerDto> careers, List<EducationDto> educations, List<LanguageDto> languages, ResumeDto resume, Long userId){
public CreateResumeRequest(List<AchievementDto> achievements, List<QualificationDto> qualifications, List<MySkillsDto> mySkills, List<ActivityDto> activities, List<CareerDto> careers, List<EducationDto> educations, List<LanguageDto> languages, ResumeDto resume, Long userId){
this.achievements = achievements;
this.qualifications = qualifications;
this.mySkills = mySkills;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package darkoverload.itzip.feature.resume.controller.request;

import darkoverload.itzip.feature.resume.dto.achievement.AchievementDto;
import darkoverload.itzip.feature.resume.dto.activity.ActivityDto;
import darkoverload.itzip.feature.resume.dto.career.CareerDto;
import darkoverload.itzip.feature.resume.dto.education.EducationDto;
Expand All @@ -9,6 +10,7 @@
import darkoverload.itzip.feature.resume.dto.resume.ResumeDto;
import darkoverload.itzip.feature.resume.util.ResumeConditional;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Builder;
import lombok.Getter;
import lombok.ToString;

Expand All @@ -20,30 +22,45 @@
public class UpdateResumeRequest {

@ResumeConditional
private List<darkoverload.itzip.feature.resume.dto.achievement.AchievementDto> achievements = new ArrayList<>();
private List<AchievementDto> achievements = new ArrayList<>();

@ResumeConditional
private final List<QualificationDto> qualifications = new ArrayList<>();
private List<QualificationDto> qualifications = new ArrayList<>();

@ResumeConditional
@Schema(description = "기술 정보 κ°’", example = "")
private final List<MySkillsDto> mySkills= new ArrayList<>();
private List<MySkillsDto> mySkills = new ArrayList<>();

@ResumeConditional
private final List<ActivityDto> activities = new ArrayList<>(); // activity ==> save
private List<ActivityDto> activities = new ArrayList<>(); // activity ==> save

@ResumeConditional
private final List<CareerDto> careers = new ArrayList<>(); // ==> save
private List<CareerDto> careers = new ArrayList<>(); // ==> save

@ResumeConditional
private final List<EducationDto> educations = new ArrayList<>(); //
private List<EducationDto> educations = new ArrayList<>(); //

@ResumeConditional
private final List<LanguageDto> languages = new ArrayList<>();
private List<LanguageDto> languages = new ArrayList<>();

private ResumeDto resume;

private Long userId;

private Long resumeId;

@Builder
public UpdateResumeRequest(List<AchievementDto> achievements, List<QualificationDto> qualifications, List<MySkillsDto> mySkills, List<ActivityDto> activities, List<CareerDto> careers, List<EducationDto> educations, List<LanguageDto> languages, ResumeDto resume, Long userId, Long resumeId) {
this.achievements = achievements;
this.qualifications = qualifications;
this.mySkills = mySkills;
this.activities = activities;
this.careers = careers;
this.educations = educations;
this.languages = languages;
this.resume = resume;
this.userId = userId;
this.resumeId = resumeId;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -20,14 +20,14 @@ public record CreateResumeResponse(Achievements achievements, Activities activit

public static CreateResumeResponse from(ResumeDetails details) {
return CreateResumeResponse.builder()
.achievements(details.getAchievements())
.activities(details.getActivities())
.careers(details.getCareers())
.educations(details.getEducations())
.languages(details.getLanguages())
.mySkills(details.getMySkills())
.qualifications(details.getQualifications())
.resume(details.getResume())
.achievements(details.achievements())
.activities(details.activities())
.careers(details.careers())
.educations(details.educations())
.languages(details.languages())
.mySkills(details.mySkills())
.qualifications(details.qualifications())
.resume(details.resume())
.build();
}
}
Original file line number Diff line number Diff line change
@@ -1,24 +1,38 @@
package darkoverload.itzip.feature.resume.controller.response;

import darkoverload.itzip.feature.resume.code.PublicOnOff;
import darkoverload.itzip.feature.resume.domain.achievement.Achievements;
import darkoverload.itzip.feature.resume.domain.activity.Activities;
import darkoverload.itzip.feature.resume.domain.career.Careers;
import darkoverload.itzip.feature.resume.domain.education.Educations;
import darkoverload.itzip.feature.resume.domain.language.Languages;
import darkoverload.itzip.feature.resume.domain.myskill.MySkills;
import darkoverload.itzip.feature.resume.domain.qualification.Qualifications;
import darkoverload.itzip.feature.resume.domain.resume.Resume;
import darkoverload.itzip.feature.resume.domain.resume.ResumeDetails;
import lombok.Builder;


public record UpdateResumeResponse(Achievements achievements, Activities activities, Careers careers,
Educations educations, Languages languages, MySkills mySkills,
Qualifications qualifications, Resume resume) {
@Builder
public UpdateResumeResponse {

}

public static UpdateResumeResponse from(ResumeDetails details) {
return UpdateResumeResponse.builder()
.achievements(details.achievements())
.activities(details.activities())
.careers(details.careers())
.educations(details.educations())
.languages(details.languages())
.mySkills(details.mySkills())
.qualifications(details.qualifications())
.resume(details.resume())
.build();
}

import java.util.List;



public class UpdateResumeResponse {

private String email;

private String phone;

private String subject;

private String introduction;

private PublicOnOff publicOnOff;
}

private List<String> links;

private Long resumeId;
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,8 @@ public static Optional<Achievements> of(List<Achievement> achievements) {

public static List<Achievement> parse(List<AchievementDto> achievements, Resume resume) {
return achievements.stream()
.map(createAchievementDto -> {
Achievement achievement = createAchievementDto.create();
.map(achievementDto -> {
Achievement achievement = achievementDto.toModel();
achievement.setResume(resume);
return achievement;
}).toList();
Expand All @@ -49,4 +49,10 @@ public static boolean isValidate(List<AchievementDto> achievements) {
return !achievements.isEmpty();
}

public List<Achievement> deleteAchievements(List<Achievement> allAchievements) {
return achievements.stream().filter(achievement -> {
return !achievements.contains(achievement);
}).toList();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,8 @@ public static Optional<Activities> of(List<Activity> activities) {

public static List<Activity> parse(List<ActivityDto> activities, Resume resume) {
return activities.stream()
.map(createActivityDto -> {
Activity activity = createActivityDto.create();
.map(activityDto -> {
Activity activity = activityDto.toModel();
activity.setResume(resume);
return activity;
}).toList();
Expand All @@ -49,4 +49,10 @@ public static boolean isValidate(List<ActivityDto> activities) {
return !activities.isEmpty();
}

public List<Activity> deleteActivities(List<Activity> allActivities) {
return activities.stream().filter(activity -> {
return !allActivities.contains(activity);
}).toList();
}

}
Loading

0 comments on commit 146ba8f

Please sign in to comment.