From 28f17d5b5405e0f7ffb7ab8bd1bd2d1f42ad599f Mon Sep 17 00:00:00 2001 From: dirgantarasiahaan Date: Wed, 24 May 2023 23:53:00 +0700 Subject: [PATCH] enhance api sumber dana --- .../controller/SumberDanaController.java | 117 +++++++++--------- .../model/projection/SumberDanaView.java | 17 +++ .../model/request/SumberDanaRequest.java | 23 ++++ .../response/GetListSumberDanaResponse.java | 20 +++ .../model/response/SumberDanaResponse.java | 20 +++ .../repository/SumberDanaRepository.java | 20 +++ .../sumberdana/DeleteSumberDanaService.java | 26 ++++ .../sumberdana/GetListSumberDanaService.java | 49 ++++++++ .../sumberdana/GetSumberDanaService.java | 31 +++++ .../PostCreateSumberDanaService.java | 40 ++++++ .../sumberdana/PutSumberDanaService.java | 32 +++++ 11 files changed, 334 insertions(+), 61 deletions(-) create mode 100644 src/main/java/com/iconplus/smartproc/model/projection/SumberDanaView.java create mode 100644 src/main/java/com/iconplus/smartproc/model/request/SumberDanaRequest.java create mode 100644 src/main/java/com/iconplus/smartproc/model/response/GetListSumberDanaResponse.java create mode 100644 src/main/java/com/iconplus/smartproc/model/response/SumberDanaResponse.java create mode 100644 src/main/java/com/iconplus/smartproc/service/sumberdana/DeleteSumberDanaService.java create mode 100644 src/main/java/com/iconplus/smartproc/service/sumberdana/GetListSumberDanaService.java create mode 100644 src/main/java/com/iconplus/smartproc/service/sumberdana/GetSumberDanaService.java create mode 100644 src/main/java/com/iconplus/smartproc/service/sumberdana/PostCreateSumberDanaService.java create mode 100644 src/main/java/com/iconplus/smartproc/service/sumberdana/PutSumberDanaService.java diff --git a/src/main/java/com/iconplus/smartproc/controller/SumberDanaController.java b/src/main/java/com/iconplus/smartproc/controller/SumberDanaController.java index 95873cf..5670f07 100644 --- a/src/main/java/com/iconplus/smartproc/controller/SumberDanaController.java +++ b/src/main/java/com/iconplus/smartproc/controller/SumberDanaController.java @@ -1,78 +1,73 @@ package com.iconplus.smartproc.controller; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.CrossOrigin; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.iconplus.smartproc.exception.ResourceNotFoundException; -import com.iconplus.smartproc.model.entity.SumberDana; -import com.iconplus.smartproc.repository.SumberDanaRepository; +import com.iconplus.smartproc.helper.model.EmptyResponse; +import com.iconplus.smartproc.model.request.SumberDanaRequest; +import com.iconplus.smartproc.model.response.GetListSumberDanaResponse; +import com.iconplus.smartproc.model.response.SumberDanaResponse; +import com.iconplus.smartproc.service.sumberdana.*; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.web.bind.annotation.*; @CrossOrigin(origins = "http://localhost:8080", allowCredentials = "true") @RestController @RequestMapping("/api/sumberdana") public class SumberDanaController { - @Autowired - private SumberDanaRepository sumberdanaRepository; - //get all data - @GetMapping - public List getAllSumberdanas(){ - return sumberdanaRepository.findAll(); - } + private GetListSumberDanaService getListSumberDanaService; + private PostCreateSumberDanaService postCreateSumberDanaService; + private DeleteSumberDanaService deleteSumberDanaService; + private GetSumberDanaService getSumberDanaService; + private PutSumberDanaService putSumberDanaService; - // create - @PostMapping - public SumberDana createSumberdana(@RequestBody SumberDana sumberdana) { - return sumberdanaRepository.save(sumberdana); - } + public SumberDanaController(GetListSumberDanaService getListSumberDanaService, + PostCreateSumberDanaService postCreateSumberDanaService, + DeleteSumberDanaService deleteSumberDanaService, + GetSumberDanaService getSumberDanaService, + PutSumberDanaService putSumberDanaService) { + this.getListSumberDanaService = getListSumberDanaService; + this.postCreateSumberDanaService = postCreateSumberDanaService; + this.deleteSumberDanaService = deleteSumberDanaService; + this.getSumberDanaService = getSumberDanaService; + this.putSumberDanaService = putSumberDanaService; + } - // get sumberdana by id rest api - @GetMapping("/{id}") - public ResponseEntity getSumberdanaById(@PathVariable Long id) { - SumberDana sumberdana = sumberdanaRepository.findById(id) - .orElseThrow(() -> new ResourceNotFoundException("Sumberdana not exist with id :" + id)); - return ResponseEntity.ok(sumberdana); - } + @GetMapping + public GetListSumberDanaResponse getListSumberDana(@RequestParam(name = "search", required = false) String search, + @RequestParam(name = "page", defaultValue = "1") Integer page, + @RequestParam(name = "size", defaultValue = "5") Integer size){ - // update sumberdana rest api - @PutMapping("/{id}") - public ResponseEntity updateSumberdana(@PathVariable Long id, @RequestBody SumberDana sumberDanaDetails){ - SumberDana sumberdana = sumberdanaRepository.findById(id) - .orElseThrow(() -> new ResourceNotFoundException("Sumberdana not exist with id :" + id)); + Pageable pageable = PageRequest.of((page - 1), size); + SumberDanaRequest sumberDanaRequest = SumberDanaRequest.builder() + .search(search) + .pageable(pageable) + .build(); - sumberdana.setSumberDana(sumberDanaDetails.getSumberDana()); - sumberdana.setKeterangan(sumberDanaDetails.getKeterangan()); - - SumberDana updatedSumberDana = sumberdanaRepository.save(sumberdana); - return ResponseEntity.ok(updatedSumberDana); - } - - // delete sumberdana rest api - @DeleteMapping("/{id}") - public ResponseEntity> deleteSumberdana(@PathVariable Long id){ - SumberDana sumberdana = sumberdanaRepository.findById(id) - .orElseThrow(() -> new ResourceNotFoundException("Sumberdana not exist with id :" + id)); - - sumberdanaRepository.delete(sumberdana); - Map response = new HashMap<>(); - response.put("deleted", Boolean.TRUE); - return ResponseEntity.ok(response); - } + return getListSumberDanaService.execute(sumberDanaRequest); + } + @PostMapping + public SumberDanaResponse createSumberDana(@RequestBody SumberDanaRequest request) { + return postCreateSumberDanaService.execute(request); + } + @GetMapping("/{id}") + public SumberDanaResponse getSumberDanaById(@PathVariable Long id) { + return getSumberDanaService.execute(SumberDanaRequest.builder() + .id(id) + .build()); + } + @PutMapping("/{id}") + public SumberDanaResponse updateBidang(@PathVariable Long id, @RequestBody SumberDanaRequest request){ + request.setId(id); + return putSumberDanaService.execute(request); + } + @DeleteMapping("/{id}") + public EmptyResponse deleteBidang(@PathVariable Long id){ + return deleteSumberDanaService.execute(SumberDanaRequest.builder() + .id(id) + .build()); + } } diff --git a/src/main/java/com/iconplus/smartproc/model/projection/SumberDanaView.java b/src/main/java/com/iconplus/smartproc/model/projection/SumberDanaView.java new file mode 100644 index 0000000..22e0572 --- /dev/null +++ b/src/main/java/com/iconplus/smartproc/model/projection/SumberDanaView.java @@ -0,0 +1,17 @@ +package com.iconplus.smartproc.model.projection; + +public interface SumberDanaView { + + Long getId(); + void setId(); + + String getKeterangan(); + void setKeterangan(String keterangan); + + String getSumberDana(); + void setSumberDana(String sumberDana); + + Boolean getIsActive(); + void setIsActive(Boolean isActive); + +} diff --git a/src/main/java/com/iconplus/smartproc/model/request/SumberDanaRequest.java b/src/main/java/com/iconplus/smartproc/model/request/SumberDanaRequest.java new file mode 100644 index 0000000..11a7802 --- /dev/null +++ b/src/main/java/com/iconplus/smartproc/model/request/SumberDanaRequest.java @@ -0,0 +1,23 @@ +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 SumberDanaRequest extends BaseRequest { + + private Long id; + private String sumberDana; + private String keterangan; + private Boolean isActive; + private String search; + private transient Pageable pageable; + +} diff --git a/src/main/java/com/iconplus/smartproc/model/response/GetListSumberDanaResponse.java b/src/main/java/com/iconplus/smartproc/model/response/GetListSumberDanaResponse.java new file mode 100644 index 0000000..7d12fcd --- /dev/null +++ b/src/main/java/com/iconplus/smartproc/model/response/GetListSumberDanaResponse.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 +@NoArgsConstructor +@AllArgsConstructor +public class GetListSumberDanaResponse extends BaseResponse { + + private List data; + private Pagination pagination; +} diff --git a/src/main/java/com/iconplus/smartproc/model/response/SumberDanaResponse.java b/src/main/java/com/iconplus/smartproc/model/response/SumberDanaResponse.java new file mode 100644 index 0000000..6bbe13e --- /dev/null +++ b/src/main/java/com/iconplus/smartproc/model/response/SumberDanaResponse.java @@ -0,0 +1,20 @@ +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 SumberDanaResponse extends BaseResponse { + + private Long id; + private String sumberDana; + private String keterangan; + private Boolean isActive; + private Boolean isDelete; +} diff --git a/src/main/java/com/iconplus/smartproc/repository/SumberDanaRepository.java b/src/main/java/com/iconplus/smartproc/repository/SumberDanaRepository.java index 41230fb..8769890 100644 --- a/src/main/java/com/iconplus/smartproc/repository/SumberDanaRepository.java +++ b/src/main/java/com/iconplus/smartproc/repository/SumberDanaRepository.java @@ -1,10 +1,30 @@ package com.iconplus.smartproc.repository; import com.iconplus.smartproc.model.entity.SumberDana; +import com.iconplus.smartproc.model.projection.SumberDanaView; +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 SumberDanaRepository extends JpaRepository { + + Optional findByIdAndIsDeleteFalse(Long id); + Optional findBySumberDanaAndIsDeleteFalse(String sumberDana); + + @Query(value = "SELECT sd.id as id, " + + "sd.sumberDana as sumberDana, " + + "sd.keterangan as keterangan, " + + "sd.isActive as isActive " + + "FROM SumberDana sd " + + "WHERE sd.isDelete = false " + + "AND (:search = '' or UPPER(sd.sumberDana) like :search) " + + "ORDER BY sd.id") + Page getListSumberDana(String search, Pageable pageable); + } diff --git a/src/main/java/com/iconplus/smartproc/service/sumberdana/DeleteSumberDanaService.java b/src/main/java/com/iconplus/smartproc/service/sumberdana/DeleteSumberDanaService.java new file mode 100644 index 0000000..2707b3c --- /dev/null +++ b/src/main/java/com/iconplus/smartproc/service/sumberdana/DeleteSumberDanaService.java @@ -0,0 +1,26 @@ +package com.iconplus.smartproc.service.sumberdana; + +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.SumberDanaRequest; +import com.iconplus.smartproc.repository.SumberDanaRepository; +import org.springframework.stereotype.Service; + +@Service +public class DeleteSumberDanaService implements BaseService { + + private SumberDanaRepository sumberDanaRepository; + + public DeleteSumberDanaService(SumberDanaRepository sumberDanaRepository) { + this.sumberDanaRepository = sumberDanaRepository; + } + + @Override + public EmptyResponse execute(SumberDanaRequest input) { + var sumberDana = sumberDanaRepository.findByIdAndIsDeleteFalse(input.getId()).orElseThrow(() -> new BusinessException("err", "err", "err")); + sumberDana.setIsDelete(true); + sumberDanaRepository.save(sumberDana); + return new EmptyResponse(); + } +} diff --git a/src/main/java/com/iconplus/smartproc/service/sumberdana/GetListSumberDanaService.java b/src/main/java/com/iconplus/smartproc/service/sumberdana/GetListSumberDanaService.java new file mode 100644 index 0000000..10742bb --- /dev/null +++ b/src/main/java/com/iconplus/smartproc/service/sumberdana/GetListSumberDanaService.java @@ -0,0 +1,49 @@ +package com.iconplus.smartproc.service.sumberdana; + +import com.iconplus.smartproc.helper.model.Pagination; +import com.iconplus.smartproc.helper.service.BaseService; +import com.iconplus.smartproc.model.projection.SumberDanaView; +import com.iconplus.smartproc.model.request.SumberDanaRequest; +import com.iconplus.smartproc.model.response.GetListSumberDanaResponse; +import com.iconplus.smartproc.model.response.SumberDanaResponse; +import com.iconplus.smartproc.repository.SumberDanaRepository; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +@Service +public class GetListSumberDanaService implements BaseService { + + private SumberDanaRepository sumberDanaRepository; + + public GetListSumberDanaService(SumberDanaRepository sumberDanaRepository) { + this.sumberDanaRepository = sumberDanaRepository; + } + + @Override + public GetListSumberDanaResponse execute(SumberDanaRequest input) { + List sumberDanaResponseList = new ArrayList<>(); + var sumberDanaViews= sumberDanaRepository.getListSumberDana(input.getSearch(), input.getPageable()); + for (SumberDanaView sumberDanaView : sumberDanaViews) { + SumberDanaResponse sumberDanaResponse = SumberDanaResponse.builder() + .id(sumberDanaView.getId()) + .sumberDana(sumberDanaView.getSumberDana()) + .keterangan(sumberDanaView.getKeterangan()) + .isActive(sumberDanaView.getIsActive()) + .build(); + sumberDanaResponseList.add(sumberDanaResponse); + } + return GetListSumberDanaResponse.builder() + .data(sumberDanaResponseList) + .pagination(Pagination.builder() + .pageSize(input.getPageable().getPageSize()) + .currentPage(input.getPageable().getPageNumber()) + .totalPages(sumberDanaViews.getTotalPages()) + .totalRecords(sumberDanaViews.getTotalElements()) + .isFirstPage(sumberDanaViews.isFirst()) + .isLastPage(sumberDanaViews.isLast()) + .build()) + .build(); + } +} diff --git a/src/main/java/com/iconplus/smartproc/service/sumberdana/GetSumberDanaService.java b/src/main/java/com/iconplus/smartproc/service/sumberdana/GetSumberDanaService.java new file mode 100644 index 0000000..6c30c19 --- /dev/null +++ b/src/main/java/com/iconplus/smartproc/service/sumberdana/GetSumberDanaService.java @@ -0,0 +1,31 @@ +package com.iconplus.smartproc.service.sumberdana; + +import com.iconplus.smartproc.exception.BusinessException; +import com.iconplus.smartproc.helper.service.BaseService; +import com.iconplus.smartproc.model.request.SumberDanaRequest; +import com.iconplus.smartproc.model.response.SumberDanaResponse; +import com.iconplus.smartproc.repository.SumberDanaRepository; +import org.springframework.stereotype.Service; + +@Service +public class GetSumberDanaService implements BaseService { + + private SumberDanaRepository sumberDanaRepository; + + public GetSumberDanaService(SumberDanaRepository sumberDanaRepository) { + this.sumberDanaRepository = sumberDanaRepository; + } + + @Override + public SumberDanaResponse execute(SumberDanaRequest input) { + + var sumberDana = sumberDanaRepository.findByIdAndIsDeleteFalse(input.getId()).orElseThrow(() -> new BusinessException("err", "err", "err")); + return SumberDanaResponse.builder() + .id(sumberDana.getId()) + .sumberDana(sumberDana.getSumberDana()) + .keterangan(sumberDana.getKeterangan()) + .isActive(sumberDana.getIsActive()) + .isDelete(sumberDana.getIsDelete()) + .build(); + } +} diff --git a/src/main/java/com/iconplus/smartproc/service/sumberdana/PostCreateSumberDanaService.java b/src/main/java/com/iconplus/smartproc/service/sumberdana/PostCreateSumberDanaService.java new file mode 100644 index 0000000..d898f90 --- /dev/null +++ b/src/main/java/com/iconplus/smartproc/service/sumberdana/PostCreateSumberDanaService.java @@ -0,0 +1,40 @@ +package com.iconplus.smartproc.service.sumberdana; + +import com.iconplus.smartproc.exception.BusinessException; +import com.iconplus.smartproc.helper.service.BaseService; +import com.iconplus.smartproc.model.entity.SumberDana; +import com.iconplus.smartproc.model.request.SumberDanaRequest; +import com.iconplus.smartproc.model.response.SumberDanaResponse; +import com.iconplus.smartproc.repository.SumberDanaRepository; +import org.springframework.stereotype.Service; + +@Service +public class PostCreateSumberDanaService implements BaseService { + + private SumberDanaRepository sumberDanaRepository; + + public PostCreateSumberDanaService(SumberDanaRepository sumberDanaRepository) { + this.sumberDanaRepository = sumberDanaRepository; + } + + @Override + public SumberDanaResponse execute(SumberDanaRequest input) { + + var sumberDana = sumberDanaRepository.findBySumberDanaAndIsDeleteFalse(input.getSumberDana()); + if (sumberDana.isPresent()) { + throw new BusinessException("err", "err", "err"); + } + SumberDana sumberDanaEntity = SumberDana.builder() + .sumberDana(input.getSumberDana()) + .keterangan(input.getKeterangan()) + .isActive(input.getIsActive()) + .isDelete(false) + .build(); + + var result = sumberDanaRepository.save(sumberDanaEntity); + + return SumberDanaResponse.builder() + .id(result.getId()) + .build(); + } +} diff --git a/src/main/java/com/iconplus/smartproc/service/sumberdana/PutSumberDanaService.java b/src/main/java/com/iconplus/smartproc/service/sumberdana/PutSumberDanaService.java new file mode 100644 index 0000000..010d999 --- /dev/null +++ b/src/main/java/com/iconplus/smartproc/service/sumberdana/PutSumberDanaService.java @@ -0,0 +1,32 @@ +package com.iconplus.smartproc.service.sumberdana; + +import com.iconplus.smartproc.exception.BusinessException; +import com.iconplus.smartproc.helper.service.BaseService; +import com.iconplus.smartproc.model.request.SumberDanaRequest; +import com.iconplus.smartproc.model.response.SumberDanaResponse; +import com.iconplus.smartproc.repository.SumberDanaRepository; +import org.springframework.stereotype.Service; + +@Service +public class PutSumberDanaService implements BaseService { + + private SumberDanaRepository sumberDanaRepository; + + public PutSumberDanaService(SumberDanaRepository sumberDanaRepository) { + this.sumberDanaRepository = sumberDanaRepository; + } + + @Override + public SumberDanaResponse execute(SumberDanaRequest input) { + + var sumberDana = sumberDanaRepository.findByIdAndIsDeleteFalse(input.getId()).orElseThrow(() -> new BusinessException("err", "err", "err")); + sumberDana.setSumberDana(input.getSumberDana()); + sumberDana.setKeterangan(input.getKeterangan()); + sumberDana.setIsActive(input.getIsActive()); + var result = sumberDanaRepository.save(sumberDana); + return SumberDanaResponse.builder() + .id(result.getId()) + .build(); + + } +}