package net.gepafin.tendermanagement.dao; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.RegionEntity; import net.gepafin.tendermanagement.enums.RegionStatusEnum; import net.gepafin.tendermanagement.model.request.RegionReq; import net.gepafin.tendermanagement.model.response.RegionResponseBean; import net.gepafin.tendermanagement.repositories.RegionRepository; import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import java.util.List; import java.util.stream.Collectors; import static net.gepafin.tendermanagement.util.Utils.setIfUpdated; @Repository public class RegionDao { private final Logger log = LoggerFactory.getLogger(RegionDao.class); @Autowired private RegionRepository regionRepository; public RegionResponseBean createRegion(RegionReq regionReq) { log.info("Creating new region with details: {}", regionReq); RegionEntity regionEntity = convertRegionRequestToRegionEntity(regionReq); regionEntity = regionRepository.save(regionEntity); log.info("Region created with ID: {}", regionEntity.getId()); return convertRegionEntityToRegionResponse(regionEntity); } private RegionEntity convertRegionRequestToRegionEntity(RegionReq regionReq) { RegionEntity regionEntity = new RegionEntity(); regionEntity.setCountry(regionReq.getCountry()); regionEntity.setDescription(regionReq.getDescription()); regionEntity.setGdp(regionReq.getGdp()); regionEntity.setRegionName(regionReq.getRegionName()); regionEntity.setAreaSize(regionReq.getAreaSize()); regionEntity.setPopulation(regionReq.getPopulation()); regionEntity.setEnvironmentalScore(regionReq.getEnvironmentalScore()); regionEntity.setStatus(regionReq.getStatus().getValue()); regionEntity.setHealthcareAccess(regionReq.getHealthcareAccess()); regionEntity.setInfrastructureScore(regionReq.getInfrastructureScore()); regionEntity.setPriorityArea(regionReq.getPriorityArea()); regionEntity.setUnemploymentRate(regionReq.getUnemploymentRate()); regionEntity.setEducationLevel(regionReq.getEducationLevel()); return regionEntity; } public RegionResponseBean convertRegionEntityToRegionResponse(RegionEntity regionEntity) { RegionResponseBean regionResponseBean = new RegionResponseBean(); regionResponseBean.setId(regionEntity.getId()); regionResponseBean.setCreatedDate(regionEntity.getCreatedDate()); regionResponseBean.setUpdatedDate(regionEntity.getUpdatedDate()); regionResponseBean.setCountry(regionEntity.getCountry()); regionResponseBean.setDescription(regionEntity.getDescription()); regionResponseBean.setGdp(regionEntity.getGdp()); regionResponseBean.setRegionName(regionEntity.getRegionName()); regionResponseBean.setAreaSize(regionEntity.getAreaSize()); regionResponseBean.setPopulation(regionEntity.getPopulation()); regionResponseBean.setEnvironmentalScore(regionEntity.getEnvironmentalScore()); regionResponseBean.setStatus(RegionStatusEnum.valueOf(regionEntity.getStatus())); regionResponseBean.setHealthcareAccess(regionEntity.getHealthcareAccess()); regionResponseBean.setInfrastructureScore(regionEntity.getInfrastructureScore()); regionResponseBean.setPriorityArea(regionEntity.getPriorityArea()); regionResponseBean.setUnemploymentRate(regionEntity.getUnemploymentRate()); regionResponseBean.setEducationLevel(regionEntity.getEducationLevel()); return regionResponseBean; } public RegionResponseBean updateRegion(Long id, RegionReq regionReq) { log.info("Updating region with ID: {}", id); RegionEntity existingRegion = validateRegion(id); log.info("Current region details: {}", existingRegion); log.info("New region details: {}", regionReq); String newStatus = regionReq.getStatus() != null ? regionReq.getStatus().getValue() : null; if (Boolean.FALSE.equals(existingRegion.getStatus().equals(newStatus))) { existingRegion.setStatus(newStatus); } setIfUpdated(existingRegion::getRegionName, existingRegion::setRegionName, regionReq.getRegionName()); setIfUpdated(existingRegion::getDescription, existingRegion::setDescription, regionReq.getDescription()); setIfUpdated(existingRegion::getCountry, existingRegion::setCountry, regionReq.getCountry()); setIfUpdated(existingRegion::getPriorityArea, existingRegion::setPriorityArea, regionReq.getPriorityArea()); setIfUpdated(existingRegion::getPopulation, existingRegion::setPopulation, regionReq.getPopulation()); setIfUpdated(existingRegion::getAreaSize, existingRegion::setAreaSize, regionReq.getAreaSize()); setIfUpdated(existingRegion::getGdp, existingRegion::setGdp, regionReq.getGdp()); setIfUpdated(existingRegion::getUnemploymentRate, existingRegion::setUnemploymentRate, regionReq.getUnemploymentRate()); setIfUpdated(existingRegion::getInfrastructureScore, existingRegion::setInfrastructureScore, regionReq.getInfrastructureScore()); setIfUpdated(existingRegion::getEducationLevel, existingRegion::setEducationLevel, regionReq.getEducationLevel()); setIfUpdated(existingRegion::getHealthcareAccess, existingRegion::setHealthcareAccess, regionReq.getHealthcareAccess()); setIfUpdated(existingRegion::getEnvironmentalScore, existingRegion::setEnvironmentalScore, regionReq.getEnvironmentalScore()); existingRegion = regionRepository.save(existingRegion); log.info("Region updated with ID: {}", existingRegion.getId()); return Utils.convertObject(existingRegion, RegionResponseBean.class); } public RegionEntity validateRegion(Long id) { log.info("Fetching region with ID: {}", id); RegionEntity regionEntity = regionRepository.findById(id) .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.REGION_NOT_FOUND_MSG))); log.info("Region found: {}", regionEntity); return regionEntity; } public RegionResponseBean getRegionById(Long id) { log.info("Fetching region with ID: {}", id); RegionEntity regionEntity = validateRegion(id); return convertRegionEntityToRegionResponse(regionEntity); } public void deleteById(Long id) { log.info("Deleting region with ID: {}", id); validateRegion(id); regionRepository.deleteById(id); log.info("Region deleted with ID: {}", id); } public List getAllRegions() { log.info("Fetching all regions"); List regions = regionRepository.findAll() .stream() .map(regionEntity -> Utils.convertObject(regionEntity, RegionResponseBean.class)) .collect(Collectors.toList()); log.info("Total regions found: {}", regions.size()); return regions; } }