diff --git a/src/main/java/com/iconplus/smartproc/controller/JabatanController.java b/src/main/java/com/iconplus/smartproc/controller/JabatanController.java new file mode 100644 index 0000000..667f9e9 --- /dev/null +++ b/src/main/java/com/iconplus/smartproc/controller/JabatanController.java @@ -0,0 +1,73 @@ +package com.iconplus.smartproc.controller; + +import com.iconplus.smartproc.helper.model.EmptyResponse; +import com.iconplus.smartproc.model.request.JabatanRequest; +import com.iconplus.smartproc.model.response.GetListJabatanResponse; +import com.iconplus.smartproc.model.response.JabatanResponse; +import com.iconplus.smartproc.service.jabatan.*; +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/jabatan") +public class JabatanController { + + private DeleteJabatanService deleteJabatanService; + private GetJabatanService getJabatanService; + private GetListJabatanService getListJabatanService; + private PostCreateJabatanService postCreateJabatanService; + private PutUpdateJabatanService putUpdateJabatanService; + + public JabatanController(DeleteJabatanService deleteJabatanService, + GetJabatanService getJabatanService, + GetListJabatanService getListJabatanService, + PostCreateJabatanService postCreateJabatanService, + PutUpdateJabatanService putUpdateJabatanService) { + this.deleteJabatanService = deleteJabatanService; + this.getJabatanService = getJabatanService; + this.getListJabatanService = getListJabatanService; + this.postCreateJabatanService = postCreateJabatanService; + this.putUpdateJabatanService = putUpdateJabatanService; + } + + @GetMapping + public GetListJabatanResponse getListJabatan(@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); + JabatanRequest bidangRequest = JabatanRequest.builder() + .search(search) + .pageable(pageable) + .build(); + + return getListJabatanService.execute(bidangRequest); + } + + @PostMapping + public JabatanResponse createJabatan(@RequestBody JabatanRequest request) { + return postCreateJabatanService.execute(request); + } + + @GetMapping("/{id}") + public JabatanResponse getJabatanById(@PathVariable Long id) { + return getJabatanService.execute(JabatanRequest.builder() + .id(id) + .build()); + } + + @PutMapping("/{id}") + public JabatanResponse updateBidang(@PathVariable Long id, @RequestBody JabatanRequest request){ + request.setId(id); + return putUpdateJabatanService.execute(request); + } + + @DeleteMapping("/{id}") + public EmptyResponse deleteJabatan(@PathVariable Long id){ + return deleteJabatanService.execute(JabatanRequest.builder() + .id(id) + .build()); + } +} diff --git a/src/main/java/com/iconplus/smartproc/model/entity/Jabatan.java b/src/main/java/com/iconplus/smartproc/model/entity/Jabatan.java new file mode 100644 index 0000000..80b5543 --- /dev/null +++ b/src/main/java/com/iconplus/smartproc/model/entity/Jabatan.java @@ -0,0 +1,44 @@ +package com.iconplus.smartproc.model.entity; + +import com.iconplus.smartproc.helper.base.BaseEntity; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.Type; + +import javax.persistence.*; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Entity +@Table(name = "jabatan") +public class Jabatan extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") + private Long id; + + @Column(name = "jabatan") + private String jabatan; + + @Column(name = "instansi_id") + private Long instansiId; + + @Column(name = "bidang_id") + private Long bidangId; + + @Column(name = "keterangan") + private String keterangan; + + @Column(name = "is_active") + @Type(type = "org.hibernate.type.NumericBooleanType") + private Boolean isActive; + + @Column(name = "is_delete") + @Type(type = "org.hibernate.type.NumericBooleanType") + private Boolean isDelete; +} diff --git a/src/main/java/com/iconplus/smartproc/model/projection/JabatanView.java b/src/main/java/com/iconplus/smartproc/model/projection/JabatanView.java new file mode 100644 index 0000000..da19fd4 --- /dev/null +++ b/src/main/java/com/iconplus/smartproc/model/projection/JabatanView.java @@ -0,0 +1,31 @@ +package com.iconplus.smartproc.model.projection; + +public interface JabatanView { + + Long getId(); + void setId(Long id); + + String getJabatan(); + void setJabatan(String jabatan); + + String getKeterangan(); + void setKeterangan(String keterangan); + + Long getInstansiId(); + void setInstansiId(Long instansiId); + + String getInstansi(); + void setInstansi(String instansi); + + Long getBidangId(); + void setBidangId(Long bidangId); + + String getBidang(); + void setBidang(String bidang); + + Boolean getIsActive(); + void setIsActive(Boolean isAvtive); + + Boolean getIsDelete(); + void setIsDelete(Boolean isDelete); +} diff --git a/src/main/java/com/iconplus/smartproc/model/request/JabatanRequest.java b/src/main/java/com/iconplus/smartproc/model/request/JabatanRequest.java new file mode 100644 index 0000000..c11cc34 --- /dev/null +++ b/src/main/java/com/iconplus/smartproc/model/request/JabatanRequest.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 JabatanRequest extends BaseRequest { + + private Long id; + private String jabatan; + private String keterangan; + private Long instansiId; + private Long bidangId; + private Boolean isActive; + private String search; + private transient Pageable pageable; +} diff --git a/src/main/java/com/iconplus/smartproc/model/response/GetListJabatanResponse.java b/src/main/java/com/iconplus/smartproc/model/response/GetListJabatanResponse.java new file mode 100644 index 0000000..a778d26 --- /dev/null +++ b/src/main/java/com/iconplus/smartproc/model/response/GetListJabatanResponse.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 GetListJabatanResponse extends BaseResponse { + + private List data; + private Pagination pagination; +} diff --git a/src/main/java/com/iconplus/smartproc/model/response/JabatanResponse.java b/src/main/java/com/iconplus/smartproc/model/response/JabatanResponse.java new file mode 100644 index 0000000..d81dcd7 --- /dev/null +++ b/src/main/java/com/iconplus/smartproc/model/response/JabatanResponse.java @@ -0,0 +1,24 @@ +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 JabatanResponse extends BaseResponse { + + private Long id; + private String jabatan; + private String keterangan; + private Long instansiId; + private String instansi; + private Long bidangId; + private String bidang; + private Boolean isActive; + private Boolean isDelete; +} diff --git a/src/main/java/com/iconplus/smartproc/repository/JabatanRepository.java b/src/main/java/com/iconplus/smartproc/repository/JabatanRepository.java new file mode 100644 index 0000000..a0b7aa6 --- /dev/null +++ b/src/main/java/com/iconplus/smartproc/repository/JabatanRepository.java @@ -0,0 +1,52 @@ +package com.iconplus.smartproc.repository; + +import com.iconplus.smartproc.model.entity.Jabatan; +import com.iconplus.smartproc.model.projection.JabatanView; +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 JabatanRepository extends JpaRepository { + + Optional findByIdAndIsDeleteFalse(Long id); + + Optional findByJabatanAndIsDeleteFalse(String jabatan); + + @Query(value = "SELECT j.id as id, " + + "j.jabatan as jabatan, " + + "j.instansiId as instansiId, " + + "j.keterangan as keterangan, " + + "i.instansi as instansi, " + + "j.bidangId as bidangId, " + + "b.bidang as bidang, " + + "j.isActive as isActive, " + + "j.isDelete as isDelete " + + "FROM Jabatan j " + + "JOIN Bidang b ON b.id = j.bidangId " + + "JOIN Instansi i ON i.id = j.instansiId " + + "WHERE j.isDelete = false " + + "AND j.id = :jabatanId") + Optional getJabatanDetails(Long jabatanId); + + @Query(value = "SELECT j.id as id, " + + "j.jabatan as jabatan, " + + "j.keterangan as keterangan, " + + "j.instansiId as instansiId, " + + "i.instansi as instansi, " + + "j.bidangId as bidangId, " + + "b.bidang as bidang, " + + "j.isActive as isActive, " + + "j.isDelete as isDelete " + + "FROM Jabatan j " + + "JOIN Bidang b ON b.id = j.bidangId " + + "JOIN Instansi i ON i.id = j.instansiId " + + "WHERE j.isDelete = false " + + "AND (:search = '' or UPPER(j.jabatan) like :search) " + + "ORDER BY j.id") + Page getListJabatan(String search, Pageable pageable); +} diff --git a/src/main/java/com/iconplus/smartproc/service/jabatan/DeleteJabatanService.java b/src/main/java/com/iconplus/smartproc/service/jabatan/DeleteJabatanService.java new file mode 100644 index 0000000..29d34ef --- /dev/null +++ b/src/main/java/com/iconplus/smartproc/service/jabatan/DeleteJabatanService.java @@ -0,0 +1,25 @@ +package com.iconplus.smartproc.service.jabatan; + +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.JabatanRequest; +import com.iconplus.smartproc.repository.JabatanRepository; +import org.springframework.stereotype.Service; + +@Service +public class DeleteJabatanService implements BaseService { + + private JabatanRepository jabatanRepository; + public DeleteJabatanService(JabatanRepository jabatanRepository) { + this.jabatanRepository = jabatanRepository; + } + @Override + public EmptyResponse execute(JabatanRequest input) { + var jabatan = jabatanRepository.findByIdAndIsDeleteFalse(input.getId()) + .orElseThrow(() -> new BusinessException("err", "err", "err")); + jabatan.setIsDelete(true); + jabatanRepository.save(jabatan); + return new EmptyResponse(); + } +} diff --git a/src/main/java/com/iconplus/smartproc/service/jabatan/GetJabatanService.java b/src/main/java/com/iconplus/smartproc/service/jabatan/GetJabatanService.java new file mode 100644 index 0000000..cb36032 --- /dev/null +++ b/src/main/java/com/iconplus/smartproc/service/jabatan/GetJabatanService.java @@ -0,0 +1,36 @@ +package com.iconplus.smartproc.service.jabatan; + +import com.iconplus.smartproc.exception.BusinessException; +import com.iconplus.smartproc.helper.service.BaseService; +import com.iconplus.smartproc.model.request.JabatanRequest; +import com.iconplus.smartproc.model.response.JabatanResponse; +import com.iconplus.smartproc.repository.JabatanRepository; +import org.springframework.stereotype.Service; + +@Service +public class GetJabatanService implements BaseService { + + private JabatanRepository jabatanRepository; + public GetJabatanService(JabatanRepository jabatanRepository) { + this.jabatanRepository = jabatanRepository; + } + + @Override + public JabatanResponse execute(JabatanRequest input) { + + var jabatan = jabatanRepository.getJabatanDetails(input.getId()) + .orElseThrow(() -> new BusinessException("err", "err", "err")); + + return JabatanResponse.builder() + .id(jabatan.getId()) + .jabatan(jabatan.getJabatan()) + .keterangan(jabatan.getKeterangan()) + .instansiId(jabatan.getInstansiId()) + .instansi(jabatan.getInstansi()) + .bidangId(jabatan.getBidangId()) + .bidang(jabatan.getBidang()) + .isActive(jabatan.getIsActive()) + .isDelete(jabatan.getIsDelete()) + .build(); + } +} diff --git a/src/main/java/com/iconplus/smartproc/service/jabatan/GetListJabatanService.java b/src/main/java/com/iconplus/smartproc/service/jabatan/GetListJabatanService.java new file mode 100644 index 0000000..504d564 --- /dev/null +++ b/src/main/java/com/iconplus/smartproc/service/jabatan/GetListJabatanService.java @@ -0,0 +1,65 @@ +package com.iconplus.smartproc.service.jabatan; + +import com.iconplus.smartproc.helper.model.Pagination; +import com.iconplus.smartproc.helper.service.BaseService; +import com.iconplus.smartproc.model.entity.Jabatan; +import com.iconplus.smartproc.model.projection.JabatanView; +import com.iconplus.smartproc.model.request.JabatanRequest; +import com.iconplus.smartproc.model.request.JenisAnggaranRequest; +import com.iconplus.smartproc.model.response.GetListJabatanResponse; +import com.iconplus.smartproc.model.response.JabatanResponse; +import com.iconplus.smartproc.repository.JabatanRepository; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +@Service +public class GetListJabatanService implements BaseService { + + private JabatanRepository jabatanRepository; + public GetListJabatanService(JabatanRepository jabatanRepository) { + this.jabatanRepository = jabatanRepository; + } + + @Override + public GetListJabatanResponse execute(JabatanRequest input) { + validateRequest(input); + List jabatanResponseList = new ArrayList<>() ; + var jabatanViews = jabatanRepository.getListJabatan(input.getSearch(), input.getPageable()); + + for (JabatanView jabatanView : jabatanViews) { + JabatanResponse jabatanResponse = JabatanResponse.builder() + .id(jabatanView.getId()) + .jabatan(jabatanView.getJabatan()) + .keterangan(jabatanView.getKeterangan()) + .instansiId(jabatanView.getInstansiId()) + .instansi(jabatanView.getInstansi()) + .bidangId(jabatanView.getBidangId()) + .bidang(jabatanView.getBidang()) + .isActive(jabatanView.getIsActive()) + .isDelete(jabatanView.getIsDelete()) + .build(); + jabatanResponseList.add(jabatanResponse); + } + return GetListJabatanResponse.builder() + .data(jabatanResponseList) + .pagination(Pagination.builder() + .pageSize(input.getPageable().getPageSize()) + .currentPage(input.getPageable().getPageNumber()) + .totalPages(jabatanViews.getTotalPages()) + .totalRecords(jabatanViews.getTotalElements()) + .isFirstPage(jabatanViews.isFirst()) + .isLastPage(jabatanViews.isLast()) + .build()) + .build(); + } + + private void validateRequest(JabatanRequest input) { + if (StringUtils.isNotBlank(input.getSearch())) { + input.setSearch('%'+ input.getSearch().toUpperCase()+'%'); + } + } + +} diff --git a/src/main/java/com/iconplus/smartproc/service/jabatan/PostCreateJabatanService.java b/src/main/java/com/iconplus/smartproc/service/jabatan/PostCreateJabatanService.java new file mode 100644 index 0000000..42c438f --- /dev/null +++ b/src/main/java/com/iconplus/smartproc/service/jabatan/PostCreateJabatanService.java @@ -0,0 +1,41 @@ +package com.iconplus.smartproc.service.jabatan; + +import com.iconplus.smartproc.exception.BusinessException; +import com.iconplus.smartproc.helper.service.BaseService; +import com.iconplus.smartproc.model.entity.Jabatan; +import com.iconplus.smartproc.model.request.JabatanRequest; +import com.iconplus.smartproc.model.response.JabatanResponse; +import com.iconplus.smartproc.repository.JabatanRepository; +import org.springframework.stereotype.Service; + +@Service +public class PostCreateJabatanService implements BaseService { + + private JabatanRepository jabatanRepository; + public PostCreateJabatanService(JabatanRepository jabatanRepository) { + this.jabatanRepository = jabatanRepository; + } + + @Override + public JabatanResponse execute(JabatanRequest input) { + + var jabatan = jabatanRepository.findByJabatanAndIsDeleteFalse(input.getJabatan()); + if (jabatan.isPresent()) { + throw new BusinessException("err", "err", "err"); + } + + Jabatan jabatanEntity = Jabatan.builder() + .jabatan(input.getJabatan()) + .keterangan(input.getKeterangan()) + .instansiId(input.getInstansiId()) + .bidangId(input.getBidangId()) + .isActive(input.getIsActive()) + .isDelete(false) + .build(); + var result = jabatanRepository.save(jabatanEntity); + + return JabatanResponse.builder() + .id(result.getId()) + .build(); + } +} diff --git a/src/main/java/com/iconplus/smartproc/service/jabatan/PutUpdateJabatanService.java b/src/main/java/com/iconplus/smartproc/service/jabatan/PutUpdateJabatanService.java new file mode 100644 index 0000000..d959a32 --- /dev/null +++ b/src/main/java/com/iconplus/smartproc/service/jabatan/PutUpdateJabatanService.java @@ -0,0 +1,34 @@ +package com.iconplus.smartproc.service.jabatan; + +import com.iconplus.smartproc.exception.BusinessException; +import com.iconplus.smartproc.helper.service.BaseService; +import com.iconplus.smartproc.model.request.JabatanRequest; +import com.iconplus.smartproc.model.response.JabatanResponse; +import com.iconplus.smartproc.repository.JabatanRepository; +import org.springframework.stereotype.Service; + +@Service +public class PutUpdateJabatanService implements BaseService { + + private JabatanRepository jabatanRepository; + public PutUpdateJabatanService(JabatanRepository jabatanRepository) { + this.jabatanRepository = jabatanRepository; + } + + @Override + public JabatanResponse execute(JabatanRequest input) { + + var jabatan = jabatanRepository.findByIdAndIsDeleteFalse(input.getId()) + .orElseThrow(() -> new BusinessException("err", "err", "err")); + + jabatan.setJabatan(input.getJabatan()); + jabatan.setKeterangan(input.getKeterangan()); + jabatan.setInstansiId(input.getInstansiId()); + jabatan.setBidangId(input.getBidangId()); + jabatan.setIsActive(input.getIsActive()); + var result = jabatanRepository.save(jabatan); + return JabatanResponse.builder() + .id(result.getId()) + .build(); + } +}