diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..b937cae8d67980ee2105facf93b71583ba79724e --- /dev/null +++ b/pom.xml @@ -0,0 +1,114 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + <parent> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-parent</artifactId> + <version>2.7.1</version> + <relativePath/> <!-- lookup parent from repository --> + </parent> + <groupId>org.upsmf</groupId> + <artifactId>grievance</artifactId> + <version>0.0.1-SNAPSHOT</version> + <name>Grievance Service</name> + <description>Customised service for grievance workflow </description> + <properties> + <java.version>11</java.version> + <firebase-admin.version>9.2.0</firebase-admin.version> + </properties> + <dependencies> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-actuator</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-security</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.security</groupId> + <artifactId>spring-security-jwt</artifactId> + <version>1.1.0.RELEASE</version> + </dependency> + <dependency> + <groupId>org.springframework.security.oauth</groupId> + <artifactId>spring-security-oauth2</artifactId> + <version>2.5.0.RELEASE</version> + </dependency> + <dependency> + <groupId>io.jsonwebtoken</groupId> + <artifactId>jjwt</artifactId> + <version>0.6.0</version> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-data-jpa</artifactId> + </dependency> + <dependency> + <groupId>com.google.cloud</groupId> + <artifactId>google-cloud-storage</artifactId> + <version>2.26.0</version> + </dependency> + <dependency> + <groupId>org.postgresql</groupId> + <artifactId>postgresql</artifactId> + <version>42.6.0</version> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-data-elasticsearch</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-data-redis</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-mail</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-web</artifactId> + </dependency> + <!-- https://mvnrepository.com/artifact/com.google.firebase/firebase-admin --> + <dependency> + <groupId>com.google.firebase</groupId> + <artifactId>firebase-admin</artifactId> + <version>${firebase-admin.version}</version> + </dependency> + <dependency> + <groupId>org.projectlombok</groupId> + <artifactId>lombok</artifactId> + <optional>true</optional> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-test</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.apache.maven</groupId> + <artifactId>maven-artifact-manager</artifactId> + <version>2.0</version> + </dependency> + </dependencies> + + <build> + <plugins> + <plugin> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-maven-plugin</artifactId> + <configuration> + <excludes> + <exclude> + <groupId>org.projectlombok</groupId> + <artifactId>lombok</artifactId> + </exclude> + </excludes> + </configuration> + </plugin> + </plugins> + </build> + +</project> diff --git a/src/main/.DS_Store b/src/main/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..2c2c05dc581d4df18e116503e9c1227aa6568f9c Binary files /dev/null and b/src/main/.DS_Store differ diff --git a/src/main/java/.DS_Store b/src/main/java/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..3b55b64a6de9e0092ed80c725c3629a6ae64f0e1 Binary files /dev/null and b/src/main/java/.DS_Store differ diff --git a/src/main/java/org/.DS_Store b/src/main/java/org/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..edee1968e0bf39036c17cae926de537a5da84921 Binary files /dev/null and b/src/main/java/org/.DS_Store differ diff --git a/src/main/java/org/upsmf/.DS_Store b/src/main/java/org/upsmf/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..2c81699741227b09e795aed149a6197996a1c3d0 Binary files /dev/null and b/src/main/java/org/upsmf/.DS_Store differ diff --git a/src/main/java/org/upsmf/grievance/.DS_Store b/src/main/java/org/upsmf/grievance/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..39347aeaeebb37622c509c1e058726a467b72398 Binary files /dev/null and b/src/main/java/org/upsmf/grievance/.DS_Store differ diff --git a/src/main/java/org/upsmf/grievance/GrievanceServiceApplication.java b/src/main/java/org/upsmf/grievance/GrievanceServiceApplication.java new file mode 100644 index 0000000000000000000000000000000000000000..7cbe26cdc008b1662db7cde24f26c243955f1cbe --- /dev/null +++ b/src/main/java/org/upsmf/grievance/GrievanceServiceApplication.java @@ -0,0 +1,15 @@ +package org.upsmf.grievance; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; + +@SpringBootApplication +@EnableJpaRepositories(basePackages = "org.upsmf.grievance") +public class GrievanceServiceApplication { + + public static void main(String[] args) { + SpringApplication.run(GrievanceServiceApplication.class, args); + } + +} diff --git a/src/main/java/org/upsmf/grievance/config/EsConfig.java b/src/main/java/org/upsmf/grievance/config/EsConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..b3f7feab684afd385435b2e93ffdf502d1c73c0d --- /dev/null +++ b/src/main/java/org/upsmf/grievance/config/EsConfig.java @@ -0,0 +1,45 @@ +package org.upsmf.grievance.config; + +import lombok.extern.slf4j.Slf4j; +import org.elasticsearch.client.RestHighLevelClient; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.elasticsearch.client.ClientConfiguration; +import org.springframework.data.elasticsearch.client.RestClients; +import org.springframework.data.elasticsearch.config.AbstractElasticsearchConfiguration; +import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories; + +@Configuration +@EnableElasticsearchRepositories(basePackages = "org.upsmf.grievance") +@Slf4j +public class EsConfig extends AbstractElasticsearchConfiguration { + + @Value("${spring.data.elasticsearch.rest.uris}") + private String host; + + private String port = "9200"; + + public String getHost() { + return host; + } + + public void setHost(String host) { + this.host = host; + } + + public String getPort() { + return port; + } + + public void setPort(String port) { + this.port = port; + } + + @Override + public RestHighLevelClient elasticsearchClient() { + final ClientConfiguration clientConfiguration = ClientConfiguration.builder() + .connectedTo(host) + .build(); + return RestClients.create(clientConfiguration).rest(); + } +} \ No newline at end of file diff --git a/src/main/java/org/upsmf/grievance/config/JwtAuthenticationEntryPoint.java b/src/main/java/org/upsmf/grievance/config/JwtAuthenticationEntryPoint.java new file mode 100644 index 0000000000000000000000000000000000000000..6b657acc5d3d778b409ded52362ce8d1a5bcd0ee --- /dev/null +++ b/src/main/java/org/upsmf/grievance/config/JwtAuthenticationEntryPoint.java @@ -0,0 +1,30 @@ +package org.upsmf.grievance.config; + +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.web.AuthenticationEntryPoint; +import org.springframework.stereotype.Component; + +import javax.servlet.ServletContext; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.Serializable; + +@Component +public class JwtAuthenticationEntryPoint implements AuthenticationEntryPoint, Serializable { + /** + * + */ + private static final long serialVersionUID = 1L; + + @Override + public void commence(javax.servlet.http.HttpServletRequest httpServletRequest, + HttpServletResponse httpServletResponse, AuthenticationException e) throws IOException, ServletException { + /* ServletContext ctx = httpServletRequest.getServletContext(); + if (!(Boolean) ctx.getAttribute("WhiteList")) { + httpServletResponse.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized"); + }*/ + + } + +} \ No newline at end of file diff --git a/src/main/java/org/upsmf/grievance/config/JwtAuthenticationFilter.java b/src/main/java/org/upsmf/grievance/config/JwtAuthenticationFilter.java new file mode 100644 index 0000000000000000000000000000000000000000..65304246de8ae523a01b4772b70df66f95ad9ef6 --- /dev/null +++ b/src/main/java/org/upsmf/grievance/config/JwtAuthenticationFilter.java @@ -0,0 +1,123 @@ +package org.upsmf.grievance.config; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.filter.OncePerRequestFilter; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +public class JwtAuthenticationFilter extends OncePerRequestFilter { + + /*@Autowired + private UserService userService; + + @Autowired + private JwtTokenUtil jwtTokenUtil;*/ + + @Value("${urls.whitelist}") + private String whitelistUrls; + + @Override + protected void doFilterInternal(HttpServletRequest req, HttpServletResponse res, FilterChain chain) + throws IOException, ServletException { + + + /*List<String> whitelistUrlList = Arrays.asList(whitelistUrls.split(",")); + + ServletContext ctx = req.getServletContext(); + Boolean whiteListed; + Boolean authorized = Boolean.FALSE; + String username = null; + String authToken = null; + UserDetails userDetails = null; + Map<String, Object> userInfoObectMap = new HashMap<>(); + + if (whitelistUrlList.contains(req.getRequestURI())) { + whiteListed = Boolean.TRUE; + } else { + whiteListed = Boolean.FALSE; + String header = req.getHeader(HEADER_STRING); + if (StringUtils.isBlank(header)) { + res.setStatus(HttpServletResponse.SC_UNAUTHORIZED); + res.getWriter() + .write(ResponseGenerator.failureResponse(ResponseMessages.ErrorMessages.UNAUTHORIZED_ACCESS)); + res.setContentType("application/json"); + res.getWriter().flush(); + return; + } + if (header.startsWith(TOKEN_PREFIX)) { + authToken = header.replace(TOKEN_PREFIX, ""); + username = getUserName(username, authToken); + } else { + logger.warn("couldn't find bearer string, will ignore the header"); + } + if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) { + userInfoObectMap = userService.getUserInfoObjects(username); + userDetails = (UserDetails) userInfoObectMap.get("UserDetails"); + if (jwtTokenUtil.validateToken(authToken, userDetails)) { + UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken( + userDetails, null, Arrays.asList(new SimpleGrantedAuthority("ROLE_ADMIN"))); + authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(req)); + logger.info("authenticated user " + username + ", setting security context"); + SecurityContextHolder.getContext().setAuthentication(authentication); + } + } + + + Boolean userTokenAvailable = userService.findUserByToken(authToken); + authorized = checkForAuthorization(req, ctx, authorized, userDetails, userInfoObectMap, userTokenAvailable); + } + + if (!authorized && !whiteListed) { + res.setStatus(HttpServletResponse.SC_FORBIDDEN); + res.getWriter() + .write(ResponseGenerator.failureResponse(ResponseMessages.ErrorMessages.INVALID_ACCESS_ROLE)); + res.setContentType("application/json"); + res.getWriter().flush(); + return; + }*/ + + chain.doFilter(req, res); + } + + /*public String getUserName(String username, String authToken) { + try { + username = jwtTokenUtil.getUsernameFromToken(authToken); + } catch (IllegalArgumentException e) { + logger.error("an error occured during getting username from token", e); + } catch (ExpiredJwtException e) { + logger.warn("the token is expired and not valid anymore", e); + } catch (SignatureException e) { + logger.error("Authentication Failed. Username or Password not valid."); + } + return username; + } + + public Boolean checkForAuthorization(HttpServletRequest req, ServletContext ctx, Boolean authorized, + UserDetails userDetails, Map<String, Object> userInfoObectMap, Boolean userTokenAvailable) { + if (userTokenAvailable) { + try { + if (userDetails != null) { + User user = (User) userInfoObectMap.get("User"); + req.setAttribute("UserInfo", user); + ctx.setAttribute("UserInfo", user); + List<Long> roleIds = MasterDataManager.getRoleIdsForUserId(user.getId()); + for (Long roleId : roleIds) { + List<String> actionUrlList = MasterDataManager.getActionUrlsForRoleId(roleId); + if (actionUrlList.contains(req.getRequestURI())) { + ctx.setAttribute("Authorized", Boolean.TRUE); + authorized = Boolean.TRUE; + break; + } + } + } + } catch (UsernameNotFoundException e) { + e.getMessage(); + } + } + return authorized; + }*/ +} \ No newline at end of file diff --git a/src/main/java/org/upsmf/grievance/config/WebSecurityConfig.java b/src/main/java/org/upsmf/grievance/config/WebSecurityConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..666baf64eb8f4ba9897650b73845b074c661c0eb --- /dev/null +++ b/src/main/java/org/upsmf/grievance/config/WebSecurityConfig.java @@ -0,0 +1,62 @@ +package org.upsmf.grievance.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; + +import javax.annotation.Resource; + +@Configuration +@EnableWebSecurity +@EnableGlobalMethodSecurity(prePostEnabled = true) +public class WebSecurityConfig extends WebSecurityConfigurerAdapter { + + /*@Resource(name = "userService") + private UserDetailsService userDetailsService;*/ + + @Autowired + private JwtAuthenticationEntryPoint unauthorizedHandler; + + @Value("${urls.whitelist}") + private String whiteListUrls; + + /*@Override + @Bean + public AuthenticationManager authenticationManagerBean() throws Exception { + return super.authenticationManagerBean(); + }*/ + + /*@Autowired + public void globalUserDetails(AuthenticationManagerBuilder auth) throws Exception { + auth.userDetailsService(userDetailsService).passwordEncoder(encoder()); + }*/ + + @Bean + public JwtAuthenticationFilter authenticationTokenFilterBean() { + return new JwtAuthenticationFilter(); + } + + @Override + protected void configure(HttpSecurity http) throws Exception { + /*http.cors().and().csrf().disable().authorizeRequests().antMatchers("/**").permitAll().anyRequest() + .authenticated().and().exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and() + .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS); + http.addFilterBefore(authenticationTokenFilterBean(), UsernamePasswordAuthenticationFilter.class);*/ + http.cors().and().csrf().disable().authorizeRequests().antMatchers("/**").permitAll(); + } + + @Bean + public BCryptPasswordEncoder encoder() { + return new BCryptPasswordEncoder(); + } + +} diff --git a/src/main/java/org/upsmf/grievance/constants/Constants.java b/src/main/java/org/upsmf/grievance/constants/Constants.java new file mode 100644 index 0000000000000000000000000000000000000000..86f54633e2b0d5e8a3db99b432d35b2d5967b063 --- /dev/null +++ b/src/main/java/org/upsmf/grievance/constants/Constants.java @@ -0,0 +1,6 @@ +package org.upsmf.grievance.constants; + +public class Constants { + + public static final String TIME_ZONE = "Asia/Kolkata"; +} diff --git a/src/main/java/org/upsmf/grievance/controller/FeedbackController.java b/src/main/java/org/upsmf/grievance/controller/FeedbackController.java new file mode 100644 index 0000000000000000000000000000000000000000..67b3f46fd943a1b0b11100d78c96c4654875715a --- /dev/null +++ b/src/main/java/org/upsmf/grievance/controller/FeedbackController.java @@ -0,0 +1,32 @@ +package org.upsmf.grievance.controller; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.upsmf.grievance.dto.FeedbackDto; +import org.upsmf.grievance.model.reponse.Response; +import org.upsmf.grievance.service.FeedbackService; + +@Controller +@RequestMapping("/feedback") +public class FeedbackController { + + @Autowired + private FeedbackService feedbackService; + + @PostMapping("/save") + public ResponseEntity saveFeedback(@RequestBody FeedbackDto feedbackDto) { + feedbackService.saveFeedback(feedbackDto); + return new ResponseEntity(HttpStatus.OK); + } + + @GetMapping("/all") + public ResponseEntity<Response> getFeedbacks() { + return new ResponseEntity<Response>(new Response(HttpStatus.OK.value(), feedbackService.getFeedbacks()), HttpStatus.OK); + } +} diff --git a/src/main/java/org/upsmf/grievance/controller/OtpController.java b/src/main/java/org/upsmf/grievance/controller/OtpController.java new file mode 100644 index 0000000000000000000000000000000000000000..ae50323f5892d10a20043846d6de0badfba95ef1 --- /dev/null +++ b/src/main/java/org/upsmf/grievance/controller/OtpController.java @@ -0,0 +1,43 @@ +package org.upsmf.grievance.controller; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.upsmf.grievance.model.OtpRequest; +import org.upsmf.grievance.model.OtpValidationRequest; +import org.upsmf.grievance.service.OtpService; + +@RestController +@RequestMapping("/otp") +public class OtpController { + + @Autowired + private OtpService otpService; + + @PostMapping("/generate-otp") + public ResponseEntity<String> generateOtp(@RequestBody OtpRequest otpRequest) { + try { + otpService.generateAndSendOtp(otpRequest); + return ResponseEntity.ok("OTP generated and sent successfully to " + otpRequest.getEmail()); + } catch (Exception e) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body("Failed to generate and send OTP: " + e.getMessage()); + } + } + + @PostMapping("/validate-otp") + public ResponseEntity<String> validateOtp(@RequestBody OtpValidationRequest otpValidationRequest) { + boolean isValid = otpService.validateOtp(otpValidationRequest.getEmail(), otpValidationRequest.getOtp()); + if (isValid) { + return ResponseEntity.ok("OTP validation successful."); + } else { + return ResponseEntity.badRequest().body("Invalid OTP."); + } + } + + +} diff --git a/src/main/java/org/upsmf/grievance/controller/SearchTicketController.java b/src/main/java/org/upsmf/grievance/controller/SearchTicketController.java new file mode 100644 index 0000000000000000000000000000000000000000..9f745a5c80e5a57cb8fe1a492b6266e4589b3a93 --- /dev/null +++ b/src/main/java/org/upsmf/grievance/controller/SearchTicketController.java @@ -0,0 +1,31 @@ +package org.upsmf.grievance.controller; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.upsmf.grievance.dto.SearchRequest; +import org.upsmf.grievance.model.es.Ticket; +import org.upsmf.grievance.model.reponse.Response; +import org.upsmf.grievance.model.reponse.TicketResponse; +import org.upsmf.grievance.service.SearchService; + +import java.util.Optional; + +@Controller +@RequestMapping("/search") +public class SearchTicketController { + + @Autowired + private SearchService searchService; + + @PostMapping("/getAllTickets") + public ResponseEntity<Response> search(SearchRequest searchRequest){ + TicketResponse responseTicket = searchService.search(searchRequest); + Response response = new Response(HttpStatus.OK.value(), responseTicket); + return new ResponseEntity<>(response, HttpStatus.OK); + } + +} \ No newline at end of file diff --git a/src/main/java/org/upsmf/grievance/controller/TicketController.java b/src/main/java/org/upsmf/grievance/controller/TicketController.java new file mode 100644 index 0000000000000000000000000000000000000000..4b7532a70ebb04cc5a4ff76439e9ca1aff2b956d --- /dev/null +++ b/src/main/java/org/upsmf/grievance/controller/TicketController.java @@ -0,0 +1,62 @@ +package org.upsmf.grievance.controller; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.upsmf.grievance.dto.FileUploadRequest; +import org.upsmf.grievance.model.Ticket; +import org.upsmf.grievance.model.reponse.Response; +import org.upsmf.grievance.dto.TicketRequest; +import org.upsmf.grievance.dto.UpdateTicketRequest; +import org.upsmf.grievance.service.AttachmentService; +import org.upsmf.grievance.service.TicketService; + +@Controller +@RequestMapping("/ticket") +public class TicketController { + + @Autowired + private TicketService ticketService; + + @Autowired + private AttachmentService attachmentService; + + @PostMapping("/save") + public ResponseEntity<Response> save(@RequestBody TicketRequest ticketRequest) { + Ticket responseTicket = null; + try { + responseTicket = ticketService.save(ticketRequest); + } catch (Exception e) { + throw new RuntimeException(e); + } + Response response = new Response(HttpStatus.OK.value(), responseTicket); + return new ResponseEntity<Response>(response, HttpStatus.OK); + } + + @PostMapping("/update") + public ResponseEntity<Response> update(@RequestBody UpdateTicketRequest updateTicketRequest) { + Ticket responseTicket = ticketService.update(updateTicketRequest); + Response response = new Response(HttpStatus.OK.value(), responseTicket); + return new ResponseEntity<Response>(response, HttpStatus.OK); + } + + @GetMapping("/{id}") + public ResponseEntity<Response> update(@RequestParam(name = "id") long id) { + Ticket responseTicket = ticketService.getTicketById(id); + Response response = new Response(HttpStatus.OK.value(), responseTicket); + return new ResponseEntity<Response>(response, HttpStatus.OK); + } + + @PostMapping("/file/upload") + public ResponseEntity upload(@RequestBody FileUploadRequest fileUploadRequest) { + Ticket responseTicket = null; + try { + attachmentService.uploadObject(fileUploadRequest); + } catch (Exception e) { + throw new RuntimeException(e); + } + return new ResponseEntity(HttpStatus.OK); + } +} diff --git a/src/main/java/org/upsmf/grievance/dto/ErrorResponseDto.java b/src/main/java/org/upsmf/grievance/dto/ErrorResponseDto.java new file mode 100644 index 0000000000000000000000000000000000000000..64c60db198f6931119fdc51cb1d3ba36de961c81 --- /dev/null +++ b/src/main/java/org/upsmf/grievance/dto/ErrorResponseDto.java @@ -0,0 +1,22 @@ +package org.upsmf.grievance.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class ErrorResponseDto { + + private int statusCode; + private String message; + + public ErrorResponseDto(String message) + { + super(); + this.message = message; + } +} \ No newline at end of file diff --git a/src/main/java/org/upsmf/grievance/dto/FeedbackDto.java b/src/main/java/org/upsmf/grievance/dto/FeedbackDto.java new file mode 100644 index 0000000000000000000000000000000000000000..8fb302a53ab225739ec5b351e9ae8e1a768c080e --- /dev/null +++ b/src/main/java/org/upsmf/grievance/dto/FeedbackDto.java @@ -0,0 +1,19 @@ +package org.upsmf.grievance.dto; + +import lombok.*; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Builder +@ToString(includeFieldNames = true) +public class FeedbackDto { + + private String firstName; + private String lastName; + private String phone; + private String email; + private Integer rating; + private String comment; +} diff --git a/src/main/java/org/upsmf/grievance/dto/FileUploadRequest.java b/src/main/java/org/upsmf/grievance/dto/FileUploadRequest.java new file mode 100644 index 0000000000000000000000000000000000000000..569bdf7d245298109f2f46e84944a4087bdf0be6 --- /dev/null +++ b/src/main/java/org/upsmf/grievance/dto/FileUploadRequest.java @@ -0,0 +1,21 @@ +package org.upsmf.grievance.dto; + +import lombok.*; + +import java.io.File; +import java.sql.Timestamp; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +@ToString +public class FileUploadRequest { + + private File file; + private String fileName; + private String fileExtension; + private Timestamp createdDate; + private Timestamp updatedDate; + private Long uploadedBy; +} diff --git a/src/main/java/org/upsmf/grievance/dto/SearchRequest.java b/src/main/java/org/upsmf/grievance/dto/SearchRequest.java new file mode 100644 index 0000000000000000000000000000000000000000..d7678f6c294fbc19abefe4dd993e53aec3c7412b --- /dev/null +++ b/src/main/java/org/upsmf/grievance/dto/SearchRequest.java @@ -0,0 +1,37 @@ +package org.upsmf.grievance.dto; + +import lombok.*; +import org.upsmf.grievance.enums.TicketPriority; + +import java.sql.Timestamp; +import java.util.List; +import java.util.Map; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class SearchRequest { + + private String searchKeyword; + + private Map<String,Object> filter; + + private List<String> status; + + private String cc; + + private Timestamp date; + + private Boolean isJunk; + + private TicketPriority priority; + + private int offset; + + private int size; + + private Map<String, String> sort; + +} diff --git a/src/main/java/org/upsmf/grievance/dto/TicketRequest.java b/src/main/java/org/upsmf/grievance/dto/TicketRequest.java new file mode 100644 index 0000000000000000000000000000000000000000..027666da643f2240c60fc6d9a7fa396bd54e247d --- /dev/null +++ b/src/main/java/org/upsmf/grievance/dto/TicketRequest.java @@ -0,0 +1,27 @@ +package org.upsmf.grievance.dto; + +import lombok.*; +import org.upsmf.grievance.enums.RequesterType; + +import java.util.List; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Builder +@ToString(includeFieldNames = true) +public class TicketRequest { + + private String firstName; + private String lastName; + private String email; + private String phone; + private RequesterType userType; + private Long cc; + private String requestType; + private String description; + private List<String> attachmentURls; + private String otp; + +} diff --git a/src/main/java/org/upsmf/grievance/dto/UpdateTicketRequest.java b/src/main/java/org/upsmf/grievance/dto/UpdateTicketRequest.java new file mode 100644 index 0000000000000000000000000000000000000000..562c1db1d489ec169347cfa6d1c7cc9bc9313d69 --- /dev/null +++ b/src/main/java/org/upsmf/grievance/dto/UpdateTicketRequest.java @@ -0,0 +1,30 @@ +package org.upsmf.grievance.dto; + +import lombok.*; +import org.upsmf.grievance.enums.TicketPriority; +import org.upsmf.grievance.enums.TicketStatus; + +import java.util.List; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Builder +@ToString(includeFieldNames = true) +public class UpdateTicketRequest { + + private long id; + private long requestedBy; + private TicketStatus status; + private Long cc;//AssignedTo + private TicketPriority priority; + private String comment; + private List<String> assigneeAttachmentURLs; + private Boolean isJunk; + //nodal office - + // mark as resolved - status - closed, + // others cc = -1 + // junk - update status as closed, isJunk + // attachment url - +} diff --git a/src/main/java/org/upsmf/grievance/enums/ErrorCode400.java b/src/main/java/org/upsmf/grievance/enums/ErrorCode400.java new file mode 100755 index 0000000000000000000000000000000000000000..86300cf9f4198bc5e4189c5d39bf1aed88d0f540 --- /dev/null +++ b/src/main/java/org/upsmf/grievance/enums/ErrorCode400.java @@ -0,0 +1,24 @@ +package org.upsmf.grievance.enums; + +public enum ErrorCode400 { + INVALID_REQUEST("GVS-400-001","Invalid Request"), + MISSING_AUTH_TOKEN("GVS-400-002","Missing Auth Token"), + UNAUTHORIZED_REQUEST("GVS-400-003","Invalid Access Token"), + INVALID_REFRESH_TOKEN("GVS-400-004","Invalid Refresh Token"); + + private String code; + private String message; + + ErrorCode400(String code, String message) { + this.code = code; + this.message = message; + } + + public String getCode() { + return code; + } + + public String getMessage() { + return message; + } +} diff --git a/src/main/java/org/upsmf/grievance/enums/ErrorCode422.java b/src/main/java/org/upsmf/grievance/enums/ErrorCode422.java new file mode 100755 index 0000000000000000000000000000000000000000..13f6c203b47aa76be3940959cf9ce0cf1ac81726 --- /dev/null +++ b/src/main/java/org/upsmf/grievance/enums/ErrorCode422.java @@ -0,0 +1,22 @@ +package org.upsmf.grievance.enums; + +public enum ErrorCode422 { + UNABLE_TO_FETCH_PROFILE("GVS-422-001","Unable to Fetch Profile"), + NO_PROFILE_FOUND("GVS-422-002","No Profile Found"); + + private String code; + private String message; + + ErrorCode422(String code, String message) { + this.code = code; + this.message = message; + } + + public String getCode() { + return code; + } + + public String getMessage() { + return message; + } +} diff --git a/src/main/java/org/upsmf/grievance/enums/ErrorCode500.java b/src/main/java/org/upsmf/grievance/enums/ErrorCode500.java new file mode 100755 index 0000000000000000000000000000000000000000..18492648a3b37c0624dcd96b2b7dbec439dd621c --- /dev/null +++ b/src/main/java/org/upsmf/grievance/enums/ErrorCode500.java @@ -0,0 +1,23 @@ +package org.upsmf.grievance.enums; + +public enum ErrorCode500 { + + INTERNAL_SERVER_ERROR("GVS-500-999","Internal Technical Error."); + + private String code; + private String message; + + ErrorCode500(String code, String message) { + this.code = code; + this.message = message; + } + + public String getCode() { + return code; + } + + public String getMessage() { + return message; + } +} + diff --git a/src/main/java/org/upsmf/grievance/enums/RequesterType.java b/src/main/java/org/upsmf/grievance/enums/RequesterType.java new file mode 100644 index 0000000000000000000000000000000000000000..92de2018da3c4efc9ce69038d1feb4c09f05e6fd --- /dev/null +++ b/src/main/java/org/upsmf/grievance/enums/RequesterType.java @@ -0,0 +1,15 @@ +package org.upsmf.grievance.enums; + +public enum RequesterType { + + CANDIDATE(1), INSTITUTE(2), FACULTY(3), OTHERS(4); + + private int id; + RequesterType(int id) { + this.id = id; + } + + public int getId() { + return id; + } +} diff --git a/src/main/java/org/upsmf/grievance/enums/TicketPriority.java b/src/main/java/org/upsmf/grievance/enums/TicketPriority.java new file mode 100644 index 0000000000000000000000000000000000000000..6f03727e12373e35c989197cc0cc9c4bf2a64173 --- /dev/null +++ b/src/main/java/org/upsmf/grievance/enums/TicketPriority.java @@ -0,0 +1,13 @@ +package org.upsmf.grievance.enums; + +public enum TicketPriority { + + HIGH(1), MEDIUM(2), LOW(3); + + private int id; + + + TicketPriority(int id) { + this.id = id; + } +} diff --git a/src/main/java/org/upsmf/grievance/enums/TicketStatus.java b/src/main/java/org/upsmf/grievance/enums/TicketStatus.java new file mode 100644 index 0000000000000000000000000000000000000000..8037f4eb414c590e04b3cbfa9cd9388122080bc9 --- /dev/null +++ b/src/main/java/org/upsmf/grievance/enums/TicketStatus.java @@ -0,0 +1,12 @@ +package org.upsmf.grievance.enums; + +public enum TicketStatus { + + OPEN(1), CLOSED(2); + + private int id; + + TicketStatus(int id) { + this.id = id; + } +} diff --git a/src/main/java/org/upsmf/grievance/exception/controller/ExceptionHandler4xxController.java b/src/main/java/org/upsmf/grievance/exception/controller/ExceptionHandler4xxController.java new file mode 100644 index 0000000000000000000000000000000000000000..04cfd2275ca101cac7116971aee0061b01868bdf --- /dev/null +++ b/src/main/java/org/upsmf/grievance/exception/controller/ExceptionHandler4xxController.java @@ -0,0 +1,24 @@ +package org.upsmf.grievance.exception.controller; + +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.upsmf.grievance.dto.ErrorResponseDto; +import org.upsmf.grievance.exception.runtime.InvalidRequestException; + +@ControllerAdvice +public class ExceptionHandler4xxController { + + /** + * Exception handler for Invalid request exception + * @param e + * @return + */ + @ExceptionHandler(value = InvalidRequestException.class) + @ResponseStatus(HttpStatus.BAD_REQUEST) + public ErrorResponseDto handleInvalidRequestException(InvalidRequestException e) { + return new ErrorResponseDto(HttpStatus.BAD_REQUEST.value(), e.getMessage()); + } + +} diff --git a/src/main/java/org/upsmf/grievance/exception/runtime/InvalidRequestException.java b/src/main/java/org/upsmf/grievance/exception/runtime/InvalidRequestException.java new file mode 100644 index 0000000000000000000000000000000000000000..88546852c0822a4e776ed04c2ddc94d5f2c74e62 --- /dev/null +++ b/src/main/java/org/upsmf/grievance/exception/runtime/InvalidRequestException.java @@ -0,0 +1,14 @@ +package org.upsmf.grievance.exception.runtime; + +public class InvalidRequestException extends RuntimeException { + + private String message; + + public InvalidRequestException() { + } + + public InvalidRequestException(String msg) { + super(msg); + this.message = msg; + } +} diff --git a/src/main/java/org/upsmf/grievance/model/AssigneeTicketAttachment.java b/src/main/java/org/upsmf/grievance/model/AssigneeTicketAttachment.java new file mode 100644 index 0000000000000000000000000000000000000000..98c90cf51ac22f784f5a225ea0d5e691a2665d35 --- /dev/null +++ b/src/main/java/org/upsmf/grievance/model/AssigneeTicketAttachment.java @@ -0,0 +1,28 @@ +package org.upsmf.grievance.model; + +import lombok.*; + +import javax.persistence.*; + +@Entity +@Table(name ="ticket_assignee_attachment") +@Data +@Builder +@ToString +@AllArgsConstructor +@NoArgsConstructor +public class AssigneeTicketAttachment { + + @Id() + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "ticket_id") + private Long ticketId; + + @Column(name = "user_id", nullable = false) + private Long userId; + + @Column(name = "attachment_url", nullable = false) + private String attachment_url; +} diff --git a/src/main/java/org/upsmf/grievance/model/Comments.java b/src/main/java/org/upsmf/grievance/model/Comments.java new file mode 100644 index 0000000000000000000000000000000000000000..120a715aecd376e39b341b11c0f3242880135598 --- /dev/null +++ b/src/main/java/org/upsmf/grievance/model/Comments.java @@ -0,0 +1,28 @@ +package org.upsmf.grievance.model; + +import lombok.*; + +import javax.persistence.*; + +@Entity +@Table(name ="ticket_comments") +@Data +@Builder +@ToString +@AllArgsConstructor +@NoArgsConstructor +public class Comments { + + @Id() + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "ticket_id", nullable = false) + private Long ticketId; + + @Column(name = "user_id", nullable = false) + private Long userId; + + @Column(name = "comment", nullable = false) + private String comment; +} diff --git a/src/main/java/org/upsmf/grievance/model/EmailDetails.java b/src/main/java/org/upsmf/grievance/model/EmailDetails.java new file mode 100644 index 0000000000000000000000000000000000000000..c09ef12e6a874baa2d960b2e07150c52e5d82106 --- /dev/null +++ b/src/main/java/org/upsmf/grievance/model/EmailDetails.java @@ -0,0 +1,16 @@ +package org.upsmf.grievance.model; + +import lombok.*; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +@ToString +public class EmailDetails { + + private String recipient; + private String msgBody; + private String subject; + private String attachment; +} diff --git a/src/main/java/org/upsmf/grievance/model/OtpRequest.java b/src/main/java/org/upsmf/grievance/model/OtpRequest.java new file mode 100644 index 0000000000000000000000000000000000000000..a57821eba6cd55e0e72be67afcf54cfb5ca5f01a --- /dev/null +++ b/src/main/java/org/upsmf/grievance/model/OtpRequest.java @@ -0,0 +1,16 @@ +package org.upsmf.grievance.model; + +import lombok.*; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@ToString(includeFieldNames = true) +public class OtpRequest { + + private String email; + private String phone; + private String name; + +} diff --git a/src/main/java/org/upsmf/grievance/model/OtpValidationRequest.java b/src/main/java/org/upsmf/grievance/model/OtpValidationRequest.java new file mode 100644 index 0000000000000000000000000000000000000000..92093c2b3896c21bfa13bd01f93197753e966255 --- /dev/null +++ b/src/main/java/org/upsmf/grievance/model/OtpValidationRequest.java @@ -0,0 +1,15 @@ +package org.upsmf.grievance.model; + + +import lombok.*; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@ToString(includeFieldNames = true) +public class OtpValidationRequest { + + private String email; + private String otp; +} diff --git a/src/main/java/org/upsmf/grievance/model/RaiserTicketAttachment.java b/src/main/java/org/upsmf/grievance/model/RaiserTicketAttachment.java new file mode 100644 index 0000000000000000000000000000000000000000..1130b1406488f59a904c52dd265d1f12362c79bd --- /dev/null +++ b/src/main/java/org/upsmf/grievance/model/RaiserTicketAttachment.java @@ -0,0 +1,25 @@ +package org.upsmf.grievance.model; + +import lombok.*; + +import javax.persistence.*; + +@Entity +@Table(name ="ticket_raiser_attachments") +@Data +@Builder +@ToString +@AllArgsConstructor +@NoArgsConstructor +public class RaiserTicketAttachment { + + @Id() + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "ticket_id", nullable = false) + private Long ticketId; + + @Column(name = "attachment_url", nullable = false) + private String attachment_url; +} diff --git a/src/main/java/org/upsmf/grievance/model/RedisTicketData.java b/src/main/java/org/upsmf/grievance/model/RedisTicketData.java new file mode 100644 index 0000000000000000000000000000000000000000..ef8858418fa3dc6c5bb558e4f57edab36d4bd3f4 --- /dev/null +++ b/src/main/java/org/upsmf/grievance/model/RedisTicketData.java @@ -0,0 +1,24 @@ +package org.upsmf.grievance.model; + +import lombok.*; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@ToString(includeFieldNames = true) +public class RedisTicketData { + + private String email; + private Long ticketId; + + private String date; + + private String emailOtp; + + private String mobileOtp; + + private String phoneNumber; + + +} diff --git a/src/main/java/org/upsmf/grievance/model/Ticket.java b/src/main/java/org/upsmf/grievance/model/Ticket.java new file mode 100644 index 0000000000000000000000000000000000000000..5df9cdc74860c8bb9296ee165982e9ca67359daa --- /dev/null +++ b/src/main/java/org/upsmf/grievance/model/Ticket.java @@ -0,0 +1,94 @@ +package org.upsmf.grievance.model; + +import lombok.*; +import org.hibernate.annotations.Fetch; +import org.hibernate.annotations.FetchMode; +import org.upsmf.grievance.enums.RequesterType; +import org.upsmf.grievance.enums.TicketPriority; +import org.upsmf.grievance.enums.TicketStatus; + +import javax.persistence.*; +import java.sql.Timestamp; +import java.util.List; + +@Entity +@Table(name = "ticket") +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@Builder +@ToString +public class Ticket { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + @Column(name = "requester_first_name") + private String firstName; + + @Column(name = "requester_last_name") + private String lastName; + + @Column(name = "requester_phone") + private String phone; + + @Column(name = "requester_email") + private String email; + + @Column(name = "requester_type") + private RequesterType requesterType; + + @Column(name = "assigned_to_id") + private Long assignedToId; + + @Column(name = "description") + private String description; + + @Column(name = "is_junk") + private boolean junk = false; + + @Column(name = "created_date") + private Timestamp createdDate; + + @Column(name = "updated_date") + private Timestamp updatedDate; + + @Column(name = "last_updated_by") + private Long lastUpdatedBy; + + @Column(name = "is_escalated") + private boolean escalated; + + @Column(name = "escalated_date") + private Timestamp escalatedDate; + + @Column(name = "escalated_to") + private Long escalatedTo; + + @Column(name = "status") + private TicketStatus status = TicketStatus.OPEN; + + @Column(name = "request_type") + private String requestType; + + @Column(name = "priority") + private TicketPriority priority = TicketPriority.LOW; + + // if the ticket is escalated by system, value will be -1 else superAdmin ID + @Column(name = "escalated_by") + private Long escalatedBy = -1L; + + @OneToMany(targetEntity = Comments.class, mappedBy = "ticketId", fetch = FetchType.EAGER) + @Fetch(value = FetchMode.SUBSELECT) + private List<Comments> comments; + + @OneToMany(targetEntity = RaiserTicketAttachment.class, mappedBy = "ticketId", fetch = FetchType.EAGER) + @Fetch(value = FetchMode.SUBSELECT) + private List<RaiserTicketAttachment> raiserTicketAttachmentURLs; + + @OneToMany(targetEntity = AssigneeTicketAttachment.class, mappedBy = "ticketId", fetch = FetchType.EAGER) + @Fetch(value = FetchMode.SUBSELECT) + private List<AssigneeTicketAttachment> assigneeTicketAttachment; +} diff --git a/src/main/java/org/upsmf/grievance/model/es/Feedback.java b/src/main/java/org/upsmf/grievance/model/es/Feedback.java new file mode 100644 index 0000000000000000000000000000000000000000..3c4c2aa572bfa613606d5ee9bd01e3c53072fe84 --- /dev/null +++ b/src/main/java/org/upsmf/grievance/model/es/Feedback.java @@ -0,0 +1,37 @@ +package org.upsmf.grievance.model.es; + +import lombok.*; +import org.springframework.data.annotation.Id; +import org.springframework.data.elasticsearch.annotations.Document; +import org.springframework.data.elasticsearch.annotations.Field; + +@Document(indexName = "feedback") +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Builder +@ToString +public class Feedback { + + @Id + private Long id; + + @Field(name = "first_name") + private String firstName; + + @Field(name = "last_name") + private String lastName; + + @Field(name = "phone") + private String phone; + + @Field(name = "email") + private String email; + + @Field(name = "rating") + private Integer rating; + + @Field(name = "comment") + private String comment; +} diff --git a/src/main/java/org/upsmf/grievance/model/es/Ticket.java b/src/main/java/org/upsmf/grievance/model/es/Ticket.java new file mode 100644 index 0000000000000000000000000000000000000000..af1d1930d2f5fa6dcbfefba6b62bd3510d2ed53c --- /dev/null +++ b/src/main/java/org/upsmf/grievance/model/es/Ticket.java @@ -0,0 +1,102 @@ +package org.upsmf.grievance.model.es; + +import lombok.*; +import org.springframework.data.annotation.Id; +import org.springframework.data.elasticsearch.annotations.Document; +import org.springframework.data.elasticsearch.annotations.Field; +import org.upsmf.grievance.enums.RequesterType; +import org.upsmf.grievance.enums.TicketPriority; +import org.upsmf.grievance.enums.TicketStatus; + +@Document(indexName = "ticket", createIndex = false) +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@Builder +@ToString(includeFieldNames = true) +public class Ticket { + + @Id + private String id; + + @Field(name = "ticket_id") + private Long ticketId; + + @Field(name = "requester_first_name") + private String firstName; + + @Field(name = "requester_last_name") + private String lastName; + + @Field(name = "requester_phone") + private String phone; + + @Field(name = "requester_email") + private String email; + + @Field(name = "requester_type") + private RequesterType requesterType; + + @Field(name = "assigned_to_id") + private Long assignedToId; + + @Field(name = "assigned_to_name") + private String assignedToName; + + @Field(name = "description") + private String description; + + @Field(name = "is_junk") + private Boolean junk = false; + + @Field(name = "created_date") + private String createdDate; + + @Field(name = "updated_date") + private String updatedDate; + + @Field(name = "created_date_ts") + private Long createdDateTS; + + @Field(name = "updated_date_ts") + private Long updatedDateTS; + + @Field(name = "last_updated_by") + private Long lastUpdatedBy; + + @Field(name = "is_escalated") + private Boolean escalated; + + @Field(name = "escalated_date") + private String escalatedDate; + + @Field(name = "escalated_date_ts") + private Long escalatedDateTS; + + @Field(name = "escalated_to") + private Long escalatedTo; + + @Field(name = "status") + private TicketStatus status = TicketStatus.OPEN; + + @Field(name = "request_type") + private String requestType; + + @Field(name = "priority") + private TicketPriority priority = TicketPriority.LOW; + + // if the ticket is escalated by system, value will be -1 else superAdmin ID + @Field(name = "escalated_by") + private Long escalatedBy = -1L; + + /* @Field(name = "comments") + private List<Comments> comments; + + @Field(name = "raiser_attachment_urls") + private String raiserAttachmentURLs; + + @Field(name = "assignee_attachment_urls") + private String assigneeAttachmentURLs;*/ + +} diff --git a/src/main/java/org/upsmf/grievance/model/reponse/FeedbackResponse.java b/src/main/java/org/upsmf/grievance/model/reponse/FeedbackResponse.java new file mode 100644 index 0000000000000000000000000000000000000000..f42339bf64ae2d618eb5d40ab27545034dc4f882 --- /dev/null +++ b/src/main/java/org/upsmf/grievance/model/reponse/FeedbackResponse.java @@ -0,0 +1,15 @@ +package org.upsmf.grievance.model.reponse; + +import lombok.Builder; +import lombok.Data; +import org.upsmf.grievance.model.es.Feedback; + +import java.util.List; + +@Data +@Builder +public class FeedbackResponse { + + private int count; + private List<Feedback> data; +} diff --git a/src/main/java/org/upsmf/grievance/model/reponse/Response.java b/src/main/java/org/upsmf/grievance/model/reponse/Response.java new file mode 100644 index 0000000000000000000000000000000000000000..480ebd1aa8c1116072603773d4843d37f15d0c19 --- /dev/null +++ b/src/main/java/org/upsmf/grievance/model/reponse/Response.java @@ -0,0 +1,14 @@ +package org.upsmf.grievance.model.reponse; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class Response { + + private int status; + + private Object body; + +} diff --git a/src/main/java/org/upsmf/grievance/model/reponse/TicketResponse.java b/src/main/java/org/upsmf/grievance/model/reponse/TicketResponse.java new file mode 100644 index 0000000000000000000000000000000000000000..3cb19c90ba51dfe8d6bbbd0e3840041587d090d4 --- /dev/null +++ b/src/main/java/org/upsmf/grievance/model/reponse/TicketResponse.java @@ -0,0 +1,14 @@ +package org.upsmf.grievance.model.reponse; + +import lombok.Builder; +import lombok.Data; +import org.upsmf.grievance.model.es.Ticket; + +import java.util.List; + +@Builder +@Data +public class TicketResponse { + private List<Ticket> data; + private Long count; +} diff --git a/src/main/java/org/upsmf/grievance/repository/.DS_Store b/src/main/java/org/upsmf/grievance/repository/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..8d7d653c8e24dace65cf6ca705aa80970795e4ab Binary files /dev/null and b/src/main/java/org/upsmf/grievance/repository/.DS_Store differ diff --git a/src/main/java/org/upsmf/grievance/repository/AssigneeTicketAttachmentRepository.java b/src/main/java/org/upsmf/grievance/repository/AssigneeTicketAttachmentRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..987d2954d81d0a15bfa64c461cf1228635baecd5 --- /dev/null +++ b/src/main/java/org/upsmf/grievance/repository/AssigneeTicketAttachmentRepository.java @@ -0,0 +1,9 @@ +package org.upsmf.grievance.repository; + +import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Repository; +import org.upsmf.grievance.model.AssigneeTicketAttachment; + +@Repository +public interface AssigneeTicketAttachmentRepository extends CrudRepository<AssigneeTicketAttachment, Long> { +} diff --git a/src/main/java/org/upsmf/grievance/repository/CommentRepository.java b/src/main/java/org/upsmf/grievance/repository/CommentRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..f1e1e2409cb1e65d0b01f12a40ce33e52bf65dfa --- /dev/null +++ b/src/main/java/org/upsmf/grievance/repository/CommentRepository.java @@ -0,0 +1,9 @@ +package org.upsmf.grievance.repository; + +import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Repository; +import org.upsmf.grievance.model.Comments; + +@Repository +public interface CommentRepository extends CrudRepository<Comments, Long> { +} diff --git a/src/main/java/org/upsmf/grievance/repository/RaiserTicketAttachmentRepository.java b/src/main/java/org/upsmf/grievance/repository/RaiserTicketAttachmentRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..04e73901330094a2075665a8399b28210da68019 --- /dev/null +++ b/src/main/java/org/upsmf/grievance/repository/RaiserTicketAttachmentRepository.java @@ -0,0 +1,9 @@ +package org.upsmf.grievance.repository; + +import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Repository; +import org.upsmf.grievance.model.RaiserTicketAttachment; + +@Repository +public interface RaiserTicketAttachmentRepository extends CrudRepository<RaiserTicketAttachment, Long> { +} diff --git a/src/main/java/org/upsmf/grievance/repository/TicketRepository.java b/src/main/java/org/upsmf/grievance/repository/TicketRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..84fd518e6dc43bf6435791489b92898c6ae375b1 --- /dev/null +++ b/src/main/java/org/upsmf/grievance/repository/TicketRepository.java @@ -0,0 +1,9 @@ +package org.upsmf.grievance.repository; + +import org.springframework.context.annotation.Configuration; +import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Repository; + +@Repository("ticketRepository") +public interface TicketRepository extends CrudRepository<org.upsmf.grievance.model.Ticket, Long> { +} diff --git a/src/main/java/org/upsmf/grievance/repository/es/FeedbackRepository.java b/src/main/java/org/upsmf/grievance/repository/es/FeedbackRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..e17dc1724bd823819cc68dca47ac0a39922e41a0 --- /dev/null +++ b/src/main/java/org/upsmf/grievance/repository/es/FeedbackRepository.java @@ -0,0 +1,9 @@ +package org.upsmf.grievance.repository.es; + +import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; +import org.springframework.stereotype.Repository; +import org.upsmf.grievance.model.es.Feedback; + +@Repository +public interface FeedbackRepository extends ElasticsearchRepository<Feedback, String> { +} diff --git a/src/main/java/org/upsmf/grievance/repository/es/TicketRepository.java b/src/main/java/org/upsmf/grievance/repository/es/TicketRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..8423330e6a43d2f758f1b67fc9dfaec8930d3372 --- /dev/null +++ b/src/main/java/org/upsmf/grievance/repository/es/TicketRepository.java @@ -0,0 +1,16 @@ +package org.upsmf.grievance.repository.es; + +import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; +import org.upsmf.grievance.model.es.Ticket; + +import java.util.Optional; + +@Repository("esTicketRepository") +public interface TicketRepository extends ElasticsearchRepository<Ticket, String> { + @Query("{'ticket_id': ?0}") + Optional<Ticket> findOneByTicketId(long id); + + +} diff --git a/src/main/java/org/upsmf/grievance/service/.DS_Store b/src/main/java/org/upsmf/grievance/service/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..00b0945c8fb3b31bf223c60f5862a024f4d47ee8 Binary files /dev/null and b/src/main/java/org/upsmf/grievance/service/.DS_Store differ diff --git a/src/main/java/org/upsmf/grievance/service/AttachmentService.java b/src/main/java/org/upsmf/grievance/service/AttachmentService.java new file mode 100644 index 0000000000000000000000000000000000000000..141c62828181df0b10de8b31dcc6ca820c0026df --- /dev/null +++ b/src/main/java/org/upsmf/grievance/service/AttachmentService.java @@ -0,0 +1,10 @@ +package org.upsmf.grievance.service; + +import org.upsmf.grievance.dto.FileUploadRequest; + +import java.io.IOException; + +public interface AttachmentService { + + void uploadObject(FileUploadRequest fileUploadRequest); +} diff --git a/src/main/java/org/upsmf/grievance/service/EmailService.java b/src/main/java/org/upsmf/grievance/service/EmailService.java new file mode 100644 index 0000000000000000000000000000000000000000..715ae337ba5ce65b5ab0894e13c98a934f6a6dc9 --- /dev/null +++ b/src/main/java/org/upsmf/grievance/service/EmailService.java @@ -0,0 +1,14 @@ +package org.upsmf.grievance.service; + +import org.upsmf.grievance.model.EmailDetails; + +public interface EmailService { + + // Method + // To send a simple email + void sendSimpleMail(EmailDetails details); + + // Method + // To send an email with attachment + void sendMailWithAttachment(EmailDetails details); +} diff --git a/src/main/java/org/upsmf/grievance/service/FeedbackService.java b/src/main/java/org/upsmf/grievance/service/FeedbackService.java new file mode 100644 index 0000000000000000000000000000000000000000..dedb90ff2eae9de276012013108d4127dc40b682 --- /dev/null +++ b/src/main/java/org/upsmf/grievance/service/FeedbackService.java @@ -0,0 +1,11 @@ +package org.upsmf.grievance.service; + +import org.upsmf.grievance.dto.FeedbackDto; +import org.upsmf.grievance.model.reponse.FeedbackResponse; + +public interface FeedbackService { + + public void saveFeedback(FeedbackDto feedbackDto); + + public FeedbackResponse getFeedbacks(); +} diff --git a/src/main/java/org/upsmf/grievance/service/OtpService.java b/src/main/java/org/upsmf/grievance/service/OtpService.java new file mode 100644 index 0000000000000000000000000000000000000000..0758d6125af46b77bf8e922df8705c10155a8367 --- /dev/null +++ b/src/main/java/org/upsmf/grievance/service/OtpService.java @@ -0,0 +1,12 @@ +package org.upsmf.grievance.service; + +import org.springframework.stereotype.Service; +import org.upsmf.grievance.model.OtpRequest; + +@Service +public interface OtpService { + + String generateAndSendOtp(OtpRequest otpRequest); + boolean validateOtp(String email, String otp); + void sendGenericEmail(String email, String subject, String mailBody); +} diff --git a/src/main/java/org/upsmf/grievance/service/SearchService.java b/src/main/java/org/upsmf/grievance/service/SearchService.java new file mode 100644 index 0000000000000000000000000000000000000000..1ff264eeedc78f4f6053ab340890782ef0241200 --- /dev/null +++ b/src/main/java/org/upsmf/grievance/service/SearchService.java @@ -0,0 +1,11 @@ +package org.upsmf.grievance.service; + +import org.upsmf.grievance.model.es.Ticket; +import org.upsmf.grievance.dto.SearchRequest; +import org.upsmf.grievance.model.reponse.TicketResponse; + +import java.util.Optional; + +public interface SearchService { + TicketResponse search(SearchRequest searchRequest); +} \ No newline at end of file diff --git a/src/main/java/org/upsmf/grievance/service/TicketService.java b/src/main/java/org/upsmf/grievance/service/TicketService.java new file mode 100644 index 0000000000000000000000000000000000000000..11884f93c14b911c2189627dbe891c7f12771ae5 --- /dev/null +++ b/src/main/java/org/upsmf/grievance/service/TicketService.java @@ -0,0 +1,16 @@ +package org.upsmf.grievance.service; + +import org.upsmf.grievance.model.Ticket; +import org.upsmf.grievance.dto.TicketRequest; +import org.upsmf.grievance.dto.UpdateTicketRequest; + +public interface TicketService { + + Ticket save(Ticket ticket); + + Ticket save(TicketRequest ticketRequest) throws Exception; + + Ticket update(UpdateTicketRequest updateTicketRequest); + + Ticket getTicketById(long id); +} diff --git a/src/main/java/org/upsmf/grievance/service/impl/.DS_Store b/src/main/java/org/upsmf/grievance/service/impl/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 Binary files /dev/null and b/src/main/java/org/upsmf/grievance/service/impl/.DS_Store differ diff --git a/src/main/java/org/upsmf/grievance/service/impl/AttachmentServiceImpl.java b/src/main/java/org/upsmf/grievance/service/impl/AttachmentServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..1d4636b52f4416bb2fb76b46695bafcb0885a0e8 --- /dev/null +++ b/src/main/java/org/upsmf/grievance/service/impl/AttachmentServiceImpl.java @@ -0,0 +1,65 @@ +package org.upsmf.grievance.service.impl; + +import com.google.auth.oauth2.ServiceAccountCredentials; +import com.google.cloud.storage.*; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.upsmf.grievance.dto.FileUploadRequest; +import org.upsmf.grievance.service.AttachmentService; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; + +@Service +@Slf4j +public class AttachmentServiceImpl implements AttachmentService { + + @Value("${gcp.config.file.path}") + private String gcpConfigFilePath; + + @Value("${gcp.bucket.name}") + private String gcpBucketName; + + @Value("${gcp.bucket.folder.name}") + private String gcpFolderName; + + @Value("${gcp.max.file.size}") + private String gcpMaxFileSize; + + @Value("${gcp.project.id}") + private String gcpProjectId; + + @Value("${gcp.client.id}") + private String gcpClientId; + + @Value("${gcp.client.email}") + private String gcpClientEmail; + + @Value("${gcp.pkcs.key}") + private String gcpPkcsKey; + + @Value("${gcp.private.key.id}") + private String gcpPrivateKeyId; + + @Override + public void uploadObject(FileUploadRequest fileUploadRequest) { + try { + Path filePath = Files.createTempFile(fileUploadRequest.getFileName().split(".")[0], fileUploadRequest.getFileName().split(".")[1]); + ServiceAccountCredentials credentials = ServiceAccountCredentials.fromPkcs8(gcpClientId, gcpClientEmail, + gcpPkcsKey, gcpPrivateKeyId, new java.util.ArrayList<String>()); + System.out.println("credentials created"); + Storage storage = StorageOptions.newBuilder().setProjectId(gcpProjectId).setCredentials(credentials).build().getService(); + System.out.println("storage object created"); + BlobId blobId = BlobId.of(gcpBucketName, fileUploadRequest.getFileName()); + BlobInfo blobInfo = BlobInfo.newBuilder(blobId).build(); + Blob blob = storage.createFrom(blobInfo, filePath); + // TODO return correct response after testing + System.out.println(blob); + } catch (IOException e) { + log.error("Error while uploading attachment", e); + } + } + +} diff --git a/src/main/java/org/upsmf/grievance/service/impl/EmailServiceImpl.java b/src/main/java/org/upsmf/grievance/service/impl/EmailServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..154b1d8af915030c263a48dda52c82b06609dc93 --- /dev/null +++ b/src/main/java/org/upsmf/grievance/service/impl/EmailServiceImpl.java @@ -0,0 +1,82 @@ +package org.upsmf.grievance.service.impl; + +// Importing required classes +import java.io.File; +import javax.mail.MessagingException; +import javax.mail.internet.MimeMessage; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.io.FileSystemResource; +import org.springframework.mail.SimpleMailMessage; +import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.mail.javamail.MimeMessageHelper; +import org.springframework.stereotype.Service; +import org.upsmf.grievance.model.EmailDetails; +import org.upsmf.grievance.service.EmailService; + +// Annotation +@Service +@Slf4j +// Class +// Implementing EmailService interface +public class EmailServiceImpl implements EmailService { + + @Autowired private JavaMailSender javaMailSender; + + @Value("${spring.mail.username}") private String sender; + + // Method 1 + // To send a simple email + @Override + public void sendSimpleMail(EmailDetails details) + { + // Try block to check for exceptions + try { + // Creating a simple mail message + SimpleMailMessage mailMessage = new SimpleMailMessage(); + // Setting up necessary details + mailMessage.setFrom(sender); + mailMessage.setTo(details.getRecipient()); + mailMessage.setText(details.getMsgBody()); + mailMessage.setSubject(details.getSubject()); + // Sending the mail + javaMailSender.send(mailMessage); + log.info("Mail Sent Successfully..."); + } + // Catch block to handle the exceptions + catch (Exception e) { + log.error("Error while Sending Mail", e); + } + } + + // Method 2 + // To send an email with attachment + @Override + public void sendMailWithAttachment(EmailDetails details) + { + // Creating a mime message + MimeMessage mimeMessage = javaMailSender.createMimeMessage(); + MimeMessageHelper mimeMessageHelper; + try { + // Setting multipart as true for attachments tobe send + mimeMessageHelper = new MimeMessageHelper(mimeMessage, true); + mimeMessageHelper.setFrom(sender); + mimeMessageHelper.setTo(details.getRecipient()); + mimeMessageHelper.setText(details.getMsgBody()); + mimeMessageHelper.setSubject(details.getSubject()); + // Adding the attachment + FileSystemResource file = new FileSystemResource(new File(details.getAttachment())); + mimeMessageHelper.addAttachment(file.getFilename(), file); + // Sending the mail + javaMailSender.send(mimeMessage); + log.info("Mail Sent Successfully..."); + } + // Catch block to handle MessagingException + catch (MessagingException e) { + // Display message when exception occurred + log.error("Error while Sending Mail with attachment", e); + } + } +} diff --git a/src/main/java/org/upsmf/grievance/service/impl/FeedbackServiceImpl.java b/src/main/java/org/upsmf/grievance/service/impl/FeedbackServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..50e5479961cf0771bcb866da9842076982826b10 --- /dev/null +++ b/src/main/java/org/upsmf/grievance/service/impl/FeedbackServiceImpl.java @@ -0,0 +1,41 @@ +package org.upsmf.grievance.service.impl; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.upsmf.grievance.dto.FeedbackDto; +import org.upsmf.grievance.model.es.Feedback; +import org.upsmf.grievance.model.reponse.FeedbackResponse; +import org.upsmf.grievance.repository.es.FeedbackRepository; +import org.upsmf.grievance.service.FeedbackService; + +@Service +public class FeedbackServiceImpl implements FeedbackService { + + @Value("${es.default.page.size}") + private int defaultPageSize; + + @Autowired + private FeedbackRepository feedbackRepository; + + @Override + public void saveFeedback(FeedbackDto feedbackDto) { + // TODO validate request -- all fields are mandatory except comment + Feedback feedback = Feedback.builder() + .firstName(feedbackDto.getFirstName()) + .lastName(feedbackDto.getLastName()) + .email(feedbackDto.getEmail()) + .phone(feedbackDto.getPhone()) + .rating(feedbackDto.getRating()) + .comment(feedbackDto.getComment()!=null?feedbackDto.getComment():"").build(); + feedbackRepository.save(feedback); + } + + @Override + public FeedbackResponse getFeedbacks() { + Page<Feedback> page = feedbackRepository.findAll(Pageable.ofSize(defaultPageSize)); + return FeedbackResponse.builder().count(page.getNumberOfElements()).data(page.getContent()).build(); + } +} diff --git a/src/main/java/org/upsmf/grievance/service/impl/OtpServiceImpl.java b/src/main/java/org/upsmf/grievance/service/impl/OtpServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..e0ee6bba9bb695ab0bf74572985162abfbdf0dc6 --- /dev/null +++ b/src/main/java/org/upsmf/grievance/service/impl/OtpServiceImpl.java @@ -0,0 +1,117 @@ +package org.upsmf.grievance.service.impl; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.mail.SimpleMailMessage; +import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.stereotype.Service; +import org.upsmf.grievance.model.OtpRequest; +import org.upsmf.grievance.model.RedisTicketData; +import org.upsmf.grievance.service.OtpService; + +import java.util.concurrent.TimeUnit; + +@Service(value = "OtpService") +public class OtpServiceImpl implements OtpService { + + @Autowired + private StringRedisTemplate redisTemplate; + + @Autowired + private JavaMailSender mailSender; + + @Value("${otp.expiration.minutes}") + private int otpExpirationMinutes; + + @Autowired + public OtpServiceImpl(StringRedisTemplate redisTemplate, JavaMailSender mailSender) { + this.redisTemplate = redisTemplate; + this.mailSender = mailSender; + } + + @Override + public String generateAndSendOtp(OtpRequest otpRequest) { + String email = otpRequest.getEmail(); + String otp = generateOtp(); + String mobileOtp= generateOtp(); + RedisTicketData redisTicketData = new RedisTicketData(); + redisTicketData.setEmail(email); + redisTicketData.setPhoneNumber(otpRequest.getPhone()); + redisTicketData.setEmailOtp(otp); + redisTicketData.setMobileOtp(mobileOtp); + + String redisKey = "otp:" + email; + redisTemplate.opsForValue().set(redisKey, toJson(redisTicketData), otpExpirationMinutes, TimeUnit.MINUTES); + + sendOtpEmail(email, otp); + return otp; + } + + @Override + public boolean validateOtp(String email, String enteredOtp) { + String redisKey = "otp:" + email; + String redisData = redisTemplate.opsForValue().get(redisKey); + if (redisData != null) { + RedisTicketData ticketData = fromJson(redisData, RedisTicketData.class); + if (ticketData.getEmailOtp().equals(enteredOtp)) { + // Remove the data from Redis after successful validation + redisTemplate.delete(redisKey); + return true; + } + } + return false; + } + + private String toJson(Object obj) { + try { + ObjectMapper objectMapper = new ObjectMapper(); + return objectMapper.writeValueAsString(obj); + } catch (JsonProcessingException e) { + // Handle the exception + return null; + } + } + + private <T> T fromJson(String json, Class<T> valueType) { + try { + ObjectMapper objectMapper = new ObjectMapper(); + return objectMapper.readValue(json, valueType); + } catch (JsonProcessingException e) { + // Handle the exception + return null; + } + } + + + private String generateOtp() { + int otpLength = 6; + StringBuilder otp = new StringBuilder(); + + for (int i = 0; i < otpLength; i++) { + int digit = (int) (Math.random() * 10); + otp.append(digit); + } + + return otp.toString(); + } + + private void sendOtpEmail(String email, String otp) { + SimpleMailMessage message = new SimpleMailMessage(); + message.setTo(email); + message.setSubject("Your OTP for Ticket Creation"); + message.setText("Your OTP is: " + otp); + mailSender.send(message); + } + + @Override + public void sendGenericEmail(String email, String subject, String mailBody) { + SimpleMailMessage message = new SimpleMailMessage(); + message.setTo(email); + message.setSubject(subject); + message.setText(mailBody); + mailSender.send(message); + } +} diff --git a/src/main/java/org/upsmf/grievance/service/impl/SearchServiceImpl.java b/src/main/java/org/upsmf/grievance/service/impl/SearchServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..3439b8d5fa6b47e93ec0810fc14cb390f5709a61 --- /dev/null +++ b/src/main/java/org/upsmf/grievance/service/impl/SearchServiceImpl.java @@ -0,0 +1,36 @@ +package org.upsmf.grievance.service.impl; + +import org.elasticsearch.index.query.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.elasticsearch.core.ElasticsearchOperations; +import org.springframework.data.elasticsearch.core.SearchHits; +import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; +import org.springframework.data.elasticsearch.core.query.Query; +import org.springframework.stereotype.Service; +import org.upsmf.grievance.model.es.Feedback; +import org.upsmf.grievance.model.es.Ticket; +import org.upsmf.grievance.dto.SearchRequest; +import org.upsmf.grievance.model.reponse.TicketResponse; +import org.upsmf.grievance.repository.es.TicketRepository; +import org.upsmf.grievance.service.SearchService; + +import java.util.Optional; + +@Service +public class SearchServiceImpl implements SearchService { + + @Value("${es.default.page.size}") + private int defaultPageSize; + @Autowired + private TicketRepository esTicketRepository; + + @Override + public TicketResponse search(SearchRequest searchRequest) { + Page<Ticket> page = esTicketRepository.findAll(Pageable.ofSize(defaultPageSize)); + return TicketResponse.builder().count(page.getTotalElements()).data(page.getContent()).build(); + } + +} \ No newline at end of file diff --git a/src/main/java/org/upsmf/grievance/service/impl/TicketServiceImpl.java b/src/main/java/org/upsmf/grievance/service/impl/TicketServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..e683f5ba28c4353dc0c920af10e7d7c8761a8c80 --- /dev/null +++ b/src/main/java/org/upsmf/grievance/service/impl/TicketServiceImpl.java @@ -0,0 +1,275 @@ +package org.upsmf.grievance.service.impl; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.stereotype.Service; +import org.upsmf.grievance.dto.TicketRequest; +import org.upsmf.grievance.dto.UpdateTicketRequest; +import org.upsmf.grievance.enums.TicketPriority; +import org.upsmf.grievance.enums.TicketStatus; +import org.upsmf.grievance.model.AssigneeTicketAttachment; +import org.upsmf.grievance.model.Comments; +import org.upsmf.grievance.model.RaiserTicketAttachment; +import org.upsmf.grievance.model.Ticket; +import org.upsmf.grievance.repository.AssigneeTicketAttachmentRepository; +import org.upsmf.grievance.repository.CommentRepository; +import org.upsmf.grievance.repository.RaiserTicketAttachmentRepository; +import org.upsmf.grievance.repository.es.TicketRepository; +import org.upsmf.grievance.service.OtpService; +import org.upsmf.grievance.service.TicketService; +import org.upsmf.grievance.util.DateUtil; + +import javax.transaction.Transactional; +import java.sql.Timestamp; +import java.time.format.DateTimeFormatter; +import java.util.List; +import java.util.Optional; + +@Service +public class TicketServiceImpl implements TicketService { + + @Autowired + @Qualifier("esTicketRepository") + private TicketRepository esTicketRepository; + + @Autowired + @Qualifier("ticketRepository") + private org.upsmf.grievance.repository.TicketRepository ticketRepository; + + @Autowired + private CommentRepository commentRepository; + + @Autowired + private AssigneeTicketAttachmentRepository assigneeTicketAttachmentRepository; + + @Autowired + private RaiserTicketAttachmentRepository raiserTicketAttachmentRepository; + + @Autowired + private OtpService otpService; + + /** + * + * @param ticket + * @return + */ + @Transactional + public Ticket saveWithAttachment(Ticket ticket, List<String> attachments) { + // save ticket in postgres + org.upsmf.grievance.model.Ticket psqlTicket = ticketRepository.save(ticket); + // update attachments if present + if(attachments != null) { + for(String url : attachments) { + RaiserTicketAttachment raiserTicketAttachment = RaiserTicketAttachment.builder() + .attachment_url(url) + .ticketId(ticket.getId()) + .build(); + raiserTicketAttachmentRepository.save(raiserTicketAttachment); + } + } + // covert to ES ticket object + org.upsmf.grievance.model.es.Ticket esticket = convertToESTicketObj(ticket); + // save ticket in ES + esTicketRepository.save(esticket); + // TODO send mail + return psqlTicket; + } + + @Override + @Transactional + public Ticket save(Ticket ticket) { + // save ticket in postgres + org.upsmf.grievance.model.Ticket psqlTicket = ticketRepository.save(ticket); + // covert to ES ticket object + org.upsmf.grievance.model.es.Ticket esticket = convertToESTicketObj(ticket); + // save ticket in ES + esTicketRepository.save(esticket); + // TODO send mail + return psqlTicket; + } + + /** + * + * @param ticketRequest + * @return + * @throws Exception + */ + @Override + @Transactional + public Ticket save(TicketRequest ticketRequest) throws Exception { + // TODO validate request + // validate OTP + boolean isValid = otpService.validateOtp(ticketRequest.getEmail(), ticketRequest.getOtp()); + if(!isValid) { + throw new RuntimeException("Bad Request"); + } + // set default value for creating ticket + Ticket ticket = createTicketWithDefault(ticketRequest); + // create ticket + ticket = saveWithAttachment(ticket, ticketRequest.getAttachmentURls()); + // TODO get email subject and body from db + otpService.sendGenericEmail(ticketRequest.getEmail(), "Ticket Created", "You ticket is created with ID "+ticket.getId()+" at "+ticket.getCreatedDate()); + return ticket; + } + + /** + * + * @param ticketRequest + * @return + * @throws Exception + */ + private Ticket createTicketWithDefault(TicketRequest ticketRequest) throws Exception { + Timestamp currentTimestamp = new Timestamp(DateUtil.getCurrentDate().getTime()); + return Ticket.builder() + .createdDate(new Timestamp(DateUtil.getCurrentDate().getTime())) + .firstName(ticketRequest.getFirstName()) + .lastName(ticketRequest.getLastName()) + .phone(ticketRequest.getPhone()) + .email(ticketRequest.getEmail()) + .requesterType(ticketRequest.getUserType()) + .assignedToId(ticketRequest.getCc()) + .description(ticketRequest.getDescription()) + .createdDate(currentTimestamp) + .updatedDate(currentTimestamp) + .lastUpdatedBy(-1l) + .escalated(false) + .escalatedDate(null) + .escalatedTo(-1l) + .status(TicketStatus.OPEN) + .requestType(ticketRequest.getRequestType()) + .priority(TicketPriority.LOW) + .escalatedBy(-1l) + .build(); + } + + /** + * + * @param updateTicketRequest + * @return + */ + @Override + @Transactional + public Ticket update(UpdateTicketRequest updateTicketRequest) { + // TODO validate ticket + // check if the ticket exists + Optional<Ticket> ticketDetails = getTicketDetailsByID(updateTicketRequest.getId()); + Ticket ticket = null; + if(!ticketDetails.isPresent()) { + // TODO throw exception + throw new RuntimeException("Ticket does not exists"); + } + ticket = ticketDetails.get(); + // set incoming values + setUpdateTicket(updateTicketRequest, ticket); + // update ticket in DB + ticketRepository.save(ticket); + ticket = getTicketById(ticket.getId()); + // check if ticket exists in ES + Optional<org.upsmf.grievance.model.es.Ticket> esTicketDetails = esTicketRepository.findOneByTicketId(updateTicketRequest.getId()); + org.upsmf.grievance.model.es.Ticket updatedESTicket = convertToESTicketObj(ticket); + if(esTicketDetails.isPresent()) { + // TODO revisit this + esTicketRepository.deleteById(esTicketDetails.get().getId()); + } + esTicketRepository.save(updatedESTicket); + return ticket; + } + + @Override + public Ticket getTicketById(long id) { + if(id <= 0) { + throw new RuntimeException("Invalid Ticket ID"); + } + Optional<Ticket> ticketDetails = getTicketDetailsByID(id); + if(!ticketDetails.isPresent()) { + throw new RuntimeException("Invalid Ticket ID"); + } + return ticketDetails.get(); + } + + /** + * + * @param updateTicketRequest + * @param ticket + */ + private void setUpdateTicket(UpdateTicketRequest updateTicketRequest, Ticket ticket) { + // TODO check request role and permission + ticket.setStatus(updateTicketRequest.getStatus()); + ticket.setAssignedToId(updateTicketRequest.getCc()); + ticket.setPriority(updateTicketRequest.getPriority()); + // update assignee comments + Comments comments = Comments.builder().comment(updateTicketRequest.getComment()) + .userId(updateTicketRequest.getRequestedBy()) + .ticketId(ticket.getId()) + .build(); + commentRepository.save(comments); + // update assignee attachment url + if(updateTicketRequest.getAssigneeAttachmentURLs() != null) { + for (String url : updateTicketRequest.getAssigneeAttachmentURLs()) { + AssigneeTicketAttachment assigneeTicketAttachment = AssigneeTicketAttachment.builder() + .userId(updateTicketRequest.getRequestedBy()) + .ticketId(ticket.getId()) + .attachment_url(url).build(); + assigneeTicketAttachmentRepository.save(assigneeTicketAttachment); + } + } + } + + /** + * + * @param ticket + * @return + */ + private org.upsmf.grievance.model.es.Ticket convertToESTicketObj(Ticket ticket) { + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(DateUtil.DEFAULT_DATE_FORMAT); + ObjectMapper mapper = new ObjectMapper(); + // TODO get user details based on ID + return org.upsmf.grievance.model.es.Ticket.builder() + .ticketId(ticket.getId()) + .firstName(ticket.getFirstName()) + .lastName(ticket.getLastName()) + .phone(ticket.getPhone()) + .email(ticket.getEmail()) + .requesterType(ticket.getRequesterType()) + .assignedToId(ticket.getAssignedToId()) + .assignedToName("") // get user details based on ID + .description(ticket.getDescription()) + .junk(ticket.isJunk()) + .createdDate(ticket.getCreatedDate().toLocalDateTime().format(dateTimeFormatter)) + .createdDateTS(ticket.getCreatedDate().getTime()) + .updatedDate(ticket.getUpdatedDate().toLocalDateTime().format(dateTimeFormatter)) + .updatedDateTS(ticket.getUpdatedDate().getTime()) + .lastUpdatedBy(ticket.getLastUpdatedBy()) + .escalated(ticket.isEscalated()) + .escalatedDate(ticket.getEscalatedDate()!=null?ticket.getEscalatedDate().toLocalDateTime().format(dateTimeFormatter):null) + .escalatedDateTS(ticket.getEscalatedDate()!=null?ticket.getEscalatedDate().getTime():-1) + .status(ticket.getStatus()) + .requestType(ticket.getRequestType()) + .priority(ticket.getPriority()) + .escalatedBy(ticket.getEscalatedBy()) + .escalatedTo(ticket.getEscalatedTo()).build(); + //.comments(ticket.getComments()!=null?ticket.getComments():Collections.EMPTY_LIST) + //.raiserAttachmentURLs(ticket.getRaiserTicketAttachmentURLs()!=null?mapper.writeValueAsString(ticket.getRaiserTicketAttachmentURLs()):"") + //.assigneeAttachmentURLs(ticket.getAssigneeTicketAttachment()!=null?mapper.writeValueAsString(ticket.getAssigneeTicketAttachment()):"").build(); + } + + /** + * + * @param id + * @return + */ + public Optional<org.upsmf.grievance.model.es.Ticket> getESTicketByID(long id) { + return esTicketRepository.findOneByTicketId(id); + } + + /** + * + * @param id + * @return + */ + public Optional<Ticket> getTicketDetailsByID(long id) { + return ticketRepository.findById(id); + } +} diff --git a/src/main/java/org/upsmf/grievance/util/DateUtil.java b/src/main/java/org/upsmf/grievance/util/DateUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..a99a2b212012b6e04d5346f95892b722cfd66854 --- /dev/null +++ b/src/main/java/org/upsmf/grievance/util/DateUtil.java @@ -0,0 +1,397 @@ +package org.upsmf.grievance.util; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.upsmf.grievance.constants.Constants; + +import java.sql.Timestamp; +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; +import java.util.Calendar; +import java.util.Date; +import java.util.TimeZone; + +public class DateUtil { + + private static final String ENCOUNTERED_AN_EXCEPTION = "Encountered an Exception : %s"; + + public static final Logger LOGGER = LoggerFactory.getLogger(DateUtil.class); + + public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss"; + public static final String INVOICE_DATE_FORMATTER = "EEEE, MMMM d, yyyy"; + public static final String YYYYMMDD_FORMATTER = "yyyy-MM-dd"; + public static final String DATE_MONTH_YEAR_FORMAT = "dd-MMMM-yyyy"; + + /** + * this method take date object and format the date with time zone IST. + * + * @param date + * date object + * @return formatted date as String in "yyyy-MM-dd HH:mm:ss" + */ + public static String getFormattedDateInIST(Date date) { + SimpleDateFormat format = new SimpleDateFormat(DEFAULT_DATE_FORMAT); + format.setTimeZone(TimeZone.getTimeZone(Constants.TIME_ZONE)); + return format.format(date); + } + + + public static String getFormattedDateInString(Timestamp ts) { + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT); + return dateTimeFormatter.format(ts.toLocalDateTime()); + } + + /** + * this method take date object and time zone ,and format date object with + * incoming time zone. + * + * @param date + * date object + * @param timeZone + * @return formatted date as String in "yyyy-MM-dd HH:mm:ss" + */ + public static String getFormattedDateWithTimeZone(Date date, String timeZone) { + SimpleDateFormat format = new SimpleDateFormat(DEFAULT_DATE_FORMAT); + format.setTimeZone(TimeZone.getTimeZone(timeZone)); + return format.format(date); + } + + /** + * this method will format current date object with incoming formatter + * + * @param format + * date formatter + * @return String formatted date object. + */ + public static String getCurrentDate(String format) { + SimpleDateFormat dateFormat = new SimpleDateFormat(format); + return dateFormat.format(new Date()); + } + + /** + * this method will format long time value to given time zone with MM-dd-yyyy + * HH:mm:ss + * + * @param timeZone + * @param time + * @return String + */ + public static String convertLongToStringAsDateTime(String timeZone, long time) { + SimpleDateFormat format = new SimpleDateFormat("MM-dd-yyyy HH:mm:ss"); + format.setTimeZone(TimeZone.getTimeZone(timeZone)); + Date date = new Date(time); + return format.format(date); + } + + /** + * this method will format long time value to given time zone with MM-dd-yyyy + * HH:mm:ss + * + * @param timeZone + * @param date + * @param incomingDateFormat + * @return String + */ + public static String dateFormatter(String timeZone, String date, String incomingDateFormat) { + SimpleDateFormat format = new SimpleDateFormat("MM-dd-yyyy HH:mm:ss"); + SimpleDateFormat incomingFormatter = new SimpleDateFormat(incomingDateFormat); + incomingFormatter.setTimeZone(TimeZone.getDefault()); + format.setTimeZone(TimeZone.getTimeZone(timeZone)); + String response = ""; + try { + Date defaultFormattedDate = incomingFormatter.parse(date); + response = format.format(defaultFormattedDate); + } catch (Exception e) { + LOGGER.error(String.format(ENCOUNTERED_AN_EXCEPTION, e.getMessage())); + } + return response; + } // + + /** + * this method will format long time value to given time zone with MMMMM d + * EEEEEEEEE,hh:mm a + * + * @param timeZone + * @param date + * @param incomingDateFormat + * @return String + */ + public static String ormatterInMMMMdEEE(String timeZone, String date, String incomingDateFormat) { + SimpleDateFormat format = new SimpleDateFormat("EEEEEEEEE, MMMMM d @hh:mm a"); + SimpleDateFormat incomingFormatter = new SimpleDateFormat(incomingDateFormat); + incomingFormatter.setTimeZone(TimeZone.getDefault()); + format.setTimeZone(TimeZone.getTimeZone(timeZone)); + String response = ""; + try { + Date defaultFormattedDate = incomingFormatter.parse(date); + response = format.format(defaultFormattedDate); + } catch (Exception e) { + LOGGER.error(String.format(ENCOUNTERED_AN_EXCEPTION, e.getMessage())); + } + return response; + } + + /** + * this method will format long time value to given time zone with MMMMM d + * EEEEEEEEE,hh:mm a + * + * @param timeZone + * @param time + * @return String + */ + public static String convertLongToStringAsMMMMEEEE(String timeZone, long time) { + SimpleDateFormat format = new SimpleDateFormat("EEEEEEEEE, MMMMM d @hh:mm a"); + format.setTimeZone(TimeZone.getTimeZone(timeZone)); + Date date = new Date(time); + return format.format(date); + } + + /** + * this method will format date object with time zone + * + * @param date + * date object + * @param timeZone + * String + * @return String + */ + public static String getSqlTimeStamp(Date date, String... timeZone) { + + DateFormat format = new SimpleDateFormat(DEFAULT_DATE_FORMAT); + if (timeZone != null && timeZone.length > 0) { + format.setTimeZone(TimeZone.getTimeZone(timeZone[0])); + } + return format.format(date); + } + + /** + * this method will convert long value to date object and provide formatted date + * object in "yyyy-MM-dd HH:mm:ss" this form + * + * @param time + * @return String + */ + public static String getSqlTimeStamp(Long time) { + return getSqlTimeStamp(new Date(time)); + } + + /** + * + * @param date + * @param timeZone + * @return Date + * @throws Exception + */ + public static Date getDateInDefaultTimeZone(String date, String timeZone) throws Exception { + SimpleDateFormat format = new SimpleDateFormat(DEFAULT_DATE_FORMAT); + SimpleDateFormat formatterWithDefaultTimeZone = new SimpleDateFormat(DEFAULT_DATE_FORMAT); + format.setTimeZone(TimeZone.getTimeZone(timeZone)); + Date reservationTimeWithTimeZone = format.parse(date + ":00"); + String reservationTimeWithDefaultTimeZone = formatterWithDefaultTimeZone.format(reservationTimeWithTimeZone); + return formatterWithDefaultTimeZone.parse(reservationTimeWithDefaultTimeZone); + } + + /** + * + * @return Date + * @throws Exception + */ + public static Date getCurrentDate() throws Exception { + SimpleDateFormat formatterWithDefaultTimeZone = new SimpleDateFormat(DEFAULT_DATE_FORMAT); + Date currDate = new Date(); + String currTimeWithTimeZone = formatterWithDefaultTimeZone.format(currDate); + return formatterWithDefaultTimeZone.parse(currTimeWithTimeZone); + } + + /** + * This method will convert String date time with IST time Zone in "yyyy-MM-dd + * HH:mm:ss" format + * + * @param date + * String + * @return Date jave.util Date object + */ + public static Date convertStringToDateWithTime(String date) { + SimpleDateFormat format = new SimpleDateFormat(DEFAULT_DATE_FORMAT); + format.setTimeZone(TimeZone.getTimeZone(Constants.TIME_ZONE)); + Date afterFormat = null; + try { + afterFormat = format.parse(date); + } catch (Exception e) { + LOGGER.error(String.format(ENCOUNTERED_AN_EXCEPTION, e.getMessage())); + } + return afterFormat; + } + + /** + * this method will provide current data in GMT. + * + * @return Date Object + */ + public static Date getCurrentDateInGmt() { + Calendar c = Calendar.getInstance(); + TimeZone z = c.getTimeZone(); + int offset = z.getRawOffset(); + if (z.inDaylightTime(new Date())) { + offset = offset + z.getDSTSavings(); + } + int offsetHrs = offset / 1000 / 60 / 60; + int offsetMints = offset / 1000 / 60 % 60; + c.add(Calendar.HOUR_OF_DAY, (-offsetHrs)); + c.add(Calendar.MINUTE, (-offsetMints)); + return c.getTime(); + } + + /** + * this method is used to take system current time and return time with time + * zone. + * + * @param date + * current date + * @param timezone + * time + * @return String + */ + public static String convertDateWithTimeZone(Date date, String timezone) { + SimpleDateFormat dateFormatGmt = new SimpleDateFormat(DEFAULT_DATE_FORMAT); + dateFormatGmt.setTimeZone(TimeZone.getTimeZone(timezone)); + return dateFormatGmt.format(date); + + } + + /** + * this method will convert String to date object with system time zone. + * + * @param date + * String + * @return Date + */ + public static Date convertStringToDate(String date) { + SimpleDateFormat format = new SimpleDateFormat(DEFAULT_DATE_FORMAT); + Date afterFormat = null; + try { + afterFormat = format.parse(date); + } catch (Exception e) { + LOGGER.error(String.format(ENCOUNTERED_AN_EXCEPTION, e.getMessage())); + } + return afterFormat; + } + + /** + * this will format incoming date with MM/dd/yyyy + * + * @param date + * String + * @return String + */ + public static String formateWithMMddyyyy(String date) { + SimpleDateFormat dateFormat = new SimpleDateFormat(DEFAULT_DATE_FORMAT); + SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy"); + String formattedDate = ""; + try { + formattedDate = format.format(dateFormat.parse(date)); + } catch (Exception e) { + LOGGER.error(String.format(ENCOUNTERED_AN_EXCEPTION, e.getMessage())); + } + + return formattedDate; + } + + /** + * This method will return reservation time and current time difference in + * minutes. + * + * @param date + * String reservation time + * @return int + */ + public static int getDateDifferenceInMinutes(String date) { + int diffDate = 0; + SimpleDateFormat dateFormat = new SimpleDateFormat(DEFAULT_DATE_FORMAT); + dateFormat.setTimeZone(TimeZone.getTimeZone(Constants.TIME_ZONE)); + try { + Date requestedDate = dateFormat.parse(date); + Date currentDate = new Date(); + currentDate = dateFormat.parse(dateFormat.format(currentDate)); + diffDate = (int) ((requestedDate.getTime() - currentDate.getTime()) / 60000); + } catch (Exception e) { + LOGGER.error(String.format(ENCOUNTERED_AN_EXCEPTION, e.getMessage())); + } + return diffDate; + } + + /** + * This method will formate incoming String to time zone and format. + * + * @param date + * @param timZone + * @param format + * @return + */ + public static String formatStringToTimeZone(String date, String timZone, String format) { + SimpleDateFormat dateFormat = new SimpleDateFormat(format); + dateFormat.setTimeZone(TimeZone.getTimeZone(timZone)); + SimpleDateFormat dateFormat1 = new SimpleDateFormat(format); + dateFormat1.setTimeZone(TimeZone.getTimeZone(Constants.TIME_ZONE)); + String formattedDate = date; + try { + Date parseDate = dateFormat.parse(date); + formattedDate = dateFormat1.format(parseDate); + formattedDate = dateFormat1.format(dateFormat1.parse(formattedDate)); + } catch (Exception e) { + LOGGER.error(String.format(ENCOUNTERED_AN_EXCEPTION, e.getMessage())); + } + return formattedDate; + } + + /** + * This method will provide current date in IST format in YYYY_MM_DD format. + * + * @return String + */ + public static String getYyyyMmDdInIST() { + SimpleDateFormat format = new SimpleDateFormat(YYYYMMDD_FORMATTER); + format.setTimeZone(TimeZone.getTimeZone(Constants.TIME_ZONE)); + return format.format(new Date()); + } + + /** + * this method will convert String to date object in IST + * + * @param date + * String + * @return Date + */ + public static Date convertStringToDateIST(String date) { + SimpleDateFormat format = new SimpleDateFormat(YYYYMMDD_FORMATTER); + format.setTimeZone(TimeZone.getTimeZone(Constants.TIME_ZONE)); + Date afterFormat = null; + try { + afterFormat = format.parse(date); + } catch (Exception e) { + LOGGER.error(String.format(ENCOUNTERED_AN_EXCEPTION, e.getMessage())); + } + return afterFormat; + } + + public static String getTimeWithHHMMSSFormat() { + + Calendar cal = Calendar.getInstance(); + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); + return sdf.format(cal.getTime()); + + } + + public static Date convertPorjectUploadDate(String date) { + SimpleDateFormat format = new SimpleDateFormat(DATE_MONTH_YEAR_FORMAT); + Date formatDate = null; + try { + formatDate = format.parse(date); + } catch (ParseException e) { + LOGGER.error(String.format(ENCOUNTERED_AN_EXCEPTION, e.getMessage())); + } + return formatDate; + } +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 0000000000000000000000000000000000000000..3434466049ea180d8e16778601a098b223803f1e --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1,46 @@ +# Details for our datasource +spring.datasource.url=jdbc:postgresql://192.168.64.5:5432/grievance +spring.datasource.username=postgres +spring.datasource.password=postgres + +# Hibernate properties +spring.jpa.database-platform=org.hibernate.dialect.PostgreSQL94Dialect +spring.jpa.show-sql=true +spring.jpa.hibernate.ddl-auto=none +spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl +spring.jpa.properties.hibernate.format_sql=true +spring.main.allow-bean-definition-overriding=true + +# ES config +spring.data.elasticsearch.rest.uris=localhost:9200 + +# Logging +logging.level.org.upsmf.grievance=DEBUG +es.default.page.size=20 + +# WhiteListing +urls.whitelist= + +# Mail +spring.mail.host=smtp.gmail.com +spring.mail.port=587 +spring.mail.username=upsmf.otp@upsmfac.org +spring.mail.password= +spring.mail.properties.mail.smtp.auth=true +spring.mail.properties.mail.smtp.starttls.enable=true + +# Redis +spring.redis.host=localhost +spring.redis.port=6379 + +# OTP expiration time in minutes +otp.expiration.minutes=5 + +# gcp config +gcp.project.id= +gcp.bucket.name= +gcp.bucket.folder.name=grievance +gcp.max.file.size=2mb +gcp.config.file.path=/Users/shishirsuman/Desktop/upsmf.json +gcp.client.id= + diff --git a/src/test/java/org/upsmf/notification/NotificationServiceApplicationTests.java b/src/test/java/org/upsmf/notification/NotificationServiceApplicationTests.java new file mode 100644 index 0000000000000000000000000000000000000000..989065555742c538198ad1965f00b661b24ccdcd --- /dev/null +++ b/src/test/java/org/upsmf/notification/NotificationServiceApplicationTests.java @@ -0,0 +1,13 @@ +package org.upsmf.notification; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class NotificationServiceApplicationTests { + + @Test + void contextLoads() { + } + +}