diff --git a/src/main/java/com/iconplus/smartproc/controller/JenisAnggaranController.java b/src/main/java/com/iconplus/smartproc/controller/JenisAnggaranController.java index c2e0d14..cb61b31 100644 --- a/src/main/java/com/iconplus/smartproc/controller/JenisAnggaranController.java +++ b/src/main/java/com/iconplus/smartproc/controller/JenisAnggaranController.java @@ -5,9 +5,7 @@ import com.iconplus.smartproc.helper.model.EmptyResponse; import com.iconplus.smartproc.model.request.JenisAnggaranRequest; import com.iconplus.smartproc.model.response.GetListJenisAnggaranResponse; import com.iconplus.smartproc.model.response.JenisAnggaranResponse; -import com.iconplus.smartproc.repository.JenisAnggaranRepository; import com.iconplus.smartproc.service.jenisanggaran.*; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.web.bind.annotation.*; @@ -17,9 +15,6 @@ import org.springframework.web.bind.annotation.*; @RequestMapping("/api/jenisanggaran") public class JenisAnggaranController { - @Autowired - private JenisAnggaranRepository jenisanggaranRepository; - private final GetListJenisAnggaranService getListJenisAnggaranService; private final GetJenisAnggaranByIdService getJenisAnggaranByIdService; private final PostCreateJenisAnggaranService postCreateJenisAnggaranService; diff --git a/src/main/java/com/iconplus/smartproc/controller/JenisPengadaanController.java b/src/main/java/com/iconplus/smartproc/controller/JenisPengadaanController.java index 50290a8..ed8559c 100644 --- a/src/main/java/com/iconplus/smartproc/controller/JenisPengadaanController.java +++ b/src/main/java/com/iconplus/smartproc/controller/JenisPengadaanController.java @@ -1,65 +1,75 @@ package com.iconplus.smartproc.controller; -import com.iconplus.smartproc.model.entity.JenisPengadaan; -import com.iconplus.smartproc.exception.ResourceNotFoundException; -import com.iconplus.smartproc.repository.JenisPengadaanRepository; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.ResponseEntity; +import com.iconplus.smartproc.helper.model.EmptyResponse; +import com.iconplus.smartproc.model.request.JenisPengadaanRequest; +import com.iconplus.smartproc.model.response.GetListJenisPengadaanResponse; +import com.iconplus.smartproc.model.response.JenisPengadaanResponse; +import com.iconplus.smartproc.service.jenispengadaan.*; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; import org.springframework.web.bind.annotation.*; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - @CrossOrigin(origins = "http://localhost:8080", allowCredentials = "true") @RestController @RequestMapping("/api/jenispengadaan") public class JenisPengadaanController { - @Autowired - private JenisPengadaanRepository jenispengadaanRepository; - //get all data - @GetMapping - public List getAllJenispengadaans(){ - return jenispengadaanRepository.findAll(); - } + private final GetListJenisPengadaanService getListJenisPengadaanService; + private final GetJenisPengadaanService getJenisPengadaanService; + private final PostCreateJenisPengadaanService postCreateJenisPengadaanService; + private final DeleteJenisPengadaanService deleteJenisPengadaanService; + private final PutUpdateJenisPengadaanService putUpdateJenisPengadaanService; - // create - @PostMapping - public JenisPengadaan createJenispengadaan(@RequestBody JenisPengadaan jenispengadaan) { - return jenispengadaanRepository.save(jenispengadaan); - } + public JenisPengadaanController(GetListJenisPengadaanService getListJenisPengadaanService, + GetJenisPengadaanService getJenisPengadaanService, + PostCreateJenisPengadaanService postCreateJenisPengadaanService, + DeleteJenisPengadaanService deleteJenisPengadaanService, + PutUpdateJenisPengadaanService putUpdateJenisPengadaanService) { + this.getListJenisPengadaanService = getListJenisPengadaanService; + this.getJenisPengadaanService = getJenisPengadaanService; + this.postCreateJenisPengadaanService = postCreateJenisPengadaanService; + this.deleteJenisPengadaanService = deleteJenisPengadaanService; + this.putUpdateJenisPengadaanService = putUpdateJenisPengadaanService; + } - // get jenispengadaan by id rest api - @GetMapping("/{id}") - public ResponseEntity getJenispengadaanById(@PathVariable Long id) { - JenisPengadaan jenispengadaan = jenispengadaanRepository.findById(id) - .orElseThrow(() -> new ResourceNotFoundException("Jenispengadaan not exist with id :" + id)); - return ResponseEntity.ok(jenispengadaan); - } + @GetMapping + public GetListJenisPengadaanResponse getListJenisPengadaan(@RequestParam(name = "search", required = false) String search, + @RequestParam(name = "page", defaultValue = "1") Integer page, + @RequestParam(name = "size", defaultValue = "5") Integer size){ - // update jenispengadaan rest api - @PutMapping("/{id}") - public ResponseEntity updateJenispengadaan(@PathVariable Long id, @RequestBody JenisPengadaan jenisPengadaanDetails){ - JenisPengadaan jenispengadaan = jenispengadaanRepository.findById(id) - .orElseThrow(() -> new ResourceNotFoundException("Jenispengadaan not exist with id :" + id)); + Pageable pageable = PageRequest.of((page - 1), size); + JenisPengadaanRequest jenisPengadaanRequest = JenisPengadaanRequest.builder() + .search(search) + .pageable(pageable) + .build(); - jenispengadaan.setJenisPengadaan(jenisPengadaanDetails.getJenisPengadaan()); - jenispengadaan.setKeterangan(jenisPengadaanDetails.getKeterangan()); + return getListJenisPengadaanService.execute(jenisPengadaanRequest); + } - JenisPengadaan updatedJenisPengadaan = jenispengadaanRepository.save(jenispengadaan); - return ResponseEntity.ok(updatedJenisPengadaan); - } + @PostMapping + public JenisPengadaanResponse createJenisPengadaan(@RequestBody JenisPengadaanRequest jenisPengadaanRequest) { + return postCreateJenisPengadaanService.execute(jenisPengadaanRequest); + } - // delete jenispengadaan rest api - @DeleteMapping("/{id}") - public ResponseEntity> deleteJenispengadaan(@PathVariable Long id){ - JenisPengadaan jenispengadaan = jenispengadaanRepository.findById(id) - .orElseThrow(() -> new ResourceNotFoundException("Supposmatrix not exist with id :" + id)); + @GetMapping("/{id}") + public JenisPengadaanResponse getJenisPengadaannById(@PathVariable Long id) { + return getJenisPengadaanService.execute(JenisPengadaanRequest.builder() + .id(id) + .build()); + } - jenispengadaanRepository.delete(jenispengadaan); - Map response = new HashMap<>(); - response.put("deleted", Boolean.TRUE); - return ResponseEntity.ok(response); - } + + @PutMapping("/{id}") + public JenisPengadaanResponse updateJenisPengadaan(@PathVariable Long id, + @RequestBody JenisPengadaanRequest jenisPengadaanRequest){ + jenisPengadaanRequest.setId(id); + return putUpdateJenisPengadaanService.execute(jenisPengadaanRequest); + } + + @DeleteMapping("/{id}") + public EmptyResponse deleteJenisAnggaran(@PathVariable Long id) { + return deleteJenisPengadaanService.execute(JenisPengadaanRequest.builder() + .id(id) + .build()); + } } diff --git a/src/main/java/com/iconplus/smartproc/model/projection/JenisPengadaanView.java b/src/main/java/com/iconplus/smartproc/model/projection/JenisPengadaanView.java new file mode 100644 index 0000000..702dc10 --- /dev/null +++ b/src/main/java/com/iconplus/smartproc/model/projection/JenisPengadaanView.java @@ -0,0 +1,16 @@ +package com.iconplus.smartproc.model.projection; + +public interface JenisPengadaanView { + + Long getId(); + void setId(Long id); + + String getJenisPengadaan(); + void setJenisPengadaan(String jenisPengadaan); + + String getKeterangan(); + void setKeterangan(String keterangan); + + Boolean getIsActive(); + void setIsActive(Boolean isActive); +} diff --git a/src/main/java/com/iconplus/smartproc/model/request/JenisPengadaanRequest.java b/src/main/java/com/iconplus/smartproc/model/request/JenisPengadaanRequest.java new file mode 100644 index 0000000..ec8a2f1 --- /dev/null +++ b/src/main/java/com/iconplus/smartproc/model/request/JenisPengadaanRequest.java @@ -0,0 +1,22 @@ +package com.iconplus.smartproc.model.request; + +import com.iconplus.smartproc.helper.base.BaseRequest; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.data.domain.Pageable; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class JenisPengadaanRequest extends BaseRequest { + + private Long id; + private String jenisPengadaan; + private String keterangan; + private Boolean isActive; + private String search; + private transient Pageable pageable; +} diff --git a/src/main/java/com/iconplus/smartproc/model/response/GetListJenisPengadaanResponse.java b/src/main/java/com/iconplus/smartproc/model/response/GetListJenisPengadaanResponse.java new file mode 100644 index 0000000..22dc679 --- /dev/null +++ b/src/main/java/com/iconplus/smartproc/model/response/GetListJenisPengadaanResponse.java @@ -0,0 +1,20 @@ +package com.iconplus.smartproc.model.response; + +import com.iconplus.smartproc.helper.base.BaseResponse; +import com.iconplus.smartproc.helper.model.Pagination; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class GetListJenisPengadaanResponse extends BaseResponse { + + private List data; + private Pagination pagination; +} diff --git a/src/main/java/com/iconplus/smartproc/model/response/JenisPengadaanResponse.java b/src/main/java/com/iconplus/smartproc/model/response/JenisPengadaanResponse.java new file mode 100644 index 0000000..367a31c --- /dev/null +++ b/src/main/java/com/iconplus/smartproc/model/response/JenisPengadaanResponse.java @@ -0,0 +1,21 @@ +package com.iconplus.smartproc.model.response; + +import com.iconplus.smartproc.helper.base.BaseResponse; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class JenisPengadaanResponse extends BaseResponse { + + private Long id; + private String jenisPengadaan; + private String keterangan; + private Boolean isActive; + private Boolean isDelete; + +} diff --git a/src/main/java/com/iconplus/smartproc/repository/JenisPengadaanRepository.java b/src/main/java/com/iconplus/smartproc/repository/JenisPengadaanRepository.java index 8eff2e3..79cd333 100644 --- a/src/main/java/com/iconplus/smartproc/repository/JenisPengadaanRepository.java +++ b/src/main/java/com/iconplus/smartproc/repository/JenisPengadaanRepository.java @@ -1,10 +1,29 @@ package com.iconplus.smartproc.repository; import com.iconplus.smartproc.model.entity.JenisPengadaan; +import com.iconplus.smartproc.model.projection.JenisPengadaanView; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; +import java.util.Optional; + @Repository public interface JenisPengadaanRepository extends JpaRepository { + + Optional findByIdAndIsDeleteFalse(Long id); + Optional findByJenisPengadaanAndIsDeleteFalse(String jenisPengadaan); + + @Query(value = "SELECT jp.id as id, " + + "jp.jenisPengadaan as jenisPengadaan, " + + "jp.keterangan as keterangan, " + + "jp.isActive as isActive " + + "FROM JenisPengadaan jp " + + "WHERE jp.isDelete = false " + + "AND (:search='' OR UPPER(jp.jenisPengadaan) like :search) " + + "ORDER BY jp.id") + Page getListJenisPengadaan(String search, Pageable pageable); } \ No newline at end of file diff --git a/src/main/java/com/iconplus/smartproc/service/jenispengadaan/DeleteJenisPengadaanService.java b/src/main/java/com/iconplus/smartproc/service/jenispengadaan/DeleteJenisPengadaanService.java new file mode 100644 index 0000000..db71fe9 --- /dev/null +++ b/src/main/java/com/iconplus/smartproc/service/jenispengadaan/DeleteJenisPengadaanService.java @@ -0,0 +1,26 @@ +package com.iconplus.smartproc.service.jenispengadaan; + +import com.iconplus.smartproc.exception.BusinessException; +import com.iconplus.smartproc.helper.model.EmptyResponse; +import com.iconplus.smartproc.helper.service.BaseService; +import com.iconplus.smartproc.model.request.JenisPengadaanRequest; +import com.iconplus.smartproc.repository.JenisPengadaanRepository; +import org.springframework.stereotype.Service; + +@Service +public class DeleteJenisPengadaanService implements BaseService { + + private JenisPengadaanRepository jenisPengadaanRepository; + public DeleteJenisPengadaanService(JenisPengadaanRepository jenisPengadaanRepository) { + this.jenisPengadaanRepository = jenisPengadaanRepository; + } + + @Override + public EmptyResponse execute(JenisPengadaanRequest input) { + var jenisPengadaan = jenisPengadaanRepository.findByIdAndIsDeleteFalse(input.getId()) + .orElseThrow(() -> new BusinessException("err", "err", "err")); + jenisPengadaan.setIsDelete(true); + jenisPengadaanRepository.save(jenisPengadaan); + return new EmptyResponse(); + } +} diff --git a/src/main/java/com/iconplus/smartproc/service/jenispengadaan/GetJenisPengadaanService.java b/src/main/java/com/iconplus/smartproc/service/jenispengadaan/GetJenisPengadaanService.java new file mode 100644 index 0000000..8e13017 --- /dev/null +++ b/src/main/java/com/iconplus/smartproc/service/jenispengadaan/GetJenisPengadaanService.java @@ -0,0 +1,32 @@ +package com.iconplus.smartproc.service.jenispengadaan; + +import com.iconplus.smartproc.exception.BusinessException; +import com.iconplus.smartproc.helper.service.BaseService; +import com.iconplus.smartproc.model.request.JenisPengadaanRequest; +import com.iconplus.smartproc.model.response.JenisPengadaanResponse; +import com.iconplus.smartproc.repository.JenisPengadaanRepository; +import org.springframework.stereotype.Service; + +@Service +public class GetJenisPengadaanService implements BaseService { + + private JenisPengadaanRepository jenisPengadaanRepository; + public GetJenisPengadaanService(JenisPengadaanRepository jenisPengadaanRepository) { + this.jenisPengadaanRepository = jenisPengadaanRepository; + } + + @Override + public JenisPengadaanResponse execute(JenisPengadaanRequest input) { + + var jenisPengadaan = jenisPengadaanRepository.findByIdAndIsDeleteFalse(input.getId()) + .orElseThrow(() -> new BusinessException("err", "err", "err")); + + return JenisPengadaanResponse.builder() + .id(jenisPengadaan.getId()) + .jenisPengadaan(jenisPengadaan.getJenisPengadaan()) + .keterangan(jenisPengadaan.getKeterangan()) + .isActive(jenisPengadaan.getIsActive()) + .isDelete(jenisPengadaan.getIsDelete()) + .build(); + } +} diff --git a/src/main/java/com/iconplus/smartproc/service/jenispengadaan/GetListJenisPengadaanService.java b/src/main/java/com/iconplus/smartproc/service/jenispengadaan/GetListJenisPengadaanService.java new file mode 100644 index 0000000..1460e96 --- /dev/null +++ b/src/main/java/com/iconplus/smartproc/service/jenispengadaan/GetListJenisPengadaanService.java @@ -0,0 +1,59 @@ +package com.iconplus.smartproc.service.jenispengadaan; + +import com.iconplus.smartproc.helper.model.Pagination; +import com.iconplus.smartproc.helper.service.BaseService; +import com.iconplus.smartproc.model.projection.JenisPengadaanView; +import com.iconplus.smartproc.model.request.JenisPengadaanRequest; +import com.iconplus.smartproc.model.response.GetListJenisPengadaanResponse; +import com.iconplus.smartproc.model.response.JenisPengadaanResponse; +import com.iconplus.smartproc.repository.JenisPengadaanRepository; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +@Service +public class GetListJenisPengadaanService implements BaseService { + + private JenisPengadaanRepository jenisPengadaanRepository; + public GetListJenisPengadaanService(JenisPengadaanRepository jenisPengadaanRepository) { + this.jenisPengadaanRepository = jenisPengadaanRepository; + } + + @Override + public GetListJenisPengadaanResponse execute(JenisPengadaanRequest input) { + validateRequest(input); + List jenisPengadaanResponseList = new ArrayList<>(); + var jenisPengadaanViews = jenisPengadaanRepository.getListJenisPengadaan(input.getSearch(), input.getPageable()); + + for (JenisPengadaanView jenisPengadaanView : jenisPengadaanViews) { + JenisPengadaanResponse jenisPengadaanResponse = JenisPengadaanResponse.builder() + .id(jenisPengadaanView.getId()) + .jenisPengadaan(jenisPengadaanView.getJenisPengadaan()) + .keterangan(jenisPengadaanView.getKeterangan()) + .isActive(jenisPengadaanView.getIsActive()) + .build(); + jenisPengadaanResponseList.add(jenisPengadaanResponse); + } + + return GetListJenisPengadaanResponse.builder() + .data(jenisPengadaanResponseList) + .pagination(Pagination.builder() + .pageSize(input.getPageable().getPageSize()) + .currentPage(input.getPageable().getPageNumber()) + .totalPages(jenisPengadaanViews.getTotalPages()) + .totalRecords(jenisPengadaanViews.getTotalElements()) + .isFirstPage(jenisPengadaanViews.isFirst()) + .isLastPage(jenisPengadaanViews.isLast()) + .build()) + .build(); + + } + + private void validateRequest(JenisPengadaanRequest input) { + if (StringUtils.isNotBlank(input.getSearch())) { + input.setSearch('%'+ input.getSearch().toUpperCase()+'%'); + } + } +} diff --git a/src/main/java/com/iconplus/smartproc/service/jenispengadaan/PostCreateJenisPengadaanService.java b/src/main/java/com/iconplus/smartproc/service/jenispengadaan/PostCreateJenisPengadaanService.java new file mode 100644 index 0000000..20b272e --- /dev/null +++ b/src/main/java/com/iconplus/smartproc/service/jenispengadaan/PostCreateJenisPengadaanService.java @@ -0,0 +1,37 @@ +package com.iconplus.smartproc.service.jenispengadaan; + +import com.iconplus.smartproc.exception.BusinessException; +import com.iconplus.smartproc.helper.service.BaseService; +import com.iconplus.smartproc.model.entity.JenisPengadaan; +import com.iconplus.smartproc.model.request.JenisPengadaanRequest; +import com.iconplus.smartproc.model.response.JenisPengadaanResponse; +import com.iconplus.smartproc.repository.JenisPengadaanRepository; +import org.springframework.stereotype.Service; + +@Service +public class PostCreateJenisPengadaanService implements BaseService { + + private JenisPengadaanRepository jenisPengadaanRepository; + public PostCreateJenisPengadaanService(JenisPengadaanRepository jenisPengadaanRepository) { + this.jenisPengadaanRepository = jenisPengadaanRepository; + } + + @Override + public JenisPengadaanResponse execute(JenisPengadaanRequest input) { + var jenisPengadaan = jenisPengadaanRepository.findByJenisPengadaanAndIsDeleteFalse(input.getJenisPengadaan()); + if (jenisPengadaan.isPresent()) { + throw new BusinessException("err", "err", "err"); + } + + JenisPengadaan jenisPengadaanEntity = JenisPengadaan.builder() + .jenisPengadaan(input.getJenisPengadaan()) + .keterangan(input.getKeterangan()) + .isActive(input.getIsActive()) + .isDelete(false) + .build(); + var result = jenisPengadaanRepository.save(jenisPengadaanEntity); + return JenisPengadaanResponse.builder() + .id(result.getId()) + .build(); + } +} diff --git a/src/main/java/com/iconplus/smartproc/service/jenispengadaan/PutUpdateJenisPengadaanService.java b/src/main/java/com/iconplus/smartproc/service/jenispengadaan/PutUpdateJenisPengadaanService.java new file mode 100644 index 0000000..18373b9 --- /dev/null +++ b/src/main/java/com/iconplus/smartproc/service/jenispengadaan/PutUpdateJenisPengadaanService.java @@ -0,0 +1,30 @@ +package com.iconplus.smartproc.service.jenispengadaan; + +import com.iconplus.smartproc.exception.BusinessException; +import com.iconplus.smartproc.helper.service.BaseService; +import com.iconplus.smartproc.model.request.JenisPengadaanRequest; +import com.iconplus.smartproc.model.response.JenisPengadaanResponse; +import com.iconplus.smartproc.repository.JenisPengadaanRepository; +import org.springframework.stereotype.Service; + +@Service +public class PutUpdateJenisPengadaanService implements BaseService { + + private JenisPengadaanRepository jenisPengadaanRepository; + public PutUpdateJenisPengadaanService(JenisPengadaanRepository jenisPengadaanRepository) { + this.jenisPengadaanRepository = jenisPengadaanRepository; + } + + @Override + public JenisPengadaanResponse execute(JenisPengadaanRequest input) { + var jenisPengadaan = jenisPengadaanRepository.findByIdAndIsDeleteFalse(input.getId()) + .orElseThrow(() -> new BusinessException("err", "err", "err")); + jenisPengadaan.setJenisPengadaan(input.getJenisPengadaan()); + jenisPengadaan.setKeterangan(input.getKeterangan()); + jenisPengadaan.setIsActive(input.getIsActive()); + jenisPengadaanRepository.save(jenisPengadaan); + return JenisPengadaanResponse.builder() + .id(jenisPengadaan.getId()) + .build(); + } +}