From 34646a605687403a7f75208663469be2bf585ab5 Mon Sep 17 00:00:00 2001 From: rajesh Date: Thu, 22 Aug 2024 18:46:39 +0530 Subject: [PATCH 1/4] updated code --- .../config/SecurityConfig.java | 29 +++++++++---------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java index 53b7baef..1ffed20b 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java +++ b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java @@ -39,13 +39,10 @@ import net.gepafin.tendermanagement.config.jwt.TokenProvider; public class SecurityConfig { private final TokenProvider tokenProvider; - - private final CorsFilter corsFilter; @Autowired - public SecurityConfig(TokenProvider tokenProvider, CorsFilter corsFilter) { + public SecurityConfig(TokenProvider tokenProvider) { this.tokenProvider = tokenProvider; - this.corsFilter = corsFilter; } @Bean @@ -73,17 +70,17 @@ public class SecurityConfig { } -// @Bean -// public CorsConfigurationSource corsConfigurationSource() { -// UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); -// CorsConfiguration config = new CorsConfiguration(); -// config.setAllowCredentials(true); -// config.addAllowedOrigin("http://localhost:3000"); // Change this to your frontend URL -// config.addAllowedHeader("*"); -// config.addAllowedMethod("*"); -// source.registerCorsConfiguration("/**", config); -// return source; -// } + @Bean + public CorsFilter corsFilter() { + UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); + CorsConfiguration config = new CorsConfiguration(); + config.setAllowCredentials(true); + config.addAllowedOrigin("http://localhost:3000"); + config.addAllowedMethod("*"); + config.addAllowedHeader("*"); + source.registerCorsConfiguration("/**", config); + return new CorsFilter(source); + } @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http, MvcRequestMatcher.Builder mvc) throws Exception { @@ -99,7 +96,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(); From 28045c1de0ccd5b766a08a91259675f58a1c1bae Mon Sep 17 00:00:00 2001 From: rajesh Date: Thu, 22 Aug 2024 19:00:34 +0530 Subject: [PATCH 2/4] updated code --- .../config/SecurityConfig.java | 31 ++++++++++++++++--- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java index 1ffed20b..f000c416 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java +++ b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java @@ -1,5 +1,7 @@ package net.gepafin.tendermanagement.config; +import java.util.ArrayList; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -70,15 +72,34 @@ public class SecurityConfig { } +// @Bean +// public CorsFilter corsFilter() { +// UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); +// CorsConfiguration config = new CorsConfiguration(); +// config.setAllowCredentials(true); +// config.addAllowedOrigin("http://localhost:3000"); +// config.addAllowedMethod("*"); +// config.addAllowedHeader("*"); +// source.registerCorsConfiguration("/**", config); +// return new CorsFilter(source); +// } + @Bean public CorsFilter corsFilter() { + UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); + CorsConfiguration config = new CorsConfiguration(); - config.setAllowCredentials(true); - config.addAllowedOrigin("http://localhost:3000"); - config.addAllowedMethod("*"); - config.addAllowedHeader("*"); - source.registerCorsConfiguration("/**", config); + config.addAllowedOrigin("*"); + config.addAllowedMethod("*"); + config.addAllowedHeader("*"); + config.setMaxAge(3600l); + + if (config.getAllowedOrigins() != null && !config.getAllowedOrigins().isEmpty()) { + source.registerCorsConfiguration("/v1/**", config); + source.registerCorsConfiguration("/management/**", config); + source.registerCorsConfiguration("/v1/api-docs", config); + } return new CorsFilter(source); } From b6692e206d1d92a8e7f9ef1b6395aa014f82b98a Mon Sep 17 00:00:00 2001 From: rajesh Date: Fri, 23 Aug 2024 11:50:58 +0530 Subject: [PATCH 3/4] updated code for PreAuthorize role --- .../config/SecurityConfig.java | 17 ------- .../constants/GepafinConstant.java | 1 + .../gepafin/tendermanagement/dao/CallDao.java | 1 + .../gepafin/tendermanagement/dao/RoleDao.java | 3 ++ .../gepafin/tendermanagement/dao/UserDao.java | 12 ++--- .../tendermanagement/entities/RoleEntity.java | 6 ++- .../model/request/RoleReq.java | 4 +- .../model/request/UpdateUserReq.java | 2 - .../model/request/UserReq.java | 2 - .../model/response/RoleResponseBean.java | 1 + .../repositories/UserRepository.java | 4 +- .../service/impl/AuthenticationService.java | 45 ++++++++++--------- .../web/rest/api/CallApi.java | 2 +- .../web/rest/api/UserApi.java | 2 + .../api/impl/CustomUserDetailsService.java | 20 ++++----- .../db/changelog/db.changelog-1.0.0.xml | 15 +++++-- src/main/resources/message_en.properties | 1 + src/main/resources/message_it.properties | 1 + 18 files changed, 71 insertions(+), 68 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java index f000c416..fa2b2020 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java +++ b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java @@ -1,7 +1,5 @@ package net.gepafin.tendermanagement.config; -import java.util.ArrayList; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -17,12 +15,10 @@ import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.web.SecurityFilterChain; -import org.springframework.security.web.access.intercept.AuthorizationFilter; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; import org.springframework.security.web.servlet.util.matcher.MvcRequestMatcher; import org.springframework.security.web.util.matcher.AntPathRequestMatcher; import org.springframework.web.cors.CorsConfiguration; -import org.springframework.web.cors.CorsConfigurationSource; import org.springframework.web.cors.UrlBasedCorsConfigurationSource; import org.springframework.web.filter.CorsFilter; import org.springframework.web.servlet.handler.HandlerMappingIntrospector; @@ -71,18 +67,6 @@ public class SecurityConfig { .requestMatchers(new AntPathRequestMatcher("/swagger-ui/**")); } - -// @Bean -// public CorsFilter corsFilter() { -// UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); -// CorsConfiguration config = new CorsConfiguration(); -// config.setAllowCredentials(true); -// config.addAllowedOrigin("http://localhost:3000"); -// config.addAllowedMethod("*"); -// config.addAllowedHeader("*"); -// source.registerCorsConfiguration("/**", config); -// return new CorsFilter(source); -// } @Bean public CorsFilter corsFilter() { @@ -109,7 +93,6 @@ public class SecurityConfig { .csrf(AbstractHttpConfigurer::disable) .authorizeHttpRequests(auth -> auth .requestMatchers(mvc.pattern(HttpMethod.POST, "/v1/user/login")).permitAll() - .requestMatchers(mvc.pattern(HttpMethod.POST, "/v1/user")).permitAll() .requestMatchers("/swagger-ui/**").permitAll() .requestMatchers("/v1/api-docs/**").permitAll() .anyRequest().authenticated() diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 75b748fe..c3de4e48 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -10,6 +10,7 @@ public class GepafinConstant { public static final String UPDATE_USER_ERROR_MSG = "update_user_error_msg"; public static final String DELETE_USER_ERROR_MSG = "delete_user_error_msg"; public static final String GET_USER_SUCCESS_MSG = "get_user_success_msg"; + public static final String USER_NOT_ACTIVE_MSG = "user.not.active"; public static final String ROLE_CREATED_SUCCESS_MSG = "role.created.success"; public static final String ROLE_UPDATED_SUCCESS_MSG = "role.updated.success"; diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index b4987c81..179b3f4e 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -19,6 +19,7 @@ import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationExceptio 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.security.access.prepost.PreAuthorize; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import net.gepafin.tendermanagement.entities.LookUpDataEntity.LookUpDataTypeEnum; diff --git a/src/main/java/net/gepafin/tendermanagement/dao/RoleDao.java b/src/main/java/net/gepafin/tendermanagement/dao/RoleDao.java index e7f4c5f9..d0c6342c 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/RoleDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/RoleDao.java @@ -45,6 +45,7 @@ public class RoleDao { private RoleEntity convertRoleRequestToRoleEntity(RoleReq roleReq) { RoleEntity roleEntity = new RoleEntity(); roleEntity.setRoleName(roleReq.getRoleName()); + roleEntity.setRoleType(roleReq.getRoleType()); roleEntity.setPermissions(roleReq.getPermissions()); roleEntity.setDescription(roleReq.getDescription()); roleEntity.setRegion(regionService.getRegionById(roleReq.getRegionId())); @@ -57,6 +58,7 @@ public class RoleDao { roleResponseBean.setCreatedDate(roleEntity.getCreatedDate()); roleResponseBean.setUpdatedDate(roleEntity.getUpdatedDate()); roleResponseBean.setRoleName(roleEntity.getRoleName()); + roleResponseBean.setRoleType(roleEntity.getRoleType()); roleResponseBean.setDescription(roleEntity.getDescription()); roleResponseBean.setPermissions(roleEntity.getPermissions()); RegionResponseBean regionResponseBean = regionDao.convertRegionEntityToRegionResponse(roleEntity.getRegion()); @@ -73,6 +75,7 @@ public class RoleDao { log.info("New role details: {}", roleReq); setIfUpdated(existingRole::getRoleName, existingRole::setRoleName, roleReq.getRoleName()); + setIfUpdated(existingRole::getRoleType, existingRole::setRoleType, roleReq.getRoleType()); setIfUpdated(existingRole::getDescription, existingRole::setDescription, roleReq.getDescription()); setIfUpdated(existingRole::getPermissions, existingRole::setPermissions, roleReq.getPermissions()); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java index 2ca30fe6..dc06326f 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java @@ -47,7 +47,7 @@ public class UserDao { public UserResponseBean createUser(UserReq userReq) { log.info("Creating user with email: {}", userReq.getEmail()); - if (userRepository.existsByEmail(userReq.getEmail())) { + if (userRepository.existsByEmailIgnoreCase(userReq.getEmail())) { log.error("User creation failed: Email {} already exists", userReq.getEmail()); throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.EMAIL_ALREADY_EXISTS)); } @@ -94,7 +94,7 @@ public class UserDao { userEntity.setPassword(passwordEncoder.encode(userReq.getPassword())); userEntity.setEmail(userReq.getEmail()); userEntity.setFirstName(userReq.getFirstName()); - userEntity.setStatus(userReq.getStatus().getValue()); + userEntity.setStatus(UserStatusEnum.PENDING_VERIFICATION.getValue()); userEntity.setLastName(userReq.getLastName()); userEntity.setOrganization(userReq.getOrganization()); userEntity.setAddress(userReq.getAddress()); @@ -127,10 +127,10 @@ public class UserDao { log.info("Fetching user with ID: {}", id); UserEntity userEntity = userRepository.findById(id) .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG))); - if (!UserStatusEnum.ACTIVE.getValue().equals(userEntity.getStatus())) { - log.info("User with ID: {} is not active", id); - throw new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG)); - } +// if (!UserStatusEnum.ACTIVE.getValue().equals(userEntity.getStatus())) { +// log.info("User with ID: {} is not active", id); +// throw new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG)); +// } log.info("User found: {}", userEntity); return convertUserEntityToUserResponse(userEntity); } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/RoleEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/RoleEntity.java index ff741702..c94b36b9 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/RoleEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/RoleEntity.java @@ -11,7 +11,7 @@ import lombok.Setter; @Setter public class RoleEntity extends BaseEntity { - @Column(name = "ROLE_NAME", length = 50, nullable = true) + @Column(name = "ROLE_NAME", length = 255, nullable = true) private String roleName; @Column(name = "DESCRIPTION", length = 255, nullable = true) @@ -19,8 +19,12 @@ public class RoleEntity extends BaseEntity { @Column(name = "PERMISSIONS", length = 255, nullable = true) private String permissions; + @ManyToOne @JoinColumn(name = "REGION_ID", nullable = true) private RegionEntity region; + + @Column(name = "ROLE_TYPE", length = 255, nullable = true) + private String roleType; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/RoleReq.java b/src/main/java/net/gepafin/tendermanagement/model/request/RoleReq.java index f1fd7d70..50cf17ce 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/RoleReq.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/RoleReq.java @@ -1,8 +1,6 @@ package net.gepafin.tendermanagement.model.request; import com.fasterxml.jackson.annotation.JsonProperty; -import jakarta.validation.constraints.NotEmpty; -import jakarta.validation.constraints.NotNull; import lombok.Getter; import lombok.Setter; @@ -21,5 +19,7 @@ public class RoleReq { private String permissions; private Long regionId; + + private String roleType; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/UpdateUserReq.java b/src/main/java/net/gepafin/tendermanagement/model/request/UpdateUserReq.java index f4a8a107..65eba841 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/UpdateUserReq.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/UpdateUserReq.java @@ -1,7 +1,5 @@ package net.gepafin.tendermanagement.model.request; -import jakarta.validation.constraints.NotEmpty; -import jakarta.validation.constraints.NotNull; import lombok.Getter; import lombok.Setter; import net.gepafin.tendermanagement.enums.UserStatusEnum; diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/UserReq.java b/src/main/java/net/gepafin/tendermanagement/model/request/UserReq.java index 07761068..54841e9b 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/UserReq.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/UserReq.java @@ -36,6 +36,4 @@ public class UserReq { private String country; - private UserStatusEnum status; - } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/RoleResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/RoleResponseBean.java index d5d579e5..da097f48 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/RoleResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/RoleResponseBean.java @@ -14,4 +14,5 @@ public class RoleResponseBean extends BaseBean { private String description; private String permissions; private RegionResponseBean region; + private String roleType; } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java index dc0aad37..6b6fcbe0 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java @@ -6,6 +6,6 @@ import org.springframework.data.jpa.repository.JpaRepository; import java.util.Optional; public interface UserRepository extends JpaRepository { - UserEntity findByEmail(String email); - boolean existsByEmail(String email); + Optional findByEmailIgnoreCase(String email); + boolean existsByEmailIgnoreCase(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 6ad8cf5f..6955edf4 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java @@ -5,6 +5,7 @@ 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.enums.UserStatusEnum; import net.gepafin.tendermanagement.model.request.LoginReq; import net.gepafin.tendermanagement.model.response.LoginResponse; import net.gepafin.tendermanagement.model.response.RoleResponseBean; @@ -43,30 +44,32 @@ public class AuthenticationService { this.authenticationManager = authenticationManager; } - public JWTToken login(LoginReq loginReq) { - log.info("Attempting login for email: {}", loginReq.getEmail()); - UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(loginReq.getEmail(), loginReq.getPassword()); - Authentication authentication = this.authenticationManager.authenticate(authenticationToken); - SecurityContextHolder.getContext().setAuthentication(authentication); - log.info("Authentication successful for email: {}", loginReq.getEmail()); - UserEntity user = userRepository.findByEmail(loginReq.getEmail()); - if (user == null) { - log.error("User not found for email: {}", loginReq.getEmail()); - throw new CustomValidationException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG)); - } - user.setLastLogin(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); - userRepository.save(user); - String token = tokenProvider.createToken(authentication, loginReq.getRememberMe(), user); - log.info("JWT token generated for email: {}", loginReq.getEmail()); - RoleResponseBean roleResponseBean = roleDao.convertRoleEntityToRoleResponse(user.getRoleEntity()); + public JWTToken login(LoginReq loginReq) { + log.info("Attempting login for email: {}", loginReq.getEmail()); + UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken( + loginReq.getEmail(), loginReq.getPassword()); + Authentication authentication = this.authenticationManager.authenticate(authenticationToken); + SecurityContextHolder.getContext().setAuthentication(authentication); + log.info("Authentication successful for email: {}", loginReq.getEmail()); + 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)); + } + user.setLastLogin(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); + userRepository.save(user); + String token = tokenProvider.createToken(authentication, loginReq.getRememberMe(), user); + log.info("JWT token generated for email: {}", loginReq.getEmail()); + RoleResponseBean roleResponseBean = roleDao.convertRoleEntityToRoleResponse(user.getRoleEntity()); - LoginResponse loginResponse = getLoginResponse(user, roleResponseBean); + LoginResponse loginResponse = getLoginResponse(user, roleResponseBean); - JWTToken jwtToken = new JWTToken(token, loginResponse); + JWTToken jwtToken = new JWTToken(token, loginResponse); - log.info("Login successful for email: {}", loginReq.getEmail()); - return jwtToken; - } + log.info("Login successful for email: {}", loginReq.getEmail()); + return jwtToken; + } private static LoginResponse getLoginResponse(UserEntity user, RoleResponseBean roleResponseBean) { LoginResponse loginResponse = new LoginResponse(); diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java index b2b335de..637ad6f8 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java @@ -31,7 +31,7 @@ public interface CallApi { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) @PostMapping(value = "", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) - @PreAuthorize("hasRole('SUPER_ADMIN')") + @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')") public ResponseEntity> createCall(HttpServletRequest request, @Parameter(description = "Call request object", required = true) @Valid @RequestBody CreateCallRequest createCallRequest); 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..cca0b247 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 @@ -16,6 +16,7 @@ import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; @@ -37,6 +38,7 @@ public interface UserApi { @RequestMapping(value = "", produces = {"application/json"}, method = RequestMethod.POST) + @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')") default ResponseEntity> createUser( @Parameter(description = "User request object", required = true) @Validated @RequestBody UserReq userReq) { return new ResponseEntity>(HttpStatus.NOT_IMPLEMENTED); diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CustomUserDetailsService.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CustomUserDetailsService.java index 102a388c..7345d13e 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CustomUserDetailsService.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CustomUserDetailsService.java @@ -1,9 +1,13 @@ package net.gepafin.tendermanagement.web.rest.api.impl; +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.repositories.RoleRepository; import net.gepafin.tendermanagement.repositories.UserRepository; +import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.security.core.GrantedAuthority; @@ -22,11 +26,9 @@ public class CustomUserDetailsService implements UserDetailsService { private final Logger log = LoggerFactory.getLogger(CustomUserDetailsService.class); private final UserRepository userRepository; - private final RoleRepository roleRepository; - public CustomUserDetailsService(UserRepository userRepository, RoleRepository roleRepository) { + public CustomUserDetailsService(UserRepository userRepository) { this.userRepository = userRepository; - this.roleRepository = roleRepository; } @Override @@ -34,17 +36,15 @@ public class CustomUserDetailsService implements UserDetailsService { public UserDetails loadUserByUsername(final String email) throws UsernameNotFoundException { log.debug("Authenticating {}", email); - UserEntity user = userRepository.findByEmail(email); - if (user == null) { - throw new UsernameNotFoundException("User " + email + " was not found in the database"); - } - + UserEntity user = userRepository.findByEmailIgnoreCase(email) + .orElseThrow( + () -> new UsernameNotFoundException("User " + email + " was not found in the database")); return createSpringSecurityUser(user); } private org.springframework.security.core.userdetails.User createSpringSecurityUser(UserEntity user) { RoleEntity role = user.getRoleEntity(); - GrantedAuthority grantedAuthority = new SimpleGrantedAuthority(role.getRoleName()); + GrantedAuthority grantedAuthority = new SimpleGrantedAuthority(role.getRoleType()); return new org.springframework.security.core.userdetails.User( user.getEmail(), 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..d090e106 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 @@ -66,6 +66,9 @@ + + + @@ -314,7 +317,8 @@ - + + @@ -324,7 +328,8 @@ - + + @@ -334,7 +339,8 @@ - + + @@ -344,7 +350,8 @@ - + + diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 1c9cc13b..c35db8ac 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -7,6 +7,7 @@ update_user_error_msg=An error occurred while updating the user. delete_user_error_msg=An error occurred while deleting the user. get_user_success_msg=User retrieved successfully. get_user_error_msg=An error occurred while retrieving the user. +user.not.active=User is not active. Please contact support. # Role-related messages role.created.success=Role created successfully. role.updated.success=Role updated successfully. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index 326c7329..085c1ce4 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -7,6 +7,7 @@ update_user_error_msg=Si � verificato un errore durante l'aggiornamento dell'u delete_user_error_msg=Si � verificato un errore durante l'eliminazione dell'utente. get_user_success_msg=Utente recuperato con successo. get_user_error_msg=Si � verificato un errore durante il recupero dell'utente. +user.not.active=Utente non attivo. Si prega di contattare il supporto. # Role-related messages role.created.success=Ruolo creato con successo. role.updated.success=Ruolo aggiornato con successo. From 1b9ddc30faef439029b5010ada7ee27f6879f26e Mon Sep 17 00:00:00 2001 From: rajesh Date: Mon, 26 Aug 2024 11:44:52 +0530 Subject: [PATCH 4/4] created call api in 2 steps --- .../constants/GepafinConstant.java | 1 + .../gepafin/tendermanagement/dao/CallDao.java | 134 ++++++++++++------ .../tendermanagement/dao/DocumentDao.java | 54 +++---- .../tendermanagement/entities/CallEntity.java | 4 +- ...quest.java => CreateCallRequestStep1.java} | 28 ++-- .../model/request/CreateCallRequestStep2.java | 29 ++++ .../model/request/LookUpDataReq.java | 2 + .../response/CreateCallResponseBean.java | 2 +- .../repositories/CallRepository.java | 4 +- ...CallTargetAudienceChecklistRepository.java | 11 +- .../repositories/DocumentRepository.java | 5 +- .../repositories/FaqRepository.java | 9 +- .../service/AmazonS3Service.java | 9 +- .../tendermanagement/service/CallService.java | 7 +- .../service/DocumentService.java | 2 +- .../service/impl/AmazonS3ServiceImpl.java | 2 +- .../service/impl/CallServiceImpl.java | 13 +- .../service/impl/DocumentServiceImpl.java | 15 +- .../web/rest/api/CallApi.java | 30 +++- .../web/rest/api/impl/CallApiController.java | 15 +- .../db/changelog/db.changelog-1.0.0.xml | 1 - src/main/resources/message_en.properties | 2 + src/main/resources/message_it.properties | 1 + 23 files changed, 254 insertions(+), 126 deletions(-) rename src/main/java/net/gepafin/tendermanagement/model/request/{CreateCallRequest.java => CreateCallRequestStep1.java} (73%) create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep2.java diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index c3de4e48..ab9f75cc 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -42,6 +42,7 @@ public class GepafinConstant { public static final String PASSWORD_MIN_LEN ="pass.min.len.msg"; 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 INVALID_DATE_MSG = "call.invalid.date"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index 179b3f4e..0b99ceb6 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -1,28 +1,52 @@ package net.gepafin.tendermanagement.dao; -import net.gepafin.tendermanagement.config.Translator; -import net.gepafin.tendermanagement.constants.GepafinConstant; -import net.gepafin.tendermanagement.entities.*; - import java.math.BigDecimal; +import java.time.LocalDate; import java.time.LocalDateTime; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.stream.Collectors; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; + +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.entities.CallEntity; +import net.gepafin.tendermanagement.entities.CallTargetAudienceChecklistEntity; +import net.gepafin.tendermanagement.entities.DocumentEntity; +import net.gepafin.tendermanagement.entities.EvaluationCriteriaEntity; +import net.gepafin.tendermanagement.entities.FaqEntity; +import net.gepafin.tendermanagement.entities.LookUpDataEntity; +import net.gepafin.tendermanagement.entities.LookUpDataEntity.LookUpDataTypeEnum; +import net.gepafin.tendermanagement.entities.RegionEntity; +import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.enums.CallTypeEnum; -import net.gepafin.tendermanagement.model.request.*; -import net.gepafin.tendermanagement.model.response.*; -import net.gepafin.tendermanagement.repositories.*; +import net.gepafin.tendermanagement.model.request.CreateCallRequestStep1; +import net.gepafin.tendermanagement.model.request.CreateCallRequestStep2; +import net.gepafin.tendermanagement.model.request.DocumentReq; +import net.gepafin.tendermanagement.model.request.EvaluationCriteriaReq; +import net.gepafin.tendermanagement.model.request.FaqReq; +import net.gepafin.tendermanagement.model.request.LookUpDataReq; +import net.gepafin.tendermanagement.model.response.CreateCallResponseBean; +import net.gepafin.tendermanagement.model.response.DocumentResponseBean; +import net.gepafin.tendermanagement.model.response.EvaluationCriteriaResponseBean; +import net.gepafin.tendermanagement.model.response.FaqResponseBean; +import net.gepafin.tendermanagement.model.response.LookUpDataResponse; +import net.gepafin.tendermanagement.repositories.CallRepository; +import net.gepafin.tendermanagement.repositories.CallTargetAudienceChecklistRepository; +import net.gepafin.tendermanagement.repositories.DocumentRepository; +import net.gepafin.tendermanagement.repositories.EvaluationCriteriaRepository; +import net.gepafin.tendermanagement.repositories.FaqRepository; +import net.gepafin.tendermanagement.repositories.LookUpDataRepository; +import net.gepafin.tendermanagement.repositories.RegionRepository; +import net.gepafin.tendermanagement.repositories.UserRepository; import net.gepafin.tendermanagement.util.DateTimeUtil; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; 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.security.access.prepost.PreAuthorize; -import org.springframework.stereotype.Component; -import org.springframework.util.StringUtils; -import net.gepafin.tendermanagement.entities.LookUpDataEntity.LookUpDataTypeEnum; @Component public class CallDao { @@ -51,30 +75,23 @@ public class CallDao { @Autowired private UserRepository userRepository; - public CreateCallResponseBean createCall(CreateCallRequest createCallRequest, Long userId) { + public CreateCallResponseBean createCallStep1(CreateCallRequestStep1 createCallRequest, Long userId) { CreateCallResponseBean createCallResponseBean = null; CallEntity callEntity = convertToCallEntity(createCallRequest); - List evaluationCriteriaEntities = convertToEvaluationCriteriaEntities( - createCallRequest.getCriteria(), callEntity); - List documentEntities = convertToDocumentEntities(createCallRequest.getDocs(), callEntity); - List imageEntities = convertToDocumentEntities(createCallRequest.getImages(), callEntity); List faqEntities = convertToFaqEntities(createCallRequest.getFaq(), callEntity, userId); List amiedTo = convertLookUpDataEntities(createCallRequest.getAimedTo(), callEntity, LookUpDataTypeEnum.AIMED_TO); - List checkList = convertLookUpDataEntities(createCallRequest.getAimedTo(), callEntity, - LookUpDataTypeEnum.CHECKLIST); - createCallResponseBean = assembleCreateCallResponseBean(callEntity, evaluationCriteriaEntities, - documentEntities, faqEntities, imageEntities); + createCallResponseBean = assembleCreateCallResponseBean(callEntity, Collections.emptyList(), + Collections.emptyList(), faqEntities, Collections.emptyList()); createCallResponseBean.setAimedTo(amiedTo); - createCallResponseBean.setCheckList(checkList); return createCallResponseBean; } - public CallEntity convertToCallEntity(CreateCallRequest createCallRequest) { + public CallEntity convertToCallEntity(CreateCallRequestStep1 createCallRequest) { CallEntity callEntity = new CallEntity(); - validateCallEntity(createCallRequest.getRegionId(), createCallRequest.getAmount()); + validateCallEntity(createCallRequest); RegionEntity region = regionRepository.findById(createCallRequest.getRegionId()) .orElseThrow(() -> new ResourceNotFoundException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.REGION_NOT_FOUND))); callEntity.setRegion(region); @@ -86,12 +103,11 @@ public class CallDao { callEntity.setStatus(String.valueOf(createCallRequest.getStatus())); callEntity.setAmountMax(createCallRequest.getAmountMax()); callEntity.setAmount(createCallRequest.getAmountMax()); - callEntity.setThreshold(createCallRequest.getThreshold()); callEntity.setConfidi(false); if(createCallRequest.getConfidi()!=null){ callEntity.setConfidi(createCallRequest.getConfidi()); } - callEntity.setDocumentation_requested(createCallRequest.getDocumentationRequested()); + callEntity.setDocumentationRequested(createCallRequest.getDocumentationRequested()); callEntity = callRepository.save(callEntity); return callEntity; } @@ -121,13 +137,15 @@ public class CallDao { private DocumentEntity convertToDocumentEntity(DocumentReq documentReq, CallEntity callEntity) { validateDocumentEntity(documentReq.getId(),documentReq.getFileName()); - DocumentEntity documentEntity = documentRepository.findById(documentReq.getId()); - if(documentEntity==null){ - throw new ResourceNotFoundException(Status.VALIDATION_ERROR,Translator.toLocale(GepafinConstant.DOCUMENT_NOT_FOUND)); - } - documentEntity.setFileName(documentReq.getFileName()); - documentEntity.setFilePath(documentReq.getUrl()); - documentEntity.setCall(callEntity); + DocumentEntity documentEntity = documentRepository.findById(documentReq.getId()) + .orElseThrow(() -> new ResourceNotFoundException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.DOCUMENT_NOT_FOUND))); +// if(documentEntity==null){ +// throw ; +// } +// documentEntity.setFileName(documentReq.getFileName()); +// documentEntity.setFilePath(documentReq.getUrl()); +// documentEntity.setCall(callEntity); return documentEntity; } @@ -170,9 +188,9 @@ public class CallDao { throw new CustomValidationException(Status.VALIDATION_ERROR,Translator.toLocale(GepafinConstant.DOCUMENT_ID_NOT_FOUND)); } - if (!StringUtils.hasText(name)) { - throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.NAME_NOT_EMPTY_MSG)); - } +// if (!StringUtils.hasText(name)) { +// throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.NAME_NOT_EMPTY_MSG)); +// } } public void validateEvolutionCrieteriaEntity(String name) { @@ -181,14 +199,17 @@ public class CallDao { } } - public void validateCallEntity(Long regionId, BigDecimal fundingAmount) { - if (regionId == null) { + public void validateCallEntity(CreateCallRequestStep1 createCallRequest) { + if (createCallRequest.getRegionId() == null) { throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.REGION_NOT_FOUND_MSG)); } - if (fundingAmount == null || fundingAmount.compareTo(BigDecimal.ZERO) <= 0) { + if (createCallRequest.getAmount().compareTo(BigDecimal.ZERO) <= 0||createCallRequest.getAmountMax().compareTo(BigDecimal.ZERO) <= 0) { throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.AMOUNT_GREATER_THAN_ZERO_MSG)); } + if (createCallRequest.getStartDate().toLocalDate().isBefore(LocalDate.now()) || createCallRequest.getEndDate().toLocalDate().isBefore(LocalDate.now())) { + throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.INVALID_DATE_MSG)); + } } public CreateCallResponseBean convertToCallResponseBean(CallEntity callEntity) { CreateCallResponseBean createCallResponseBean = new CreateCallResponseBean(); @@ -204,7 +225,7 @@ public class CallDao { createCallResponseBean.setContactInfo(callEntity.getContactInfo()); createCallResponseBean.setSubmissionMethod(callEntity.getSubmissionMethod()); createCallResponseBean.setThreshold(callEntity.getThreshold()); - createCallResponseBean.setDocumentationReqested(callEntity.getDocumentation_requested()); + createCallResponseBean.setDocumentationReqested(callEntity.getDocumentationRequested()); createCallResponseBean.setPriorityArea(callEntity.getPriorityArea()); createCallResponseBean.setCreatedDate(callEntity.getCreatedDate()); createCallResponseBean.setUpdatedDate(callEntity.getUpdatedDate()); @@ -291,13 +312,13 @@ public class CallDao { callTargetAudienceChecklistEntity.setLookupData(lookUpDataEntity); callTargetAudienceChecklistEntity.setCall(callEntity); callTargetAudienceChecklistEntity= callTargetAudienceChecklistRepository.save(callTargetAudienceChecklistEntity); - lookUpDataResponses.add(convertToLookUpDataResponseBean(lookUpDataEntity,callTargetAudienceChecklistEntity)); + lookUpDataResponses.add(convertToLookUpDataResponseBean(callTargetAudienceChecklistEntity)); } return lookUpDataResponses; } private LookUpDataEntity convertLookUpDataRequestIntoLookUpDataEntity(LookUpDataReq req, LookUpDataEntity.LookUpDataTypeEnum type) { - if (req.getLookUpDataId() == null || req.getLookUpDataId().equals(BigDecimal.ZERO)) { + if (req.getLookUpDataId() == null || req.getLookUpDataId().equals(0l)) { LookUpDataEntity newEntity = new LookUpDataEntity(); newEntity.setValue(req.getValue()); newEntity.setType(type.getValue()); @@ -308,8 +329,9 @@ public class CallDao { .orElseThrow(() -> new ResourceNotFoundException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.LOOK_UP_DATA_NOT_VALID_MSG))); } - public LookUpDataResponse convertToLookUpDataResponseBean(LookUpDataEntity lookUpDataEntity,CallTargetAudienceChecklistEntity callTargetAudienceChecklistEntity) { + public LookUpDataResponse convertToLookUpDataResponseBean(CallTargetAudienceChecklistEntity callTargetAudienceChecklistEntity) { LookUpDataResponse lookUpDataResponse = new LookUpDataResponse(); + LookUpDataEntity lookUpDataEntity = callTargetAudienceChecklistEntity.getLookupData(); lookUpDataResponse.setId(callTargetAudienceChecklistEntity.getId()); lookUpDataResponse.setLookUpDataId(lookUpDataEntity.getId()); lookUpDataResponse.setValue(lookUpDataEntity.getValue()); @@ -318,6 +340,32 @@ public class CallDao { lookUpDataResponse.setUpdatedDate(lookUpDataEntity.getUpdatedDate()); return lookUpDataResponse; } + + + public CreateCallResponseBean createCallStep2(CreateCallRequestStep2 createCallRequest, Long userId) { + CreateCallResponseBean createCallResponseBean = null; + CallEntity callEntity = callRepository.findById(createCallRequest.getCallId()) + .orElseThrow(() -> new CustomValidationException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.NAME_NOT_EMPTY_MSG))); + + callEntity.setThreshold(createCallRequest.getThreshold()); + List evaluationCriteriaEntities = convertToEvaluationCriteriaEntities( + createCallRequest.getCriteria(), callEntity); + List documentEntities = convertToDocumentEntities(createCallRequest.getDocs(), callEntity); + List imageEntities = convertToDocumentEntities(createCallRequest.getImages(), callEntity); + List checkList = convertLookUpDataEntities(createCallRequest.getCheckList(), callEntity, + LookUpDataTypeEnum.CHECKLIST); + List faqEntities = faqRepository.findByCallId(callEntity.getId()); + List amiedTo = callTargetAudienceChecklistRepository + .findByCallIdAndLookupDataType(callEntity.getId(), LookUpDataTypeEnum.AIMED_TO.getValue()).stream() + .map(this::convertToLookUpDataResponseBean).toList(); + createCallResponseBean = assembleCreateCallResponseBean(callEntity, evaluationCriteriaEntities, + documentEntities, faqEntities, imageEntities); + createCallResponseBean.setAimedTo(amiedTo); + createCallResponseBean.setCheckList(checkList); + return createCallResponseBean; + + } } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java b/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java index 3c5cd708..f9603b70 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java @@ -1,5 +1,16 @@ package net.gepafin.tendermanagement.dao; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +import org.apache.commons.io.FilenameUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; +import org.springframework.web.multipart.MultipartFile; + import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.DocumentEntity; @@ -10,17 +21,6 @@ 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.apache.commons.io.FilenameUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; -import org.springframework.util.StringUtils; -import org.springframework.web.multipart.MultipartFile; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; @Component public class DocumentDao { @@ -34,15 +34,6 @@ public class DocumentDao { @Autowired private CallDao callDao; - @Value("${aws.s3.bucket.name}") - private String bucketName; - - @Value("${aws.s3.url.folder}") - private String s3Folder; - - @Value("${aws.s3.url}") - private String s3Url; - public List uploadFiles(List files, DocumentTypeEnum fileType) { List documentEntities = new ArrayList<>(); @@ -65,16 +56,15 @@ public class DocumentDao { .map(callDao::convertToDocumentResponseBean) .collect(Collectors.toList()); } - public Void deleteFile(Long documentId){ - DocumentEntity documentEntity= documentRepository.findById(documentId); - if(documentEntity==null){ - new ResourceNotFoundException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.DOCUMENT_NOT_FOUND)); - } - String fileName= Utils.extractFileName(documentEntity.getFilePath()); - try { - amazonS3Service.delete(bucketName, fileName); - documentRepository.delete(documentEntity); - }catch (Exception e){} - return null; - } + + public void deleteFile(Long documentId) { + DocumentEntity documentEntity = documentRepository.findById(documentId) + .orElseThrow(() -> new ResourceNotFoundException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.DOCUMENT_NOT_FOUND))); + + String fileName = Utils.extractFileName(documentEntity.getFilePath()); + amazonS3Service.delete(fileName); + documentRepository.delete(documentEntity); + + } } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/CallEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/CallEntity.java index 1ee48d6b..81da7209 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/CallEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/CallEntity.java @@ -52,10 +52,10 @@ public class CallEntity extends BaseEntity { private String submissionMethod; @Column(name = "THRESHOLD", nullable = false) - private Integer threshold; + private Long threshold; @Column(name="DOCUMENTATION_REQUESTED",columnDefinition = "TEXT") - private String documentation_requested; + private String documentationRequested; @Column(name = "PRIORITY_AREA", columnDefinition = "TEXT") private String priorityArea; diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep1.java similarity index 73% rename from src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequest.java rename to src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep1.java index 80d828fc..e6cbc3e9 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequest.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep1.java @@ -7,43 +7,47 @@ import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.List; -@Data -public class CreateCallRequest { +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +@Data +public class CreateCallRequestStep1 { + + @NotEmpty private String name; + @NotEmpty private String descriptionShort; + @NotEmpty private String descriptionLong; + @NotNull private LocalDateTime startDate; + @NotNull private LocalDateTime endDate; + @NotNull private Long regionId; + @NotNull private BigDecimal amount; + @NotNull private BigDecimal amountMax; + @NotNull private List aimedTo; + @NotEmpty private String documentationRequested; - private Integer threshold; - private Boolean Confidi; - List criteria; - private List faq; - private List checkList; - - private List docs; - - private List images; - + @NotNull private CallTypeEnum status; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep2.java b/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep2.java new file mode 100644 index 00000000..7908c9ae --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep2.java @@ -0,0 +1,29 @@ +package net.gepafin.tendermanagement.model.request; + +import java.util.List; + +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import net.gepafin.tendermanagement.enums.CallTypeEnum; + +@Data +public class CreateCallRequestStep2 { + + @NotNull + private Long callId; + + private Long threshold; + + @NotNull + private List criteria; + + @NotNull + private List checkList; + + private List docs; + + private List images; + + private CallTypeEnum status; + +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/LookUpDataReq.java b/src/main/java/net/gepafin/tendermanagement/model/request/LookUpDataReq.java index 18b847b4..5fe41b41 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/LookUpDataReq.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/LookUpDataReq.java @@ -1,10 +1,12 @@ package net.gepafin.tendermanagement.model.request; +import jakarta.validation.constraints.NotNull; import lombok.Data; @Data public class LookUpDataReq { + @NotNull private Long lookUpDataId; private String value; diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/CreateCallResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/CreateCallResponseBean.java index b913f85b..56a42a2a 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/CreateCallResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/CreateCallResponseBean.java @@ -32,7 +32,7 @@ public class CreateCallResponseBean { private String submissionMethod; - private Integer threshold; + private Long threshold; private String priorityArea; diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/CallRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/CallRepository.java index ef6e144f..093e4086 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/CallRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/CallRepository.java @@ -1,8 +1,10 @@ package net.gepafin.tendermanagement.repositories; import net.gepafin.tendermanagement.entities.CallEntity; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; -public interface CallRepository extends JpaRepository { +@Repository +public interface CallRepository extends JpaRepository { } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/CallTargetAudienceChecklistRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/CallTargetAudienceChecklistRepository.java index fe70f982..8d4912fe 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/CallTargetAudienceChecklistRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/CallTargetAudienceChecklistRepository.java @@ -1,7 +1,14 @@ package net.gepafin.tendermanagement.repositories; -import net.gepafin.tendermanagement.entities.CallTargetAudienceChecklistEntity; -import org.springframework.data.jpa.repository.JpaRepository; +import java.util.List; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import net.gepafin.tendermanagement.entities.CallTargetAudienceChecklistEntity; + +@Repository public interface CallTargetAudienceChecklistRepository extends JpaRepository { + + List findByCallIdAndLookupDataType(Long id, String value); } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/DocumentRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/DocumentRepository.java index d8d4f07a..9a2a4639 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/DocumentRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/DocumentRepository.java @@ -1,9 +1,10 @@ package net.gepafin.tendermanagement.repositories; import net.gepafin.tendermanagement.entities.DocumentEntity; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; -public interface DocumentRepository extends JpaRepository { +@Repository +public interface DocumentRepository extends JpaRepository { - DocumentEntity findById(Long id); } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/FaqRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/FaqRepository.java index 9453ade3..7b4b7610 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/FaqRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/FaqRepository.java @@ -1,7 +1,14 @@ package net.gepafin.tendermanagement.repositories; import net.gepafin.tendermanagement.entities.FaqEntity; -import org.springframework.data.jpa.repository.JpaRepository; +import java.util.List; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository public interface FaqRepository extends JpaRepository { + + List findByCallId(Long callId); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/AmazonS3Service.java b/src/main/java/net/gepafin/tendermanagement/service/AmazonS3Service.java index 188d131a..1ff3a7fd 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/AmazonS3Service.java +++ b/src/main/java/net/gepafin/tendermanagement/service/AmazonS3Service.java @@ -1,6 +1,5 @@ package net.gepafin.tendermanagement.service; - import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; @@ -10,11 +9,9 @@ import java.io.InputStream; @Component public interface AmazonS3Service { + public String upload(String fileName, MultipartFile file) throws IOException; - public String upload(String fileName, - MultipartFile file) throws IOException; + public Boolean delete(String fileName); - public Boolean delete(String bucketName ,String fileName); - - InputStream getFile(String filePath) throws IOException; + InputStream getFile(String filePath) throws IOException; } \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/service/CallService.java b/src/main/java/net/gepafin/tendermanagement/service/CallService.java index 40dfd65f..f8a07093 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/CallService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/CallService.java @@ -1,11 +1,14 @@ package net.gepafin.tendermanagement.service; import jakarta.servlet.http.HttpServletRequest; -import net.gepafin.tendermanagement.model.request.CreateCallRequest; +import net.gepafin.tendermanagement.model.request.CreateCallRequestStep1; +import net.gepafin.tendermanagement.model.request.CreateCallRequestStep2; import net.gepafin.tendermanagement.model.response.CreateCallResponseBean; public interface CallService { - CreateCallResponseBean createCall(HttpServletRequest request, CreateCallRequest createCallRequest); + CreateCallResponseBean createCallStep1(HttpServletRequest request, CreateCallRequestStep1 createCallRequest); + + CreateCallResponseBean createCallStep2(HttpServletRequest request, CreateCallRequestStep2 createCallRequest); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/DocumentService.java b/src/main/java/net/gepafin/tendermanagement/service/DocumentService.java index 806d81cc..4081af53 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/DocumentService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/DocumentService.java @@ -10,5 +10,5 @@ public interface DocumentService { public List uploadFile(List files, DocumentTypeEnum fileType); - public Void deleteFile(Long documentId); + public void deleteFile(Long documentId); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/AmazonS3ServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/AmazonS3ServiceImpl.java index ad865d13..3657d115 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/AmazonS3ServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/AmazonS3ServiceImpl.java @@ -63,7 +63,7 @@ public class AmazonS3ServiceImpl implements AmazonS3Service { } @Override - public Boolean delete(String bucketName,String fileName) { + public Boolean delete(String fileName) { final DeleteObjectRequest deleteObjectRequest = new DeleteObjectRequest(bucketName, fileName); if(Boolean.FALSE.equals(isTestProfileActivated())) { diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java index cb4b76bc..53edaf6d 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java @@ -3,7 +3,8 @@ package net.gepafin.tendermanagement.service.impl; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.config.jwt.TokenProvider; import net.gepafin.tendermanagement.dao.CallDao; -import net.gepafin.tendermanagement.model.request.CreateCallRequest; +import net.gepafin.tendermanagement.model.request.CreateCallRequestStep1; +import net.gepafin.tendermanagement.model.request.CreateCallRequestStep2; import net.gepafin.tendermanagement.model.response.CreateCallResponseBean; import net.gepafin.tendermanagement.service.CallService; import org.springframework.beans.factory.annotation.Autowired; @@ -22,8 +23,14 @@ public class CallServiceImpl implements CallService { private TokenProvider tokenProvider; @Override - public CreateCallResponseBean createCall(HttpServletRequest request, CreateCallRequest createCallRequest) { + public CreateCallResponseBean createCallStep1(HttpServletRequest request, CreateCallRequestStep1 createCallRequest) { Map userInfo= tokenProvider.getUserInfoAndUserIdFromToken(request); - return callDao.createCall(createCallRequest, Long.parseLong(userInfo.get("userId").toString())); + return callDao.createCallStep1(createCallRequest, Long.parseLong(userInfo.get("userId").toString())); + } + + @Override + public CreateCallResponseBean createCallStep2(HttpServletRequest request, CreateCallRequestStep2 createCallRequest) { + Map userInfo= tokenProvider.getUserInfoAndUserIdFromToken(request); + return callDao.createCallStep2(createCallRequest, Long.parseLong(userInfo.get("userId").toString())); } } 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 e7bf864e..55c6165b 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/DocumentServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/DocumentServiceImpl.java @@ -1,14 +1,15 @@ 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 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; - -import java.util.List; @Service public class DocumentServiceImpl implements DocumentService { @@ -22,7 +23,7 @@ public class DocumentServiceImpl implements DocumentService { return fileDao.uploadFiles(files,fileType); } @Override - public Void deleteFile(Long documentId){ - return fileDao.deleteFile(documentId); + public void deleteFile(Long documentId){ + fileDao.deleteFile(documentId); } } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java index 637ad6f8..3da8bab6 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java @@ -7,20 +7,22 @@ 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.CreateCallRequest; +import net.gepafin.tendermanagement.model.request.CreateCallRequestStep1; +import net.gepafin.tendermanagement.model.request.CreateCallRequestStep2; import net.gepafin.tendermanagement.model.response.CreateCallResponseBean; 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.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; - +@Validated public interface CallApi { - @Operation(summary = "Api to create call", + @Operation(summary = "Api to create call step 1", responses = { @ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @@ -30,10 +32,26 @@ public interface CallApi { @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) - @PostMapping(value = "", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) + @PostMapping(value = "/step1", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')") - public ResponseEntity> createCall(HttpServletRequest request, + public ResponseEntity> createCallStep1(HttpServletRequest request, @Parameter(description = "Call request object", required = true) - @Valid @RequestBody CreateCallRequest createCallRequest); + @Valid @RequestBody CreateCallRequestStep1 createCallRequest); + + @Operation(summary = "Api to create call step 2", + 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 = "/step2", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) + @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')") + public ResponseEntity> createCallStep2(HttpServletRequest request, + @Parameter(description = "Call request object", required = true) + @Valid @RequestBody CreateCallRequestStep2 createCallRequest); } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java index d4165383..0ff654bc 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java @@ -3,7 +3,8 @@ 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.CreateCallRequest; +import net.gepafin.tendermanagement.model.request.CreateCallRequestStep1; +import net.gepafin.tendermanagement.model.request.CreateCallRequestStep2; import net.gepafin.tendermanagement.model.response.CreateCallResponseBean; import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.service.CallService; @@ -27,8 +28,16 @@ public class CallApiController implements CallApi { @Override @Transactional(rollbackFor=Exception.class) - public ResponseEntity> createCall(HttpServletRequest request, CreateCallRequest createCallRequest) { - CreateCallResponseBean createCallResponseBean = callService.createCall(request, createCallRequest); + public ResponseEntity> createCallStep1(HttpServletRequest request, CreateCallRequestStep1 createCallRequest) { + CreateCallResponseBean createCallResponseBean = callService.createCallStep1(request, createCallRequest); + return ResponseEntity.status(HttpStatus.CREATED) + .body(new Response<>(createCallResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.CALL_CREATED_SUCCESSFULLY_MSG))); + } + + @Override + @Transactional(rollbackFor=Exception.class) + public ResponseEntity> createCallStep2(HttpServletRequest request, CreateCallRequestStep2 createCallRequest) { + CreateCallResponseBean createCallResponseBean = callService.createCallStep2(request, createCallRequest); return ResponseEntity.status(HttpStatus.CREATED) .body(new Response<>(createCallResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.CALL_CREATED_SUCCESSFULLY_MSG))); } 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 d090e106..5293ec62 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 @@ -171,7 +171,6 @@ - diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index c35db8ac..15aa6498 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -43,6 +43,8 @@ call.created.successfully=Call created successfully. file.deleted.successfully=File deleted successfully. 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. # Login-related messages login.successfully=Login successfully. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index 085c1ce4..ae93ff53 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -43,6 +43,7 @@ call.created.successfully=Chiamata creata correttamente. 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. # Login-related messages login.successfully=Accesso effettuato con successo.