diff --git a/auth-service/auth-data-access/src/main/java/az/rock/flyjob/auth/dataAccess/model/compose/BaseCompose.java b/auth-service/auth-data-access/src/main/java/az/rock/flyjob/auth/dataAccess/model/compose/BaseCompose.java index 21774d84c..e3d597722 100644 --- a/auth-service/auth-data-access/src/main/java/az/rock/flyjob/auth/dataAccess/model/compose/BaseCompose.java +++ b/auth-service/auth-data-access/src/main/java/az/rock/flyjob/auth/dataAccess/model/compose/BaseCompose.java @@ -9,6 +9,7 @@ @Compose public class BaseCompose { + private UUID uuid; private Long version; diff --git a/auth-service/auth-domain/auth-domain-presentation/src/main/java/az/rock/auth/domain/presentation/ports/input/service/query/concretes/user/UserQueryPrivateDomainPresentation.java b/auth-service/auth-domain/auth-domain-presentation/src/main/java/az/rock/auth/domain/presentation/ports/input/service/query/concretes/user/UserQueryPrivateDomainPresentation.java index 0f61d9f32..a3efef84a 100644 --- a/auth-service/auth-domain/auth-domain-presentation/src/main/java/az/rock/auth/domain/presentation/ports/input/service/query/concretes/user/UserQueryPrivateDomainPresentation.java +++ b/auth-service/auth-domain/auth-domain-presentation/src/main/java/az/rock/auth/domain/presentation/ports/input/service/query/concretes/user/UserQueryPrivateDomainPresentation.java @@ -1,20 +1,16 @@ package az.rock.auth.domain.presentation.ports.input.service.query.concretes.user; import az.rock.auth.domain.presentation.dto.response.user.*; +import az.rock.auth.domain.presentation.ports.input.service.query.abstracts.user.AbstractUserQueryDomainPresentation; import az.rock.auth.domain.presentation.ports.output.publisher.AbstractNotificationMessagePublisher; import az.rock.auth.domain.presentation.ports.output.repository.query.user.AbstractUserProfileQueryRepositoryAdapter; -import az.rock.auth.domain.presentation.security.AbstractSecurityContextHolder; -import az.rock.auth.domain.presentation.exception.AuthDomainPresentationException; -import az.rock.auth.domain.presentation.ports.input.service.query.abstracts.user.AbstractUserQueryDomainPresentation; import az.rock.auth.domain.presentation.ports.output.repository.query.user.AbstractUserQueryRepositoryAdapter; +import az.rock.auth.domain.presentation.security.AbstractSecurityContextHolder; import az.rock.flyjob.auth.exception.user.MyFollowersNotFoundException; import az.rock.flyjob.auth.exception.user.MyNetworksNotFoundException; import az.rock.flyjob.auth.exception.user.MyUserProfileNotFoundException; import az.rock.flyjob.auth.exception.user.UserProfileNotFoundException; import az.rock.flyjob.auth.model.query.AnyProfileQueryRecord; -import az.rock.flyjob.auth.model.root.network.FollowRelationRoot; -import az.rock.flyjob.auth.model.root.user.UserRoot; -import az.rock.lib.domain.id.auth.UserID; import az.rock.lib.valueObject.common.PageableRequest; import com.intellibucket.lib.fj.notificatin.api.notifications.ViewedProfileNotification; import org.springframework.stereotype.Service; @@ -55,11 +51,10 @@ public MyUserProfileResponse myProfile() { public AnyUserProfileResponse anyProfile(UUID userID) { var currentUser = this.securityContextHolder.availableUser(); Optional optionalUserProfile = this.userProfileQueryRepositoryAdapter.findAnyProfile(currentUser.getAbsoluteID(), userID); - if (optionalUserProfile.isPresent()){ + if (optionalUserProfile.isPresent()) { this.notificationMessagePublisher.send(ViewedProfileNotification.of(currentUser.getAbsoluteID(), userID)); return AnyUserProfileResponse.of(optionalUserProfile.get()); - } - else throw new UserProfileNotFoundException(); + } else throw new UserProfileNotFoundException(); } @Override diff --git a/job-seeker-service/js-application/js-presentation/src/main/java/az/rock/flyjob/js/presentation/api/rest/privates/query/resume/detail/EducationQueryPrivateController.java b/job-seeker-service/js-application/js-presentation/src/main/java/az/rock/flyjob/js/presentation/api/rest/privates/query/resume/detail/EducationQueryPrivateController.java index 527547b12..edceb6fd8 100644 --- a/job-seeker-service/js-application/js-presentation/src/main/java/az/rock/flyjob/js/presentation/api/rest/privates/query/resume/detail/EducationQueryPrivateController.java +++ b/job-seeker-service/js-application/js-presentation/src/main/java/az/rock/flyjob/js/presentation/api/rest/privates/query/resume/detail/EducationQueryPrivateController.java @@ -4,49 +4,66 @@ import az.rock.flyjob.js.domain.presentation.dto.response.resume.education.MyEducationResponseModel; import az.rock.flyjob.js.domain.presentation.dto.response.resume.education.simple.SimpleAnyEducationResponseModel; import az.rock.flyjob.js.domain.presentation.dto.response.resume.education.simple.SimpleMyEducationResponseModel; +import az.rock.flyjob.js.domain.presentation.ports.input.services.query.abstracts.AbstractEducationQueryDomainPresentationService; import az.rock.flyjob.js.spec.privates.query.resume.detail.EducationQueryPrivateSpec; import az.rock.lib.jresponse.response.success.JSuccessDataResponse; import az.rock.lib.valueObject.SimplePageableRequest; import az.rock.lib.valueObject.SimplePageableResponse; +import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import java.util.UUID; @RestController +@CrossOrigin +@RequestMapping(value = "/js/1.0/private/query/education", produces = MediaType.APPLICATION_JSON_VALUE) public class EducationQueryPrivateController implements EducationQueryPrivateSpec { + private final AbstractEducationQueryDomainPresentationService educationQueryDomainPresentationService; + public EducationQueryPrivateController(AbstractEducationQueryDomainPresentationService educationQueryDomainPresentationService) { + this.educationQueryDomainPresentationService = educationQueryDomainPresentationService; + } @Override - public ResponseEntity>> queryAllMyEducations(SimplePageableRequest pageableRequest) { - - return null; + @GetMapping("/get-my/educations") + public ResponseEntity>> queryAllMyEducations(@ModelAttribute("pageableRequest") SimplePageableRequest pageableRequest) { + var response = educationQueryDomainPresentationService.queryAllMyEducations(pageableRequest); + return ResponseEntity.ok(new JSuccessDataResponse<>(response)); } @Override - public ResponseEntity>> queryAllAnyEducations(UUID targetResumeId, SimplePageableRequest pageableRequest) { - - return null; + @GetMapping("/get-any/educations/{targetResumeId}") + public ResponseEntity>> queryAllAnyEducations(@PathVariable UUID targetResumeId, @ModelAttribute("pageableRequest") SimplePageableRequest pageableRequest) { + var response = educationQueryDomainPresentationService.queryAllAnyEducations(targetResumeId, pageableRequest); + return ResponseEntity.ok(new JSuccessDataResponse<>(response)); } @Override - public ResponseEntity>> queryAllMySimpleEducations(SimplePageableRequest pageableRequest) { - - return null; + @GetMapping("/get-my/simple-educations") + public ResponseEntity>> queryAllMySimpleEducations(@ModelAttribute("pageableRequest") SimplePageableRequest pageableRequest) { + var response = educationQueryDomainPresentationService.queryAllMySimpleEducations(pageableRequest); + return ResponseEntity.ok(new JSuccessDataResponse<>(response)); } @Override - public ResponseEntity>> queryAllAnySimpleEducations(UUID targetResumeId, SimplePageableRequest pageableRequest) { - return null; + @GetMapping("/get-any/simple-educations/{targetResumeId}") + public ResponseEntity>> queryAllAnySimpleEducations(@PathVariable UUID targetResumeId, @ModelAttribute("pageableRequest") SimplePageableRequest pageableRequest) { + var response = educationQueryDomainPresentationService.queryAllAnySimpleEducations(targetResumeId, pageableRequest); + return ResponseEntity.ok(new JSuccessDataResponse<>(response)); } @Override - public ResponseEntity> findMyEducationById(UUID id) { - return null; + @GetMapping("/get-my/education/{id}") + public ResponseEntity> findMyEducationById(@PathVariable UUID id) { + var response = educationQueryDomainPresentationService.findMyEducationById(id); + return ResponseEntity.ok(new JSuccessDataResponse<>(response)); } @Override - public ResponseEntity> findAnyEducationById(UUID id) { - return null; + @GetMapping("/get-any/education/{id}") + public ResponseEntity> findAnyEducationById(@PathVariable UUID id) { + var response = educationQueryDomainPresentationService.findAnyEducationById(id); + return ResponseEntity.ok(new JSuccessDataResponse<>(response)); } } \ No newline at end of file diff --git a/job-seeker-service/js-data-access/src/main/java/az/rock/flyjob/js/dataaccess/adapter/query/EducationQueryRepositoryAdapter.java b/job-seeker-service/js-data-access/src/main/java/az/rock/flyjob/js/dataaccess/adapter/query/EducationQueryRepositoryAdapter.java index 4e3c7d470..c416b3e52 100644 --- a/job-seeker-service/js-data-access/src/main/java/az/rock/flyjob/js/dataaccess/adapter/query/EducationQueryRepositoryAdapter.java +++ b/job-seeker-service/js-data-access/src/main/java/az/rock/flyjob/js/dataaccess/adapter/query/EducationQueryRepositoryAdapter.java @@ -1,11 +1,17 @@ package az.rock.flyjob.js.dataaccess.adapter.query; import az.rock.flyjob.js.dataaccess.mapper.abstracts.AbstractEducationDataAccessMapper; +import az.rock.flyjob.js.dataaccess.mapper.concretes.PageableDataAccessMapper; +import az.rock.flyjob.js.dataaccess.model.batis.model.EducationComposeExample; +import az.rock.flyjob.js.dataaccess.repository.abstracts.query.batis.EducationBatisRepository; import az.rock.flyjob.js.dataaccess.repository.abstracts.query.jpa.EducationQueryJpaRepository; import az.rock.flyjob.js.domain.core.root.detail.EducationRoot; +import az.rock.flyjob.js.domain.presentation.dto.criteria.EducationCriteria; import az.rock.flyjob.js.domain.presentation.ports.output.repository.query.AbstractEducationQueryRepositoryAdapter; import az.rock.lib.domain.id.js.EducationID; import az.rock.lib.domain.id.js.ResumeID; +import az.rock.lib.valueObject.SimplePageableRequest; +import com.intellibucket.lib.fj.dataaccess.BatisPageable; import org.springframework.stereotype.Component; import java.util.List; @@ -15,12 +21,15 @@ @Component public class EducationQueryRepositoryAdapter implements AbstractEducationQueryRepositoryAdapter { + private final static String orderByOrderNumber = "order_number"; private final EducationQueryJpaRepository educationQueryJpaRepository; private final AbstractEducationDataAccessMapper educationDataAccessMapper; + private final EducationBatisRepository educationBatisRepository; - public EducationQueryRepositoryAdapter(EducationQueryJpaRepository educationQueryJpaRepository, AbstractEducationDataAccessMapper educationDataAccessMapper) { + public EducationQueryRepositoryAdapter(EducationQueryJpaRepository educationQueryJpaRepository, AbstractEducationDataAccessMapper educationDataAccessMapper, EducationBatisRepository educationBatisRepository) { this.educationQueryJpaRepository = educationQueryJpaRepository; this.educationDataAccessMapper = educationDataAccessMapper; + this.educationBatisRepository = educationBatisRepository; } @Override @@ -30,6 +39,27 @@ public Optional findByResumeAndUuidAndRowStatusTrue(ResumeID resu return educationDataAccessMapper.toRoot(entity.get()); } + @Override + public List fetchAllEducations(EducationCriteria educationCriteria, SimplePageableRequest simplePageableRequest) { + var educationComposeExample = EducationComposeExample.of(educationCriteria, orderByOrderNumber, BatisPageable.of(simplePageableRequest.getSize(), simplePageableRequest.getPage())); + var composes = educationBatisRepository.selectByExample(educationComposeExample); + System.out.println(composes); + return composes + .stream() + .map(educationDataAccessMapper::composeToRoot) + .filter(Optional::isPresent) + .map(Optional::get) + .toList(); + } + + @Override + public Optional fetchEducation(EducationCriteria educationCriteria) { + var educationComposeExample = EducationComposeExample.of(educationCriteria); + var educationCompose = educationBatisRepository.selectFirstByExample(educationComposeExample); + return educationDataAccessMapper.composeToRoot(educationCompose); + } + + @Override public Optional findById(EducationID rootId) { var entity = educationQueryJpaRepository.findById(rootId.getAbsoluteID()); diff --git a/job-seeker-service/js-data-access/src/main/java/az/rock/flyjob/js/dataaccess/mapper/abstracts/AbstractEducationDataAccessMapper.java b/job-seeker-service/js-data-access/src/main/java/az/rock/flyjob/js/dataaccess/mapper/abstracts/AbstractEducationDataAccessMapper.java index 527e1b10f..dd861e68b 100644 --- a/job-seeker-service/js-data-access/src/main/java/az/rock/flyjob/js/dataaccess/mapper/abstracts/AbstractEducationDataAccessMapper.java +++ b/job-seeker-service/js-data-access/src/main/java/az/rock/flyjob/js/dataaccess/mapper/abstracts/AbstractEducationDataAccessMapper.java @@ -1,12 +1,14 @@ package az.rock.flyjob.js.dataaccess.mapper.abstracts; +import az.rock.flyjob.js.dataaccess.model.batis.model.EducationCompose; import az.rock.flyjob.js.dataaccess.model.entity.resume.details.EducationEntity; import az.rock.flyjob.js.domain.core.root.detail.EducationRoot; import com.intellibucket.lib.fj.dataaccess.AbstractDataAccessMapper; +import java.util.Optional; public interface AbstractEducationDataAccessMapper extends AbstractDataAccessMapper { - + Optional composeToRoot(EducationCompose educationCompose); } diff --git a/job-seeker-service/js-data-access/src/main/java/az/rock/flyjob/js/dataaccess/mapper/concretes/EducationDataAccessMapper.java b/job-seeker-service/js-data-access/src/main/java/az/rock/flyjob/js/dataaccess/mapper/concretes/EducationDataAccessMapper.java index 415652581..0f9cdd984 100644 --- a/job-seeker-service/js-data-access/src/main/java/az/rock/flyjob/js/dataaccess/mapper/concretes/EducationDataAccessMapper.java +++ b/job-seeker-service/js-data-access/src/main/java/az/rock/flyjob/js/dataaccess/mapper/concretes/EducationDataAccessMapper.java @@ -2,16 +2,23 @@ import az.rock.flyjob.js.dataaccess.mapper.abstracts.AbstractEducationDataAccessMapper; +import az.rock.flyjob.js.dataaccess.model.batis.model.EducationCompose; import az.rock.flyjob.js.dataaccess.model.entity.resume.ResumeEntity; import az.rock.flyjob.js.dataaccess.model.entity.resume.details.EducationEntity; import az.rock.flyjob.js.domain.core.root.detail.EducationRoot; import az.rock.lib.domain.id.js.EducationID; import az.rock.lib.domain.id.js.ResumeID; import az.rock.lib.util.GDateTime; +import az.rock.lib.valueObject.AccessModifier; +import az.rock.lib.valueObject.ProcessStatus; +import az.rock.lib.valueObject.RowStatus; import az.rock.lib.valueObject.Version; +import az.rock.lib.valueObject.js.EducationDegree; +import az.rock.lib.valueObject.js.EducationState; import org.springframework.stereotype.Component; import java.util.Optional; +import java.util.UUID; @Component public class EducationDataAccessMapper implements AbstractEducationDataAccessMapper { @@ -68,5 +75,30 @@ public Optional toEntity(EducationRoot root) { } + @Override + public Optional composeToRoot(EducationCompose educationCompose) { + var optionalEducationCompose = Optional.ofNullable(educationCompose); + return optionalEducationCompose.map(compose -> EducationRoot.Builder.builder() + .uuid(EducationID.of(compose.getUuid())) + .resume(ResumeID.of(compose.getResumeUuid())) + .version(Version.of(compose.getVersion())) + .rowStatus(RowStatus.valueOf(compose.getRowStatus())) + .processStatus(ProcessStatus.of(compose.getProcessStatus())) + .createdDate(GDateTime.of(compose.getCreatedDate())) + .lastModifiedDate(GDateTime.of(compose.getModificationDate())) + .accessModifier(AccessModifier.valueOf(compose.getAccessModifier())) + .cityId((UUID) compose.getCityId()) + .establishmentUUID((UUID) compose.getEstablishmentUuid()) + .establishmentName(compose.getEstablishmentName()) + .orderNumber(compose.getOrderNumber()) + .startDate(GDateTime.convertToLocalDate(compose.getStartDate())) + .endDate(GDateTime.convertToLocalDate(compose.getEndDate())) + .description(compose.getDescription()) + .link(compose.getLink()) + .state(EducationState.valueOf(compose.getState())) + .degree(EducationDegree.valueOf(compose.getDegree())) + .build()); + } + } diff --git a/job-seeker-service/js-data-access/src/main/java/az/rock/flyjob/js/dataaccess/model/batis/model/EducationComposeExample.java b/job-seeker-service/js-data-access/src/main/java/az/rock/flyjob/js/dataaccess/model/batis/model/EducationComposeExample.java index 9b4bb4f8c..062ef4948 100644 --- a/job-seeker-service/js-data-access/src/main/java/az/rock/flyjob/js/dataaccess/model/batis/model/EducationComposeExample.java +++ b/job-seeker-service/js-data-access/src/main/java/az/rock/flyjob/js/dataaccess/model/batis/model/EducationComposeExample.java @@ -1,9 +1,12 @@ package az.rock.flyjob.js.dataaccess.model.batis.model; -import java.util.ArrayList; -import java.util.Date; -import java.util.Iterator; -import java.util.List; +import az.rock.flyjob.js.domain.presentation.dto.criteria.EducationCriteria; +import az.rock.lib.valueObject.AccessModifier; +import az.rock.lib.valueObject.ProcessStatus; +import az.rock.lib.valueObject.RowStatus; +import com.intellibucket.lib.fj.dataaccess.BatisPageable; + +import java.util.*; @SuppressWarnings("all") public class EducationComposeExample { @@ -13,26 +16,57 @@ public class EducationComposeExample { protected List oredCriteria; + private BatisPageable pageable; + + public EducationComposeExample() { oredCriteria = new ArrayList<>(); } - public void setOrderByClause(String orderByClause) { - this.orderByClause = orderByClause; + public static EducationComposeExample of(EducationCriteria educationCriteria, String orderByClause, BatisPageable pageable) { + var educationComposeExample = of(educationCriteria); + educationComposeExample.setOrderByClause(orderByClause); + educationComposeExample.setPageable(pageable); + return educationComposeExample; + } + + public static EducationComposeExample of(EducationCriteria educationCriteria) { + var educationComposeExample = new EducationComposeExample(); + var criteria = educationComposeExample.createCriteria(); + if (Objects.nonNull(educationCriteria.getResumeID())) criteria.andResumeUuidEqualTo(educationCriteria.getResumeID()); + if (Objects.nonNull(educationCriteria.getEducationId())) criteria.andUuidEqualTo(educationCriteria.getEducationId()); + if (Objects.nonNull(educationCriteria.getAccessModifiers())) + criteria.andAccessModifierIn(educationCriteria.getAccessModifiers().stream().map(AccessModifier::name).toList()); + criteria + .andRowStatusEqualTo(RowStatus.ACTIVE.name()) + .andProcessStatusEqualTo(ProcessStatus.COMPLETED.name()); + return educationComposeExample; + } + + public BatisPageable getPageable() { + return this.pageable; + } + + public void setPageable(BatisPageable batisPageable) { + this.pageable = batisPageable; } public String getOrderByClause() { return orderByClause; } - public void setDistinct(boolean distinct) { - this.distinct = distinct; + public void setOrderByClause(String orderByClause) { + this.orderByClause = orderByClause; } public boolean isDistinct() { return distinct; } + public void setDistinct(boolean distinct) { + this.distinct = distinct; + } + public List getOredCriteria() { return oredCriteria; } @@ -41,6 +75,7 @@ public void or(Criteria criteria) { oredCriteria.add(criteria); } + public Criteria or() { Criteria criteria = createCriteriaInternal(); oredCriteria.add(criteria); @@ -1317,38 +1352,6 @@ public static class Criterion { private String typeHandler; - public String getCondition() { - return condition; - } - - public Object getValue() { - return value; - } - - public Object getSecondValue() { - return secondValue; - } - - public boolean isNoValue() { - return noValue; - } - - public boolean isSingleValue() { - return singleValue; - } - - public boolean isBetweenValue() { - return betweenValue; - } - - public boolean isListValue() { - return listValue; - } - - public String getTypeHandler() { - return typeHandler; - } - protected Criterion(String condition) { super(); this.condition = condition; @@ -1384,5 +1387,37 @@ protected Criterion(String condition, Object value, Object secondValue, String t protected Criterion(String condition, Object value, Object secondValue) { this(condition, value, secondValue, null); } + + public String getCondition() { + return condition; + } + + public Object getValue() { + return value; + } + + public Object getSecondValue() { + return secondValue; + } + + public boolean isNoValue() { + return noValue; + } + + public boolean isSingleValue() { + return singleValue; + } + + public boolean isBetweenValue() { + return betweenValue; + } + + public boolean isListValue() { + return listValue; + } + + public String getTypeHandler() { + return typeHandler; + } } } \ No newline at end of file diff --git a/job-seeker-service/js-data-access/src/main/java/az/rock/flyjob/js/dataaccess/repository/abstracts/query/batis/EducationBatisRepository.java b/job-seeker-service/js-data-access/src/main/java/az/rock/flyjob/js/dataaccess/repository/abstracts/query/batis/EducationBatisRepository.java index 879a65f95..9b31be8c9 100644 --- a/job-seeker-service/js-data-access/src/main/java/az/rock/flyjob/js/dataaccess/repository/abstracts/query/batis/EducationBatisRepository.java +++ b/job-seeker-service/js-data-access/src/main/java/az/rock/flyjob/js/dataaccess/repository/abstracts/query/batis/EducationBatisRepository.java @@ -18,6 +18,7 @@ public interface EducationBatisRepository { int insertSelective(EducationCompose record); List selectByExample(EducationComposeExample example); + EducationCompose selectFirstByExample(EducationComposeExample example); EducationCompose selectByPrimaryKey(Object uuid); @@ -28,4 +29,5 @@ public interface EducationBatisRepository { int updateByPrimaryKeySelective(EducationCompose record); int updateByPrimaryKey(EducationCompose record); + } \ No newline at end of file diff --git a/job-seeker-service/js-data-access/src/main/resources/mapper/EducationBatisRepository.xml b/job-seeker-service/js-data-access/src/main/resources/mapper/EducationBatisRepository.xml index 0a7f77f5e..9ea27a2d2 100644 --- a/job-seeker-service/js-data-access/src/main/resources/mapper/EducationBatisRepository.xml +++ b/job-seeker-service/js-data-access/src/main/resources/mapper/EducationBatisRepository.xml @@ -103,6 +103,30 @@ order by ${orderByClause} + + OFFSET #{pageable.offset} ROWS + FETCH NEXT #{pageable.limit} ROWS ONLY + + + +