Skip to content

Commit

Permalink
refined the rest service.
Browse files Browse the repository at this point in the history
Signed-off-by: kamarbaraka <[email protected]>
  • Loading branch information
kamarbaraka committed Nov 7, 2023
1 parent 92287c7 commit 41ad66a
Show file tree
Hide file tree
Showing 12 changed files with 142 additions and 35 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
@RestController
@OpenAPIDefinition(
tags = {
@Tag(name = "Utilities", description = "Useful apis"),
@Tag(name = "User Registration", description = "Apis to register a user"),
@Tag(name = "User Activation", description = "Apis to activate a user"),
@Tag(name = "User Management", description = "Apis to manage a user"),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.kamar.issuemanagementsystem.app_properties;

import org.springframework.boot.context.properties.ConfigurationProperties;

/**
* company configuration.
* @author kamar baraka.*/

@ConfigurationProperties(prefix = "app.company")
public record CompanyProperties(

String name,
String email,
String endTag
) {
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.kamar.issuemanagementsystem.config;

import com.kamar.issuemanagementsystem.app_properties.CompanyProperties;
import com.kamar.issuemanagementsystem.app_properties.InnitUserProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;
Expand All @@ -10,7 +11,8 @@

@Configuration
@EnableConfigurationProperties(value = {
InnitUserProperties.class
InnitUserProperties.class,
CompanyProperties.class
})
public class ConfigPropertiesConfig {
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.session.SessionAuthenticationStrategy;
import org.springframework.security.web.authentication.session.SessionFixationProtectionStrategy;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
import org.springframework.security.web.util.matcher.RequestMatcher;


import javax.sql.DataSource;
Expand All @@ -43,13 +45,12 @@ public SecurityFilterChain securityFilterChain(HttpSecurity httpSecurity,
httpBasic.authenticationEntryPoint(entryPoint);
});

// httpSecurity.authorizeHttpRequests(requests -> requests.anyRequest().authenticated());

/*configure session management*/
httpSecurity.sessionManagement(session -> {
session.maximumSessions(2);
session.maximumSessions(1);
session.sessionFixation(
SessionManagementConfigurer.SessionFixationConfigurer::changeSessionId);
SessionManagementConfigurer.SessionFixationConfigurer::newSession
);
session.sessionConcurrency(concurrency -> {
concurrency.maximumSessions(1);
concurrency.maxSessionsPreventsLogin(true);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,22 +1,31 @@
package com.kamar.issuemanagementsystem.external_resouces;

import com.google.api.client.util.Value;
import com.kamar.issuemanagementsystem.app_properties.CompanyProperties;
import jakarta.mail.MessagingException;
import jakarta.mail.internet.MimeMessage;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
import org.springframework.mail.MailMessage;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;

import java.io.UnsupportedEncodingException;

/**
* implementation of the email service.
* @author kamar baraka.*/

@Service
@RequiredArgsConstructor
@Log4j2
public class EmailServiceImpl implements EmailService {

/*inject the dependencies*/
private final JavaMailSender javaMailSender;
private final SimpleMailMessage mailMessage;
private final CompanyProperties company;

@Override
public boolean authenticateEmail(String email) {
Expand All @@ -27,13 +36,26 @@ public boolean authenticateEmail(String email) {
public boolean sendEmail(String message, String subject, String email) {

/*configure the email*/
mailMessage.setTo(email);
mailMessage.setFrom("[email protected]");
mailMessage.setSubject(subject);
mailMessage.setText(message);

MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage);

try
{
mimeMessageHelper.setFrom(company.email(), company.name());
mimeMessageHelper.setTo(email);
mimeMessageHelper.setSubject(subject);
mimeMessageHelper.setTo(email);
mimeMessageHelper.setText(message, true);

}catch (MessagingException | UnsupportedEncodingException e){

/*log the exception*/
log.error(e.getMessage());
}

/*send the email*/
javaMailSender.send(mailMessage);
javaMailSender.send(mimeMessage);

return true;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import org.springframework.hateoas.Link;
import org.springframework.hateoas.server.mvc.WebMvcLinkBuilder;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.annotation.Secured;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.security.core.userdetails.UserDetails;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.kamar.issuemanagementsystem.ticket.service;

import com.kamar.issuemanagementsystem.app_properties.CompanyProperties;
import com.kamar.issuemanagementsystem.external_resouces.EmailService;
import com.kamar.issuemanagementsystem.ticket.controller.ReferralRequestController;
import com.kamar.issuemanagementsystem.ticket.controller.TicketManagementController;
Expand Down Expand Up @@ -34,6 +35,7 @@ public class ReferralRequestManagementServiceImpl implements ReferralRequestMana
private final UserRepository userRepository;
private final TicketRepository ticketRepository;
private final ReferralRequestMapper referralRequestMapper;
private final CompanyProperties company;

private void sendReferralRequest(final ReferralRequest referralRequest){

Expand All @@ -54,8 +56,11 @@ private void sendReferralRequest(final ReferralRequest referralRequest){
/*compose the email*/
String subject = "Referral Request";
String message = referralRequest.getFrom().getUsername()+ " has requested you to handle the ticket #" +
referralRequest.getRefferedTicket().getTicketId()+ " "+ referralRequest.getRefferedTicket().getTitle()
+ " \n"+ acceptRequest+ " \n"+ rejectRequest+ " \n";
referralRequest.getRefferedTicket().getTicketId()+ " \""+ referralRequest.getRefferedTicket().getTitle()
+ "\" <br>"+
"<h4 style=\"color: green;\"><a href=\""+ acceptRequest.getHref()+ "\">Accept</a></h4> <br>"+
"<h4 style=\"color: red;\"><a href=\""+ rejectRequest.getHref()+ "\">Reject</a></h4> <br>"+
company.endTag();

/*send the email*/
emailService.sendEmail(message, subject, referralRequest.getTo().getUsername());
Expand All @@ -71,8 +76,10 @@ private void receiveAcceptedRequestNotification(Ticket ticket, UserDetails authe
.getTicketById(ticket.getTicketId(), authenticatedUser)).withRel("ticket");

String message = "The ticket #" + ticket.getTicketId() + " " + ticket.getTitle()
+ " is assigned to you upon accepting the referral request. Resolve it before "
+ ticket.getDeadline() + "\n" + ticketLink;
+ " is assigned to you upon accepting the referral request. Resolve it before "+
"<h4 style=\"color: red;\">" + ticket.getDeadline()+ "</h4> <br>"+
"<h4><a href=\""+ ticketLink.getHref()+ "\">Ticket</a></h4> <br>"+
company.endTag();

/*send the message*/
emailService.sendEmail(message, subject, ticket.getAssignedTo().getUsername());
Expand All @@ -85,10 +92,10 @@ private void sendAcceptedRequestNotification(ReferralRequest referralRequest){
/*set the email*/
String subject = "Request Accepted";


String message = referralRequest.getTo().getUsername() + " accepted your referral request for ticket #"
+ referralRequest.getRefferedTicket().getTicketId() + " "
+ referralRequest.getRefferedTicket().getTitle() + "\n" ;
+ referralRequest.getRefferedTicket().getTicketId() + " \""
+ referralRequest.getRefferedTicket().getTitle() + "\". <br>"+
company.endTag();

/*send message*/
emailService.sendEmail(message, subject, referralRequest.getFrom().getUsername());
Expand All @@ -99,8 +106,9 @@ private void sendRejectedRequestNotification(ReferralRequest referralRequest){
/*set the email*/
String subject = "Request Rejected";
String message = referralRequest.getTo().getUsername() + " rejected your referral request for ticket #"
+ referralRequest.getRefferedTicket().getTicketId() + " "
+ referralRequest.getRefferedTicket().getTitle();
+ referralRequest.getRefferedTicket().getTicketId() + " \""
+ referralRequest.getRefferedTicket().getTitle()+ "\". <br>"+
company.endTag();

/*send notification*/
emailService.sendEmail(message, subject, referralRequest.getFrom().getUsername());
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.kamar.issuemanagementsystem.ticket.service;

import com.kamar.issuemanagementsystem.app_properties.CompanyProperties;
import com.kamar.issuemanagementsystem.department.repository.DepartmentRepository;
import com.kamar.issuemanagementsystem.external_resouces.EmailService;
import com.kamar.issuemanagementsystem.ticket.controller.ReferralRequestController;
Expand Down Expand Up @@ -32,6 +33,7 @@ public class TicketAssignmentServiceImpl implements TicketAssignmentService {
private final TicketManagementService ticketManagementService;
private final EmailService emailService;
private final DepartmentRepository departmentRepository;
private final CompanyProperties company;


private UserDetails getAuthenticatedUser(){
Expand All @@ -45,17 +47,24 @@ private void sendNotification(Ticket ticket){
Link ticketLink = WebMvcLinkBuilder.linkTo(WebMvcLinkBuilder.methodOn(
TicketManagementController.class).getTicketById(ticket.getTicketId(),
getAuthenticatedUser())).withRel("the ticket");
String message = "You have been assigned the ticket #" + ticket.getTicketId() + " " + ticket.getTitle() +
". Resolve it before " + ticket.getDeadline() + ". \n" + ticketLink;

String message = "You have been assigned the ticket #" + ticket.getTicketId()+ " "+ ticket.getTitle() +
". Resolve it before "+ "<h4 style=\"color: red;\">"+ ticket.getDeadline()+ "</h4> <br>"+
" <h4><a href=\""+ ticketLink.getHref()+ "\" >Ticket</a></h4> <br>"+
company.endTag();

/*send the message*/
emailService.sendEmail(message, subject, ticket.getAssignedTo().getUsername());

/*compose and send notification to the raiser*/
String raiserSubject = "Ticket handling";
String raiserMessage = "Your ticket #" + ticket.getTicketId() + " \"" + ticket.getTitle() + "\""+
" is being handled by the " + departmentRepository.findDepartmentByMembersContaining(ticket.getAssignedTo())+
" department.";
String raiserMessage = "Dear "+ ticket.getRaisedBy().getUsername()+ ",Your ticket #" + ticket.getTicketId()
+ " \"" + ticket.getTitle() + "\""+
" is being handled by the " + departmentRepository.
findDepartmentByMembersContaining(ticket.getAssignedTo()).orElseThrow().getDepartmentName()+
" department.<br>"+
"Thank you for your patience.<br>"+
company.endTag();

emailService.sendEmail(raiserMessage, raiserSubject, ticket.getRaisedBy().getUsername());

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.kamar.issuemanagementsystem.ticket.service;

import com.kamar.issuemanagementsystem.app_properties.CompanyProperties;
import com.kamar.issuemanagementsystem.external_resouces.EmailService;
import com.kamar.issuemanagementsystem.ticket.controller.TicketCreationController;
import com.kamar.issuemanagementsystem.ticket.controller.TicketManagementController;
Expand Down Expand Up @@ -27,6 +28,7 @@ public class TicketCreationServiceImpl implements TicketCreationService {
private final TicketRepository ticketRepository;
private final EmailService emailService;
private final UserRepository userRepository;
private final CompanyProperties company;

private UserDetails getAuthenticatedUser(){

Expand All @@ -39,12 +41,16 @@ private void sendCreationNotification(Ticket ticket){
/*the get ticket link*/
String linkToTicket = WebMvcLinkBuilder.linkTo(WebMvcLinkBuilder.methodOn(
TicketManagementController.class).getTicketById(
ticket.getTicketId(), getAuthenticatedUser())).toUriComponentsBuilder().toUriString();
ticket.getTicketId(), getAuthenticatedUser())).withRel("ticket").getHref();
/*the subject*/
String subject = "Ticket Raised";
/*construct the message*/
String message = ticket.getRaisedBy().getUsername() + " raised a ticket \"" + ticket.getTitle() + "\". #" + ticket.getTicketId()+
"\n "+ linkToTicket;
" <br> "+
" <h5><a href=\""+ linkToTicket+ "\" >Ticket</a></h5> <br>"+
"Thank you, <br>"+
company.endTag();

/*get all admins and send the admin notification email*/
userRepository.findUsersByAuthorityOrderByCreatedOn(Authority.ADMIN).ifPresentOrElse(
admins ->
Expand All @@ -57,7 +63,8 @@ private void sendCreationNotification(Ticket ticket){

/*send notification to the raiser*/
String raiserSubject = "Ticket Success";
String raiserMessage = "Thank you for raising your issue. It will be handled within a week.";
String raiserMessage = "Dear "+ ticket.getRaisedBy().getUsername()+ ", thank you for raising your issue. <br>"+
"It will be handled within a week.<br>"+ company.endTag();

emailService.sendEmail(raiserMessage, raiserSubject, ticket.getRaisedBy().getUsername());

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.kamar.issuemanagementsystem.ticket.service;

import com.kamar.issuemanagementsystem.app_properties.CompanyProperties;
import com.kamar.issuemanagementsystem.department.entity.Department;
import com.kamar.issuemanagementsystem.department.repository.DepartmentRepository;
import com.kamar.issuemanagementsystem.external_resouces.EmailService;
Expand Down Expand Up @@ -32,13 +33,18 @@ public class TicketFeedbackServiceImpl implements TicketFeedbackService {
private final TicketManagementService ticketManagementService;
private final RatingService ratingService;
private final DepartmentRepository departmentRepository;
private final CompanyProperties company;

private void unsatisfiedNotification(final TicketUserFeedbackDTO userFeedbackDTO, final Ticket ticket){

/*compose the email*/
String subject = "Submission Feedback";
String message = "Ticket #" + ticket.getTicketId() + " " + ticket.getTitle() +
" needs more attention: \n\"" + userFeedbackDTO.feedback() + "\". Please resolve it in due time.";
String message = "Ticket #"+ ticket.getTicketId()+ " \""+ ticket.getTitle()+ "\" needs more attention: <br>"+
"<div style=\"border-radius: 20px; background: grey;\">"+
"<p style=\"color: yellow;\">"+
userFeedbackDTO.feedback()+
"</p><div><br>"+
"Please resolve it in due time.<br>"+ company.endTag();

/*send the email*/
emailService.sendEmail(message, subject, ticket.getAssignedTo().getUsername());
Expand All @@ -47,8 +53,9 @@ private void satisfactionNotification(final TicketUserFeedbackDTO userFeedbackDT

/*compose the email*/
String subject = "Congratulation!";
String message = "Congratulation!, you have managed to resolve ticket #" + ticket.getTicketId() +
" " + ticket.getTitle() + ". Your rating is " + userFeedbackDTO.serviceRating();
String message = "Congratulation!, you have managed to resolve ticket #"+ ticket.getTicketId()+
" \""+ ticket.getTitle()+ "\". Your rating is "+ userFeedbackDTO.serviceRating()+
company.endTag();

/*send the email*/
emailService.sendEmail(message, subject, ticket.getAssignedTo().getUsername());
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.kamar.issuemanagementsystem.ticket.service;

import com.kamar.issuemanagementsystem.app_properties.CompanyProperties;
import com.kamar.issuemanagementsystem.external_resouces.EmailService;
import com.kamar.issuemanagementsystem.ticket.data.TicketStatus;
import com.kamar.issuemanagementsystem.ticket.entity.Ticket;
Expand All @@ -24,15 +25,20 @@ public class TicketSubmissionServiceImpl implements TicketSubmissionService {
private final TicketManagementService ticketManagementService;
private final TicketRepository ticketRepository;
private final UserManagementService userManagementService;
private final CompanyProperties company;


private void submitTicketNotification(final Ticket ticket){

/*compose the email*/
String subject = "Ticket Review";
String message = "Ticket #" + ticket.getTicketId() + " " + ticket.getTitle() +
", has been resolved. Please check if it is resolved to your satisfaction and provide the feedback.";
String messageAdmin = ticket.getAssignedTo().getUsername() + " has submitted ticket #" + ticket.getTicketId() + " " + ticket.getTitle();
String message = "Dear "+ ticket.getRaisedBy().getUsername()+ ", your ticket #"+ ticket.getTicketId()+ " \""+
ticket.getTitle()+ "\", has been resolved. Please check if it is resolved to your satisfaction and provide the feedback.<>br"+
company.endTag();

String messageAdmin = ticket.getAssignedTo().getUsername() + " has submitted ticket #"+ ticket.getTicketId()+
" \""+ ticket.getTitle()+ "\".<br>"+
company.endTag();

/*send notification to the admins*/
userManagementService.getUsersByAuthority(Authority.ADMIN).parallelStream()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.kamar.issuemanagementsystem.user.controller;

import io.swagger.v3.oas.annotations.Operation;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
* controller for user utilities.
* @author kamar baraka.*/


@RestController
@RequestMapping(value = {"api/users/util"})
public class UserUtilitiesController {


@GetMapping(value = {"", "who"})
@Operation(tags = {"Utilities"}, summary = "api to discover the authenticated user")
public ResponseEntity<UserDetails> whoAmI(@AuthenticationPrincipal UserDetails user){

return ResponseEntity.ok(user);
}
}

0 comments on commit 41ad66a

Please sign in to comment.