Skip to content
Extraits de code Groupes Projets
Valider 29b11b3b rédigé par Mohamed Lemine BAILLAHI's avatar Mohamed Lemine BAILLAHI
Parcourir les fichiers

Merge branch 'feature/MLC-297' into 'develop'

MLC-297/dynamic search & approve/reject for unregistered agents and introduce SpecBuilder

See merge request !9
parents 21181f75 30a2c624
Branches
1 requête de fusion!9MLC-297/dynamic search & approve/reject for unregistered agents and introduce SpecBuilder
Affichage de
avec 410 ajouts et 218 suppressions
......@@ -24,4 +24,7 @@
- MLC-296/Added agency name filtering support (case-insensitive, partial match)
- MLC-296/Fixed data type mismatch for agencyId (String → Long)
- MLC-251/Update Sessions & ActivityHistory Path
- MLC-297/dynamic search & approve/reject for unregistered agents
- MLC-297/introduce SpecBuilder for conditional Specification chains
- MLC-297/refactor list methods for clients, agents
......@@ -27,7 +27,7 @@ public class Paths {
// === External Agency ===
public static final String GET_AGENCY_NAME_BY_ID = "/{id}/name";
public static final String AGENCY_EXISTS = "/exists/{agencyId}";
public static final String AGENCY_EXISTS = "/{agencyId}/exists";
public static final String GET_AGENCIES_BY_IDS="/by-ids";
public static final String GET_ALL_AGENCIES="/agencies/all";
......@@ -42,5 +42,11 @@ public class Paths {
public static final String ACTIVITY_BY_USER_ID = "/user/{userId}";
public static final String RECENT_ACTIVITY = "recent";
//===============Unregistered agents Api======================
public static final String UNREGISTERED_AGENTS_BASE = BASE_URL + "/unregistered-agents";
public static final String ALL_UNREGISTERED_AGENTS= "/all";
public static final String APPROVE_AGENT="/approve";
public static final String REJECT_AGENT="/reject/{id}";
}
......@@ -3,6 +3,7 @@ package com.marketingconfort.mobiloca.controller;
import com.marketingconfort.mobiloca.common.Agency.dtos.ManagerResponseDTO;
import com.marketingconfort.mobiloca.common.User.enums.UserStatus;
import com.marketingconfort.mobiloca.dto.request.AgentRequestDTO;
import com.marketingconfort.mobiloca.dto.request.AgentSearchRequest;
import com.marketingconfort.mobiloca.dto.response.AgentResponseDTO;
import com.marketingconfort.mobiloca.service.AgentService;
import com.marketingconfort.starter.core.exceptions.FunctionalException;
......@@ -10,13 +11,11 @@ import com.marketingconfort.starter.core.exceptions.S3FunctionalException;
import com.marketingconfort.starter.core.exceptions.TechnicalException;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.time.LocalDate;
import java.util.List;
import static com.marketingconfort.mobiloca.constants.Paths.*;
......@@ -34,7 +33,7 @@ public class AgentController {
return ResponseEntity.status(HttpStatus.CREATED).body(createdAgent);
}
@PostMapping(value =UPDATE_AGENT, consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
@PostMapping(value = UPDATE_AGENT, consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public ResponseEntity<AgentResponseDTO> updateAgent(@ModelAttribute AgentRequestDTO request)
throws FunctionalException, S3FunctionalException {
AgentResponseDTO updated = agentService.updateAgent(request);
......@@ -56,39 +55,11 @@ public class AgentController {
return ResponseEntity.status(HttpStatus.OK).body("Agent status updated.");
}
@GetMapping( ALL_AGENTS)
@GetMapping(ALL_AGENTS)
public ResponseEntity<Page<AgentResponseDTO>> getAllAgents(
@RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "10") int size,
@RequestParam(defaultValue = "createdDate") String sortBy,
@RequestParam(defaultValue = "DESC") String sortDirection,
@RequestParam(required = false) String idSearch,
@RequestParam(required = false) String nameSearch,
@RequestParam(required = false) String cinSearch,
@RequestParam(required = false) String agencySearch,
@RequestParam(required = false) String roleSearch,
@RequestParam(required = false) List<Long> roleFilter,
@RequestParam(required = false) String statusSearch,
@RequestParam(required = false) String phoneNumberSearch,
@RequestParam(required = false)
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE)
LocalDate createdDate,
@RequestParam(required = false)
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE)
LocalDate startDate,
@RequestParam(required = false)
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE)
LocalDate endDate
@ModelAttribute AgentSearchRequest request
) throws FunctionalException {
Page<AgentResponseDTO> result = agentService.getAllAgents(
page, size, sortBy, sortDirection,
idSearch, nameSearch, cinSearch, agencySearch, roleSearch,roleFilter,
statusSearch, phoneNumberSearch, createdDate, startDate, endDate
);
Page<AgentResponseDTO> result = agentService.getAllAgents(request);
return ResponseEntity.ok(result);
}
......@@ -103,17 +74,18 @@ public class AgentController {
List<ManagerResponseDTO> managers = agentService.getAllManagers();
return ResponseEntity.ok(managers);
}
@GetMapping(GET_MANAGER)
public ResponseEntity<ManagerResponseDTO> getManagerById(@PathVariable("id") Long agentId) throws FunctionalException {
ManagerResponseDTO manager = agentService.getManagerById(agentId);
return ResponseEntity.ok(manager);
}
@GetMapping(EXIST_MANAGER)
public ResponseEntity<Boolean> isAgentExists(@PathVariable("id") Long agentId) throws FunctionalException {
public ResponseEntity<Boolean> isAgentExists(@PathVariable("id") Long agentId) {
boolean exists = agentService.isAgentExists(agentId);
return ResponseEntity.ok(exists);
}
}
\ No newline at end of file
......@@ -3,6 +3,7 @@ package com.marketingconfort.mobiloca.controller;
import com.marketingconfort.mobiloca.common.User.enums.UserStatus;
import com.marketingconfort.mobiloca.constants.Paths;
import com.marketingconfort.mobiloca.dto.request.ClientSearchRequest;
import com.marketingconfort.mobiloca.dto.response.ClientResponseDTO;
import com.marketingconfort.mobiloca.dto.request.ClientRequestDTO;
import com.marketingconfort.mobiloca.service.ClientService;
......@@ -11,12 +12,10 @@ import com.marketingconfort.starter.core.exceptions.S3FunctionalException;
import com.marketingconfort.starter.core.exceptions.TechnicalException;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.time.LocalDate;
@RestController
@RequestMapping(Paths.CLIENT_BASE)
......@@ -36,7 +35,8 @@ public class ClientController {
ClientResponseDTO clientDTO = clientService.getClientByID(id);
return new ResponseEntity<>(clientDTO, HttpStatus.OK);
}
@PostMapping (Paths.UPDATE_CLIENT)
@PostMapping(Paths.UPDATE_CLIENT)
public ResponseEntity<ClientResponseDTO> updateClient(
@PathVariable Long id,
@ModelAttribute ClientRequestDTO request) throws FunctionalException, S3FunctionalException {
......@@ -48,27 +48,14 @@ public class ClientController {
@GetMapping(Paths.ALL_CLIENTS)
public ResponseEntity<Page<ClientResponseDTO>> getAllClients(
@RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "10") int size,
@RequestParam(defaultValue = "createdDate") String sortBy,
@RequestParam(defaultValue = "DESC") String sortDirection,
@RequestParam(required = false) String idSearch,
@RequestParam(required = false) String nameSearch,
@RequestParam(required = false) String statusSearch,
@RequestParam(required = false) String cinSearch,
@RequestParam(required = false) String phoneNumberSearch,
@RequestParam(required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate createdDate,
@RequestParam(required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate startDate,
@RequestParam(required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate endDate
@ModelAttribute ClientSearchRequest request
) {
Page<ClientResponseDTO> clients = clientService.getAllClients(
page, size, sortBy, sortDirection, idSearch, nameSearch, statusSearch, cinSearch, phoneNumberSearch, createdDate, startDate, endDate
);
System.out.println(">>> nameSearch = " + request.getNameSearch());
Page<ClientResponseDTO> clients = clientService.getAllClients(request);
return ResponseEntity.ok(clients);
}
@PostMapping(Paths.UPDATE_CLIENT_STATUS)
public ResponseEntity<Void> changeClientStatus(
@PathVariable Long id,
......@@ -84,5 +71,4 @@ public class ClientController {
}
}
package com.marketingconfort.mobiloca.controller;
import com.marketingconfort.mobiloca.constants.Paths;
import com.marketingconfort.mobiloca.dto.request.AgentRequestDTO;
import com.marketingconfort.mobiloca.dto.request.UnregisteredAgentSearchRequest;
import com.marketingconfort.mobiloca.dto.response.UnregisteredAgentDTO;
import com.marketingconfort.mobiloca.service.UnregisteredAgentService;
import com.marketingconfort.starter.core.exceptions.FunctionalException;
import com.marketingconfort.starter.core.exceptions.S3FunctionalException;
import com.marketingconfort.starter.core.exceptions.TechnicalException;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import static com.marketingconfort.mobiloca.constants.Paths.APPROVE_AGENT;
import static com.marketingconfort.mobiloca.constants.Paths.REJECT_AGENT;
@RestController
@RequestMapping(Paths.UNREGISTERED_AGENTS_BASE)
@RequiredArgsConstructor
public class UnregisteredAgentController {
private final UnregisteredAgentService unregisteredAgentService;
@GetMapping(Paths.ALL_UNREGISTERED_AGENTS)
public Page<UnregisteredAgentDTO> getAllUnregisteredAgents(
@ModelAttribute UnregisteredAgentSearchRequest request
) {
return unregisteredAgentService.getAllUnregisteredAgents(request);
}
@PostMapping(APPROVE_AGENT)
public ResponseEntity<Void> approveAgent(
@RequestBody AgentRequestDTO requestDTO
) throws S3FunctionalException, TechnicalException, FunctionalException {
unregisteredAgentService.approveAgent(requestDTO);
return ResponseEntity.ok().build();
}
@PostMapping(REJECT_AGENT)
public ResponseEntity<Void> rejectAgent(
@PathVariable("id") Long unregisteredAgentId
) {
unregisteredAgentService.rejectAgent(unregisteredAgentId);
return ResponseEntity.noContent().build();
}
}
package com.marketingconfort.mobiloca.dto.request;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
@Getter
@Setter
public class AgentSearchRequest extends UserSearchRequest {
private String agencySearch;
private String roleSearch;
private List<Long> roleIds;
}
package com.marketingconfort.mobiloca.dto.request;
import lombok.Data;
import java.time.LocalDate;
@Data
public class BaseSearchRequest {
private int page = 0;
private int size = 10;
private String sortBy = "createdDate";
private String sortDirection = "desc";
private LocalDate createdDate;
}
package com.marketingconfort.mobiloca.dto.request;
import lombok.Data;
import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
@Data
public class ClientSearchRequest extends UserSearchRequest {
}
package com.marketingconfort.mobiloca.dto.request;
import lombok.Data;
import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
@Data
public class UnregisteredAgentSearchRequest extends UserSearchRequest{
private String emailSearch;
private String addressSearch;
}
package com.marketingconfort.mobiloca.dto.request;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.time.LocalDate;
@EqualsAndHashCode(callSuper = true)
@Data
public abstract class UserSearchRequest extends BaseSearchRequest {
private String idSearch;
private String nameSearch;
private String statusSearch;
private String cinSearch;
private String phoneNumberSearch;
private LocalDate startDate;
private LocalDate endDate;
}
package com.marketingconfort.mobiloca.dto.response;
import com.marketingconfort.mobiloca.common.User.enums.UnregisteredAgentStatus;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.time.LocalDate;
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class UnregisteredAgentDTO {
private long id;
private String firstName;
private String lastName;
private String email;
private String phone;
private String address;
private LocalDate createdDate;
private UnregisteredAgentStatus status;
}
package com.marketingconfort.mobiloca.mapper;
import com.marketingconfort.mobiloca.common.User.models.UnregisteredAgent;
import com.marketingconfort.mobiloca.dto.response.UnregisteredAgentDTO;
import lombok.AllArgsConstructor;
import org.modelmapper.ModelMapper;
import org.springframework.stereotype.Component;
@Component
@AllArgsConstructor
public class UnregisteredAgentMapper {
private final ModelMapper modelMapper;
public UnregisteredAgentDTO toDto(UnregisteredAgent entity) {
return modelMapper.map(entity, UnregisteredAgentDTO.class);
}
public UnregisteredAgent toEntity(UnregisteredAgentDTO dto) {
return modelMapper.map(dto, UnregisteredAgent.class);
}
}
package com.marketingconfort.mobiloca.repository;
import com.marketingconfort.mobiloca.common.User.models.UnregisteredAgent;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.stereotype.Repository;
@Repository
public interface UnregisteredAgentRepository extends JpaRepository<UnregisteredAgent, Long>,
JpaSpecificationExecutor<UnregisteredAgent> {
}
......@@ -3,6 +3,7 @@ package com.marketingconfort.mobiloca.service;
import com.marketingconfort.mobiloca.common.Agency.dtos.ManagerResponseDTO;
import com.marketingconfort.mobiloca.common.User.enums.UserStatus;
import com.marketingconfort.mobiloca.dto.request.AgentRequestDTO;
import com.marketingconfort.mobiloca.dto.request.AgentSearchRequest;
import com.marketingconfort.mobiloca.dto.response.AgentResponseDTO;
import com.marketingconfort.starter.core.exceptions.FunctionalException;
import com.marketingconfort.starter.core.exceptions.S3FunctionalException;
......@@ -10,12 +11,11 @@ import com.marketingconfort.starter.core.exceptions.TechnicalException;
import org.springframework.data.domain.Page;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDate;
import java.util.List;
public interface AgentService {
@Transactional(rollbackFor = FunctionalException.class)
public AgentResponseDTO createAgent(AgentRequestDTO request) throws FunctionalException, TechnicalException, S3FunctionalException;
AgentResponseDTO createAgent(AgentRequestDTO request) throws FunctionalException, TechnicalException, S3FunctionalException;
AgentResponseDTO updateAgent(AgentRequestDTO request) throws FunctionalException, S3FunctionalException;
......@@ -23,22 +23,8 @@ public interface AgentService {
void changeAgentStatus(Long id, UserStatus newStatus) throws FunctionalException;
public Page<AgentResponseDTO> getAllAgents(
int page,
int size,
String sortBy,
String sortDirection,
String idSearch,
String nameSearch,
String cinSearch,
String agencySearch,
String roleSearch,
List<Long> roleIds,
String statusSearch,
String phoneNumberSearch,
LocalDate createdDate,
LocalDate startDate,
LocalDate endDate
Page<AgentResponseDTO> getAllAgents(
AgentSearchRequest request
) throws FunctionalException;
AgentResponseDTO getAgentById(Long id) throws FunctionalException;
......@@ -47,6 +33,6 @@ public interface AgentService {
ManagerResponseDTO getManagerById(Long agentId) throws FunctionalException;
public List<ManagerResponseDTO> getAllManagers();
List<ManagerResponseDTO> getAllManagers();
}
package com.marketingconfort.mobiloca.service;
import com.marketingconfort.mobiloca.common.User.enums.UserStatus;
import com.marketingconfort.mobiloca.dto.request.ClientSearchRequest;
import com.marketingconfort.mobiloca.dto.response.ClientResponseDTO;
import com.marketingconfort.mobiloca.dto.request.ClientRequestDTO;
import com.marketingconfort.starter.core.exceptions.FunctionalException;
......@@ -8,27 +9,16 @@ import com.marketingconfort.starter.core.exceptions.S3FunctionalException;
import com.marketingconfort.starter.core.exceptions.TechnicalException;
import org.springframework.data.domain.Page;
import java.time.LocalDate;
public interface ClientService {
ClientResponseDTO createClient(ClientRequestDTO request) throws FunctionalException, TechnicalException, S3FunctionalException;
ClientResponseDTO updateClient(ClientRequestDTO request) throws FunctionalException, S3FunctionalException;
ClientResponseDTO getClientByID(long id) throws FunctionalException;
Page<ClientResponseDTO> getAllClients(
int page,
int size,
String sortBy,
String sortDirection,
String idSearch,
String search,
String statusSearch,
String cinSearch,
String phoneNumberSearch,
LocalDate createdDate,
LocalDate startDate,
LocalDate endDate
ClientSearchRequest request
);
void changeClientStatus(Long id, UserStatus newStatus) throws FunctionalException;
......
package com.marketingconfort.mobiloca.service;
import com.marketingconfort.mobiloca.dto.request.AgentRequestDTO;
import com.marketingconfort.mobiloca.dto.request.UnregisteredAgentSearchRequest;
import com.marketingconfort.mobiloca.dto.response.UnregisteredAgentDTO;
import com.marketingconfort.starter.core.exceptions.FunctionalException;
import com.marketingconfort.starter.core.exceptions.S3FunctionalException;
import com.marketingconfort.starter.core.exceptions.TechnicalException;
import org.springframework.data.domain.Page;
public interface UnregisteredAgentService {
Page<UnregisteredAgentDTO> getAllUnregisteredAgents(UnregisteredAgentSearchRequest request
);
void approveAgent(AgentRequestDTO requestDTO) throws S3FunctionalException, TechnicalException, FunctionalException;
void rejectAgent(Long unregisteredAgentId);
}
......@@ -7,16 +7,14 @@ import com.marketingconfort.mobiloca.common.User.models.Agent;
import com.marketingconfort.mobiloca.common.User.models.Role;
import com.marketingconfort.mobiloca.constants.Message;
import com.marketingconfort.mobiloca.dto.request.AgentRequestDTO;
import com.marketingconfort.mobiloca.dto.request.AgentSearchRequest;
import com.marketingconfort.mobiloca.dto.response.AgentResponseDTO;
import com.marketingconfort.mobiloca.externalService.AgencyService;
import com.marketingconfort.mobiloca.mapper.AgentMapper;
import com.marketingconfort.mobiloca.repository.AgentRepository;
import com.marketingconfort.mobiloca.repository.RoleRepository;
import com.marketingconfort.mobiloca.service.AgentService;
import com.marketingconfort.mobiloca.utils.SpecificationUtils;
import com.marketingconfort.mobiloca.utils.StringUtils;
import com.marketingconfort.mobiloca.utils.UserUtils;
import com.marketingconfort.mobiloca.utils.ValidationUtils;
import com.marketingconfort.mobiloca.utils.*;
import com.marketingconfort.starter.core.dtos.requests.ClientRegistrationRequest;
import com.marketingconfort.starter.core.dtos.requests.UpdateUserInformationRequest;
import com.marketingconfort.starter.core.exceptions.FunctionalException;
......@@ -167,6 +165,7 @@ public class AgentServiceImpl implements AgentService {
agent.setUpdatedDate(LocalDate.now());
agentRepository.save(agent);
}
public List<Long> findAgencyByName(String nameSearch) throws FunctionalException {
List<AgencyDTO> allAgencies = agencyService.getAllAgencies();
return allAgencies.stream()
......@@ -177,43 +176,32 @@ public class AgentServiceImpl implements AgentService {
}
@Override
public Page<AgentResponseDTO> getAllAgents(
int page,
int size,
String sortBy,
String sortDirection,
String idSearch,
String nameSearch,
String cinSearch,
String agencySearch,
String roleSearch,
List<Long> roleIds,
String statusSearch,
String phoneNumberSearch,
LocalDate createdDate,
LocalDate startDate,
LocalDate endDate
) throws FunctionalException {
Pageable pageable = PageRequest.of(page, size, Sort.by(Sort.Direction.fromString(sortDirection), sortBy));
Specification<Agent> spec = Specification.where(null);
if (idSearch != null && !idSearch.isBlank()) {
spec = spec.and(SpecificationUtils.likeFieldAsString("id", idSearch));
}
public Page<AgentResponseDTO> getAllAgents(AgentSearchRequest request) throws FunctionalException {
if (nameSearch != null && !nameSearch.isBlank()) {
spec = spec.and(SpecificationUtils.likeMultipleFields(
List.of("firstName", "lastName", "email"), nameSearch
));
}
Pageable pageable = PageRequest.of(
request.getPage(),
request.getSize(),
Sort.by(Sort.Direction.fromString(request.getSortDirection()), request.getSortBy())
);
if (cinSearch != null && !cinSearch.isBlank()) {
spec = spec.and(SpecificationUtils.likeIgnoreCase("cin", cinSearch));
}
Specification<Agent> spec = new SpecBuilder<Agent>()
.andIfNotBlank(request.getIdSearch(), val -> SpecificationUtils.likeFieldAsString("id", val))
.andIfNotBlank(request.getNameSearch(), val ->
SpecificationUtils.likeMultipleFields(List.of("firstName", "lastName", "email"), val))
.andIfNotBlank(request.getCinSearch(), val -> SpecificationUtils.likeIgnoreCase("cin", val))
.andIfNotBlank(request.getPhoneNumberSearch(), val -> SpecificationUtils.likeIgnoreCase("phoneNumber", val))
.andIfNotBlank(request.getStatusSearch(), val -> SpecificationUtils.likeIgnoreCase("status", val))
.andIfNotBlank(request.getRoleSearch(), val -> SpecificationUtils.likeNestedIgnoreCase("role.name", val))
.andIfNotNull(request.getCreatedDate(), val ->
SpecificationUtils.betweenDates("createdDate",
((LocalDate) val).atStartOfDay().toLocalDate(),
((LocalDate) val).plusDays(1)))
.andIfNotNull(request.getStartDate(), val -> SpecificationUtils.greaterThanOrEqualTo("createdDate", (LocalDate) val))
.andIfNotNull(request.getEndDate(), val -> SpecificationUtils.lessThanOrEqualTo("createdDate", (LocalDate) val))
.build();
if (agencySearch != null && !agencySearch.isBlank()) {
List<Long> agencyIdsMatchingSearch = findAgencyByName(agencySearch);
if (request.getAgencySearch() != null && !request.getAgencySearch().isBlank()) {
List<Long> agencyIdsMatchingSearch = findAgencyByName(request.getAgencySearch());
if (!agencyIdsMatchingSearch.isEmpty()) {
spec = spec.and((root, query, cb) -> root.get("agencyId").in(agencyIdsMatchingSearch));
} else {
......@@ -221,34 +209,8 @@ public class AgentServiceImpl implements AgentService {
}
}
if (phoneNumberSearch != null && !phoneNumberSearch.isBlank()) {
spec = spec.and(SpecificationUtils.likeIgnoreCase("phoneNumber", phoneNumberSearch));
}
if (statusSearch != null && !statusSearch.isBlank()) {
spec = spec.and(SpecificationUtils.likeIgnoreCase("status", statusSearch));
}
if (roleSearch != null && !roleSearch.isBlank()) {
spec = spec.and(SpecificationUtils.likeNestedIgnoreCase("role.name", roleSearch));
}
if (roleIds != null && !roleIds.isEmpty()) {
spec = spec.and((root, query, cb) -> root.get("role").get("id").in(roleIds));
}
if (createdDate != null) {
spec = spec.and(SpecificationUtils.betweenDates("createdDate",
createdDate.atStartOfDay().toLocalDate(),
createdDate.plusDays(1)));
}
if (startDate != null) {
spec = spec.and(SpecificationUtils.greaterThanOrEqualTo("createdDate", startDate));
}
if (endDate != null) {
spec = spec.and(SpecificationUtils.lessThanOrEqualTo("createdDate", endDate));
if (request.getRoleIds() != null && !request.getRoleIds().isEmpty()) {
spec = spec.and((root, query, cb) -> root.get("role").get("id").in(request.getRoleIds()));
}
Page<Agent> agentPage = agentRepository.findAll(spec, pageable);
......@@ -265,7 +227,6 @@ public class AgentServiceImpl implements AgentService {
agencyDTOMap = agencies.stream()
.collect(Collectors.toMap(AgencyDTO::id, Function.identity()));
} catch (FunctionalException ignored) {
}
}
......@@ -297,7 +258,7 @@ public class AgentServiceImpl implements AgentService {
@Override
@Transactional(readOnly = true)
public boolean isAgentExists(Long agentId){
public boolean isAgentExists(Long agentId) {
return agentRepository.existsById(agentId);
}
......
......@@ -3,16 +3,14 @@ package com.marketingconfort.mobiloca.service.impl;
import com.marketingconfort.mobiloca.common.User.enums.UserStatus;
import com.marketingconfort.mobiloca.common.User.models.Client;
import com.marketingconfort.mobiloca.constants.Message;
import com.marketingconfort.mobiloca.dto.request.ClientSearchRequest;
import com.marketingconfort.mobiloca.dto.response.ClientResponseDTO;
import com.marketingconfort.mobiloca.dto.request.ClientRequestDTO;
import com.marketingconfort.mobiloca.mapper.ClientMapper;
import com.marketingconfort.mobiloca.repository.ClientRepository;
import com.marketingconfort.mobiloca.service.AddressService;
import com.marketingconfort.mobiloca.service.ClientService;
import com.marketingconfort.mobiloca.utils.SpecificationUtils;
import com.marketingconfort.mobiloca.utils.StringUtils;
import com.marketingconfort.mobiloca.utils.UserUtils;
import com.marketingconfort.mobiloca.utils.ValidationUtils;
import com.marketingconfort.mobiloca.utils.*;
import com.marketingconfort.starter.core.dtos.requests.ClientRegistrationRequest;
import com.marketingconfort.starter.core.dtos.requests.UpdateUserInformationRequest;
import com.marketingconfort.starter.core.exceptions.FunctionalException;
......@@ -125,66 +123,29 @@ public class ClientServiceImpl implements ClientService {
}
@Override
public Page<ClientResponseDTO> getAllClients(
int page,
int size,
String sortBy,
String sortDirection,
String idSearch,
String nameSearch,
String statusSearch,
String cinSearch,
String phoneNumberSearch,
LocalDate createdDate,
LocalDate startDate,
LocalDate endDate
) {
public Page<ClientResponseDTO> getAllClients(ClientSearchRequest request) {
Pageable pageable = PageRequest.of(
page,
size,
Sort.by(Sort.Direction.fromString(sortDirection), sortBy)
request.getPage(),
request.getSize(),
Sort.by(Sort.Direction.fromString(request.getSortDirection()), request.getSortBy())
);
Specification<Client> spec = Specification.where(null);
if (idSearch != null && !idSearch.isBlank()) {
spec = spec.and(SpecificationUtils.likeIgnoreCase("id", idSearch));
}
if (nameSearch != null && !nameSearch.isBlank()) {
spec = spec.and(SpecificationUtils.likeMultipleFields(
Arrays.asList("firstName", "lastName", "email"),
nameSearch
));
}
if (statusSearch != null && !statusSearch.isBlank()) {
spec = spec.and(SpecificationUtils.likeIgnoreCase("status", statusSearch));
}
if (cinSearch != null && !cinSearch.isBlank()) {
spec = spec.and(SpecificationUtils.likeIgnoreCase("cin", cinSearch));
}
if (phoneNumberSearch != null && !phoneNumberSearch.isBlank()) {
spec = spec.and(SpecificationUtils.likeIgnoreCase("phoneNumber", phoneNumberSearch));
}
if (createdDate != null) {
spec = spec.and(SpecificationUtils.betweenDates(
"createdDate",
createdDate.atStartOfDay().toLocalDate(),
createdDate.plusDays(1)
));
}
if (startDate != null) {
spec = spec.and(SpecificationUtils.greaterThanOrEqualTo("createdDate", startDate));
}
if (endDate != null) {
spec = spec.and(SpecificationUtils.lessThanOrEqualTo("createdDate", endDate));
}
Specification<Client> spec = new SpecBuilder<Client>()
.andIfNotBlank(request.getIdSearch(), val -> SpecificationUtils.likeIgnoreCase("id", val))
.andIfNotBlank(request.getNameSearch(), val ->
SpecificationUtils.likeMultipleFields(Arrays.asList("firstName", "lastName", "email"), val))
.andIfNotBlank(request.getStatusSearch(), val -> SpecificationUtils.likeIgnoreCase("status", val))
.andIfNotBlank(request.getCinSearch(), val -> SpecificationUtils.likeIgnoreCase("cin", val))
.andIfNotBlank(request.getPhoneNumberSearch(), val -> SpecificationUtils.likeIgnoreCase("phoneNumber", val))
.andIfNotNull(request.getCreatedDate(), val ->
SpecificationUtils.betweenDates("createdDate",
((LocalDate) val).atStartOfDay().toLocalDate(),
((LocalDate) val).plusDays(1)))
.andIfNotNull(request.getStartDate(), val ->
SpecificationUtils.greaterThanOrEqualTo("createdDate", (LocalDate) val))
.andIfNotNull(request.getEndDate(), val ->
SpecificationUtils.lessThanOrEqualTo("createdDate", (LocalDate) val))
.build();
Page<Client> clientPage = clientRepository.findAll(spec, pageable);
return clientPage.map(clientMapper::toDto);
......
package com.marketingconfort.mobiloca.service.impl;
import com.marketingconfort.mobiloca.common.User.enums.UnregisteredAgentStatus;
import com.marketingconfort.mobiloca.common.User.models.UnregisteredAgent;
import com.marketingconfort.mobiloca.dto.request.AgentRequestDTO;
import com.marketingconfort.mobiloca.dto.request.UnregisteredAgentSearchRequest;
import com.marketingconfort.mobiloca.dto.response.UnregisteredAgentDTO;
import com.marketingconfort.mobiloca.mapper.UnregisteredAgentMapper;
import com.marketingconfort.mobiloca.repository.UnregisteredAgentRepository;
import com.marketingconfort.mobiloca.service.AgentService;
import com.marketingconfort.mobiloca.service.UnregisteredAgentService;
import com.marketingconfort.mobiloca.utils.SpecBuilder;
import com.marketingconfort.mobiloca.utils.SpecificationUtils;
import com.marketingconfort.starter.core.exceptions.FunctionalException;
import com.marketingconfort.starter.core.exceptions.S3FunctionalException;
import com.marketingconfort.starter.core.exceptions.TechnicalException;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.FunctorException;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import java.time.LocalDate;
import java.util.List;
@Service
@Slf4j
@RequiredArgsConstructor
public class UnregisteredAgentImpl implements UnregisteredAgentService {
private final UnregisteredAgentRepository unregisteredAgentRepository;
private final UnregisteredAgentMapper agentMapper;
private final AgentService agentService;
@Override
public Page<UnregisteredAgentDTO> getAllUnregisteredAgents(UnregisteredAgentSearchRequest request) {
Pageable pageable = PageRequest.of(
request.getPage(),
request.getSize(),
Sort.by(Sort.Direction.fromString(request.getSortDirection()), request.getSortBy())
);
Specification<UnregisteredAgent> spec = new SpecBuilder<UnregisteredAgent>()
.andIfNotBlank(request.getIdSearch(), val -> SpecificationUtils.likeFieldAsString("id", val))
.andIfNotBlank(request.getNameSearch(), val -> SpecificationUtils.likeMultipleFields(
List.of("firstName", "lastName"), val))
.andIfNotBlank(request.getEmailSearch(), val -> SpecificationUtils.likeIgnoreCase("email", val))
.andIfNotBlank(request.getPhoneNumberSearch(), val -> SpecificationUtils.likeIgnoreCase("phone", val))
.andIfNotBlank(request.getAddressSearch(), val -> SpecificationUtils.likeIgnoreCase("address", val))
.andIfNotBlank(request.getStatusSearch(), val -> SpecificationUtils.equalIgnoreCase("status", val))
.andIfNotNull(request.getCreatedDate(), val -> (root, query, cb) -> cb.equal(root.get("createdDate"), val))
.andIfNotNull(request.getStartDate(), val -> SpecificationUtils.greaterThanOrEqualTo("createdDate", (LocalDate) val))
.andIfNotNull(request.getEndDate(), val -> SpecificationUtils.lessThanOrEqualTo("createdDate", (LocalDate) val))
.build();
Page<UnregisteredAgent> pageResult = unregisteredAgentRepository.findAll(spec, pageable);
return pageResult.map(agentMapper::toDto);
}
@Override
public void approveAgent(AgentRequestDTO requestDTO) throws S3FunctionalException, TechnicalException, FunctionalException {
UnregisteredAgent agent = unregisteredAgentRepository.findById(requestDTO.getId())
.orElseThrow(() -> new FunctorException("Unregistered agent not found"));
if (!agent.getStatus().equals(UnregisteredAgentStatus.PENDING)) {
throw new IllegalStateException("Only PENDING agents can be approved");
}
unregisteredAgentRepository.save(agent);
agent.setStatus(UnregisteredAgentStatus.APPROVED);
agentService.createAgent(requestDTO);
}
@Override
public void rejectAgent(Long unregisteredAgentId) {
UnregisteredAgent agent = unregisteredAgentRepository.findById(unregisteredAgentId)
.orElseThrow(() -> new FunctorException("Unregistered agent not found"));
if (!agent.getStatus().equals(UnregisteredAgentStatus.PENDING)) {
throw new IllegalStateException("Only PENDING agents can be rejected");
}
agent.setStatus(UnregisteredAgentStatus.REJECTED);
unregisteredAgentRepository.save(agent);
}
}
package com.marketingconfort.mobiloca.utils;
import org.springframework.data.jpa.domain.Specification;
import java.util.function.Function;
public class SpecBuilder<T> {
private Specification<T> spec = Specification.where(null);
public SpecBuilder<T> andIfNotBlank(String value, Function<String, Specification<T>> supplier) {
if (value != null && !value.isBlank()) {
spec = spec.and(supplier.apply(value));
}
return this;
}
public SpecBuilder<T> andIfNotNull(Object value, Function<Object, Specification<T>> supplier) {
if (value != null) {
spec = spec.and(supplier.apply(value));
}
return this;
}
public Specification<T> build() {
return spec;
}
}
0% ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter