From a45dd56432621f66bca5ed4f9c71987d1f99d220 Mon Sep 17 00:00:00 2001 From: harish Date: Mon, 26 Aug 2024 12:27:12 +0530 Subject: [PATCH 1/6] Api related to logout,reset and change password in user api controller --- .../config/SecurityConfig.java | 29 ++++--- .../config/jwt/TokenProvider.java | 22 +++++ .../constants/GepafinConstant.java | 8 ++ .../gepafin/tendermanagement/dao/UserDao.java | 84 +++++++++++++++++- .../tendermanagement/entities/UserEntity.java | 2 + .../model/request/ChangePasswordRequest.java | 16 ++++ .../request/InitiatePasswordResetReq.java | 8 ++ .../model/request/LogoutReq.java | 10 +++ .../model/request/ResetPasswordReq.java | 11 +++ .../tendermanagement/service/UserService.java | 18 +++- .../service/impl/AuthenticationService.java | 17 +++- .../service/impl/UserServiceImpl.java | 30 ++++++- .../web/rest/api/UserApi.java | 85 +++++++++++++++++-- .../web/rest/api/impl/UserApiController.java | 57 +++++++++++-- .../db/changelog/db.changelog-1.0.0.xml | 8 ++ src/main/resources/message_en.properties | 14 +++ src/main/resources/message_it.properties | 10 +++ 17 files changed, 393 insertions(+), 36 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/ChangePasswordRequest.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/InitiatePasswordResetReq.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/LogoutReq.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/ResetPasswordReq.java diff --git a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java index 53b7baef..5ffca88e 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java +++ b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java @@ -39,13 +39,12 @@ import net.gepafin.tendermanagement.config.jwt.TokenProvider; public class SecurityConfig { private final TokenProvider tokenProvider; - - private final CorsFilter corsFilter; + private final CorsConfigurationSource corsConfigurationSource; @Autowired - public SecurityConfig(TokenProvider tokenProvider, CorsFilter corsFilter) { + public SecurityConfig(TokenProvider tokenProvider, CorsConfigurationSource corsConfigurationSource) { this.tokenProvider = tokenProvider; - this.corsFilter = corsFilter; + this.corsConfigurationSource = corsConfigurationSource; } @Bean @@ -59,20 +58,19 @@ public class SecurityConfig { } @Bean - MvcRequestMatcher.Builder mvc(HandlerMappingIntrospector introspector) { + public MvcRequestMatcher.Builder mvc(HandlerMappingIntrospector introspector) { return new MvcRequestMatcher.Builder(introspector); } - + @Bean public WebSecurityCustomizer webSecurityCustomizer(MvcRequestMatcher.Builder mvc) { return (web) -> web.ignoring().requestMatchers(mvc.pattern(HttpMethod.OPTIONS, "/**")) - .requestMatchers(new AntPathRequestMatcher("/i18n/**")) - .requestMatchers(new AntPathRequestMatcher("/content/**")) - .requestMatchers(new AntPathRequestMatcher("/swagger-ui/index.html")) - .requestMatchers(new AntPathRequestMatcher("/swagger-ui/**")); + .requestMatchers(new AntPathRequestMatcher("/i18n/**")) + .requestMatchers(new AntPathRequestMatcher("/content/**")) + .requestMatchers(new AntPathRequestMatcher("/swagger-ui/index.html")) + .requestMatchers(new AntPathRequestMatcher("/swagger-ui/**")); } - // @Bean // public CorsConfigurationSource corsConfigurationSource() { // UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); @@ -85,9 +83,14 @@ public class SecurityConfig { // return source; // } + @Bean + public CorsFilter corsFilter() { + return new CorsFilter(corsConfigurationSource); + } + @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http, MvcRequestMatcher.Builder mvc) throws Exception { - http + http .csrf(AbstractHttpConfigurer::disable) .authorizeHttpRequests(auth -> auth .requestMatchers(mvc.pattern(HttpMethod.POST, "/v1/user/login")).permitAll() @@ -99,7 +102,7 @@ public class SecurityConfig { .sessionManagement(session -> session .sessionCreationPolicy(SessionCreationPolicy.STATELESS) ) - .addFilterBefore(corsFilter, UsernamePasswordAuthenticationFilter.class) + .addFilterBefore(corsFilter(), UsernamePasswordAuthenticationFilter.class) .addFilterBefore(new JWTFilter(tokenProvider), UsernamePasswordAuthenticationFilter.class); return http.build(); diff --git a/src/main/java/net/gepafin/tendermanagement/config/jwt/TokenProvider.java b/src/main/java/net/gepafin/tendermanagement/config/jwt/TokenProvider.java index c3c54d99..3068fefb 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/jwt/TokenProvider.java +++ b/src/main/java/net/gepafin/tendermanagement/config/jwt/TokenProvider.java @@ -48,6 +48,7 @@ public class TokenProvider { public static final String INVALID_USER = "invalid_user"; static final String AUTH_SECRET = "X-Api-Secret"; + private final Set invalidatedTokens = new HashSet<>(); @PostConstruct public void init() { @@ -113,6 +114,10 @@ public class TokenProvider { public boolean validateToken(String authToken) { try { + if (isTokenInvalid(authToken)) { + log.warn("Token is invalidated."); + return false; + } Jwts.parserBuilder() .setSigningKey(key) .build() @@ -124,6 +129,15 @@ public class TokenProvider { return false; } } + + public void invalidateToken(String token) { + invalidatedTokens.add(token); + log.info("Token invalidated: {}", token); + } + + public boolean isTokenInvalid(String token) { + return invalidatedTokens.contains(token); + } public Map getUserInfoAndUserIdFromToken(HttpServletRequest request) { Map userInfo = new HashMap<>(); String authSecretHeader=request.getHeader(AUTH_SECRET); @@ -196,4 +210,12 @@ public class TokenProvider { Claims claims = Jwts.parser().setSigningKey(key).parseClaimsJws(token).getBody(); return claims.getSubject(); } + public String extractTokenFromRequest(HttpServletRequest request) { + String bearerToken = request.getHeader("Authorization"); + if (bearerToken != null && bearerToken.startsWith("Bearer ")) { + return bearerToken.substring(7); // Remove "Bearer " prefix + } + return null; // Return null if token is not found or not in Bearer format + } + } diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 75b748fe..6fdebe76 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -42,5 +42,13 @@ public class GepafinConstant { public static final String EMAIL_ALREADY_EXISTS = "email.already.exists"; public static final String DOCUMENT_ID_NOT_FOUND="document.id.not.found"; + public static final String RESET_PASSWORD_INITIATED = "password.reset.initiated"; + public static final String PASSWORD_RESET_SUCCESS = "password.reset.success"; + public static final String INVALID_TOKEN_MSG = "invalid.token.msg"; + public static final String CURRENT_PASSWORD_INCORRECT = "current.password.incorrect"; + + public static final String LOGOUT_SUCCESSFUL_MSG = "logout.successful.msg"; + public static final String SUCCESS_PASSWORD_CHANGED = "success.password.changed"; + public static final String UPDATE_USER_STATUS_SUCCESS_MSG = "update.user.status.success"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java index 2ca30fe6..8a0197f6 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java @@ -1,13 +1,13 @@ package net.gepafin.tendermanagement.dao; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.RoleEntity; import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.enums.UserStatusEnum; -import net.gepafin.tendermanagement.model.request.LoginReq; -import net.gepafin.tendermanagement.model.request.UpdateUserReq; -import net.gepafin.tendermanagement.model.request.UserReq; +import net.gepafin.tendermanagement.model.request.*; import net.gepafin.tendermanagement.model.response.RoleResponseBean; import net.gepafin.tendermanagement.model.response.UserResponseBean; import net.gepafin.tendermanagement.model.util.JWTToken; @@ -23,6 +23,10 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Repository; +import java.security.SecureRandom; +import java.util.Base64; +import java.util.Optional; + import static net.gepafin.tendermanagement.util.ObjectUtils.setIfUpdated; @Repository @@ -149,4 +153,78 @@ public class UserDao { log.info("Login successful for email: {}", loginReq.getEmail()); return jwtToken; } + public String generateSecureToken() { + SecureRandom secureRandom = new SecureRandom(); + byte[] tokenBytes = new byte[24]; + secureRandom.nextBytes(tokenBytes); + String token = Base64.getUrlEncoder().withoutPadding().encodeToString(tokenBytes); + log.debug("Generated secure token: {}", token); + return token; + } + + public String initiatePasswordReset(InitiatePasswordResetReq resetReq) { + UserEntity user = userRepository.findByEmail(resetReq.getEmail()); + if (user == null) { + log.info("Password reset attempt for non-existent user: {}", resetReq.getEmail()); + throw new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG)); + } + String token = generateSecureToken(); + user.setResetPasswordToken(token); + userRepository.save(user); + log.info("Password reset token generated for user: {}", resetReq.getEmail()); + return token; + } + + public Boolean resetPassword(ResetPasswordReq resetPasswordReq) { + UserEntity user = userRepository.findByEmail(resetPasswordReq.getEmail()); + if (user == null) { + log.info("Password reset attempt for non-existent user: {}", resetPasswordReq.getEmail()); + throw new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG)); + } + String dbToken = user.getResetPasswordToken(); + + if (dbToken == null || !dbToken.equals(resetPasswordReq.getToken())) { + log.info("Invalid password reset token for user: {}", resetPasswordReq.getEmail()); + throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.INVALID_TOKEN_MSG)); + } + + user.setPassword(passwordEncoder.encode(resetPasswordReq.getNewPassword())); + user.setResetPasswordToken(null); + userRepository.save(user); + log.info("Password successfully reset for user: {}", resetPasswordReq.getEmail()); + return true; + } + + public Boolean changePassword(ChangePasswordRequest request) { + UserEntity user = userRepository.findByEmail(request.getEmail()); + if (user == null) { + log.info("Password reset attempt for non-existent user: {}", request.getEmail()); + throw new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG)); + } + if (!passwordEncoder.matches(request.getPassword(), user.getPassword())) { + throw new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.CURRENT_PASSWORD_INCORRECT)); + } + if (!request.getNewPassword().equals(request.getConfirmPassword())) { + log.info("User creation failed: Passwords do not match for email {}", user.getEmail()); + throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.PASSWORD_DOESNT_MATCH)); + } + user.setPassword(passwordEncoder.encode(request.getNewPassword())); + userRepository.save(user); + return true; + } + public void logout(HttpServletRequest request, HttpServletResponse response) { + authService.logout(request, response); + log.info("User successfully logged out."); + } + + public UserResponseBean updateUserStatus(Long userId, UserStatusEnum statusReq) { + log.info("Updating status for user with ID: {}", userId); + UserEntity userEntity = userRepository.findById(userId) + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG))); + userEntity.setStatus(statusReq.getValue()); + userEntity = userRepository.save(userEntity); + log.info("User status updated to {} for user ID: {}", statusReq, userId); + return convertUserEntityToUserResponse(userEntity); + } + } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/UserEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/UserEntity.java index aac82db9..5bd88f33 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/UserEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/UserEntity.java @@ -58,4 +58,6 @@ public class UserEntity extends BaseEntity { @Column(name = "COUNTRY", length = 50, nullable = true) private String country; + @Column(name = "RESET_PASSWORD_TOKEN", length = 255, nullable = true) + private String resetPasswordToken; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/ChangePasswordRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/ChangePasswordRequest.java new file mode 100644 index 00000000..a15f8cfc --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/ChangePasswordRequest.java @@ -0,0 +1,16 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; + +@Data +public class ChangePasswordRequest { + + + private String email; + + private String password; + + private String newPassword; + + private String confirmPassword; +} \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/InitiatePasswordResetReq.java b/src/main/java/net/gepafin/tendermanagement/model/request/InitiatePasswordResetReq.java new file mode 100644 index 00000000..ae2ba0d0 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/InitiatePasswordResetReq.java @@ -0,0 +1,8 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; + +@Data +public class InitiatePasswordResetReq { + private String email; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/LogoutReq.java b/src/main/java/net/gepafin/tendermanagement/model/request/LogoutReq.java new file mode 100644 index 00000000..00c07a25 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/LogoutReq.java @@ -0,0 +1,10 @@ +package net.gepafin.tendermanagement.model.request; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import lombok.Data; + +@Data +public class LogoutReq { + private String email; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/ResetPasswordReq.java b/src/main/java/net/gepafin/tendermanagement/model/request/ResetPasswordReq.java new file mode 100644 index 00000000..7a46596a --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/ResetPasswordReq.java @@ -0,0 +1,11 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; + +@Data +public class ResetPasswordReq { + private String email; + private String token; + private String newPassword; + +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/UserService.java b/src/main/java/net/gepafin/tendermanagement/service/UserService.java index 68912240..c609a5ac 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/UserService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/UserService.java @@ -1,8 +1,9 @@ package net.gepafin.tendermanagement.service; -import net.gepafin.tendermanagement.model.request.LoginReq; -import net.gepafin.tendermanagement.model.request.UpdateUserReq; -import net.gepafin.tendermanagement.model.request.UserReq; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import net.gepafin.tendermanagement.enums.UserStatusEnum; +import net.gepafin.tendermanagement.model.request.*; import net.gepafin.tendermanagement.model.response.UserResponseBean; import net.gepafin.tendermanagement.model.util.JWTToken; @@ -16,4 +17,15 @@ public interface UserService { void deleteUser(Long userId); JWTToken login(LoginReq loginReq); + + + String initiatePasswordReset(InitiatePasswordResetReq resetReq); + + Boolean resetPassword(ResetPasswordReq resetPasswordReq); + + Boolean changePassword(ChangePasswordRequest request); + + void logoutUser(HttpServletRequest request, HttpServletResponse response); + + UserResponseBean updateUserStatus(Long userId, UserStatusEnum statusReq); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java b/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java index 6ad8cf5f..ca480a88 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java @@ -1,11 +1,14 @@ package net.gepafin.tendermanagement.service.impl; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.config.jwt.TokenProvider; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.dao.RoleDao; import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.model.request.LoginReq; +import net.gepafin.tendermanagement.model.request.LogoutReq; import net.gepafin.tendermanagement.model.response.LoginResponse; import net.gepafin.tendermanagement.model.response.RoleResponseBean; import net.gepafin.tendermanagement.model.util.JWTToken; @@ -20,7 +23,9 @@ import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler; import org.springframework.stereotype.Service; + import java.time.LocalDateTime; @Service @@ -67,7 +72,7 @@ public class AuthenticationService { log.info("Login successful for email: {}", loginReq.getEmail()); return jwtToken; } - + private static LoginResponse getLoginResponse(UserEntity user, RoleResponseBean roleResponseBean) { LoginResponse loginResponse = new LoginResponse(); loginResponse.setId(user.getId()); @@ -86,5 +91,15 @@ public class AuthenticationService { loginResponse.setUpdatedDate(user.getUpdatedDate()); return loginResponse; } + public void logout(HttpServletRequest request, HttpServletResponse response) + { Authentication auth = SecurityContextHolder.getContext().getAuthentication(); + if (auth != null) { + String token = tokenProvider.extractTokenFromRequest(request); + tokenProvider.invalidateToken(token); + new SecurityContextLogoutHandler().logout(request, response, auth); + } + SecurityContextHolder.getContext().setAuthentication(null); + SecurityContextHolder.clearContext(); +} } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java index c6205aae..6499aa29 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java @@ -1,9 +1,10 @@ package net.gepafin.tendermanagement.service.impl; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import net.gepafin.tendermanagement.dao.UserDao; -import net.gepafin.tendermanagement.model.request.LoginReq; -import net.gepafin.tendermanagement.model.request.UpdateUserReq; -import net.gepafin.tendermanagement.model.request.UserReq; +import net.gepafin.tendermanagement.enums.UserStatusEnum; +import net.gepafin.tendermanagement.model.request.*; import net.gepafin.tendermanagement.model.response.LoginResponse; import net.gepafin.tendermanagement.model.response.UserResponseBean; import net.gepafin.tendermanagement.model.util.JWTToken; @@ -50,4 +51,27 @@ public class UserServiceImpl implements UserService { } + @Override + public String initiatePasswordReset(InitiatePasswordResetReq resetReq) { + return userDao.initiatePasswordReset(resetReq); + } + + @Override + public Boolean resetPassword(ResetPasswordReq resetPasswordReq) { + return userDao.resetPassword(resetPasswordReq); + } + @Override + public Boolean changePassword(ChangePasswordRequest request){ + return userDao.changePassword(request); + } + @Override + public void logoutUser(HttpServletRequest request, HttpServletResponse response) { + userDao.logout(request,response); + } + @Override + @Transactional(rollbackFor = Exception.class) + public UserResponseBean updateUserStatus(Long userId, UserStatusEnum statusReq) { + return userDao.updateUserStatus(userId, statusReq); + + } } \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java index 7c310b83..2959c13d 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java @@ -5,10 +5,12 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.ExampleObject; import io.swagger.v3.oas.annotations.responses.ApiResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.Valid; -import net.gepafin.tendermanagement.model.request.LoginReq; -import net.gepafin.tendermanagement.model.request.UpdateUserReq; -import net.gepafin.tendermanagement.model.request.UserReq; +import net.gepafin.tendermanagement.entities.UserEntity; +import net.gepafin.tendermanagement.enums.UserStatusEnum; +import net.gepafin.tendermanagement.model.request.*; import net.gepafin.tendermanagement.model.response.UserResponseBean; import net.gepafin.tendermanagement.model.util.JWTToken; import net.gepafin.tendermanagement.model.util.Response; @@ -17,10 +19,7 @@ import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.*; @Validated public interface UserApi { @@ -103,4 +102,76 @@ public interface UserApi { method = RequestMethod.POST) ResponseEntity> login( @Parameter(description = "Login request object", required = true) @Valid @RequestBody LoginReq loginReq); + @Operation(summary = "Api to initiate password reset", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE)})), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE)}))}) + @RequestMapping(value = "/reset-password/initiate", + produces = {"application/json"}, + method = RequestMethod.POST) + ResponseEntity> initiatePasswordReset( + @Parameter(description = "Initiate password reset request object", required = true) @Valid @RequestBody InitiatePasswordResetReq initiatePasswordResetReq); + + @Operation(summary = "Api to reset password", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE)})), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE)}))}) + @RequestMapping(value = "/reset-password", + produces = {"application/json"}, + method = RequestMethod.POST) + ResponseEntity> resetPassword( + @Parameter(description = "Reset password request object", required = true) @Valid @RequestBody ResetPasswordReq resetPasswordReq); + @Operation(summary = "Api to change user password", + responses = { + @ApiResponse(responseCode = "200", description = "Password Changed Successfully", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = "{ \"message\": \"Password changed successfully.\" }")})), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE)})), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE)}))}) + @RequestMapping(value = "/change-password", + produces = {"application/json"}, + method = RequestMethod.POST) + ResponseEntity> changePassword( + @Parameter(description = "Change password request object", required = true) @Valid @RequestBody ChangePasswordRequest changePasswordRequest); @Operation(summary = "Api to logout user", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE)})), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE)})), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE)}))}) + @RequestMapping(value = "/logout", + method = RequestMethod.POST) + ResponseEntity> logoutUser( + @Parameter(description = "The request object is not needed for logout", required = false) HttpServletRequest request, + @Parameter(description = "The response object is not needed for logout", required = false) HttpServletResponse response); + @Operation(summary = "API to update user active/deactive status", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE)})), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE)})), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE)})) + }) + @RequestMapping(value = "/{userId}/status", + produces = {"application/json"}, + method = RequestMethod.PUT) + default ResponseEntity> updateUserStatus( + @Parameter(description = "The user id", required = true) @PathVariable("userId") Long userId, + @Parameter(description = "status", required = true)@RequestParam(value = "status", required = true) UserStatusEnum status) { + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + } + + } + diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserApiController.java index f44c2e87..fb4801b7 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserApiController.java @@ -1,17 +1,19 @@ package net.gepafin.tendermanagement.web.rest.api.impl; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.Valid; import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.config.jwt.TokenProvider; import net.gepafin.tendermanagement.constants.GepafinConstant; -import net.gepafin.tendermanagement.model.request.LoginReq; -import net.gepafin.tendermanagement.model.request.UpdateUserReq; -import net.gepafin.tendermanagement.model.request.UserReq; +import net.gepafin.tendermanagement.entities.UserEntity; +import net.gepafin.tendermanagement.enums.UserStatusEnum; +import net.gepafin.tendermanagement.model.request.*; import net.gepafin.tendermanagement.model.response.UserResponseBean; import net.gepafin.tendermanagement.model.util.JWTToken; import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.service.UserService; import net.gepafin.tendermanagement.web.rest.api.UserApi; - import net.gepafin.tendermanagement.web.rest.api.errors.Status; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -27,7 +29,8 @@ import org.springframework.web.bind.annotation.*; public class UserApiController implements UserApi { private final Logger log = LoggerFactory.getLogger(UserApiController.class); - + @Autowired + private TokenProvider tokenProvider; @Autowired private UserService userService; @@ -74,4 +77,46 @@ public class UserApiController implements UserApi { JWTToken jwtToken = userService.login(loginReq); return ResponseEntity.ok(new Response<>(jwtToken, Status.SUCCESS, Translator.toLocale(GepafinConstant.LOGIN_SUCCESS_MSG))); } -} + @Override + public ResponseEntity> changePassword(@Valid @RequestBody ChangePasswordRequest request) { + log.info("Change Password attempt for email: {}", request.getEmail()); + userService.changePassword(request); + return ResponseEntity.ok(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.SUCCESS_PASSWORD_CHANGED))); + } + @Override + public ResponseEntity> initiatePasswordReset(InitiatePasswordResetReq request) { + log.info("Initiating password reset for email: {}", request.getEmail()); + String resetToken = userService.initiatePasswordReset(request); + log.info("Password reset token generated for email: {}", request.getEmail()); + return ResponseEntity.ok(new Response<>(resetToken, Status.SUCCESS, Translator.toLocale(GepafinConstant.RESET_PASSWORD_INITIATED))); + } + + @Override + public ResponseEntity> resetPassword(ResetPasswordReq request) { + log.info("Resetting password for username: {}", request.getEmail()); + Boolean success = userService.resetPassword(request); + if (success) { + log.info("Password reset successfully for username: {}", request.getEmail()); + } else { + log.error("Password reset failed for username: {}", request.getEmail()); + } + return ResponseEntity.ok(new Response<>(success, Status.SUCCESS, Translator.toLocale(GepafinConstant.PASSWORD_RESET_SUCCESS))); + } + + @Override + public ResponseEntity> logoutUser(HttpServletRequest request, HttpServletResponse response) { + userService.logoutUser(request, response); + + log.info("User has successfully logged"); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.LOGOUT_SUCCESSFUL_MSG))); + } + + @Override + public ResponseEntity> updateUserStatus(@PathVariable Long userId, @RequestParam UserStatusEnum status) { + log.info("Update User Status for- User ID: {}, Request Body: {}", userId, status); + UserResponseBean updatedUser = userService.updateUserStatus(userId, status); + return ResponseEntity.ok(new Response<>(updatedUser, Status.SUCCESS, Translator.toLocale(GepafinConstant.UPDATE_USER_STATUS_SUCCESS_MSG))); + } + +} \ No newline at end of file diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index ffd93d80..cce854f6 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -389,4 +389,12 @@ + + + + + + + + diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 1c9cc13b..34d711c7 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -54,6 +54,20 @@ invalid_signature=Invalid token. invalid_login=Invalid username or password. req_validation_er=Request Validation Error +# Password reset messages +password.reset.initiated=Password reset initiated. +password.reset.success=Password has been successfully reset. +#Change Password +invalid.token.msg=The token provided is invalid or expired. Please request a new token. +current.password.incorrect = Current password is incorrect. +success.password.changed=Password changed successfully. +#Logout +logout.successful.msg=Logout successful. You have been logged out successfully. +#Update user Active or Deactive status +update.user.status.success=User status has been successfully updated. + + + diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index 326c7329..33624af7 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -53,3 +53,13 @@ common_message=qualcosa é andato storto. Per favore riprova invalid_signature=Gettone non valido. invalid_login=Nome utente o password errati req_validation_er=Errore di convalida +# Password reset messages +password.reset.initiated=Reimpostazione della password avviata. +password.reset.success=La password è stata reimpostata con successo. +invalid.token.msg=Il token fornito è invalido o scaduto. Si prega di richiedere un nuovo token. +current.password.incorrect = La password attuale non è corretta. +success.password.changed=Password cambiata con successo. +logout.successful.msg=Logout riuscito. Sei stato disconnesso con successo. + +update.user.status.success=Lo stato dell'utente è stato aggiornato con successo. + From 83e7c898bdb60fc05efed01c1278dc26bdfad540 Mon Sep 17 00:00:00 2001 From: harish Date: Mon, 26 Aug 2024 12:45:20 +0530 Subject: [PATCH 2/6] Update code --- .../net/gepafin/tendermanagement/config/SecurityConfig.java | 4 ---- .../gepafin/tendermanagement/repositories/UserRepository.java | 1 + .../tendermanagement/service/impl/AuthenticationService.java | 4 ++-- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java index 90285d95..e06c3e4b 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java +++ b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java @@ -87,10 +87,6 @@ public class SecurityConfig { return new CorsFilter(source); } - @Bean - public CorsFilter corsFilter() { - return new CorsFilter(corsConfigurationSource); - } @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http, MvcRequestMatcher.Builder mvc) throws Exception { diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java index 6b6fcbe0..7720430c 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java @@ -8,4 +8,5 @@ import java.util.Optional; public interface UserRepository extends JpaRepository { Optional findByEmailIgnoreCase(String email); boolean existsByEmailIgnoreCase(String email); + UserEntity findByEmail(String email); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java b/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java index b3806deb..62ead6f2 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java @@ -59,8 +59,8 @@ public class AuthenticationService { UserEntity user = userRepository.findByEmailIgnoreCase(loginReq.getEmail()).orElseThrow(()-> new CustomValidationException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG))); if (Boolean.FALSE.equals(UserStatusEnum.ACTIVE.getValue().equals(user.getStatus()))) { - new CustomValidationException(Status.NOT_FOUND, - Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG)); + throw new CustomValidationException(Status.NOT_FOUND, + Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG)); } user.setLastLogin(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); userRepository.save(user); From 948e5ec31dc6046dc6ba424d70448f9c0e3354d5 Mon Sep 17 00:00:00 2001 From: harish Date: Mon, 26 Aug 2024 17:05:03 +0530 Subject: [PATCH 3/6] Created crud operation for evaluation criteria,faq,lookUp data and document --- .../constants/GepafinConstant.java | 19 +++ .../gepafin/tendermanagement/dao/CallDao.java | 16 ++- .../tendermanagement/dao/DocumentDao.java | 110 ++++++++++++++---- .../dao/EvaluationCriteriaDao.java | 75 ++++++++++++ .../gepafin/tendermanagement/dao/FaqDao.java | 96 +++++++++++++++ .../tendermanagement/dao/LookUpDataDao.java | 65 +++++++++++ .../model/request/EvaluationCriteriaReq.java | 2 + .../request/EvaluationCriteriaRequest.java | 17 +++ .../model/request/LookUpDataRequest.java | 12 ++ .../EvaluationCriteriaResponseBean.java | 9 +- .../model/response/FaqResponseBean.java | 8 +- .../model/response/LookUpDataResponse.java | 11 +- .../response/LookUpDataResponseBean.java | 15 +++ .../EvaluationCriteriaRepository.java | 2 +- .../repositories/FaqRepository.java | 6 +- .../service/DocumentService.java | 7 +- .../service/EvaluationCriteriaService.java | 16 +++ .../tendermanagement/service/FaqService.java | 15 +++ .../service/LookUpDataService.java | 15 +++ .../service/impl/DocumentServiceImpl.java | 29 +++-- .../impl/EvaluationCriteriaServiceImpl.java | 36 ++++++ .../service/impl/FaqServiceImpl.java | 44 +++++++ .../service/impl/LookUpDataServiceImpl.java | 35 ++++++ .../web/rest/api/DocumentApi.java | 37 +++++- .../web/rest/api/EvaluationCriteriaApi.java | 78 +++++++++++++ .../tendermanagement/web/rest/api/FaqApi.java | 57 +++++++++ .../web/rest/api/LookUpDataApi.java | 51 ++++++++ .../rest/api/impl/DocumentApiController.java | 29 +++-- .../impl/EvaluationCriteriaApiController.java | 66 +++++++++++ .../web/rest/api/impl/FaqApiController.java | 61 ++++++++++ .../api/impl/LookUpDataApiController.java | 62 ++++++++++ src/main/resources/message_en.properties | 24 +++- src/main/resources/message_it.properties | 27 +++++ 33 files changed, 1075 insertions(+), 77 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/dao/EvaluationCriteriaDao.java create mode 100644 src/main/java/net/gepafin/tendermanagement/dao/FaqDao.java create mode 100644 src/main/java/net/gepafin/tendermanagement/dao/LookUpDataDao.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/EvaluationCriteriaRequest.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/LookUpDataRequest.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/LookUpDataResponseBean.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/EvaluationCriteriaService.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/FaqService.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/LookUpDataService.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/impl/EvaluationCriteriaServiceImpl.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/impl/FaqServiceImpl.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/impl/LookUpDataServiceImpl.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/EvaluationCriteriaApi.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/FaqApi.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/LookUpDataApi.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/EvaluationCriteriaApiController.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/FaqApiController.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/LookUpDataApiController.java diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index ab9f75cc..c5b1a697 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -44,5 +44,24 @@ public class GepafinConstant { public static final String DOCUMENT_ID_NOT_FOUND="document.id.not.found"; public static final String INVALID_DATE_MSG = "call.invalid.date"; + public static final String EVALUATION_CRITERIA_NOT_FOUND = "evaluation.criteria.not.found"; + public static final String EVALUATION_CRITERIA_CREATED_SUCCESSFULLY = "evaluation.criteria.created.successfully"; + public static final String EVALUATION_CRITERIA_FETCH_SUCCESSFULLY = "evaluation.criteria.fetch.successfully"; + public static final String EVALUATION_CRITERIA_UPDATED_SUCCESSFULLY = "evaluation.criteria.updated.successfully"; + public static final String EVALUATION_CRITERIA_DELETED_SUCCESSFULLY = "evaluation.criteria.deleted.successfully"; + public static final String CALL_NOT_FOUND="call.not.found"; + public static final String SCORE_NOT_NULL_MSG="score.not.null"; + public static final String FAQ_NOT_FOUND = "faq.not.found"; + public static final String FAQ_CREATED_SUCCESSFULLY = "faq.created.successfully"; + public static final String FAQ_FETCHED_SUCCESSFULLY = "faq.fetched.successfully"; + public static final String FAQ_UPDATED_SUCCESSFULLY = "faq.updated.successfully"; + public static final String FAQ_DELETED_SUCCESSFULLY = "faq.deleted.successfully"; + public static final String LOOKUP_DATA_NOT_FOUND = "lookupdata.not.found"; + public static final String LOOKUP_DATA_CREATED_SUCCESSFULLY = "lookupdata.created.successfully"; + public static final String LOOKUP_DATA_FETCHED_SUCCESSFULLY = "lookupdata.fetched.successfully"; + public static final String LOOKUP_DATA_UPDATED_SUCCESSFULLY = "lookupdata.updated.successfully"; + public static final String LOOKUP_DATA_DELETED_SUCCESSFULLY = "lookupdata.deleted.successfully"; + public static final String DOCUMENT_UPDATED_SUCCESSFULLY = "document.updated.successfully"; + public static final String DOCUMENT_FETCHED_SUCCESSFULLY = "document.fetched.successfully"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index 0b99ceb6..e3984435 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -112,7 +112,7 @@ public class CallDao { return callEntity; } - public List convertToEvaluationCriteriaEntities(List criteriaReqList, CallEntity callEntity) { + public List convertListOfEvaluationCriteriaReqToEvaluationCriteriaEntities(List criteriaReqList, CallEntity callEntity) { List evaluationCriteriaEntities = criteriaReqList.stream().map(req -> convertToEvaluationCriteriaEntity(req, callEntity)).collect(Collectors.toList()); evaluationCriteriaRepository.saveAll(evaluationCriteriaEntities); return evaluationCriteriaEntities; @@ -120,7 +120,7 @@ public class CallDao { private EvaluationCriteriaEntity convertToEvaluationCriteriaEntity(EvaluationCriteriaReq criteriaReq, CallEntity callEntity) { EvaluationCriteriaEntity criteriaEntity = new EvaluationCriteriaEntity(); - validateEvolutionCrieteriaEntity(criteriaReq.getName()); + validateEvolutionCrieteriaEntity(criteriaReq.getName(),criteriaReq.getScore()); criteriaEntity.setName(criteriaReq.getName()); criteriaEntity.setDescription(criteriaReq.getValue()); criteriaEntity.setScore(criteriaReq.getScore()); @@ -156,7 +156,7 @@ public class CallDao { return faqEntities; } - private FaqEntity convertToFaqEntity(FaqReq faqReq, CallEntity callEntity, Long userId) { + public FaqEntity convertToFaqEntity(FaqReq faqReq, CallEntity callEntity, Long userId) { FaqEntity faqEntity = new FaqEntity(); validateFaqEntity(faqReq.getQuestion()); UserEntity userEntity= userRepository.findById(userId) @@ -193,10 +193,13 @@ public class CallDao { // } } - public void validateEvolutionCrieteriaEntity(String name) { + public void validateEvolutionCrieteriaEntity(String name,Integer score) { if (!StringUtils.hasText(name)) { throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.NAME_NOT_EMPTY_MSG)); } + if (score == null || score <= 0) { + throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.SCORE_NOT_NULL_MSG)); + } } public void validateCallEntity(CreateCallRequestStep1 createCallRequest) { @@ -366,6 +369,11 @@ public class CallDao { return createCallResponseBean; } + public List convertToEvaluationCriteriaEntities(List criteriaReqList, CallEntity callEntity) { + List evaluationCriteriaEntities = criteriaReqList.stream().map(req -> convertToEvaluationCriteriaEntity(req, callEntity)).collect(Collectors.toList()); + evaluationCriteriaRepository.saveAll(evaluationCriteriaEntities); + return evaluationCriteriaEntities; + } } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java b/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java index f9603b70..81910ae6 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java @@ -1,8 +1,7 @@ package net.gepafin.tendermanagement.dao; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import java.util.*; import java.util.stream.Collectors; import org.apache.commons.io.FilenameUtils; @@ -13,14 +12,20 @@ import org.springframework.web.multipart.MultipartFile; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.entities.CallEntity; import net.gepafin.tendermanagement.entities.DocumentEntity; import net.gepafin.tendermanagement.enums.DocumentTypeEnum; import net.gepafin.tendermanagement.model.response.DocumentResponseBean; +import net.gepafin.tendermanagement.repositories.CallRepository; import net.gepafin.tendermanagement.repositories.DocumentRepository; import net.gepafin.tendermanagement.service.AmazonS3Service; import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import org.springframework.beans.factory.annotation.Value; + +import java.util.ArrayList; +import java.util.List; @Component public class DocumentDao { @@ -34,21 +39,32 @@ public class DocumentDao { @Autowired private CallDao callDao; - public List uploadFiles(List files, DocumentTypeEnum fileType) { - List documentEntities = new ArrayList<>(); + @Value("${aws.s3.bucket.name}") + private String bucketName; + @Value("${aws.s3.url.folder}") + private String s3Folder; + + @Value("${aws.s3.url}") + private String s3Url; + + @Autowired + private CallRepository callRepository; + + public List uploadFiles(List files,Long callId, DocumentTypeEnum fileType) { + List documentEntities = new ArrayList<>(); + CallEntity callEntity=callRepository.findById(callId).orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.CALL_NOT_FOUND))); for (MultipartFile file : files) { try { - String extension = FilenameUtils.getExtension(file.getOriginalFilename()); - String fileName = StringUtils.cleanPath(file.getOriginalFilename()); - String firstNameContain = fileName.substring(0, fileName.lastIndexOf('.')); - fileName = (firstNameContain + "." + extension); - String filepath = amazonS3Service.upload(fileName,file); - DocumentEntity documentEntity = new DocumentEntity(); - documentEntity.setFileName(fileName); - documentEntity.setType(fileType.getValue()); - documentEntity.setFilePath(filepath); - documentEntities.add(documentEntity); + uploadFileOnAmazonS3 result = uploadFileOnAmazonS3(file); + if(result!=null) { + DocumentEntity documentEntity = new DocumentEntity(); + documentEntity.setFileName(result.fileName()); + documentEntity.setCall(callEntity); + documentEntity.setType(fileType.getValue()); + documentEntity.setFilePath(result.filepath()); + documentEntities.add(documentEntity); + } } catch (IOException e) {} } documentRepository.saveAll(documentEntities); @@ -57,14 +73,62 @@ public class DocumentDao { .collect(Collectors.toList()); } - public void deleteFile(Long documentId) { - DocumentEntity documentEntity = documentRepository.findById(documentId) - .orElseThrow(() -> new ResourceNotFoundException(Status.VALIDATION_ERROR, - Translator.toLocale(GepafinConstant.DOCUMENT_NOT_FOUND))); + private uploadFileOnAmazonS3 uploadFileOnAmazonS3(MultipartFile file) throws IOException { + String extension = FilenameUtils.getExtension(file.getOriginalFilename()); + String fileName = StringUtils.cleanPath(file.getOriginalFilename()); + String firstNameContain = fileName.substring(0, fileName.lastIndexOf('.')); + fileName = (firstNameContain + "." + extension); + String filepath = amazonS3Service.upload(fileName, file); + uploadFileOnAmazonS3 result = new uploadFileOnAmazonS3(fileName, filepath); + return result; + } - String fileName = Utils.extractFileName(documentEntity.getFilePath()); - amazonS3Service.delete(fileName); - documentRepository.delete(documentEntity); + private record uploadFileOnAmazonS3(String fileName, String filepath) { + } - } -} + public void deleteFile(Long documentId){ + DocumentEntity documentEntity = getDocumentEntity(documentId); + String fileName= Utils.extractFileName(documentEntity.getFilePath()); + deleteFileOnAmazonS3(fileName); + documentRepository.delete(documentEntity); + } + + private DocumentEntity deleteFileOnAmazonS3(String fileName) { + try { + amazonS3Service.delete(fileName); + }catch (Exception e){} + return null; + } + + private DocumentEntity getDocumentEntity(Long documentId) { + Optional documentEntity= documentRepository.findById(documentId); + if(documentEntity.isEmpty()){ + throw new ResourceNotFoundException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.DOCUMENT_NOT_FOUND)); + } + return documentEntity.orElse(null); + } + + public DocumentResponseBean updateDocument(Long documentId, MultipartFile file, DocumentTypeEnum documentTypeEnum){ + DocumentEntity documentEntity = getDocumentEntity(documentId); + String fileName= Utils.extractFileName(documentEntity.getFilePath()); + deleteFileOnAmazonS3(fileName); + uploadFileOnAmazonS3 result= null; + try { + result = uploadFileOnAmazonS3(file); + } catch (IOException e) {} + if(result!=null){ + documentEntity.setFilePath(result.filepath); + documentEntity.setFileName(result.fileName); + documentEntity.setType(documentTypeEnum.getValue()); + documentRepository.save(documentEntity); + } + return callDao.convertToDocumentResponseBean(documentEntity); + } + public DocumentResponseBean getDocument(Long documentId) { + Optional documentEntity= documentRepository.findById(documentId); + if(documentEntity.isEmpty()){ + new ResourceNotFoundException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.DOCUMENT_NOT_FOUND)); + } + return callDao.convertToDocumentResponseBean(documentEntity.orElse(null)); + } + } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/EvaluationCriteriaDao.java b/src/main/java/net/gepafin/tendermanagement/dao/EvaluationCriteriaDao.java new file mode 100644 index 00000000..c24b2db6 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/dao/EvaluationCriteriaDao.java @@ -0,0 +1,75 @@ +package net.gepafin.tendermanagement.dao; + +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.entities.CallEntity; +import net.gepafin.tendermanagement.entities.EvaluationCriteriaEntity; +import net.gepafin.tendermanagement.model.request.EvaluationCriteriaRequest; +import net.gepafin.tendermanagement.model.response.EvaluationCriteriaResponseBean; +import net.gepafin.tendermanagement.repositories.CallRepository; +import net.gepafin.tendermanagement.repositories.EvaluationCriteriaRepository; +import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.EmptyResultDataAccessException; +import org.springframework.stereotype.Component; + + +@Component +public class EvaluationCriteriaDao { + + @Autowired + private EvaluationCriteriaRepository repository; + + @Autowired + private CallRepository callRepository; + + public EvaluationCriteriaResponseBean createEvaluationCriteria(EvaluationCriteriaRequest evaluationCriteriaRequest) { + EvaluationCriteriaEntity entity = convertEvaluationCriteriaRequestToEvaluationCriteriaEntity(evaluationCriteriaRequest); + return convertEvaluationCriteriaEntityEvaluationCriteriaToResponseBean(entity); + } + + private EvaluationCriteriaEntity convertEvaluationCriteriaRequestToEvaluationCriteriaEntity(EvaluationCriteriaRequest evaluationCriteriaRequest) { + EvaluationCriteriaEntity entity = new EvaluationCriteriaEntity(); + CallEntity callEntity= callRepository.findById(evaluationCriteriaRequest.getCallId()) + .orElseThrow(() -> new ResourceNotFoundException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.CALL_NOT_FOUND))); + entity.setCall(callEntity); + entity.setName(evaluationCriteriaRequest.getName()); + entity.setDescription(evaluationCriteriaRequest.getDescription()); + entity.setScore(evaluationCriteriaRequest.getScore()); + entity = repository.save(entity); + return entity; + } + + public EvaluationCriteriaResponseBean getEvaluationCriteriaById(Long id) { + return repository.findById(id) + .map(this::convertEvaluationCriteriaEntityEvaluationCriteriaToResponseBean) + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.EVALUATION_CRITERIA_NOT_FOUND))); + } + + public EvaluationCriteriaResponseBean updateEvaluationCriteria(Long id, EvaluationCriteriaRequest request) { + EvaluationCriteriaEntity entity = repository.findById(id) + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.EVALUATION_CRITERIA_NOT_FOUND))); + entity = convertEvaluationCriteriaRequestToEvaluationCriteriaEntity(request); + return convertEvaluationCriteriaEntityEvaluationCriteriaToResponseBean(entity); + } + + public void deleteEvaluationCriteria(Long id) { + try { + repository.deleteById(id); + } catch (EmptyResultDataAccessException e) { + throw new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.EVALUATION_CRITERIA_NOT_FOUND)); + } + } + + private EvaluationCriteriaResponseBean convertEvaluationCriteriaEntityEvaluationCriteriaToResponseBean(EvaluationCriteriaEntity entity) { + EvaluationCriteriaResponseBean response = new EvaluationCriteriaResponseBean(); + response.setId(entity.getId()); + response.setName(entity.getName()); + response.setDescription(entity.getDescription()); + response.setScore(entity.getScore()); + response.setCreatedDate(entity.getCreatedDate()); + response.setUpdatedDate(entity.getUpdatedDate()); + return response; + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FaqDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FaqDao.java new file mode 100644 index 00000000..cbf06fc3 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/dao/FaqDao.java @@ -0,0 +1,96 @@ +package net.gepafin.tendermanagement.dao; +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.entities.CallEntity; +import net.gepafin.tendermanagement.entities.FaqEntity; +import net.gepafin.tendermanagement.entities.UserEntity; +import net.gepafin.tendermanagement.model.request.FaqReq; +import net.gepafin.tendermanagement.model.response.FaqResponseBean; +import net.gepafin.tendermanagement.repositories.CallRepository; +import net.gepafin.tendermanagement.repositories.FaqRepository; +import net.gepafin.tendermanagement.repositories.UserRepository; +import net.gepafin.tendermanagement.util.DateTimeUtil; +import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; + +@Component +public class FaqDao { + + @Autowired + private FaqRepository faqRepository; + + @Autowired + private UserRepository userRepository; + + @Autowired + private CallDao callDao; + + @Autowired + private CallRepository callRepository; + + public FaqResponseBean createFaq(FaqReq faqRequest,Long userId,Long callId) { + FaqEntity entity = new FaqEntity(); + CallEntity callEntity=callRepository.findById(callId).orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.CALL_NOT_FOUND))); + entity= callDao.convertToFaqEntity(faqRequest,callEntity,userId); + faqRepository.save(entity); + return convertFaqEntityToResponseBean(entity); + } + + public FaqResponseBean getFaqById(Long id) { + return faqRepository.findById(id) + .map(this::convertFaqEntityToResponseBean) + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.FAQ_NOT_FOUND))); + } + + public FaqResponseBean updateFaq(Long id, FaqReq faqRequest,Long userId) { + FaqEntity entity = faqRepository.findById(id) + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND,Translator.toLocale(GepafinConstant.FAQ_NOT_FOUND))); + updateFaqEntity(entity,faqRequest,userId,entity.getCall()); + faqRepository.save(entity); + return convertFaqEntityToResponseBean(entity); + } + + public void deleteFaq(Long id) { + FaqEntity entity = faqRepository.findById(id) + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND,Translator.toLocale(GepafinConstant.FAQ_NOT_FOUND))); + faqRepository.deleteById(entity.getId()); + + } + + private FaqResponseBean convertFaqEntityToResponseBean(FaqEntity entity) { + FaqResponseBean response = new FaqResponseBean(); + response.setId(entity.getId()); + response.setUserId(entity.getUser().getId()); + response.setIsVisible(entity.getIsVisible()); + response.setUpdatedDate(entity.getUpdatedDate()); + response.setCreatedDate(entity.getCreatedDate()); + response.setQuestionShort(entity.getQuestionShort()); + response.setQuestion(entity.getQuestion()); + response.setResponseShort(entity.getResponseShort()); + response.setResponse(entity.getResponse()); + response.setResponseDate(entity.getResponseDate()); + return response; + } + private void updateFaqEntity(FaqEntity faqEntity, FaqReq faqReq, Long userId,CallEntity callEntity) { + faqEntity.setQuestion(faqReq.getQuestion()); + UserEntity userEntity= userRepository.findById(userId) + .orElseThrow(() -> new ResourceNotFoundException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.LOOK_UP_DATA_NOT_VALID_MSG))); + faqEntity.setUser(userEntity); + faqEntity.setIsVisible(true); + if(faqReq.getIsVisible()!=null){ + faqEntity.setIsVisible(faqReq.getIsVisible()); + } + faqEntity.setQuestionShort(faqReq.getQuestionShort()); + faqEntity.setQuestion(faqReq.getQuestion()); + if(faqReq.getResponse()!=null ||faqReq.getResponseShort()!=null){ + faqEntity.setResponseDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); + } + faqEntity.setResponseShort(faqReq.getResponseShort()); + faqEntity.setResponse(faqReq.getResponse()); + faqEntity.setCall(callEntity); + } +} \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/dao/LookUpDataDao.java b/src/main/java/net/gepafin/tendermanagement/dao/LookUpDataDao.java new file mode 100644 index 00000000..6d9daf37 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/dao/LookUpDataDao.java @@ -0,0 +1,65 @@ +package net.gepafin.tendermanagement.dao; + +import net.gepafin.tendermanagement.entities.LookUpDataEntity; +import net.gepafin.tendermanagement.model.request.LookUpDataRequest; +import net.gepafin.tendermanagement.model.response.LookUpDataResponseBean; +import net.gepafin.tendermanagement.repositories.LookUpDataRepository; +import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class LookUpDataDao { + + @Autowired + private LookUpDataRepository lookUpDataRepository; + + public LookUpDataResponseBean createLookUpData(LookUpDataRequest lookUpDataReq) { + LookUpDataEntity entity = convertLookUpDataReqToLookUpDataEntity(lookUpDataReq); + return convertLookUpDataEntityToResponseBean(entity); + } + private LookUpDataEntity convertLookUpDataReqToLookUpDataEntity(LookUpDataRequest lookUpDataReq) { + LookUpDataEntity entity = new LookUpDataEntity(); + entity.setTitle(lookUpDataReq.getTitle()); + entity.setType(lookUpDataReq.getType().getValue()); + entity.setValue(lookUpDataReq.getValue()); + lookUpDataRepository.save(entity); + return entity; + } + + public LookUpDataResponseBean getLookUpDataById(Long id) { + return lookUpDataRepository.findById(id) + .map(this::convertLookUpDataEntityToResponseBean) + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.LOOKUP_DATA_NOT_FOUND))); + } + + public LookUpDataResponseBean updateLookUpData(Long id, LookUpDataRequest lookUpDataReq) { + LookUpDataEntity entity = lookUpDataRepository.findById(id) + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.LOOKUP_DATA_NOT_FOUND))); + entity.setTitle(lookUpDataReq.getTitle()); + entity.setType(lookUpDataReq.getType().getValue()); + entity.setValue(lookUpDataReq.getValue()); + lookUpDataRepository.save(entity); + return convertLookUpDataEntityToResponseBean(entity); + } + + public void deleteLookUpData(Long id) { + LookUpDataEntity entity = lookUpDataRepository.findById(id) + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.LOOKUP_DATA_NOT_FOUND))); + lookUpDataRepository.deleteById(entity.getId()); + } + + private LookUpDataResponseBean convertLookUpDataEntityToResponseBean(LookUpDataEntity entity) { + LookUpDataResponseBean response = new LookUpDataResponseBean(); + response.setId(entity.getId()); + response.setTitle(entity.getTitle()); + response.setType(LookUpDataEntity.LookUpDataTypeEnum.valueOf(entity.getType())); + response.setValue(entity.getValue()); + response.setCreatedDate(entity.getCreatedDate()); + response.setUpdatedDate(entity.getUpdatedDate()); + return response; + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/EvaluationCriteriaReq.java b/src/main/java/net/gepafin/tendermanagement/model/request/EvaluationCriteriaReq.java index a8b90e1c..76b0afa4 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/EvaluationCriteriaReq.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/EvaluationCriteriaReq.java @@ -1,7 +1,9 @@ package net.gepafin.tendermanagement.model.request; import lombok.Data; +import lombok.NoArgsConstructor; +@NoArgsConstructor @Data public class EvaluationCriteriaReq { diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/EvaluationCriteriaRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/EvaluationCriteriaRequest.java new file mode 100644 index 00000000..061cc6ae --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/EvaluationCriteriaRequest.java @@ -0,0 +1,17 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@Data +public class EvaluationCriteriaRequest { + + private Long callId; + + private String name; + + private String description; + + private Integer score; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/LookUpDataRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/LookUpDataRequest.java new file mode 100644 index 00000000..459e1416 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/LookUpDataRequest.java @@ -0,0 +1,12 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; +import net.gepafin.tendermanagement.entities.LookUpDataEntity.LookUpDataTypeEnum; + +@Data +public class LookUpDataRequest { + + private String title; + private LookUpDataTypeEnum type; + private String value; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/EvaluationCriteriaResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/EvaluationCriteriaResponseBean.java index 29cfed21..5eac6455 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/EvaluationCriteriaResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/EvaluationCriteriaResponseBean.java @@ -1,13 +1,11 @@ package net.gepafin.tendermanagement.model.response; import lombok.Data; +import net.gepafin.tendermanagement.model.BaseBean; -import java.time.LocalDateTime; @Data -public class EvaluationCriteriaResponseBean { - - private Long id; +public class EvaluationCriteriaResponseBean extends BaseBean { private String name; @@ -15,7 +13,4 @@ public class EvaluationCriteriaResponseBean { private Integer score; - private LocalDateTime createdDate; - - private LocalDateTime updatedDate; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/FaqResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/FaqResponseBean.java index fdc4be63..14ca345e 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/FaqResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/FaqResponseBean.java @@ -1,14 +1,13 @@ package net.gepafin.tendermanagement.model.response; import lombok.Data; +import net.gepafin.tendermanagement.model.BaseBean; import java.time.LocalDateTime; @Data -public class FaqResponseBean { - - private Long id; +public class FaqResponseBean extends BaseBean { private Long userId; @@ -24,7 +23,4 @@ public class FaqResponseBean { private LocalDateTime responseDate; - private LocalDateTime createdDate; - - private LocalDateTime updatedDate; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/LookUpDataResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/LookUpDataResponse.java index 27811e63..4fb3f5d9 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/LookUpDataResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/LookUpDataResponse.java @@ -1,13 +1,10 @@ package net.gepafin.tendermanagement.model.response; import lombok.Data; - -import java.time.LocalDateTime; +import net.gepafin.tendermanagement.model.BaseBean; @Data -public class LookUpDataResponse { - - private Long id; +public class LookUpDataResponse extends BaseBean { private Long lookUpDataId; @@ -15,8 +12,4 @@ public class LookUpDataResponse { private String value; - private LocalDateTime createdDate; - - private LocalDateTime updatedDate; - } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/LookUpDataResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/LookUpDataResponseBean.java new file mode 100644 index 00000000..554db7bd --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/LookUpDataResponseBean.java @@ -0,0 +1,15 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Data; +import net.gepafin.tendermanagement.entities.LookUpDataEntity.LookUpDataTypeEnum; +import net.gepafin.tendermanagement.model.BaseBean; + +@Data +public class LookUpDataResponseBean extends BaseBean { + + private String title; + + private String value; + + private LookUpDataTypeEnum type; +} diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/EvaluationCriteriaRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/EvaluationCriteriaRepository.java index 057566a6..2812e264 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/EvaluationCriteriaRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/EvaluationCriteriaRepository.java @@ -3,5 +3,5 @@ package net.gepafin.tendermanagement.repositories; import net.gepafin.tendermanagement.entities.EvaluationCriteriaEntity; import org.springframework.data.jpa.repository.JpaRepository; -public interface EvaluationCriteriaRepository extends JpaRepository { +public interface EvaluationCriteriaRepository extends JpaRepository { } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/FaqRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/FaqRepository.java index 7b4b7610..9e10f3d3 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/FaqRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/FaqRepository.java @@ -5,10 +5,8 @@ import net.gepafin.tendermanagement.entities.FaqEntity; import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface FaqRepository extends JpaRepository { +public interface FaqRepository extends JpaRepository { + List findByCallId(Long callId); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/DocumentService.java b/src/main/java/net/gepafin/tendermanagement/service/DocumentService.java index 4081af53..f55636df 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/DocumentService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/DocumentService.java @@ -1,5 +1,6 @@ package net.gepafin.tendermanagement.service; +import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.enums.DocumentTypeEnum; import net.gepafin.tendermanagement.model.response.DocumentResponseBean; import org.springframework.web.multipart.MultipartFile; @@ -8,7 +9,11 @@ import java.util.List; public interface DocumentService { - public List uploadFile(List files, DocumentTypeEnum fileType); + public List uploadFile(List files,Long callId, DocumentTypeEnum fileType); public void deleteFile(Long documentId); + + public DocumentResponseBean updateDocument(HttpServletRequest httpServletRequest, Long documentId, MultipartFile file, DocumentTypeEnum documentTypeEnum); + + public DocumentResponseBean getDocument(HttpServletRequest httpServletRequest,Long documentId); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/EvaluationCriteriaService.java b/src/main/java/net/gepafin/tendermanagement/service/EvaluationCriteriaService.java new file mode 100644 index 00000000..3c1e2b85 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/EvaluationCriteriaService.java @@ -0,0 +1,16 @@ +package net.gepafin.tendermanagement.service; + +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.model.request.EvaluationCriteriaRequest; +import net.gepafin.tendermanagement.model.response.EvaluationCriteriaResponseBean; + +public interface EvaluationCriteriaService { + + public EvaluationCriteriaResponseBean createEvaluationCriteria(HttpServletRequest request,EvaluationCriteriaRequest evaluationCriteriaRequest); + + public EvaluationCriteriaResponseBean getEvaluationCriteria(HttpServletRequest request,Long id); + + public EvaluationCriteriaResponseBean updateEvaluationCriteria(HttpServletRequest request,Long id, EvaluationCriteriaRequest evaluationCriteriaRequest); + + public void deleteEvaluationCriteria(HttpServletRequest request,Long id); +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/FaqService.java b/src/main/java/net/gepafin/tendermanagement/service/FaqService.java new file mode 100644 index 00000000..58ca8234 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/FaqService.java @@ -0,0 +1,15 @@ +package net.gepafin.tendermanagement.service; +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.model.request.FaqReq; +import net.gepafin.tendermanagement.model.response.FaqResponseBean; + +public interface FaqService { + + FaqResponseBean createFaq(HttpServletRequest request,Long callId, FaqReq faqRequest); + + FaqResponseBean getFaqById(HttpServletRequest request, Long id); + + FaqResponseBean updateFaq(HttpServletRequest request, Long id, FaqReq faqRequest); + + void deleteFaq(HttpServletRequest request, Long id); +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/LookUpDataService.java b/src/main/java/net/gepafin/tendermanagement/service/LookUpDataService.java new file mode 100644 index 00000000..0a69be9f --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/LookUpDataService.java @@ -0,0 +1,15 @@ +package net.gepafin.tendermanagement.service; + +import net.gepafin.tendermanagement.model.request.LookUpDataRequest; +import net.gepafin.tendermanagement.model.response.LookUpDataResponseBean; + +public interface LookUpDataService { + + LookUpDataResponseBean createLookUpData(LookUpDataRequest lookUpDataReq); + + LookUpDataResponseBean getLookUpDataById(Long id); + + LookUpDataResponseBean updateLookUpData(Long id, LookUpDataRequest lookUpDataReq); + + void deleteLookUpData(Long id); +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/DocumentServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/DocumentServiceImpl.java index 55c6165b..15e278bf 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/DocumentServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/DocumentServiceImpl.java @@ -2,28 +2,41 @@ package net.gepafin.tendermanagement.service.impl; import java.util.List; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.web.multipart.MultipartFile; - +import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.dao.DocumentDao; import net.gepafin.tendermanagement.enums.DocumentTypeEnum; import net.gepafin.tendermanagement.model.response.DocumentResponseBean; import net.gepafin.tendermanagement.service.DocumentService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + + @Service public class DocumentServiceImpl implements DocumentService { @Autowired - private DocumentDao fileDao; + private DocumentDao documentDao; @Override - public List uploadFile(List files, DocumentTypeEnum fileType) { - return fileDao.uploadFiles(files,fileType); + public List uploadFile(List files,Long callId,DocumentTypeEnum fileType) { + return documentDao.uploadFiles(files,callId,fileType); } @Override public void deleteFile(Long documentId){ - fileDao.deleteFile(documentId); + documentDao.deleteFile(documentId); + return ; + } + + @Override + public DocumentResponseBean updateDocument(HttpServletRequest httpServletRequest, Long documentId, MultipartFile file, DocumentTypeEnum documentTypeEnum) { + return documentDao.updateDocument(documentId,file,documentTypeEnum); + } + + @Override + public DocumentResponseBean getDocument(HttpServletRequest httpServletRequest, Long documentId) { + return documentDao.getDocument(documentId); } } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/EvaluationCriteriaServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/EvaluationCriteriaServiceImpl.java new file mode 100644 index 00000000..2aef9e5f --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/EvaluationCriteriaServiceImpl.java @@ -0,0 +1,36 @@ +package net.gepafin.tendermanagement.service.impl; + +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.dao.EvaluationCriteriaDao; +import net.gepafin.tendermanagement.model.request.EvaluationCriteriaRequest; +import net.gepafin.tendermanagement.model.response.EvaluationCriteriaResponseBean; +import net.gepafin.tendermanagement.service.EvaluationCriteriaService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class EvaluationCriteriaServiceImpl implements EvaluationCriteriaService { + + @Autowired + private EvaluationCriteriaDao evaluationCriteriaDao; + + @Override + public EvaluationCriteriaResponseBean createEvaluationCriteria(HttpServletRequest request,EvaluationCriteriaRequest evaluationCriteriaRequest) { + return evaluationCriteriaDao.createEvaluationCriteria(evaluationCriteriaRequest); + } + + @Override + public EvaluationCriteriaResponseBean getEvaluationCriteria(HttpServletRequest request,Long id) { + return evaluationCriteriaDao.getEvaluationCriteriaById(id); + } + + @Override + public EvaluationCriteriaResponseBean updateEvaluationCriteria(HttpServletRequest request,Long id, EvaluationCriteriaRequest evaluationCriteriaRequest) { + return evaluationCriteriaDao.updateEvaluationCriteria(id,evaluationCriteriaRequest); + } + + @Override + public void deleteEvaluationCriteria(HttpServletRequest request,Long id) { + evaluationCriteriaDao.deleteEvaluationCriteria(id); + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/FaqServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/FaqServiceImpl.java new file mode 100644 index 00000000..252935f2 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/FaqServiceImpl.java @@ -0,0 +1,44 @@ +package net.gepafin.tendermanagement.service.impl; +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.config.jwt.TokenProvider; +import net.gepafin.tendermanagement.dao.FaqDao; +import net.gepafin.tendermanagement.model.request.FaqReq; +import net.gepafin.tendermanagement.model.response.FaqResponseBean; +import net.gepafin.tendermanagement.service.FaqService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Map; + +@Service +public class FaqServiceImpl implements FaqService { + + @Autowired + private FaqDao faqDao; + + @Autowired + private TokenProvider tokenProvider; + + @Override + public FaqResponseBean createFaq(HttpServletRequest request,Long callId, FaqReq faqRequest) { + Map userInfo= tokenProvider.getUserInfoAndUserIdFromToken(request); + return faqDao.createFaq(faqRequest,Long.parseLong(userInfo.get("userId").toString()),callId); + } + + @Override + public FaqResponseBean getFaqById(HttpServletRequest request, Long id) { + return faqDao.getFaqById(id); + } + + @Override + public FaqResponseBean updateFaq(HttpServletRequest request, Long id, FaqReq faqRequest) { + Map userInfo= tokenProvider.getUserInfoAndUserIdFromToken(request); + return faqDao.updateFaq(id, faqRequest,Long.parseLong(userInfo.get("userId").toString())); + } + + @Override + public void deleteFaq(HttpServletRequest request, Long id) { + faqDao.deleteFaq(id); + } +} + diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/LookUpDataServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/LookUpDataServiceImpl.java new file mode 100644 index 00000000..86a2ae6e --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/LookUpDataServiceImpl.java @@ -0,0 +1,35 @@ +package net.gepafin.tendermanagement.service.impl; + +import net.gepafin.tendermanagement.dao.LookUpDataDao; +import net.gepafin.tendermanagement.model.request.LookUpDataRequest; +import net.gepafin.tendermanagement.model.response.LookUpDataResponseBean; +import net.gepafin.tendermanagement.service.LookUpDataService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class LookUpDataServiceImpl implements LookUpDataService { + + @Autowired + private LookUpDataDao lookUpDataDao; + + @Override + public LookUpDataResponseBean createLookUpData(LookUpDataRequest lookUpDataReq) { + return lookUpDataDao.createLookUpData(lookUpDataReq); + } + + @Override + public LookUpDataResponseBean getLookUpDataById(Long id) { + return lookUpDataDao.getLookUpDataById(id); + } + + @Override + public LookUpDataResponseBean updateLookUpData(Long id, LookUpDataRequest lookUpDataReq) { + return lookUpDataDao.updateLookUpData(id, lookUpDataReq); + } + + @Override + public void deleteLookUpData(Long id) { + lookUpDataDao.deleteLookUpData(id); + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/DocumentApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/DocumentApi.java index 4c3386c6..2ca052ad 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/DocumentApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/DocumentApi.java @@ -1,6 +1,7 @@ package net.gepafin.tendermanagement.web.rest.api; import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.ExampleObject; import io.swagger.v3.oas.annotations.responses.ApiResponse; @@ -27,14 +28,12 @@ public interface DocumentApi { @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { - @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) - }) - @PostMapping(value = "/uploadFile", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) - default ResponseEntity>> uploadFile(HttpServletRequest httpServletRequest, - @RequestParam("file") List files, - @RequestParam("documentType") DocumentTypeEnum documentTypeEnum) { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) }))}) + @PostMapping(value = "/uploadFile/call/{callId}", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + default ResponseEntity>> uploadFile(HttpServletRequest httpServletRequest, @Parameter(description = "call id", required = true) @PathVariable Long callId, @RequestParam("file") List files, @RequestParam("documentType") DocumentTypeEnum documentTypeEnum) { return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); } + @Operation(summary = "API to delete a file by document id", responses = { @ApiResponse(responseCode = "200", description = "File deleted successfully"), @@ -50,4 +49,30 @@ public interface DocumentApi { @RequestParam( "id") Long id) { return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); } + @Operation(summary = "Api to update document", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) }))}) + @PostMapping(value = "/{documentId}", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + default ResponseEntity> updateDocument(HttpServletRequest httpServletRequest, @Parameter(description = "document id", required = true) @PathVariable Long documentId, @RequestParam("file") MultipartFile file, @RequestParam("documentType") DocumentTypeEnum documentTypeEnum) { + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + } + @Operation(summary = "API to get document by id", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })) + }) + @GetMapping(value = "/{id}", produces = MediaType.APPLICATION_JSON_VALUE) + ResponseEntity> getDocumentById(HttpServletRequest request, + @Parameter(description = "document id", required = true) + @PathVariable Long id); + } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/EvaluationCriteriaApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/EvaluationCriteriaApi.java new file mode 100644 index 00000000..1b791f2e --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/EvaluationCriteriaApi.java @@ -0,0 +1,78 @@ +package net.gepafin.tendermanagement.web.rest.api; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.ExampleObject; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.validation.Valid; +import net.gepafin.tendermanagement.model.request.EvaluationCriteriaRequest; +import net.gepafin.tendermanagement.model.response.EvaluationCriteriaResponseBean; +import net.gepafin.tendermanagement.model.util.Response; +import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +public interface EvaluationCriteriaApi { + + + @Operation(summary = "API to create evaluation criteria", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) + }) + @PostMapping(value = "/criteria", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) + ResponseEntity> createEvaluationCriteria(HttpServletRequest request, + @Parameter(description = "Evaluation criteria request object", required = true) + @Valid @RequestBody EvaluationCriteriaRequest createCallRequest); + + @Operation(summary = "API to get evaluation criteria by id", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })) + }) + @GetMapping(value = "/{id}", produces = MediaType.APPLICATION_JSON_VALUE) + ResponseEntity> getEvaluationCriteriaById(HttpServletRequest request, + @Parameter(description = "evaluation criteria id", required = true) + @PathVariable Long id); + + @Operation(summary = "API to update evaluation criteria", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) + }) + @PutMapping(value = "/{id}", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) + ResponseEntity> updateEvaluationCriteria(HttpServletRequest request, + @Parameter(description = "evaluation criteria id", required = true) + @PathVariable Long id, + @Parameter(description = "Evaluation criteria request object", required = true) + @Valid @RequestBody EvaluationCriteriaRequest evaluationCriteriaRequest); + + @Operation(summary = "API to delete evaluation criteria", + responses = { + @ApiResponse(responseCode = "204", description = "No Content"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })) + }) + @DeleteMapping(value = "/{id}", produces = MediaType.APPLICATION_JSON_VALUE) + ResponseEntity deleteEvaluationCriteria(HttpServletRequest request, + @Parameter(description = "evaluation criteria id", required = true) + @PathVariable Long id); +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/FaqApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/FaqApi.java new file mode 100644 index 00000000..2d76f286 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/FaqApi.java @@ -0,0 +1,57 @@ +package net.gepafin.tendermanagement.web.rest.api; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.ExampleObject; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import net.gepafin.tendermanagement.model.request.FaqReq; +import net.gepafin.tendermanagement.model.response.FaqResponseBean; +import net.gepafin.tendermanagement.model.util.Response; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import jakarta.servlet.http.HttpServletRequest; +import javax.validation.Valid; + +public interface FaqApi { + + @Operation(summary = "API to create FAQ", + responses = { + @ApiResponse(responseCode = "201", description = "Created"), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = "application/json", examples = @ExampleObject(value = "{ \"error\": \"Bad Request\" }"))), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = "application/json", examples = @ExampleObject(value = "{ \"error\": \"Unauthorized\" }"))), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = "application/json", examples = @ExampleObject(value = "{ \"error\": \"Not Found\" }"))) + }) + @PostMapping(value = "/call/{callId}", consumes = "application/json", produces = "application/json") + ResponseEntity> createFaq(HttpServletRequest request, @Parameter(description = "evaluation criteria id", required = true) + @PathVariable Long id, @Valid @RequestBody FaqReq faqRequest); + + @Operation(summary = "API to get FAQ by id", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = "application/json", examples = @ExampleObject(value = "{ \"error\": \"Not Found\" }"))) + }) + @GetMapping(value = "/{id}", produces = "application/json") + ResponseEntity> getFaqById(HttpServletRequest request, + @PathVariable Long id); + + @Operation(summary = "API to update FAQ", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = "application/json", examples = @ExampleObject(value = "{ \"error\": \"Not Found\" }"))), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = "application/json", examples = @ExampleObject(value = "{ \"error\": \"Bad Request\" }"))) + }) + @PutMapping(value = "/{id}", consumes = "application/json", produces = "application/json") + ResponseEntity> updateFaq(HttpServletRequest request, + @PathVariable Long id, + @Valid @RequestBody FaqReq faqRequest); + + @Operation(summary = "API to delete FAQ", + responses = { + @ApiResponse(responseCode = "204", description = "No Content"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = "application/json", examples = @ExampleObject(value = "{ \"error\": \"Not Found\" }"))) + }) + @DeleteMapping(value = "/{id}") + ResponseEntity> deleteFaq(HttpServletRequest request, + @PathVariable Long id); +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/LookUpDataApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/LookUpDataApi.java new file mode 100644 index 00000000..7ad01422 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/LookUpDataApi.java @@ -0,0 +1,51 @@ +package net.gepafin.tendermanagement.web.rest.api; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.ExampleObject; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import net.gepafin.tendermanagement.model.request.LookUpDataRequest; +import net.gepafin.tendermanagement.model.response.LookUpDataResponseBean; +import net.gepafin.tendermanagement.model.util.Response; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import jakarta.servlet.http.HttpServletRequest; +import javax.validation.Valid; + +public interface LookUpDataApi { + + @Operation(summary = "API to create LookUp Data", + responses = { + @ApiResponse(responseCode = "201", description = "Created"), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = "application/json", examples = @ExampleObject(value = "{ \"error\": \"Bad Request\" }"))), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = "application/json", examples = @ExampleObject(value = "{ \"error\": \"Not Found\" }"))) + }) + @PostMapping(value = "/lookupdata", consumes = "application/json", produces = "application/json") + ResponseEntity> createLookUpData(HttpServletRequest request, @Valid @RequestBody LookUpDataRequest lookUpDataReq); + + @Operation(summary = "API to get LookUp Data by id", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = "application/json", examples = @ExampleObject(value = "{ \"error\": \"Not Found\" }"))) + }) + @GetMapping(value = "/lookupdata/{id}", produces = "application/json") + ResponseEntity> getLookUpDataById(HttpServletRequest request, @PathVariable Long id); + + @Operation(summary = "API to update LookUp Data", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = "application/json", examples = @ExampleObject(value = "{ \"error\": \"Bad Request\" }"))), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = "application/json", examples = @ExampleObject(value = "{ \"error\": \"Not Found\" }"))) + }) + @PutMapping(value = "/lookupdata/{id}", consumes = "application/json", produces = "application/json") + ResponseEntity> updateLookUpData(HttpServletRequest request, @PathVariable Long id, @Valid @RequestBody LookUpDataRequest lookUpDataReq); + + @Operation(summary = "API to delete LookUp Data", + responses = { + @ApiResponse(responseCode = "204", description = "No Content"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = "application/json", examples = @ExampleObject(value = "{ \"error\": \"Not Found\" }"))) + }) + @DeleteMapping(value = "/lookupdata/{id}") + ResponseEntity> deleteLookUpData(HttpServletRequest request, @PathVariable Long id); +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/DocumentApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/DocumentApiController.java index d4a151b0..5f986716 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/DocumentApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/DocumentApiController.java @@ -20,16 +20,17 @@ import java.util.List; @RestController @RequestMapping("${openapi.swaggerBflowsMiddleware.base-path:/v1/document}") -public class DocumentApiController implements DocumentApi { +public class +DocumentApiController implements DocumentApi { @Autowired - private DocumentService fileService; + private DocumentService documentService; @Override - public ResponseEntity>> uploadFile(HttpServletRequest httpServletRequest, - List files, DocumentTypeEnum fileType) { + public ResponseEntity>> uploadFile(HttpServletRequest httpServletRequest, Long callId, + List files, DocumentTypeEnum fileType) { try { - List responseBeans=fileService.uploadFile(files,fileType); + List responseBeans = documentService.uploadFile(files, callId, fileType); return ResponseEntity.status(HttpStatus.CREATED) .body(new Response>(responseBeans, Status.SUCCESS, Translator.toLocale(GepafinConstant.FILES_UPLOADED_MSG))); } catch (CustomValidationException ex) { @@ -38,8 +39,22 @@ public class DocumentApiController implements DocumentApi { } @Override public ResponseEntity> deleteFile(HttpServletRequest httpServletRequest, Long documentId) { - fileService.deleteFile(documentId); + documentService.deleteFile(documentId); return ResponseEntity.status(HttpStatus.CREATED) .body(new Response(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.FILE_DELETED_SUCCESSFULLY_MSG))); - } + } + + @Override + public ResponseEntity> updateDocument(HttpServletRequest httpServletRequest, Long documentId, MultipartFile file, DocumentTypeEnum documentTypeEnum) { + DocumentResponseBean responseBeans = documentService.updateDocument(httpServletRequest, documentId, file, documentTypeEnum); + return ResponseEntity.status(HttpStatus.CREATED) + .body(new Response(responseBeans, Status.SUCCESS, Translator.toLocale(GepafinConstant.DOCUMENT_UPDATED_SUCCESSFULLY))); + } + + @Override + public ResponseEntity> getDocumentById(HttpServletRequest request, Long id) { + DocumentResponseBean documentResponseBean= documentService.getDocument(request,id); + return ResponseEntity.status(HttpStatus.CREATED) + .body(new Response(documentResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.DOCUMENT_FETCHED_SUCCESSFULLY))); } +} \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/EvaluationCriteriaApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/EvaluationCriteriaApiController.java new file mode 100644 index 00000000..7ee581e2 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/EvaluationCriteriaApiController.java @@ -0,0 +1,66 @@ +package net.gepafin.tendermanagement.web.rest.api.impl; + +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.model.request.EvaluationCriteriaRequest; +import net.gepafin.tendermanagement.model.response.EvaluationCriteriaResponseBean; +import net.gepafin.tendermanagement.model.util.Response; +import net.gepafin.tendermanagement.service.EvaluationCriteriaService; +import net.gepafin.tendermanagement.web.rest.api.EvaluationCriteriaApi; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; + +import jakarta.servlet.http.HttpServletRequest; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("${openapi.gepafin.base-path:/v1/evaluation}") +public class EvaluationCriteriaApiController implements EvaluationCriteriaApi { + + @Autowired + private EvaluationCriteriaService service; + + @Override + public ResponseEntity> createEvaluationCriteria(HttpServletRequest request, EvaluationCriteriaRequest evaluationCriteriaRequest) { + EvaluationCriteriaResponseBean responseBean = service.createEvaluationCriteria(request,evaluationCriteriaRequest); + return ResponseEntity.status(HttpStatus.CREATED) + .body(new Response<>(responseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.EVALUATION_CRITERIA_CREATED_SUCCESSFULLY))); + } + + @Override + public ResponseEntity> getEvaluationCriteriaById(HttpServletRequest request, Long id) { + EvaluationCriteriaResponseBean responseBean = service.getEvaluationCriteria(request,id); + if (responseBean != null) { + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(responseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.EVALUATION_CRITERIA_FETCH_SUCCESSFULLY))); + } else { + return ResponseEntity.status(HttpStatus.NOT_FOUND) + .body(new Response<>(null, Status.NOT_FOUND, Translator.toLocale(GepafinConstant.EVALUATION_CRITERIA_NOT_FOUND))); + } + } + + @Override + @Transactional(rollbackFor=Exception.class) + public ResponseEntity> updateEvaluationCriteria(HttpServletRequest request, Long id, EvaluationCriteriaRequest evaluationCriteriaRequest) { + EvaluationCriteriaResponseBean responseBean = service.updateEvaluationCriteria(request,id, evaluationCriteriaRequest); + if (responseBean != null) { + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(responseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.EVALUATION_CRITERIA_UPDATED_SUCCESSFULLY))); + } else { + return ResponseEntity.status(HttpStatus.NOT_FOUND) + .body(new Response<>(null, Status.NOT_FOUND, Translator.toLocale(GepafinConstant.EVALUATION_CRITERIA_NOT_FOUND))); + } + } + + @Override + public ResponseEntity deleteEvaluationCriteria(HttpServletRequest request, Long id) { + service.deleteEvaluationCriteria(request,id); + return ResponseEntity.status(HttpStatus.OK) + .header("Message", Translator.toLocale(GepafinConstant.EVALUATION_CRITERIA_DELETED_SUCCESSFULLY)) + .build(); + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/FaqApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/FaqApiController.java new file mode 100644 index 00000000..142e5614 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/FaqApiController.java @@ -0,0 +1,61 @@ +package net.gepafin.tendermanagement.web.rest.api.impl; +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.model.request.FaqReq; +import net.gepafin.tendermanagement.model.response.FaqResponseBean; +import net.gepafin.tendermanagement.model.util.Response; +import net.gepafin.tendermanagement.service.FaqService; +import net.gepafin.tendermanagement.web.rest.api.FaqApi; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("${openapi.gepafin.base-path:/v1/faq}") +public class FaqApiController implements FaqApi { + + @Autowired + private FaqService faqService; + + @Override + public ResponseEntity> createFaq(HttpServletRequest request, Long callId,FaqReq faqRequest) { + FaqResponseBean response = faqService.createFaq(request,callId, faqRequest); + return ResponseEntity.status(HttpStatus.CREATED) + .body(new Response<>(response, Status.SUCCESS, Translator.toLocale(GepafinConstant.FAQ_CREATED_SUCCESSFULLY))); + } + + @Override + public ResponseEntity> getFaqById(HttpServletRequest request, Long id) { + FaqResponseBean response = faqService.getFaqById(request, id); + if (response != null) { + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(response, Status.SUCCESS, Translator.toLocale(GepafinConstant.FAQ_FETCHED_SUCCESSFULLY))); + } else { + return ResponseEntity.status(HttpStatus.NOT_FOUND) + .body(new Response<>(null, Status.NOT_FOUND, Translator.toLocale(GepafinConstant.FAQ_NOT_FOUND))); + } + } + + @Override + public ResponseEntity> updateFaq(HttpServletRequest request, Long id, FaqReq faqRequest) { + FaqResponseBean response = faqService.updateFaq(request, id, faqRequest); + if (response != null) { + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(response, Status.SUCCESS, Translator.toLocale(GepafinConstant.FAQ_UPDATED_SUCCESSFULLY))); + } else { + return ResponseEntity.status(HttpStatus.NOT_FOUND) + .body(new Response<>(null, Status.NOT_FOUND, Translator.toLocale(GepafinConstant.FAQ_NOT_FOUND))); + } + } + + @Override + public ResponseEntity> deleteFaq(HttpServletRequest request, Long id) { + faqService.deleteFaq(request, id); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.FAQ_DELETED_SUCCESSFULLY))); + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/LookUpDataApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/LookUpDataApiController.java new file mode 100644 index 00000000..79fae0de --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/LookUpDataApiController.java @@ -0,0 +1,62 @@ +package net.gepafin.tendermanagement.web.rest.api.impl; + +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.model.request.LookUpDataRequest; +import net.gepafin.tendermanagement.model.response.LookUpDataResponseBean; +import net.gepafin.tendermanagement.model.util.Response; +import net.gepafin.tendermanagement.service.LookUpDataService; +import net.gepafin.tendermanagement.web.rest.api.LookUpDataApi; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("${openapi.gepafin.base-path:/v1/lookupdata}") +public class LookUpDataApiController implements LookUpDataApi { + + @Autowired + private LookUpDataService lookUpDataService; + + @Override + public ResponseEntity> createLookUpData(HttpServletRequest request, LookUpDataRequest lookUpDataReq) { + LookUpDataResponseBean responseBean = lookUpDataService.createLookUpData(lookUpDataReq); + return ResponseEntity.status(HttpStatus.CREATED) + .body(new Response(responseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.LOOKUP_DATA_CREATED_SUCCESSFULLY))); + } + + @Override + public ResponseEntity> getLookUpDataById(HttpServletRequest request, Long id) { + LookUpDataResponseBean responseBean = lookUpDataService.getLookUpDataById(id); + if (responseBean != null) { + return ResponseEntity.status(HttpStatus.OK) + .body(new Response(responseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.LOOKUP_DATA_FETCHED_SUCCESSFULLY))); + } else { + return ResponseEntity.status(HttpStatus.NOT_FOUND) + .body(new Response(responseBean, Status.NOT_FOUND, Translator.toLocale(GepafinConstant.LOOKUP_DATA_NOT_FOUND))); + } + } + + @Override + public ResponseEntity> updateLookUpData(HttpServletRequest request, Long id, LookUpDataRequest lookUpDataReq) { + LookUpDataResponseBean responseBean = lookUpDataService.updateLookUpData(id, lookUpDataReq); + if (responseBean != null) { + return ResponseEntity.status(HttpStatus.OK) + .body(new Response(responseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.LOOKUP_DATA_UPDATED_SUCCESSFULLY))); + } else { + return ResponseEntity.status(HttpStatus.NOT_FOUND) + .body(new Response(responseBean, Status.NOT_FOUND, Translator.toLocale(GepafinConstant.LOOKUP_DATA_NOT_FOUND))); + } + } + + @Override + public ResponseEntity> deleteLookUpData(HttpServletRequest request, Long id) { + lookUpDataService.deleteLookUpData(id); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.LOOKUP_DATA_DELETED_SUCCESSFULLY))); + } +} diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 15aa6498..918cd38a 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -45,6 +45,8 @@ document.not.found=Document not found. document.id.not.found=Document ID not found. call.created.successfully=Call created successfully. call.invalid.date=Invalid start or end date. +call.not.found=Call not dound. +score.not.null=Score cannot be null or cannot be zero. # Login-related messages login.successfully=Login successfully. @@ -57,7 +59,27 @@ invalid_signature=Invalid token. invalid_login=Invalid username or password. req_validation_er=Request Validation Error +#EvaluationCriteria-related messages +evaluation.criteria.not.found=EvaluationCriteria not found. +evaluation.criteria.created.successfully=EvaluationCriteria created successfully. +evaluation.criteria.fetch.successfully=EvaluationCriteria fetched successfully. +evaluation.criteria.updated.successfully=EvaluationCriteria updated successfully. +evaluation.criteria.deleted.successfully=EvaluationCriteria deleted successfully. +#Faq-related messages +faq.not.found=Faq not found. +faq.created.successfully=Faq created successfully. +faq.fetched.successfully=Faq fetched successfully. +faq.updated.successfully=Faq updated successfully. +faq.deleted.successfully=Faq deleted successfully. +#LookUpData-related message +lookupdata.not.found=LookUpData not found. +lookupdata.created.successfully=LookUpData created successfully. +lookupdata.fetched.successfully=LookUpData fetched successfully. +lookupdata.updated.successfully=LookUpData updated successfully. +lookupdata.deleted.successfully=LookUpData deleted successfully. - +#Document-related message +document.updated.successfully=Document updated successfully. +document.fetched.successfully=Document fetched successfully. \ No newline at end of file diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index ae93ff53..39cdf933 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -44,6 +44,8 @@ file.deleted.successfully=File eliminato con successo. document.not.found=Documento non trovato. document.id.not.found=ID documento non trovato. call.invalid.date=Data di inizio o fine non valida. +call.not.found=Chiamata non trovata. +score.not.null=Il punteggio non pu� essere nullo o zero. # Login-related messages login.successfully=Accesso effettuato con successo. @@ -55,3 +57,28 @@ common_message=qualcosa é andato storto. Per favore riprova invalid_signature=Gettone non valido. invalid_login=Nome utente o password errati req_validation_er=Errore di convalida + +#EvaluationCriteria-related messages +evaluation.criteria.not.found=EvaluationCriteria non trovato. +evaluation.criteria.created.successfully=EvaluationCriteria creato con successo. +evaluation.criteria.fetch.successfully=Recupero EvaluationCriteria riuscito. +evaluation.criteria.updated.successfully=EvaluationCriteria aggiornato con successo. +evaluation.criteria.deleted.successfully=EvaluationCriteria eliminato con successo. + +#faq-related messages +faq.not.found=Faq non trovata. +faq.created.successfully=Faq creata con successo. +faq.fetched.successfully=Faq recuperata con successo. +faq.updated.successfully=Faq aggiornata con successo. +faq.deleted.successfully=Faq eliminata con successo. + +#LookUpData-related message +lookupdata.not.found=LookUpData non trovato. +lookupdata.created.successfully=LookUpData creato correttamente. +lookupdata.fetched.successfully=LookUpData recuperato correttamente. +lookupdata.updated.successfully=LookUpData aggiornato correttamente. +lookupdata.deleted.successfully=LookUpData eliminato correttamente. + +#Document-related message +document.updated.successfully=Documento aggiornato con successo. +document.fetched.successfully=Documento recuperato con successo. \ No newline at end of file From 737c4b17b171cbf36cb7c81e05e5feca47580f4e Mon Sep 17 00:00:00 2001 From: harish Date: Mon, 26 Aug 2024 17:16:40 +0530 Subject: [PATCH 4/6] Updated code --- .../web/rest/api/EvaluationCriteriaApi.java | 6 +++--- .../tendermanagement/web/rest/api/LookUpDataApi.java | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/EvaluationCriteriaApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/EvaluationCriteriaApi.java index 1b791f2e..41bfbc92 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/EvaluationCriteriaApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/EvaluationCriteriaApi.java @@ -41,7 +41,7 @@ public interface EvaluationCriteriaApi { @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })) }) - @GetMapping(value = "/{id}", produces = MediaType.APPLICATION_JSON_VALUE) + @GetMapping(value = "/criteria/{id}", produces = MediaType.APPLICATION_JSON_VALUE) ResponseEntity> getEvaluationCriteriaById(HttpServletRequest request, @Parameter(description = "evaluation criteria id", required = true) @PathVariable Long id); @@ -56,7 +56,7 @@ public interface EvaluationCriteriaApi { @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) - @PutMapping(value = "/{id}", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) + @PutMapping(value = "/criteria/{id}", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) ResponseEntity> updateEvaluationCriteria(HttpServletRequest request, @Parameter(description = "evaluation criteria id", required = true) @PathVariable Long id, @@ -71,7 +71,7 @@ public interface EvaluationCriteriaApi { @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })) }) - @DeleteMapping(value = "/{id}", produces = MediaType.APPLICATION_JSON_VALUE) + @DeleteMapping(value = "/criteria/{id}", produces = MediaType.APPLICATION_JSON_VALUE) ResponseEntity deleteEvaluationCriteria(HttpServletRequest request, @Parameter(description = "evaluation criteria id", required = true) @PathVariable Long id); diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/LookUpDataApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/LookUpDataApi.java index 7ad01422..bf3afe19 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/LookUpDataApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/LookUpDataApi.java @@ -21,7 +21,7 @@ public interface LookUpDataApi { @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = "application/json", examples = @ExampleObject(value = "{ \"error\": \"Bad Request\" }"))), @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = "application/json", examples = @ExampleObject(value = "{ \"error\": \"Not Found\" }"))) }) - @PostMapping(value = "/lookupdata", consumes = "application/json", produces = "application/json") + @PostMapping(value = "", consumes = "application/json", produces = "application/json") ResponseEntity> createLookUpData(HttpServletRequest request, @Valid @RequestBody LookUpDataRequest lookUpDataReq); @Operation(summary = "API to get LookUp Data by id", @@ -29,7 +29,7 @@ public interface LookUpDataApi { @ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = "application/json", examples = @ExampleObject(value = "{ \"error\": \"Not Found\" }"))) }) - @GetMapping(value = "/lookupdata/{id}", produces = "application/json") + @GetMapping(value = "/{id}", produces = "application/json") ResponseEntity> getLookUpDataById(HttpServletRequest request, @PathVariable Long id); @Operation(summary = "API to update LookUp Data", @@ -38,7 +38,7 @@ public interface LookUpDataApi { @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = "application/json", examples = @ExampleObject(value = "{ \"error\": \"Bad Request\" }"))), @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = "application/json", examples = @ExampleObject(value = "{ \"error\": \"Not Found\" }"))) }) - @PutMapping(value = "/lookupdata/{id}", consumes = "application/json", produces = "application/json") + @PutMapping(value = "/{id}", consumes = "application/json", produces = "application/json") ResponseEntity> updateLookUpData(HttpServletRequest request, @PathVariable Long id, @Valid @RequestBody LookUpDataRequest lookUpDataReq); @Operation(summary = "API to delete LookUp Data", @@ -46,6 +46,6 @@ public interface LookUpDataApi { @ApiResponse(responseCode = "204", description = "No Content"), @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = "application/json", examples = @ExampleObject(value = "{ \"error\": \"Not Found\" }"))) }) - @DeleteMapping(value = "/lookupdata/{id}") + @DeleteMapping(value = "/{id}") ResponseEntity> deleteLookUpData(HttpServletRequest request, @PathVariable Long id); } From 7804b7e103b4285122016e637f40d5410d65899d Mon Sep 17 00:00:00 2001 From: harish Date: Mon, 26 Aug 2024 17:26:47 +0530 Subject: [PATCH 5/6] Updated code --- .../net/gepafin/tendermanagement/web/rest/api/DocumentApi.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/DocumentApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/DocumentApi.java index 2ca052ad..a9354dbf 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/DocumentApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/DocumentApi.java @@ -58,7 +58,7 @@ public interface DocumentApi { @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) }))}) - @PostMapping(value = "/{documentId}", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + @PutMapping(value = "/{id}", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) default ResponseEntity> updateDocument(HttpServletRequest httpServletRequest, @Parameter(description = "document id", required = true) @PathVariable Long documentId, @RequestParam("file") MultipartFile file, @RequestParam("documentType") DocumentTypeEnum documentTypeEnum) { return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); } From 38d806dc39094761853726278a73d77236c29c9c Mon Sep 17 00:00:00 2001 From: harish Date: Tue, 27 Aug 2024 12:40:49 +0530 Subject: [PATCH 6/6] Update code --- src/main/java/net/gepafin/tendermanagement/dao/UserDao.java | 4 ++++ .../tendermanagement/model/request/ResetPasswordReq.java | 2 ++ .../net/gepafin/tendermanagement/web/rest/api/UserApi.java | 5 +++-- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java index ecaf9a48..3ee707c2 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java @@ -181,6 +181,10 @@ public class UserDao { log.info("Password reset attempt for non-existent user: {}", resetPasswordReq.getEmail()); throw new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG)); } + if (!resetPasswordReq.getNewPassword().equals(resetPasswordReq.getConfirmPassword())) { + log.info("User creation failed: Passwords do not match for email {}", user.getEmail()); + throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.PASSWORD_DOESNT_MATCH)); + } String dbToken = user.getResetPasswordToken(); if (dbToken == null || !dbToken.equals(resetPasswordReq.getToken())) { diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/ResetPasswordReq.java b/src/main/java/net/gepafin/tendermanagement/model/request/ResetPasswordReq.java index 7a46596a..019ca582 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/ResetPasswordReq.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/ResetPasswordReq.java @@ -7,5 +7,7 @@ public class ResetPasswordReq { private String email; private String token; private String newPassword; + private String confirmPassword; + } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java index 2dda7d21..c60cef58 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java @@ -104,7 +104,7 @@ public interface UserApi { method = RequestMethod.POST) ResponseEntity> login( @Parameter(description = "Login request object", required = true) @Valid @RequestBody LoginReq loginReq); - @Operation(summary = "Api to initiate password reset", + @Operation(summary = "Api to initiate password reset request", responses = { @ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @@ -155,7 +155,7 @@ public interface UserApi { ResponseEntity> logoutUser( @Parameter(description = "The request object is not needed for logout", required = false) HttpServletRequest request, @Parameter(description = "The response object is not needed for logout", required = false) HttpServletResponse response); - @Operation(summary = "API to update user active/deactive status", + @Operation(summary = "Api to update user active/deactive status", responses = { @ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @@ -168,6 +168,7 @@ public interface UserApi { @RequestMapping(value = "/{userId}/status", produces = {"application/json"}, method = RequestMethod.PUT) + @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')") default ResponseEntity> updateUserStatus( @Parameter(description = "The user id", required = true) @PathVariable("userId") Long userId, @Parameter(description = "status", required = true)@RequestParam(value = "status", required = true) UserStatusEnum status) {