diff --git a/src/main/java/com/iconplus/smartproc/controller/BidangController.java b/src/main/java/com/iconplus/smartproc/controller/BidangController.java new file mode 100644 index 0000000..9090a81 --- /dev/null +++ b/src/main/java/com/iconplus/smartproc/controller/BidangController.java @@ -0,0 +1,74 @@ +package com.iconplus.smartproc.controller; + +import com.iconplus.smartproc.helper.model.EmptyResponse; +import com.iconplus.smartproc.model.request.BidangRequest; +import com.iconplus.smartproc.model.response.BidangResponse; +import com.iconplus.smartproc.model.response.GetListBidangResponse; +import com.iconplus.smartproc.service.bidang.*; +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/bidang") +public class BidangController { + + private GetBidangService getBidangService; + private DeleteBidangService deleteBidangService; + private GetListBidangService getListBidangService; + private PostCreateBidangService postCreateBidangService; + private PutUpdateBidangService putUpdateBidangService; + + public BidangController(GetBidangService getBidangService, + DeleteBidangService deleteBidangService, + GetListBidangService getListBidangService, + PostCreateBidangService postCreateBidangService, + PutUpdateBidangService putUpdateBidangService) { + this.getBidangService = getBidangService; + this.deleteBidangService = deleteBidangService; + this.getListBidangService = getListBidangService; + this.postCreateBidangService = postCreateBidangService; + this.putUpdateBidangService = putUpdateBidangService; + } + + @GetMapping + public GetListBidangResponse getListInstansi(@RequestParam(name = "search", required = false) String search, + @RequestParam(name = "page", defaultValue = "1") Integer page, + @RequestParam(name = "size", defaultValue = "5") Integer size){ + + Pageable pageable = PageRequest.of((page - 1), size); + BidangRequest bidangRequest = BidangRequest.builder() + .search(search) + .pageable(pageable) + .build(); + + return getListBidangService.execute(bidangRequest); + } + + @PostMapping + public BidangResponse createBidang(@RequestBody BidangRequest request) { + return postCreateBidangService.execute(request); + } + + @GetMapping("/{id}") + public BidangResponse getBidangById(@PathVariable Long id) { + return getBidangService.execute(BidangRequest.builder() + .id(id) + .build()); + } + + @PutMapping("/{id}") + public BidangResponse updateBidang(@PathVariable Long id, @RequestBody BidangRequest request){ + request.setId(id); + return putUpdateBidangService.execute(request); + } + + @DeleteMapping("/{id}") + public EmptyResponse deleteBidang(@PathVariable Long id){ + return deleteBidangService.execute(BidangRequest.builder() + .id(id) + .build()); + } + +} diff --git a/src/main/java/com/iconplus/smartproc/model/entity/Bidang.java b/src/main/java/com/iconplus/smartproc/model/entity/Bidang.java index 64002b2..b644d2f 100644 --- a/src/main/java/com/iconplus/smartproc/model/entity/Bidang.java +++ b/src/main/java/com/iconplus/smartproc/model/entity/Bidang.java @@ -22,6 +22,9 @@ public class Bidang extends BaseEntity { @Column(name = "id") private Long id; + @Column(name = "instansi_id") + private Long instansiId; + @Column(name = "bidang") private String bidang; diff --git a/src/main/java/com/iconplus/smartproc/model/projection/BidangView.java b/src/main/java/com/iconplus/smartproc/model/projection/BidangView.java new file mode 100644 index 0000000..6174611 --- /dev/null +++ b/src/main/java/com/iconplus/smartproc/model/projection/BidangView.java @@ -0,0 +1,22 @@ +package com.iconplus.smartproc.model.projection; + +public interface BidangView { + + Long getId(); + void setId(Long id); + + Long getInstansiId(); + void setInstansiId(Long instansiId); + + String getInstansi(); + void setInstansi(String instansi); + + String getBidang(); + void setBidang(String bidang); + + String getKeterangan(); + void setketerangan(String keterangan); + + Boolean getIsActive(); + void setIsActive(Boolean isActive); +}; diff --git a/src/main/java/com/iconplus/smartproc/model/request/BidangRequest.java b/src/main/java/com/iconplus/smartproc/model/request/BidangRequest.java new file mode 100644 index 0000000..05c0f0c --- /dev/null +++ b/src/main/java/com/iconplus/smartproc/model/request/BidangRequest.java @@ -0,0 +1,24 @@ +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 BidangRequest extends BaseRequest { + + private Long id; + private Long instansiId; + private String bidang; + private String keterangan; + private Boolean isActive; + private String search; + private transient Pageable pageable; +} diff --git a/src/main/java/com/iconplus/smartproc/model/response/BidangResponse.java b/src/main/java/com/iconplus/smartproc/model/response/BidangResponse.java new file mode 100644 index 0000000..0069708 --- /dev/null +++ b/src/main/java/com/iconplus/smartproc/model/response/BidangResponse.java @@ -0,0 +1,23 @@ +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 BidangResponse extends BaseResponse { + + private Long id; + private Long instansiId; + private String instansi; + private String bidang; + private String keterangan; + private Boolean isActive; + private Boolean isDelete; + +} diff --git a/src/main/java/com/iconplus/smartproc/model/response/GetListBidangResponse.java b/src/main/java/com/iconplus/smartproc/model/response/GetListBidangResponse.java new file mode 100644 index 0000000..742a32f --- /dev/null +++ b/src/main/java/com/iconplus/smartproc/model/response/GetListBidangResponse.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 GetListBidangResponse extends BaseResponse { + + private List data; + private Pagination pagination; +} diff --git a/src/main/java/com/iconplus/smartproc/repository/BidangRepository.java b/src/main/java/com/iconplus/smartproc/repository/BidangRepository.java index e24fe16..4c6f278 100644 --- a/src/main/java/com/iconplus/smartproc/repository/BidangRepository.java +++ b/src/main/java/com/iconplus/smartproc/repository/BidangRepository.java @@ -1,13 +1,31 @@ package com.iconplus.smartproc.repository; import com.iconplus.smartproc.model.entity.Bidang; +import com.iconplus.smartproc.model.projection.BidangView; +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.List; import java.util.Optional; @Repository public interface BidangRepository extends JpaRepository { + @Query(value = "SELECT b.id as id, " + + "b.instansiId as instansiId, " + + "i.instansi as instansi, " + + "b.bidang as bidang, " + + "b.keterangan as keterangan, " + + "b.isActive as isActive " + + "FROM Bidang b " + + "JOIN Instansi i on i.id = b.instansiId " + + "WHERE b.isDelete = false " + + "AND (:search='' or UPPER(b.bidang) like :search) " + + "ORDER BY b.id") + Page getListBidang(String search, Pageable pageable); + Optional findByIdAndIsDeleteFalse(Long id); } diff --git a/src/main/java/com/iconplus/smartproc/service/bidang/DeleteBidangService.java b/src/main/java/com/iconplus/smartproc/service/bidang/DeleteBidangService.java new file mode 100644 index 0000000..87ab8dc --- /dev/null +++ b/src/main/java/com/iconplus/smartproc/service/bidang/DeleteBidangService.java @@ -0,0 +1,29 @@ +package com.iconplus.smartproc.service.bidang; + +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.BidangRequest; +import com.iconplus.smartproc.repository.BidangRepository; +import org.springframework.stereotype.Service; + +@Service +public class DeleteBidangService implements BaseService { + + private BidangRepository bidangRepository; + + public DeleteBidangService (BidangRepository bidangRepository) { + this.bidangRepository = bidangRepository; + } + + @Override + public EmptyResponse execute(BidangRequest input) { + + var bidang = bidangRepository.findByIdAndIsDeleteFalse(input.getId()).orElseThrow(() -> new BusinessException("err", "err", "err")); + + bidang.setIsDelete(true); + bidangRepository.save(bidang); + + return new EmptyResponse(); + } +} diff --git a/src/main/java/com/iconplus/smartproc/service/bidang/GetBidangService.java b/src/main/java/com/iconplus/smartproc/service/bidang/GetBidangService.java new file mode 100644 index 0000000..26ce5c0 --- /dev/null +++ b/src/main/java/com/iconplus/smartproc/service/bidang/GetBidangService.java @@ -0,0 +1,31 @@ +package com.iconplus.smartproc.service.bidang; + +import com.iconplus.smartproc.exception.BusinessException; +import com.iconplus.smartproc.helper.service.BaseService; +import com.iconplus.smartproc.model.request.BidangRequest; +import com.iconplus.smartproc.model.response.BidangResponse; +import com.iconplus.smartproc.repository.BidangRepository; +import org.springframework.stereotype.Service; + +@Service +public class GetBidangService implements BaseService { + + private BidangRepository bidangRepository; + + public GetBidangService(BidangRepository bidangRepository) { + this.bidangRepository = bidangRepository; + } + + @Override + public BidangResponse execute(BidangRequest input) { + + var bidang = bidangRepository.findByIdAndIsDeleteFalse(input.getId()).orElseThrow(() -> new BusinessException("err", "err", "err")); + return BidangResponse.builder() + .id(bidang.getId()) + .instansiId(bidang.getInstansiId()) + .bidang(bidang.getBidang()) + .keterangan(bidang.getKeterangan()) + .isActive(bidang.getIsActive()) + .build(); + } +} diff --git a/src/main/java/com/iconplus/smartproc/service/bidang/GetListBidangService.java b/src/main/java/com/iconplus/smartproc/service/bidang/GetListBidangService.java new file mode 100644 index 0000000..57135b8 --- /dev/null +++ b/src/main/java/com/iconplus/smartproc/service/bidang/GetListBidangService.java @@ -0,0 +1,62 @@ +package com.iconplus.smartproc.service.bidang; + +import com.iconplus.smartproc.helper.model.Pagination; +import com.iconplus.smartproc.helper.service.BaseService; +import com.iconplus.smartproc.model.projection.BidangView; +import com.iconplus.smartproc.model.request.BidangRequest; +import com.iconplus.smartproc.model.request.InstansiRequest; +import com.iconplus.smartproc.model.response.BidangResponse; +import com.iconplus.smartproc.model.response.GetListBidangResponse; +import com.iconplus.smartproc.repository.BidangRepository; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +@Service +public class GetListBidangService implements BaseService { + + private BidangRepository bidangRepository; + + public GetListBidangService(BidangRepository bidangRepository) { + this.bidangRepository = bidangRepository; + } + + @Override + public GetListBidangResponse execute(BidangRequest input) { + validateRequest(input); + List bidangResponseList = new ArrayList<>(); + var bidangViews= bidangRepository.getListBidang(input.getSearch(), input.getPageable()); + + for (BidangView bidangView : bidangViews) { + BidangResponse bidangResponse = BidangResponse.builder() + .id(bidangView.getId()) + .instansiId(bidangView.getInstansiId()) + .instansi(bidangView.getInstansi()) + .bidang(bidangView.getBidang()) + .keterangan(bidangView.getKeterangan()) + .isActive(bidangView.getIsActive()) + .build(); + bidangResponseList.add(bidangResponse); + } + + return GetListBidangResponse.builder() + .data(bidangResponseList) + .pagination(Pagination.builder() + .pageSize(input.getPageable().getPageSize()) + .currentPage(input.getPageable().getPageNumber()) + .totalPages(bidangViews.getTotalPages()) + .totalRecords(bidangViews.getTotalElements()) + .isFirstPage(bidangViews.isFirst()) + .isLastPage(bidangViews.isLast()) + .build()) + .build(); + } + + private void validateRequest(BidangRequest input) { + if (StringUtils.isNotBlank(input.getSearch())) { + input.setSearch('%'+ input.getSearch().toUpperCase()+'%'); + } + } +} diff --git a/src/main/java/com/iconplus/smartproc/service/bidang/PostCreateBidangService.java b/src/main/java/com/iconplus/smartproc/service/bidang/PostCreateBidangService.java new file mode 100644 index 0000000..b68b4ee --- /dev/null +++ b/src/main/java/com/iconplus/smartproc/service/bidang/PostCreateBidangService.java @@ -0,0 +1,36 @@ +package com.iconplus.smartproc.service.bidang; + +import com.iconplus.smartproc.helper.service.BaseService; +import com.iconplus.smartproc.model.entity.Bidang; +import com.iconplus.smartproc.model.request.BidangRequest; +import com.iconplus.smartproc.model.response.BidangResponse; +import com.iconplus.smartproc.repository.BidangRepository; +import org.springframework.stereotype.Service; + +@Service +public class PostCreateBidangService implements BaseService { + + private BidangRepository bidangRepository; + + public PostCreateBidangService(BidangRepository bidangRepository) { + this.bidangRepository = bidangRepository; + } + + @Override + public BidangResponse execute(BidangRequest input) { + Bidang bidang = Bidang.builder() + .id(input.getId()) + .instansiId(input.getInstansiId()) + .bidang(input.getBidang()) + .keterangan(input.getKeterangan()) + .isActive(input.getIsActive()) + .isDelete(false) + .build(); + + var result = bidangRepository.save(bidang); + return BidangResponse.builder() + .id(result.getId()) + .build(); + + } +} diff --git a/src/main/java/com/iconplus/smartproc/service/bidang/PutUpdateBidangService.java b/src/main/java/com/iconplus/smartproc/service/bidang/PutUpdateBidangService.java new file mode 100644 index 0000000..33c8f89 --- /dev/null +++ b/src/main/java/com/iconplus/smartproc/service/bidang/PutUpdateBidangService.java @@ -0,0 +1,32 @@ +package com.iconplus.smartproc.service.bidang; + +import com.iconplus.smartproc.exception.BusinessException; +import com.iconplus.smartproc.helper.service.BaseService; +import com.iconplus.smartproc.model.request.BidangRequest; +import com.iconplus.smartproc.model.response.BidangResponse; +import com.iconplus.smartproc.repository.BidangRepository; +import org.springframework.stereotype.Service; + +@Service +public class PutUpdateBidangService implements BaseService { + + private BidangRepository bidangRepository; + + public PutUpdateBidangService(BidangRepository bidangRepository) { + this.bidangRepository = bidangRepository; + } + + @Override + public BidangResponse execute(BidangRequest input) { + + var bidang = bidangRepository.findByIdAndIsDeleteFalse(input.getId()).orElseThrow(() -> new BusinessException("err", "err", "err")); + bidang.setInstansiId(input.getInstansiId()); + bidang.setBidang(input.getBidang()); + bidang.setKeterangan(input.getKeterangan()); + bidang.setIsActive(input.getIsActive()); + var result = bidangRepository.save(bidang); + return BidangResponse.builder() + .id(result.getId()) + .build(); + } +}