enhance api sumber dana

This commit is contained in:
dirgantarasiahaan
2023-05-24 23:53:00 +07:00
parent 11430dc068
commit 28f17d5b54
11 changed files with 334 additions and 61 deletions

View File

@ -1,78 +1,73 @@
package com.iconplus.smartproc.controller; package com.iconplus.smartproc.controller;
import java.util.HashMap; import com.iconplus.smartproc.helper.model.EmptyResponse;
import java.util.List; import com.iconplus.smartproc.model.request.SumberDanaRequest;
import java.util.Map; import com.iconplus.smartproc.model.response.GetListSumberDanaResponse;
import com.iconplus.smartproc.model.response.SumberDanaResponse;
import org.springframework.beans.factory.annotation.Autowired; import com.iconplus.smartproc.service.sumberdana.*;
import org.springframework.http.ResponseEntity; import org.springframework.data.domain.PageRequest;
import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.data.domain.Pageable;
import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.*;
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;
@CrossOrigin(origins = "http://localhost:8080", allowCredentials = "true") @CrossOrigin(origins = "http://localhost:8080", allowCredentials = "true")
@RestController @RestController
@RequestMapping("/api/sumberdana") @RequestMapping("/api/sumberdana")
public class SumberDanaController { public class SumberDanaController {
@Autowired
private SumberDanaRepository sumberdanaRepository;
//get all data private GetListSumberDanaService getListSumberDanaService;
@GetMapping private PostCreateSumberDanaService postCreateSumberDanaService;
public List<SumberDana> getAllSumberdanas(){ private DeleteSumberDanaService deleteSumberDanaService;
return sumberdanaRepository.findAll(); private GetSumberDanaService getSumberDanaService;
} private PutSumberDanaService putSumberDanaService;
// create public SumberDanaController(GetListSumberDanaService getListSumberDanaService,
@PostMapping PostCreateSumberDanaService postCreateSumberDanaService,
public SumberDana createSumberdana(@RequestBody SumberDana sumberdana) { DeleteSumberDanaService deleteSumberDanaService,
return sumberdanaRepository.save(sumberdana); 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
@GetMapping("/{id}") public GetListSumberDanaResponse getListSumberDana(@RequestParam(name = "search", required = false) String search,
public ResponseEntity<SumberDana> getSumberdanaById(@PathVariable Long id) { @RequestParam(name = "page", defaultValue = "1") Integer page,
SumberDana sumberdana = sumberdanaRepository.findById(id) @RequestParam(name = "size", defaultValue = "5") Integer size){
.orElseThrow(() -> new ResourceNotFoundException("Sumberdana not exist with id :" + id));
return ResponseEntity.ok(sumberdana);
}
// update sumberdana rest api Pageable pageable = PageRequest.of((page - 1), size);
@PutMapping("/{id}") SumberDanaRequest sumberDanaRequest = SumberDanaRequest.builder()
public ResponseEntity<SumberDana> updateSumberdana(@PathVariable Long id, @RequestBody SumberDana sumberDanaDetails){ .search(search)
SumberDana sumberdana = sumberdanaRepository.findById(id) .pageable(pageable)
.orElseThrow(() -> new ResourceNotFoundException("Sumberdana not exist with id :" + id)); .build();
sumberdana.setSumberDana(sumberDanaDetails.getSumberDana()); return getListSumberDanaService.execute(sumberDanaRequest);
sumberdana.setKeterangan(sumberDanaDetails.getKeterangan()); }
SumberDana updatedSumberDana = sumberdanaRepository.save(sumberdana);
return ResponseEntity.ok(updatedSumberDana);
}
// delete sumberdana rest api
@DeleteMapping("/{id}")
public ResponseEntity<Map<String, Boolean>> deleteSumberdana(@PathVariable Long id){
SumberDana sumberdana = sumberdanaRepository.findById(id)
.orElseThrow(() -> new ResourceNotFoundException("Sumberdana not exist with id :" + id));
sumberdanaRepository.delete(sumberdana);
Map<String, Boolean> response = new HashMap<>();
response.put("deleted", Boolean.TRUE);
return ResponseEntity.ok(response);
}
@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());
}
} }

View File

@ -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);
}

View File

@ -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;
}

View File

@ -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<SumberDanaResponse> data;
private Pagination pagination;
}

View File

@ -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;
}

View File

@ -1,10 +1,30 @@
package com.iconplus.smartproc.repository; package com.iconplus.smartproc.repository;
import com.iconplus.smartproc.model.entity.SumberDana; 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.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import java.util.Optional;
@Repository @Repository
public interface SumberDanaRepository extends JpaRepository<SumberDana, Long> { public interface SumberDanaRepository extends JpaRepository<SumberDana, Long> {
Optional<SumberDana> findByIdAndIsDeleteFalse(Long id);
Optional<SumberDana> 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<SumberDanaView> getListSumberDana(String search, Pageable pageable);
} }

View File

@ -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<SumberDanaRequest, EmptyResponse> {
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();
}
}

View File

@ -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<SumberDanaRequest, GetListSumberDanaResponse> {
private SumberDanaRepository sumberDanaRepository;
public GetListSumberDanaService(SumberDanaRepository sumberDanaRepository) {
this.sumberDanaRepository = sumberDanaRepository;
}
@Override
public GetListSumberDanaResponse execute(SumberDanaRequest input) {
List<SumberDanaResponse> 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();
}
}

View File

@ -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<SumberDanaRequest, SumberDanaResponse> {
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();
}
}

View File

@ -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<SumberDanaRequest, SumberDanaResponse> {
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();
}
}

View File

@ -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<SumberDanaRequest, SumberDanaResponse> {
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();
}
}