diff --git a/.gitignore b/.gitignore
index b24d71e..d914762 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,50 +1,47 @@
-# These are some examples of commonly ignored file patterns.
-# You should customize this list as applicable to your project.
-# Learn more about .gitignore:
-# https://www.atlassian.com/git/tutorials/saving-changes/gitignore
-
-# Node artifact files
-node_modules/
-dist/
-
-# Compiled Java class files
-*.class
-
-# Compiled Python bytecode
-*.py[cod]
-
-# Log files
-*.log
-
-# Package files
+*#
+*.iml
+*.ipr
+*.iws
*.jar
-
-# Maven
-target/
-dist/
-
-# JetBrains IDE
-.idea/
-
-# Unit test reports
-TEST*.xml
-
-# Generated by MacOS
+*.sw?
+*~
+.#*
+.*.md.html
.DS_Store
+.attach_pid*
+.classpath
+.factorypath
+.gradle
+.idea
+.metadata
+.project
+.recommenders
+.settings
+.springBeans
+.vscode
+/code
+MANIFEST.MF
+_site/
+activemq-data
+bin
+build
+!/**/src/**/bin
+!/**/src/**/build
+build.log
+dependency-reduced-pom.xml
+dump.rdb
+interpolated*.xml
+lib/
+manifest.yml
+out
+overridedb.*
+target
+transaction-logs
+.flattened-pom.xml
+secrets.yml
+src/main/resources/application-local.yml
+.gradletasknamecache
+.sts4-cache
-# Generated by Windows
-Thumbs.db
-
-# Applications
-*.app
-*.exe
-*.war
-
-# Large media files
-*.mp4
-*.tiff
-*.avi
-*.flv
-*.mov
-*.wmv
-
+mvnw
+mvnw.cmd
diff --git a/pom.xml b/pom.xml
index e9c589a..ce75179 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
org.springframework.boot
spring-boot-starter-parent
- 3.0.6
+ 2.7.5
com.iconplus
@@ -14,9 +14,73 @@
smartproc
Initialisasi Smartproc Framework
- 17
+ 11
+
+
+ org.springframework.boot
+ spring-boot-starter-security
+ 2.5.4
+
+
+ org.springframework.security
+ spring-security-web
+
+
+ org.springframework.security
+ spring-security-config
+
+
+
+
+ org.springframework.security.oauth.boot
+ spring-security-oauth2-autoconfigure
+ 2.5.2
+
+
+ org.springframework.security
+ spring-security-web
+
+
+ org.springframework.security
+ spring-security-config
+
+
+
+
+ org.springframework.security
+ spring-security-web
+ 5.3.9.RELEASE
+
+
+ org.springframework.security
+ spring-security-config
+ 5.3.9.RELEASE
+
+
+
+ com.google.zxing
+ core
+ 3.3.0
+
+
+ com.google.zxing
+ javase
+ 3.3.0
+
+
+
+ io.jsonwebtoken
+ jjwt
+ 0.9.1
+
+
+ com.nimbusds
+ nimbus-jose-jwt
+ 8.19
+
+
org.springframework.boot
spring-boot-starter-data-jpa
@@ -29,13 +93,28 @@
org.springframework.boot
spring-boot-starter-web
-
+
+ io.zipkin.brave
+ brave
+ 5.16.0
+
+
+ org.apache.velocity
+ velocity-engine-core
+ 2.3
+
+
+ org.apache.commons
+ commons-lang3
+ 3.12.0
+
org.springframework.boot
spring-boot-devtools
runtime
true
+
org.postgresql
postgresql
diff --git a/src/main/java/com/iconplus/smartproc/configuration/CustomUserDetailsService.java b/src/main/java/com/iconplus/smartproc/configuration/CustomUserDetailsService.java
new file mode 100644
index 0000000..3d6bc23
--- /dev/null
+++ b/src/main/java/com/iconplus/smartproc/configuration/CustomUserDetailsService.java
@@ -0,0 +1,33 @@
+package com.iconplus.smartproc.configuration;
+
+import com.iconplus.smartproc.model.projection.UserRoleView;
+import com.iconplus.smartproc.repository.RolesRepository;
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.security.core.userdetails.UserDetailsService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Optional;
+
+@Service
+public class CustomUserDetailsService implements UserDetailsService {
+
+ private final RolesRepository rolesRepository;
+
+ public CustomUserDetailsService(RolesRepository rolesRepository) {
+ this.rolesRepository = rolesRepository;
+ }
+
+
+ @Override
+ public UserDetails loadUserByUsername(String username) {
+ List authorities = null;
+ Optional userRole = rolesRepository.getUserRoleByUserId(username);
+ if (userRole.isPresent()) {
+ authorities=List.of(new SimpleGrantedAuthority(userRole.get().getRole()));
+ }
+
+ return new org.springframework.security.core.userdetails.User(username, username, authorities);
+ }
+}
diff --git a/src/main/java/com/iconplus/smartproc/configuration/JwtAuthenticationAccessDenied.java b/src/main/java/com/iconplus/smartproc/configuration/JwtAuthenticationAccessDenied.java
new file mode 100644
index 0000000..a7d80d5
--- /dev/null
+++ b/src/main/java/com/iconplus/smartproc/configuration/JwtAuthenticationAccessDenied.java
@@ -0,0 +1,39 @@
+package com.iconplus.smartproc.configuration;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.iconplus.smartproc.exception.ErrorResponse;
+import com.iconplus.smartproc.util.Constants;
+import lombok.extern.log4j.Log4j2;
+import org.springframework.http.MediaType;
+import org.springframework.security.access.AccessDeniedException;
+import org.springframework.security.web.access.AccessDeniedHandler;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+@Component
+@Log4j2
+public class JwtAuthenticationAccessDenied implements AccessDeniedHandler {
+
+ private static final String DEFAULT_CODE = "30000";
+ private static final String DEFAULT_MESSAGE = "Access denied";
+
+ @Override
+ public void handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, AccessDeniedException e) throws IOException {
+
+ log.error("Access denied, {}", e.getMessage());
+
+ ErrorResponse errorResponse = new ErrorResponse();
+ errorResponse.setCode(DEFAULT_CODE);
+ errorResponse.setTitle(Constants.TITLE_INVALID_NEXT_STEP);
+ errorResponse.setMessage(DEFAULT_MESSAGE);
+
+ httpServletResponse.setStatus(HttpServletResponse.SC_FORBIDDEN);
+ httpServletResponse.setContentType(MediaType.APPLICATION_JSON_VALUE);
+
+ httpServletResponse.getOutputStream()
+ .println(new ObjectMapper().writeValueAsString(errorResponse));
+ }
+}
diff --git a/src/main/java/com/iconplus/smartproc/configuration/JwtAuthenticationEntryPoint.java b/src/main/java/com/iconplus/smartproc/configuration/JwtAuthenticationEntryPoint.java
new file mode 100644
index 0000000..e6fa58d
--- /dev/null
+++ b/src/main/java/com/iconplus/smartproc/configuration/JwtAuthenticationEntryPoint.java
@@ -0,0 +1,54 @@
+package com.iconplus.smartproc.configuration;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.iconplus.smartproc.exception.ErrorResponse;
+import com.iconplus.smartproc.util.Constants;
+import org.springframework.http.MediaType;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.web.AuthenticationEntryPoint;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+
+@Component
+public class JwtAuthenticationEntryPoint implements AuthenticationEntryPoint {
+
+ @Override
+ public void commence(HttpServletRequest request, HttpServletResponse response,
+ AuthenticationException authException) throws IOException {
+
+ ErrorResponse errorResponse = new ErrorResponse();
+
+ response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
+ response.setContentType(MediaType.APPLICATION_JSON_VALUE);
+
+ var exception = (Exception) request.getAttribute("exception");
+
+ String message;
+
+ if (exception != null) {
+
+ if (exception.getCause() != null) {
+ message = exception.getCause().toString() + " " + exception.getMessage();
+ } else {
+ message = exception.getMessage();
+ }
+
+ errorResponse.setCode(Constants.ERR_CODE_40051);
+ errorResponse.setTitle(Constants.TITLE_INVALID_NEXT_STEP);
+ errorResponse.setMessage(message);
+ response.getOutputStream()
+ .println(new ObjectMapper().writeValueAsString(errorResponse));
+ } else {
+ errorResponse.setCode(Constants.ERR_CODE_80007);
+ errorResponse.setTitle(Constants.TITLE_INVALID_NEXT_STEP);
+ errorResponse.setMessage("Invalid Access Token");
+ response.getOutputStream()
+ .println(new ObjectMapper().writeValueAsString(errorResponse));
+ }
+ }
+
+}
diff --git a/src/main/java/com/iconplus/smartproc/configuration/JwtRequestFilter.java b/src/main/java/com/iconplus/smartproc/configuration/JwtRequestFilter.java
new file mode 100644
index 0000000..ade2f23
--- /dev/null
+++ b/src/main/java/com/iconplus/smartproc/configuration/JwtRequestFilter.java
@@ -0,0 +1,80 @@
+package com.iconplus.smartproc.configuration;
+
+import com.iconplus.smartproc.exception.BusinessException;
+import com.iconplus.smartproc.model.request.PostAccessTokenRequest;
+import com.iconplus.smartproc.service.authentication.PostCheckAccessTokenService;
+import io.jsonwebtoken.ExpiredJwtException;
+import org.springframework.http.HttpStatus;
+import org.springframework.security.authentication.BadCredentialsException;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
+import org.springframework.web.filter.OncePerRequestFilter;
+
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+@Component
+public class JwtRequestFilter extends OncePerRequestFilter {
+
+ private final JwtTokenUtil jwtTokenUtil;
+ private final PostCheckAccessTokenService postCheckAccessTokenService;
+
+ public JwtRequestFilter(JwtTokenUtil jwtTokenUtil,
+ PostCheckAccessTokenService postCheckAccessTokenService) {
+ this.jwtTokenUtil = jwtTokenUtil;
+ this.postCheckAccessTokenService = postCheckAccessTokenService;
+ }
+
+ @Override
+ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
+ throws ServletException, IOException {
+ try {
+ String jwtToken = extractJwtFromRequest(request);
+ if (StringUtils.hasText(jwtToken) && jwtTokenUtil.validateTokenOnly(jwtToken)) {
+ isValidToken(request, jwtToken);
+ UserDetails userDetails = new org.springframework.security.core.userdetails.User(jwtTokenUtil.getUsernameFromToken(jwtToken), "",
+ jwtTokenUtil.getRolesFromToken(jwtToken));
+
+ UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = new UsernamePasswordAuthenticationToken(
+ userDetails, null, userDetails.getAuthorities());
+ SecurityContextHolder.getContext().setAuthentication(usernamePasswordAuthenticationToken);
+ }
+ } catch(ExpiredJwtException | BadCredentialsException ex)
+ {
+ request.setAttribute("exception", ex);
+ }
+ chain.doFilter(request, response);
+ }
+
+ private void isValidToken(HttpServletRequest request, String jwtToken) {
+ String requestUrl = request.getRequestURI();
+ String refreshTokenUrl = "/api/authentication/refresh-token";
+ String forgotPasswordUrl = "/api/authentication/forgot-password";
+ if (!org.apache.commons.lang3.StringUtils.equalsAnyIgnoreCase(requestUrl, refreshTokenUrl, forgotPasswordUrl)) {
+ var isValid = isValidAuthenticateToken(jwtToken);
+ if (!isValid) {
+ throw new BusinessException(HttpStatus.UNAUTHORIZED, "Invalid Access Token");
+ }
+ }
+ }
+
+ private boolean isValidAuthenticateToken(String jwtToken) {
+ return postCheckAccessTokenService.execute(PostAccessTokenRequest.builder()
+ .accessToken(jwtToken)
+ .build()).getIsValid();
+ }
+
+ private String extractJwtFromRequest(HttpServletRequest request) {
+ String bearerToken = request.getHeader("Authorization");
+ if (StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer ")) {
+ return bearerToken.substring(7);
+ }
+ return null;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/iconplus/smartproc/configuration/JwtTokenUtil.java b/src/main/java/com/iconplus/smartproc/configuration/JwtTokenUtil.java
new file mode 100644
index 0000000..c1b06a3
--- /dev/null
+++ b/src/main/java/com/iconplus/smartproc/configuration/JwtTokenUtil.java
@@ -0,0 +1,97 @@
+package com.iconplus.smartproc.configuration;
+
+import com.iconplus.smartproc.model.token.TokenContent;
+import io.jsonwebtoken.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.authentication.BadCredentialsException;
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.stereotype.Component;
+
+import java.io.Serializable;
+import java.security.KeyPair;
+import java.util.*;
+import java.util.function.Function;
+
+@Component
+public class JwtTokenUtil implements Serializable {
+ private static final long serialVersionUID = -2550185165626007488L;
+
+ @Autowired
+ private KeyPair keyPair;
+
+ //retrieve expiration date from jwt token
+ public Date getExpirationDateFromToken(String token) {
+ return getClaimFromToken(token, Claims::getExpiration);
+ }
+ public T getClaimFromToken(String token, Function claimsResolver) {
+ final Claims claims = getAllClaimsFromToken(token);
+ return claimsResolver.apply(claims);
+ }
+ //for retrieveing any information from token we will need the secret key
+ public Claims getAllClaimsFromToken(String token) {
+ return Jwts.parser().setSigningKey(keyPair.getPublic()).parseClaimsJws(token).getBody();
+ }
+
+ private Boolean isTokenExpired(String token) {
+ final Date expiration = getExpirationDateFromToken(token);
+ return expiration.before(new Date());
+ }
+
+ public String generateToken(String username, TokenContent tokenContent, Integer expirationInMs) {
+ Map claims = new HashMap<>();
+
+ claims.put("authorities", tokenContent.getAccessMenu());
+ claims.put("nama", tokenContent.getNama());
+ claims.put("username", tokenContent.getUsername());
+ claims.put("user_id", tokenContent.getUserId());
+ claims.put("roleId", tokenContent.getRoleId());
+ claims.put("role", tokenContent.getRole());
+ claims.put("instansiId", tokenContent.getInstansiId());
+ claims.put("instansi", tokenContent.getInstansi());
+ claims.put("bidangId", tokenContent.getBidangId());
+ claims.put("bidang", tokenContent.getBidang());
+ claims.put("jabatanId", tokenContent.getJabatanId());
+ claims.put("jabatan", tokenContent.getJabatan());
+
+ return doGenerateToken(claims, username, expirationInMs);
+ }
+
+ public String doGenerateToken(Map claims, String subject, Integer expirationInMs) {
+ return Jwts.builder().setClaims(claims).setSubject(subject).setIssuedAt(new Date(System.currentTimeMillis()))
+ .setExpiration(new Date(System.currentTimeMillis() + expirationInMs))
+ .signWith(SignatureAlgorithm.RS256, keyPair.getPrivate()).compact();
+ }
+
+ public Boolean validateToken(String token, UserDetails userDetails) {
+ final String username = getUsernameFromToken(token);
+ return (username.equals(userDetails.getUsername()) && !isTokenExpired(token));
+ }
+
+ public boolean validateTokenOnly(String authToken) {
+ try {
+ Jwts.parser().setSigningKey(keyPair.getPublic()).parseClaimsJws(authToken);
+ return true;
+ } catch (SignatureException | MalformedJwtException | UnsupportedJwtException | IllegalArgumentException ex) {
+ throw new BadCredentialsException("INVALID_CREDENTIALS", ex);
+ } catch (ExpiredJwtException ex) {
+ throw ex;
+ }
+ }
+
+ public String getUsernameFromToken(String token) {
+ Claims claims = Jwts.parser().setSigningKey(keyPair.getPublic()).parseClaimsJws(token).getBody();
+ return claims.getSubject();
+
+ }
+
+ @SuppressWarnings("squid:S4834")
+ public List getRolesFromToken(String token) {
+ Claims claims = Jwts.parser().setSigningKey(keyPair.getPublic()).parseClaimsJws(token).getBody();
+ List authorityList = new ArrayList<>();
+ ArrayList authorities = claims.get("authorities", ArrayList.class);
+ authorities.forEach(c-> authorityList.add(new SimpleGrantedAuthority(c)));
+ return authorityList;
+
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/iconplus/smartproc/configuration/KeyConfiguration.java b/src/main/java/com/iconplus/smartproc/configuration/KeyConfiguration.java
new file mode 100644
index 0000000..6077f9c
--- /dev/null
+++ b/src/main/java/com/iconplus/smartproc/configuration/KeyConfiguration.java
@@ -0,0 +1,30 @@
+package com.iconplus.smartproc.configuration;
+
+import com.iconplus.smartproc.util.RSAUtil;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import java.security.KeyPair;
+import java.security.PrivateKey;
+import java.security.PublicKey;
+
+@Configuration
+public class KeyConfiguration {
+
+ @Value("${jwt.private-key}")
+ private String privateKey;
+
+ @Value("${jwt.public-key}")
+ private String publicKey;
+
+ @Bean
+ public KeyPair keypairBean() {
+
+ PublicKey pubKey = RSAUtil.getPublicKey(publicKey);
+ PrivateKey privKey = RSAUtil.getPrivateKey(privateKey);
+
+ return new KeyPair(pubKey, privKey);
+ }
+
+}
diff --git a/src/main/java/com/iconplus/smartproc/configuration/WebSecurityConfig.java b/src/main/java/com/iconplus/smartproc/configuration/WebSecurityConfig.java
new file mode 100644
index 0000000..0546d49
--- /dev/null
+++ b/src/main/java/com/iconplus/smartproc/configuration/WebSecurityConfig.java
@@ -0,0 +1,58 @@
+package com.iconplus.smartproc.configuration;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.builders.WebSecurity;
+import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
+import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
+import org.springframework.security.config.http.SessionCreationPolicy;
+import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
+
+
+@Configuration
+@EnableWebSecurity
+@EnableGlobalMethodSecurity(prePostEnabled = true)
+public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
+
+ @Autowired
+ private JwtAuthenticationEntryPoint jwtAuthenticationEntryPoint;
+
+ @Autowired
+ private JwtAuthenticationAccessDenied jwtAuthenticationAccessDenied;
+
+ @Autowired
+ private JwtRequestFilter jwtRequestFilter;
+
+ @Override
+ protected void configure(HttpSecurity httpSecurity) throws Exception {
+ httpSecurity
+ .sessionManagement()
+ .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
+ .sessionFixation().none().and()
+ .csrf().disable();
+ httpSecurity.authorizeRequests()
+ .antMatchers("/api*/**").permitAll()
+ .antMatchers("/api/authentication/*").permitAll()
+ .antMatchers("/actuator/health").permitAll()
+ .antMatchers("/swagger*/**").permitAll()
+ .antMatchers("/v2*/**").permitAll()
+ .antMatchers("/token/jwks.json").permitAll()
+ .anyRequest().authenticated().and()
+ .exceptionHandling().authenticationEntryPoint(jwtAuthenticationEntryPoint)
+ .accessDeniedHandler(jwtAuthenticationAccessDenied);
+ httpSecurity.addFilterBefore(jwtRequestFilter, UsernamePasswordAuthenticationFilter.class);
+
+ }
+
+ @Override
+ public void configure(WebSecurity web) throws Exception {
+ web.ignoring().antMatchers("/v2/api-docs",
+ "/configuration/ui",
+ "/swagger-resources/**",
+ "/configuration/security",
+ "/swagger-ui.html",
+ "/webjars/**");
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/iconplus/smartproc/controller/ApprovalDrpController.java b/src/main/java/com/iconplus/smartproc/controller/ApprovalDrpController.java
new file mode 100644
index 0000000..9953b47
--- /dev/null
+++ b/src/main/java/com/iconplus/smartproc/controller/ApprovalDrpController.java
@@ -0,0 +1,114 @@
+package com.iconplus.smartproc.controller;
+
+import com.iconplus.smartproc.helper.model.EmptyRequest;
+import com.iconplus.smartproc.helper.model.EmptyResponse;
+import com.iconplus.smartproc.model.request.DrpApprovalRequest;
+import com.iconplus.smartproc.model.request.DrpRekomendasiRequest;
+import com.iconplus.smartproc.model.request.ListDrpApprovalRequest;
+import com.iconplus.smartproc.model.response.*;
+import com.iconplus.smartproc.service.approval.*;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+import org.springframework.web.bind.annotation.*;
+
+@CrossOrigin(origins = "${fe.server}", allowCredentials = "true")
+@RestController
+@RequestMapping("/api/drp/approval")
+public class ApprovalDrpController {
+
+ private GetListUserVpService getListUserVpService;
+ private GetListUserDirekturKomiteService getListUserDirekturKomiteService;
+ private PostCreateDrpApprovalService postCreateDrpApprovalService;
+ private GetListApprovalDrpServie getListApprovalDrpServie;
+ private PostDrpRekomendasiService postDrpRekomendasiService;
+ private PostDrpApprovalExecutionService postDrpApprovalExecutionService;
+ private GetApprovalService getApprovalService;
+ private GetListRekomendasiService getListRekomendasiService;
+ private GetHistoryApprovalService getHistoryApprovalService;
+ public ApprovalDrpController(GetListUserVpService getListUserVpService,
+ GetListUserDirekturKomiteService getListUserDirekturKomiteService,
+ PostCreateDrpApprovalService postCreateDrpApprovalService,
+ GetListApprovalDrpServie getListApprovalDrpServie,
+ PostDrpRekomendasiService postDrpRekomendasiService,
+ PostDrpApprovalExecutionService postDrpApprovalExecutionService,
+ GetApprovalService getApprovalService,
+ GetListRekomendasiService getListRekomendasiService,
+ GetHistoryApprovalService getHistoryApprovalService) {
+ this.getListUserVpService = getListUserVpService;
+ this.getListUserDirekturKomiteService = getListUserDirekturKomiteService;
+ this.postCreateDrpApprovalService = postCreateDrpApprovalService;
+ this.getListApprovalDrpServie = getListApprovalDrpServie;
+ this.postDrpRekomendasiService = postDrpRekomendasiService;
+ this.postDrpApprovalExecutionService = postDrpApprovalExecutionService;
+ this.getApprovalService = getApprovalService;
+ this.getListRekomendasiService = getListRekomendasiService;
+ this.getHistoryApprovalService = getHistoryApprovalService;
+ }
+
+ @GetMapping("/vp")
+ public GetListUserApprovalResponse getUserVp(EmptyRequest emptyRequest) {
+ return getListUserVpService.execute(emptyRequest);
+ }
+
+ @GetMapping("direktur-komite")
+ public GetListUserApprovalResponse getUserDirekturKomite(EmptyRequest emptyRequest) {
+ return getListUserDirekturKomiteService.execute(emptyRequest);
+ }
+
+ @PostMapping
+ public EmptyResponse createDrpHasApproval(@RequestBody ListDrpApprovalRequest listDrpApprovalRequest) {
+ return postCreateDrpApprovalService.execute(listDrpApprovalRequest);
+ }
+
+ @GetMapping
+ public GetListDrpApprovalResponse getListDrpApprovalResponse(@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);
+ DrpApprovalRequest drpApprovalRequest = DrpApprovalRequest.builder()
+ .search(search)
+ .pageable(pageable)
+ .build();
+ return getListApprovalDrpServie.execute(drpApprovalRequest);
+
+ }
+
+ @PostMapping("/rekomendasi")
+ public DrpRekomendasiResponse drpRekomendasiResponse(@RequestBody DrpRekomendasiRequest drpRekomendasiRequest) {
+ return postDrpRekomendasiService.execute(drpRekomendasiRequest);
+ }
+
+ @PostMapping("/execution")
+ public EmptyResponse drpApprovalExecution(@RequestBody DrpApprovalRequest drpApprovalRequest) {
+ return postDrpApprovalExecutionService.execute(drpApprovalRequest);
+ }
+
+ @GetMapping("/jenis-pengadaan/{id}")
+ public DrpApprovalResponse getDrpApproval(@PathVariable(name = "id") Long id) {
+ return getApprovalService.execute(DrpApprovalRequest.builder()
+ .jenisPengadaanId(id)
+ .build());
+ }
+
+ @GetMapping("/rekomendasi/jenis-pengadaan/{id}")
+ public GetListDrpRekomendasiResponse getListRekomendasi(@PathVariable(name = "id") Long id,
+ @RequestParam(name = "page", defaultValue = "1") Integer page,
+ @RequestParam(name = "size", defaultValue = "5") Integer size) {
+
+ Pageable pageable = PageRequest.of((page - 1), size);
+ DrpRekomendasiRequest drpRekomendasiRequest = DrpRekomendasiRequest.builder()
+ .jenisPengadaanId(id)
+ .pageable(pageable)
+ .build();
+
+ return getListRekomendasiService.execute(drpRekomendasiRequest);
+ }
+
+ @GetMapping("/{id}/history")
+ public GetListDrpApprovalHistoryResponse getListDrpApprovalResponse(@PathVariable(name = "id") Long id) {
+ return getHistoryApprovalService.execute(DrpApprovalRequest.builder()
+ .drpId(id)
+ .build());
+ }
+}
diff --git a/src/main/java/com/iconplus/smartproc/controller/AuthenticationController.java b/src/main/java/com/iconplus/smartproc/controller/AuthenticationController.java
new file mode 100644
index 0000000..491fa80
--- /dev/null
+++ b/src/main/java/com/iconplus/smartproc/controller/AuthenticationController.java
@@ -0,0 +1,83 @@
+package com.iconplus.smartproc.controller;
+
+import com.iconplus.smartproc.exception.BusinessException;
+import com.iconplus.smartproc.helper.model.EmptyRequest;
+import com.iconplus.smartproc.helper.model.EmptyResponse;
+import com.iconplus.smartproc.model.request.*;
+import com.iconplus.smartproc.model.response.GlobalResponse;
+import com.iconplus.smartproc.model.response.InitForgotPasswordResponse;
+import com.iconplus.smartproc.model.response.RefreshTokenResponse;
+import com.iconplus.smartproc.service.authentication.*;
+import org.springframework.web.bind.annotation.*;
+
+@CrossOrigin(origins = "${fe.server}", allowCredentials = "true")
+@RestController
+@RequestMapping("/api/authentication")
+public class AuthenticationController {
+
+ private final LoginService loginService;
+ private final TokenManagementService tokenManagementService;
+ private final LogoutService logoutService;
+ private final ChangePasswordService changePasswordService;
+ private final ForgotPasswordService forgotPasswordService;
+ private final InitForgotPasswordService initForgotPasswordService;
+
+ public AuthenticationController(LoginService loginService,
+ TokenManagementService tokenManagementService,
+ LogoutService logoutService,
+ ChangePasswordService changePasswordService,
+ ForgotPasswordService forgotPasswordService,
+ InitForgotPasswordService initForgotPasswordService) {
+ this.loginService = loginService;
+ this.tokenManagementService = tokenManagementService;
+ this.logoutService = logoutService;
+ this.changePasswordService = changePasswordService;
+ this.forgotPasswordService = forgotPasswordService;
+ this.initForgotPasswordService = initForgotPasswordService;
+ }
+
+ @PostMapping("/login")
+ public GlobalResponse getLoginResponse(@RequestBody LoginRequest loginRequest) {
+ try {
+ var loginResponse = loginService.execute(loginRequest);
+ return GlobalResponse.builder()
+ .isOk(true)
+ .message("Succes")
+ .data(loginResponse)
+ .build();
+ } catch (BusinessException exception) {
+ return GlobalResponse.builder()
+ .isOk(false)
+ .message(exception.getErrorMessage())
+ .build();
+ }
+ }
+
+ @PostMapping("/refresh-token")
+ public RefreshTokenResponse getRefreshToken(@RequestBody RefreshTokenRequest refreshTokenRequest) {
+ return tokenManagementService.execute(refreshTokenRequest);
+ }
+
+ @PostMapping("/logout")
+ public EmptyResponse logoutUser(EmptyRequest request) {
+ return logoutService.execute(request);
+
+ }
+
+ @PostMapping("/change-password")
+ public EmptyResponse changePassword(@RequestBody ChangePasswordRequest changePasswordRequest) {
+ return changePasswordService.execute(changePasswordRequest);
+ }
+
+ @PostMapping("/forgot-password")
+ public EmptyResponse forgotPassword(@RequestBody ForgotPasswordRequest forgotPasswordRequest) {
+ return forgotPasswordService.execute(forgotPasswordRequest);
+ }
+
+
+ @PostMapping("/init/forgot-password")
+ public InitForgotPasswordResponse initForgotPassword(@RequestBody InitForgotPasswordRequest initForgotPasswordRequest) {
+ return initForgotPasswordService.execute(initForgotPasswordRequest);
+ }
+
+}
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..286143f
--- /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 = "${fe.server}", 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/controller/DrpController.java b/src/main/java/com/iconplus/smartproc/controller/DrpController.java
new file mode 100644
index 0000000..58eaee7
--- /dev/null
+++ b/src/main/java/com/iconplus/smartproc/controller/DrpController.java
@@ -0,0 +1,122 @@
+package com.iconplus.smartproc.controller;
+
+import com.iconplus.smartproc.helper.model.EmptyResponse;
+import com.iconplus.smartproc.model.request.DrpDokumenRequest;
+import com.iconplus.smartproc.model.request.DrpRekomendasiRequest;
+import com.iconplus.smartproc.model.request.DrpRequest;
+import com.iconplus.smartproc.model.response.*;
+import com.iconplus.smartproc.service.drp.*;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+
+@CrossOrigin(origins = "${fe.server}", allowCredentials = "true")
+@RestController
+@RequestMapping("/api/drp")
+public class DrpController {
+
+ private final GetDrpService getDrpService;
+ private final GetListDrpService getListDrpService;
+ private final PostDrpUploadDokumenRKAPService postDrpUploadDokumenRKAPService;
+ private final PostCreateTahunDrpService postCreateTahunDrpService;
+ private final DeleteDokumenUploadService deleteDokumenUploadService;
+ private final PostCreateDrpService postCreateDrpService;
+ private final EditUploadDokumenDrpService editUploadDokumenDrpService;
+ private final GetListDrpRekomendasiService getListDrpRekomendasiService;
+
+ public DrpController(GetDrpService getDrpService,
+ GetListDrpService getListDrpService,
+ PostDrpUploadDokumenRKAPService postDrpUploadDokumenRKAPService,
+ PostCreateTahunDrpService postCreateTahunDrpService,
+ DeleteDokumenUploadService deleteDokumenUploadService,
+ PostCreateDrpService postCreateDrpService,
+ EditUploadDokumenDrpService editUploadDokumenDrpService,
+ GetListDrpRekomendasiService getListDrpRekomendasiService) {
+ this.getDrpService = getDrpService;
+ this.getListDrpService = getListDrpService;
+ this.postDrpUploadDokumenRKAPService = postDrpUploadDokumenRKAPService;
+ this.postCreateTahunDrpService = postCreateTahunDrpService;
+ this.deleteDokumenUploadService = deleteDokumenUploadService;
+ this.postCreateDrpService = postCreateDrpService;
+ this.editUploadDokumenDrpService = editUploadDokumenDrpService;
+ this.getListDrpRekomendasiService = getListDrpRekomendasiService;
+ }
+
+ @GetMapping
+ public GetListDrpResponse getListDrp(@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);
+ DrpRequest drpRequest = DrpRequest.builder()
+ .search(search)
+ .pageable(pageable)
+ .build();
+
+ return getListDrpService.execute(drpRequest);
+ }
+
+ @GetMapping("/{id}")
+ public DrpResponse getDrp(@PathVariable Long id) {
+ return getDrpService.execute(DrpRequest.builder()
+ .id(id)
+ .build());
+ }
+
+ @PostMapping("/tahun")
+ public DrpResponse createTahunDrp(@RequestBody DrpRequest drpRequest) {
+ return postCreateTahunDrpService.execute(drpRequest);
+ }
+
+ @PostMapping
+ public DrpResponse createDrp(@RequestBody DrpRequest drpRequest) {
+ return postCreateDrpService.execute(drpRequest);
+ }
+
+
+ @PostMapping("/upload/dokumen")
+ public DrpDokumenResponse uploadDokumenRkap(@RequestParam(name = "jenisDokumenId") Long jenisDokumenId,
+ @RequestParam(name = "keterangan") String keterangan,
+ @RequestParam(name = "file") MultipartFile file) throws IOException {
+ return postDrpUploadDokumenRKAPService.execute(DrpDokumenRequest.builder()
+ .jenisDokumenId(jenisDokumenId)
+ .keterangan(keterangan)
+ .file(file)
+ .build());
+ }
+
+ @DeleteMapping("/upload/dokumen")
+ public EmptyResponse deleteDokumenRkap(@RequestBody DrpDokumenRequest drpDokumenRequest) {
+ return deleteDokumenUploadService.execute(drpDokumenRequest);
+ }
+
+ @PutMapping("/upload/dokumen")
+ public DrpDokumenResponse editUploadDrpDokumen(@RequestParam(name = "filename") String filename,
+ @RequestParam(name = "jenisDokumenId") Long jenisDokumenId,
+ @RequestParam(name = "keterangan") String keterangan,
+ @RequestParam(name = "file") MultipartFile file) {
+ return editUploadDokumenDrpService.execute(DrpDokumenRequest.builder()
+ .filename(filename)
+ .jenisDokumenId(jenisDokumenId)
+ .keterangan(keterangan)
+ .file(file)
+ .build());
+ }
+
+ @GetMapping("/{id}/rekomendasi")
+ public GetListDrpRekomendasiResponse getListDrpRekomendasiResponse(@PathVariable(name = "id") Long id,
+ @RequestParam(name = "page", defaultValue = "1") Integer page,
+ @RequestParam(name = "size", defaultValue = "5") Integer size) {
+ Pageable pageable = PageRequest.of((page - 1), size);
+ DrpRekomendasiRequest drpRekomendasiRequest = DrpRekomendasiRequest.builder()
+ .drpId(id)
+ .pageable(pageable)
+ .build();
+
+ return getListDrpRekomendasiService.execute(drpRekomendasiRequest);
+ }
+
+}
diff --git a/src/main/java/com/iconplus/smartproc/controller/DrpPengadaanController.java b/src/main/java/com/iconplus/smartproc/controller/DrpPengadaanController.java
new file mode 100644
index 0000000..450cae0
--- /dev/null
+++ b/src/main/java/com/iconplus/smartproc/controller/DrpPengadaanController.java
@@ -0,0 +1,113 @@
+package com.iconplus.smartproc.controller;
+
+import com.iconplus.smartproc.helper.model.EmptyResponse;
+import com.iconplus.smartproc.model.request.DrpPengadaanDokumenRequest;
+import com.iconplus.smartproc.model.request.DrpPengadaanRequest;
+import com.iconplus.smartproc.model.response.*;
+import com.iconplus.smartproc.service.drppengadaan.*;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+
+@CrossOrigin(origins = "${fe.server}", allowCredentials = "true")
+@RestController
+@RequestMapping("/api/drp/pengadaan")
+public class DrpPengadaanController {
+
+ private final PostCreateDrpPengadaanService postCreateDrpPengadaanService;
+ private final GetListDrpPengadaanService getListDrpPengadaanService;
+ private final PostDrpUploadDokumenPendukungService postDrpUploadDokumenPendukungService;
+ private final DeleteDrpPengadaanService deleteDrpPengadaanService;
+ private final DeleteDokumenPendukungService deleteDokumenPendukungService;
+ private final EditUploadDrpPengadaanService editUploadDrpPengadaanService;
+ private final GetDrpPengadaanService getDrpPengadaanService;
+ private final PutDrpPengadaanService putDrpPengadaanService;
+
+ public DrpPengadaanController(PostCreateDrpPengadaanService postCreateDrpPengadaanService,
+ GetListDrpPengadaanService getListDrpPengadaanService,
+ PostDrpUploadDokumenPendukungService postDrpUploadDokumenPendukungService,
+ DeleteDrpPengadaanService deleteDrpPengadaanService,
+ DeleteDokumenPendukungService deleteDokumenPendukungService,
+ EditUploadDrpPengadaanService editUploadDrpPengadaanService,
+ GetDrpPengadaanService getDrpPengadaanService,
+ PutDrpPengadaanService putDrpPengadaanService) {
+ this.postCreateDrpPengadaanService = postCreateDrpPengadaanService;
+ this.getListDrpPengadaanService = getListDrpPengadaanService;
+ this.postDrpUploadDokumenPendukungService = postDrpUploadDokumenPendukungService;
+ this.deleteDrpPengadaanService = deleteDrpPengadaanService;
+ this.deleteDokumenPendukungService = deleteDokumenPendukungService;
+ this.editUploadDrpPengadaanService = editUploadDrpPengadaanService;
+ this.getDrpPengadaanService = getDrpPengadaanService;
+ this.putDrpPengadaanService = putDrpPengadaanService;
+ }
+
+ @GetMapping("/list/{id}")
+ public GetListDrpPengadaanResponse getDrpPengadaan(@PathVariable(name = "id") Long drpId,
+ @RequestParam(name = "page", defaultValue = "1") Integer page,
+ @RequestParam(name = "size", defaultValue = "5") Integer size){
+
+ Pageable pageable = PageRequest.of((page - 1), size);
+ DrpPengadaanRequest drpPengadaanRequest = DrpPengadaanRequest.builder()
+ .drpId(drpId)
+ .pageable(pageable)
+ .build();
+ return getListDrpPengadaanService.execute(drpPengadaanRequest);
+ }
+
+ @PostMapping
+ public DrpPengadaanResponse createDrpPengadaan(@RequestBody DrpPengadaanRequest drpPengadaanRequest) {
+ return postCreateDrpPengadaanService.execute(drpPengadaanRequest);
+ }
+
+ @GetMapping("/{id}")
+ public DrpPengadaanResponse getDrpPengadaanById(@PathVariable Long id) {
+ return getDrpPengadaanService.execute(DrpPengadaanRequest.builder()
+ .id(id)
+ .build());
+ }
+
+ @PutMapping("/{id}")
+ public DrpPengadaanResponse updateDrpPengadaan(@PathVariable Long id,
+ @RequestBody DrpPengadaanRequest drpPengadaanRequest) throws IOException {
+ drpPengadaanRequest.setId(id);
+ return putDrpPengadaanService.execute(drpPengadaanRequest);
+ }
+
+ @DeleteMapping("/{id}")
+ public EmptyResponse deleteDrpPengadaan(@RequestBody DrpPengadaanRequest drpPengadaanRequest) {
+ return deleteDrpPengadaanService.execute(drpPengadaanRequest);
+ }
+
+ @PostMapping("/upload/dokumen")
+ public DrpPengadaanDokumenResponse uploadDokumenPendukung(@RequestParam(name = "jenisDokumenId") Long jenisDokumenId,
+ @RequestParam(name = "keterangan") String keterangan,
+ @RequestParam(name = "file") MultipartFile file) throws IOException {
+ return postDrpUploadDokumenPendukungService.execute(DrpPengadaanDokumenRequest.builder()
+ .jenisDokumenId(jenisDokumenId)
+ .keterangan(keterangan)
+ .file(file)
+ .build());
+ }
+
+ @PutMapping("/upload/dokumen")
+ public DrpPengadaanDokumenResponse editUploadDrpDokumen(@RequestParam(name = "filename") String filename,
+ @RequestParam(name = "jenisDokumenId") Long jenisDokumenId,
+ @RequestParam(name = "keterangan") String keterangan,
+ @RequestParam(name = "file") MultipartFile file) {
+ return editUploadDrpPengadaanService.execute(DrpPengadaanDokumenRequest.builder()
+ .filename(filename)
+ .jenisDokumenId(jenisDokumenId)
+ .keterangan(keterangan)
+ .file(file)
+ .build());
+ }
+
+ @DeleteMapping("/upload/dokumen")
+ public EmptyResponse deleteDokumenPendukung(@RequestBody DrpPengadaanDokumenRequest drpPengadaanDokumenRequest) {
+ return deleteDokumenPendukungService.execute(drpPengadaanDokumenRequest);
+ }
+
+}
diff --git a/src/main/java/com/iconplus/smartproc/controller/InstansiController.java b/src/main/java/com/iconplus/smartproc/controller/InstansiController.java
new file mode 100644
index 0000000..b094a85
--- /dev/null
+++ b/src/main/java/com/iconplus/smartproc/controller/InstansiController.java
@@ -0,0 +1,74 @@
+package com.iconplus.smartproc.controller;
+
+import com.iconplus.smartproc.helper.model.EmptyResponse;
+import com.iconplus.smartproc.model.request.InstansiRequest;
+import com.iconplus.smartproc.model.response.GetListInstansiResponse;
+import com.iconplus.smartproc.model.response.InstansiResponse;
+import com.iconplus.smartproc.service.instansi.*;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+import org.springframework.web.bind.annotation.*;
+
+@CrossOrigin(origins = "${fe.server}", allowCredentials = "true")
+@RestController
+@RequestMapping("/api/instansi")
+public class InstansiController {
+
+ private final GetListInstansiService getListInstansiService;
+ private final PostCreateInstansiService postCreateInstansiService;
+ private final PutUpdateInstansiService putUpdateInstansiService;
+ private final GetInstansiByIdService getInstansiByIdService;
+ private final DeleteInstansiService deleteInstansiService;
+
+ public InstansiController(GetListInstansiService getListInstansiService,
+ PostCreateInstansiService postCreateInstansiService,
+ PutUpdateInstansiService putUpdateInstansiService,
+ GetInstansiByIdService getInstansiByIdService,
+ DeleteInstansiService deleteInstansiService) {
+ this.getListInstansiService = getListInstansiService;
+ this.postCreateInstansiService = postCreateInstansiService;
+ this.putUpdateInstansiService = putUpdateInstansiService;
+ this.getInstansiByIdService = getInstansiByIdService;
+ this.deleteInstansiService = deleteInstansiService;
+
+ }
+
+ @GetMapping
+ public GetListInstansiResponse 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);
+ InstansiRequest instansiRequest = InstansiRequest.builder()
+ .search(search)
+ .pageable(pageable)
+ .build();
+
+ return getListInstansiService.execute(instansiRequest);
+ }
+
+ @PostMapping
+ public InstansiResponse createInstansi(@RequestBody InstansiRequest request) {
+ return postCreateInstansiService.execute(request);
+ }
+
+ @GetMapping("/{id}")
+ public InstansiResponse getInstansiById(@PathVariable Long id) {
+ return getInstansiByIdService.execute(InstansiRequest.builder()
+ .id(id)
+ .build());
+ }
+
+ @PutMapping("/{id}")
+ public InstansiResponse updateInstansi(@PathVariable Long id, @RequestBody InstansiRequest request){
+ request.setId(id);
+ return putUpdateInstansiService.execute(request);
+ }
+
+ @DeleteMapping("/{id}")
+ public EmptyResponse deleteInstansi(@PathVariable Long id){
+ return deleteInstansiService.execute(InstansiRequest.builder()
+ .id(id)
+ .build());
+ }
+}
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..3a051ce
--- /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 = "${fe.server}", 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/controller/JenisAnggaranController.java b/src/main/java/com/iconplus/smartproc/controller/JenisAnggaranController.java
new file mode 100644
index 0000000..82e34d0
--- /dev/null
+++ b/src/main/java/com/iconplus/smartproc/controller/JenisAnggaranController.java
@@ -0,0 +1,77 @@
+package com.iconplus.smartproc.controller;
+
+
+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.service.jenisanggaran.*;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+import org.springframework.web.bind.annotation.*;
+
+@CrossOrigin(origins = "${fe.server}", allowCredentials = "true")
+@RestController
+@RequestMapping("/api/jenisanggaran")
+public class JenisAnggaranController {
+
+ private final GetListJenisAnggaranService getListJenisAnggaranService;
+ private final GetJenisAnggaranByIdService getJenisAnggaranByIdService;
+ private final PostCreateJenisAnggaranService postCreateJenisAnggaranService;
+ private final PutUpdateJenisAnggaranService putUpdateJenisAnggaranService;
+ private final DeleteJenisAnggaranService deleteJenisAnggaranService;
+
+ public JenisAnggaranController(GetListJenisAnggaranService getListJenisAnggaranService,
+ GetJenisAnggaranByIdService getJenisAnggaranByIdService,
+ PostCreateJenisAnggaranService postCreateJenisAnggaranService,
+ PutUpdateJenisAnggaranService putUpdateJenisAnggaranService,
+ DeleteJenisAnggaranService deleteJenisAnggaranService) {
+ this.getListJenisAnggaranService = getListJenisAnggaranService;
+ this.getJenisAnggaranByIdService = getJenisAnggaranByIdService;
+ this.postCreateJenisAnggaranService = postCreateJenisAnggaranService;
+ this.putUpdateJenisAnggaranService = putUpdateJenisAnggaranService;
+ this.deleteJenisAnggaranService = deleteJenisAnggaranService;
+ }
+
+
+ @GetMapping
+ public GetListJenisAnggaranResponse getListJenisAnggaran(@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);
+ JenisAnggaranRequest jenisAnggaranRequest = JenisAnggaranRequest.builder()
+ .search(search)
+ .pageable(pageable)
+ .build();
+
+ return getListJenisAnggaranService.execute(jenisAnggaranRequest);
+ }
+
+ @PostMapping
+ public JenisAnggaranResponse createJenisAnggaran(@RequestBody JenisAnggaranRequest jenisAnggaranRequest) {
+ return postCreateJenisAnggaranService.execute(jenisAnggaranRequest);
+ }
+
+ @GetMapping("/{id}")
+ public JenisAnggaranResponse getJenisAnggaranById(@PathVariable Long id) {
+ return getJenisAnggaranByIdService.execute(JenisAnggaranRequest.builder()
+ .id(id)
+ .build());
+ }
+
+
+ @PutMapping("/{id}")
+ public JenisAnggaranResponse updateJenisanggaran(@PathVariable Long id,
+ @RequestBody JenisAnggaranRequest jenisAnggaranRequest){
+ jenisAnggaranRequest.setId(id);
+ return putUpdateJenisAnggaranService.execute(jenisAnggaranRequest);
+ }
+
+ @DeleteMapping("/{id}")
+ public EmptyResponse deleteJenisAnggaran(@PathVariable Long id) {
+ return deleteJenisAnggaranService.execute(JenisAnggaranRequest.builder()
+ .id(id)
+ .build());
+ }
+}
diff --git a/src/main/java/com/iconplus/smartproc/controller/JenisKontrakController.java b/src/main/java/com/iconplus/smartproc/controller/JenisKontrakController.java
new file mode 100644
index 0000000..54e9637
--- /dev/null
+++ b/src/main/java/com/iconplus/smartproc/controller/JenisKontrakController.java
@@ -0,0 +1,77 @@
+package com.iconplus.smartproc.controller;
+
+
+import com.iconplus.smartproc.helper.model.EmptyResponse;
+import com.iconplus.smartproc.model.request.JenisKontrakRequest;
+import com.iconplus.smartproc.model.response.GetListJenisKontrakResponse;
+import com.iconplus.smartproc.model.response.JenisKontrakResponse;
+import com.iconplus.smartproc.service.jeniskontrak.*;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+import org.springframework.web.bind.annotation.*;
+
+@CrossOrigin(origins = "${fe.server}", allowCredentials = "true")
+@RestController
+@RequestMapping("/api/jeniskontrak")
+public class JenisKontrakController {
+
+ private final GetListJenisKontrakService getListJenisKontrakService;
+ private final GetJenisKontrakByIdService getJenisKontrakByIdService;
+ private final PostCreateJenisKontrakService postCreateJenisKontrakService;
+ private final PutUpdateJenisKontrakService putUpdateJenisKontrakService;
+ private final DeleteJenisKontrakService deleteJenisKontrakService;
+
+ public JenisKontrakController(GetListJenisKontrakService getListJenisKontrakService,
+ GetJenisKontrakByIdService getJenisKontrakByIdService,
+ PostCreateJenisKontrakService postCreateJenisKontrakService,
+ PutUpdateJenisKontrakService putUpdateJenisKontrakService,
+ DeleteJenisKontrakService deleteJenisKontrakService) {
+ this.getListJenisKontrakService = getListJenisKontrakService;
+ this.getJenisKontrakByIdService = getJenisKontrakByIdService;
+ this.postCreateJenisKontrakService = postCreateJenisKontrakService;
+ this.putUpdateJenisKontrakService = putUpdateJenisKontrakService;
+ this.deleteJenisKontrakService = deleteJenisKontrakService;
+ }
+
+
+ @GetMapping
+ public GetListJenisKontrakResponse getListJenisKontrak(@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);
+ JenisKontrakRequest jenisKontrakRequest = JenisKontrakRequest.builder()
+ .search(search)
+ .pageable(pageable)
+ .build();
+
+ return getListJenisKontrakService.execute(jenisKontrakRequest);
+ }
+
+ @PostMapping
+ public JenisKontrakResponse createJenisKontrak(@RequestBody JenisKontrakRequest jenisKontrakRequest) {
+ return postCreateJenisKontrakService.execute(jenisKontrakRequest);
+ }
+
+ @GetMapping("/{id}")
+ public JenisKontrakResponse getJenisKontrakById(@PathVariable Long id) {
+ return getJenisKontrakByIdService.execute(JenisKontrakRequest.builder()
+ .id(id)
+ .build());
+ }
+
+
+ @PutMapping("/{id}")
+ public JenisKontrakResponse updateJeniskontrak(@PathVariable Long id,
+ @RequestBody JenisKontrakRequest jenisKontrakRequest){
+ jenisKontrakRequest.setId(id);
+ return putUpdateJenisKontrakService.execute(jenisKontrakRequest);
+ }
+
+ @DeleteMapping("/{id}")
+ public EmptyResponse deleteJenisKontrak(@PathVariable Long id) {
+ return deleteJenisKontrakService.execute(JenisKontrakRequest.builder()
+ .id(id)
+ .build());
+ }
+}
diff --git a/src/main/java/com/iconplus/smartproc/controller/JenisPengadaanController.java b/src/main/java/com/iconplus/smartproc/controller/JenisPengadaanController.java
new file mode 100644
index 0000000..11454f7
--- /dev/null
+++ b/src/main/java/com/iconplus/smartproc/controller/JenisPengadaanController.java
@@ -0,0 +1,75 @@
+package com.iconplus.smartproc.controller;
+
+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.*;
+
+@CrossOrigin(origins = "${fe.server}", allowCredentials = "true")
+@RestController
+@RequestMapping("/api/jenispengadaan")
+public class JenisPengadaanController {
+
+ private final GetListJenisPengadaanService getListJenisPengadaanService;
+ private final GetJenisPengadaanService getJenisPengadaanService;
+ private final PostCreateJenisPengadaanService postCreateJenisPengadaanService;
+ private final DeleteJenisPengadaanService deleteJenisPengadaanService;
+ private final PutUpdateJenisPengadaanService putUpdateJenisPengadaanService;
+
+ 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;
+ }
+
+ @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){
+
+ Pageable pageable = PageRequest.of((page - 1), size);
+ JenisPengadaanRequest jenisPengadaanRequest = JenisPengadaanRequest.builder()
+ .search(search)
+ .pageable(pageable)
+ .build();
+
+ return getListJenisPengadaanService.execute(jenisPengadaanRequest);
+ }
+
+ @PostMapping
+ public JenisPengadaanResponse createJenisPengadaan(@RequestBody JenisPengadaanRequest jenisPengadaanRequest) {
+ return postCreateJenisPengadaanService.execute(jenisPengadaanRequest);
+ }
+
+ @GetMapping("/{id}")
+ public JenisPengadaanResponse getJenisPengadaannById(@PathVariable Long id) {
+ return getJenisPengadaanService.execute(JenisPengadaanRequest.builder()
+ .id(id)
+ .build());
+ }
+
+
+ @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/controller/JenisanggaranController.java b/src/main/java/com/iconplus/smartproc/controller/JenisanggaranController.java
deleted file mode 100644
index 7f539a1..0000000
--- a/src/main/java/com/iconplus/smartproc/controller/JenisanggaranController.java
+++ /dev/null
@@ -1,65 +0,0 @@
-package com.iconplus.smartproc.controller;
-
-import com.iconplus.smartproc.entity.Jenisanggaran;
-import com.iconplus.smartproc.exception.ResourceNotFoundException;
-import com.iconplus.smartproc.repository.JenisanggaranRepository;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.ResponseEntity;
-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/jenisanggaran")
-public class JenisanggaranController {
- @Autowired
- private JenisanggaranRepository jenisanggaranRepository;
-
- //get all data
- @GetMapping
- public List getAllJenisanggarans(){
- return jenisanggaranRepository.findAll();
- }
-
- // create
- @PostMapping
- public Jenisanggaran createJenisanggaran(@RequestBody Jenisanggaran jenisanggaran) {
- return jenisanggaranRepository.save(jenisanggaran);
- }
-
- // get jenisanggaran by id rest api
- @GetMapping("/{id}")
- public ResponseEntity getJenisanggaranById(@PathVariable Long id) {
- Jenisanggaran jenisanggaran = jenisanggaranRepository.findById(id)
- .orElseThrow(() -> new ResourceNotFoundException("Jenisanggaran not exist with id :" + id));
- return ResponseEntity.ok(jenisanggaran);
- }
-
- // update jenisanggaran rest api
- @PutMapping("/{id}")
- public ResponseEntity updateJenisanggaran(@PathVariable Long id, @RequestBody Jenisanggaran jenisanggaranDetails){
- Jenisanggaran jenisanggaran = jenisanggaranRepository.findById(id)
- .orElseThrow(() -> new ResourceNotFoundException("Jenisanggaran not exist with id :" + id));
-
- jenisanggaran.setJenisanggaran(jenisanggaranDetails.getJenisanggaran());
- jenisanggaran.setKeterangan(jenisanggaranDetails.getKeterangan());
-
- Jenisanggaran updatedJenisanggaran = jenisanggaranRepository.save(jenisanggaran);
- return ResponseEntity.ok(updatedJenisanggaran);
- }
-
- // delete jenisanggaran rest api
- @DeleteMapping("/{id}")
- public ResponseEntity