Skip to content
This repository was archived by the owner on Mar 2, 2025. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 3 additions & 13 deletions src/main/java/com/projecty/projectyweb/email/EmailService.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,11 @@

import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;
import org.thymeleaf.context.Context;
import org.thymeleaf.spring5.SpringTemplateEngine;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.util.Map;

@Service
Expand All @@ -18,26 +16,18 @@ public class EmailService {
@Value("${spring.mail.username}")
private String from;

SendEmailService sendEmailService;

public EmailService(JavaMailSender javaMailSender, SpringTemplateEngine springTemplateEngine) {
this.javaMailSender = javaMailSender;
this.springTemplateEngine = springTemplateEngine;
}

public void sendEmail(String to, String subject, String text) throws MessagingException {
MimeMessage message = javaMailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8");
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(text, true);
javaMailSender.send(message);
}

public void sendMessageThymeleafTemplate(String to, String subject, Map<String, Object> templateModel) throws MessagingException {
Context context = new Context();
context.setVariables(templateModel);
String htmlBody = springTemplateEngine.process("email-template.html", context);
sendEmail(to, subject, htmlBody);
sendEmailService.sendEmail(to, from, subject, htmlBody);
}

}
30 changes: 30 additions & 0 deletions src/main/java/com/projecty/projectyweb/email/SendEmailService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.projecty.projectyweb.email;

import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;

public class SendEmailService {

private final JavaMailSender javaMailSender;

public SendEmailService(JavaMailSender javaMailSender) {
this.javaMailSender = javaMailSender;
}


public void sendEmail(String from,
String to,
String subject,
String text) throws MessagingException {
MimeMessage message = javaMailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8");
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(text, true);
javaMailSender.send(message);
}
}
26 changes: 16 additions & 10 deletions src/main/java/com/projecty/projectyweb/message/MessageService.java
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ public Message sendMessage(
) throws BindException {
BindException bindException = new BindException(message, "message");
messageValidator.validate(message, bindException);
//

if (bindException.hasErrors()) {
throw bindException;
}
Expand All @@ -103,20 +103,26 @@ public Message reply(Long replyToMessageId,
User user = userService.getCurrentUser();
Optional<Message> optionalReplyToMessage = messageRepository.findById(replyToMessageId);
if (optionalReplyToMessage.isPresent()) {
Message replyToMessage = optionalReplyToMessage.get();
if (replyToMessage.getSender().equals(user)) {
throw new ResponseStatusException(HttpStatus.BAD_REQUEST);
}
message.setRecipientUsername(replyToMessage.getSender().getUsername());
message.setReplyTo(replyToMessage);
replyToMessage.setHasReply(true);
messageRepository.save(replyToMessage);
return sendMessage(message, multipartFiles);
return saveReply(user, message, optionalReplyToMessage.get(), multipartFiles);
} else {
throw new ResponseStatusException(HttpStatus.NOT_FOUND);
}
}

public Message saveReply(User user,
Message message,
Message replyToMessage,
List<MultipartFile> multipartFiles) throws BindException {
if (replyToMessage.getSender().equals(user)) {
throw new ResponseStatusException(HttpStatus.BAD_REQUEST);
}
message.setRecipientUsername(replyToMessage.getSender().getUsername());
message.setReplyTo(replyToMessage);
replyToMessage.setHasReply(true);
messageRepository.save(replyToMessage);
return sendMessage(message, multipartFiles);
}

public void deleteMessage(Message message) {
User currentUser = userService.getCurrentUser();
associationService.deleteMessageForUser(message, currentUser);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,12 +33,20 @@ public class ProjectController {

private final ProjectRoleService projectRoleService;

public ProjectController(ProjectService projectService, ProjectRepository projectRepository, UserService userService, ProjectValidator projectValidator, ProjectRoleService projectRoleService) {
private final ProjectPermissionAspect projectPermissionAspect;

public ProjectController(ProjectService projectService,
ProjectRepository projectRepository,
UserService userService,
ProjectValidator projectValidator,
ProjectRoleService projectRoleService,
ProjectPermissionAspect projectPermissionAspect) {
this.projectService = projectService;
this.projectRepository = projectRepository;
this.userService = userService;
this.projectValidator = projectValidator;
this.projectRoleService = projectRoleService;
this.projectPermissionAspect = projectPermissionAspect;
}

@GetMapping("")
Expand Down Expand Up @@ -96,7 +104,7 @@ public Project patchProject(
@RequestBody Project patchedProject
) {
Optional<Project> optionalProject = projectRepository.findById(projectId);
if (optionalProject.isPresent() && projectService.hasCurrentUserPermissionToEdit(optionalProject.get())) {
if (optionalProject.isPresent() && projectPermissionAspect.hasCurrentUserPermissionToEdit(optionalProject.get())) {
return projectService.patchProject(optionalProject.get(), patchedProject);
} else {
throw new ResponseStatusException(HttpStatus.NOT_FOUND);
Expand All @@ -108,7 +116,7 @@ public Project getProjectData(
@PathVariable Long projectId
) {
Optional<Project> optionalProject = projectRepository.findById(projectId);
if (optionalProject.isPresent() && projectService.hasCurrentUserPermissionToEdit(optionalProject.get())) {
if (optionalProject.isPresent() && projectPermissionAspect.hasCurrentUserPermissionToEdit(optionalProject.get())) {
return optionalProject.get();
} else {
throw new ResponseStatusException(HttpStatus.NOT_FOUND);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,11 @@

@Aspect
@Component
public class ProjectNotificationAspect {
private final UserService userService;
public class ProjectNotificationAspect extends UserServiceField{
private final NotificationService notificationService;

public ProjectNotificationAspect(UserService userService, UserRepository userRepository, NotificationService notificationService) {
this.userService = userService;
super(userService);
this.notificationService = notificationService;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
package com.projecty.projectyweb.project;

import com.projecty.projectyweb.project.role.ProjectRole;
import com.projecty.projectyweb.project.role.ProjectRoleRepository;
import com.projecty.projectyweb.project.role.ProjectRoles;
import com.projecty.projectyweb.team.role.TeamRole;
import com.projecty.projectyweb.team.role.TeamRoleRepository;
import com.projecty.projectyweb.team.role.TeamRoles;
import com.projecty.projectyweb.user.User;
import com.projecty.projectyweb.user.UserService;
import org.aspectj.lang.JoinPoint;
Expand All @@ -15,16 +21,19 @@

@Aspect
@Component
public class ProjectPermissionAspect {
private final UserService userService;
public class ProjectPermissionAspect extends UserServiceField {
private final ProjectRepository projectRepository;
private final ProjectService projectService;
private final ProjectRoleRepository projectRoleRepository;
private final TeamRoleRepository teamRoleRepository;
private final Logger logger = Logger.getLogger(getClass().getName());

public ProjectPermissionAspect(UserService userService, ProjectRepository projectRepository, ProjectService projectService) {
this.userService = userService;
public ProjectPermissionAspect(UserService userService, ProjectRepository projectRepository, ProjectService projectService,TeamRoleRepository teamRoleRepository, ProjectRoleRepository projectRoleRepository) {
super(userService);
this.projectRepository = projectRepository;
this.projectService = projectService;
this.teamRoleRepository = teamRoleRepository;
this.projectRoleRepository = projectRoleRepository;
}

@Pointcut("execution (* com.projecty.projectyweb.project.ProjectController.*(Long,..))" +
Expand All @@ -37,12 +46,34 @@ private void inProjectControllerAndWithEditPermission() {
private void inProjectControllerAndWithAnyPermission() {
}

public boolean hasCurrentUserPermissionToEdit(Project project) {
User current = userService.getCurrentUser();
if (project.getTeam() != null) {
Optional<TeamRole> optionalTeamRole = teamRoleRepository.findByTeamAndAndUser(project.getTeam(), current);
return optionalTeamRole.isPresent() && optionalTeamRole.get().getName().equals(TeamRoles.MANAGER);
}
Optional<ProjectRole> optionalRole = projectRoleRepository.findRoleByUserAndProject(current, project);
return optionalRole.isPresent() && optionalRole.get().getName().equals(ProjectRoles.ADMIN);
}

public boolean hasCurrentUserPermissionToView(Project project) {
User current = userService.getCurrentUser();
if (project.getTeam() != null) {
return teamRoleRepository.findByTeamAndAndUser(project.getTeam(), current).isPresent();
}
return hasUserRoleInProject(current, project);
}

public boolean hasUserRoleInProject(User user, Project project) {
return projectRoleRepository.findRoleByUserAndProject(user, project).isPresent();
}

@Before("inProjectControllerAndWithEditPermission()")
public void checkEditPermission(JoinPoint joinPoint) {
Long projectId = (Long) joinPoint.getArgs()[0];
User current = userService.getCurrentUser();
Optional<Project> optionalProject = projectRepository.findById(projectId);
if (!(optionalProject.isPresent() && projectService.hasCurrentUserPermissionToEdit(optionalProject.get()))) {
if (!(optionalProject.isPresent() && hasCurrentUserPermissionToEdit(optionalProject.get()))) {
logger.warning("User: "
+ current.getUsername()
+ " tried to execute "
Expand All @@ -57,12 +88,14 @@ public void checkAnyPermission(JoinPoint joinPoint) {
Long projectId = (Long) joinPoint.getArgs()[0];
User current = userService.getCurrentUser();
Optional<Project> optionalProject = projectRepository.findById(projectId);
if (!(optionalProject.isPresent() && projectService.hasCurrentUserPermissionToView(optionalProject.get()))) {
if (!(optionalProject.isPresent() && hasCurrentUserPermissionToView(optionalProject.get()))) {
logger.warning("User: " + current.getUsername()
+ " tried to execute "
+ joinPoint.getSignature().toString()
+ " without any permission");
throw new ResponseStatusException(HttpStatus.NOT_FOUND);
}
}


}
27 changes: 2 additions & 25 deletions src/main/java/com/projecty/projectyweb/project/ProjectService.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,17 +20,16 @@
import java.util.*;

@Service
public class ProjectService {
public class ProjectService extends UserServiceField{
private final ProjectRepository projectRepository;
private final UserService userService;
private final ProjectRoleRepository projectRoleRepository;
private final ProjectRoleService projectRoleService;
private final TeamRoleRepository teamRoleRepository;
private final TaskRepository taskRepository;

public ProjectService(ProjectRepository projectRepository, UserService userService, ProjectRoleRepository projectRoleRepository, ProjectRoleService projectRoleService, TeamRoleRepository teamRoleRepository, TaskRepository taskRepository) {
super(userService);
this.projectRepository = projectRepository;
this.userService = userService;
this.projectRoleRepository = projectRoleRepository;
this.projectRoleService = projectRoleService;
this.teamRoleRepository = teamRoleRepository;
Expand All @@ -41,28 +40,6 @@ public void save(Project project) {
projectRepository.save(project);
}

public boolean hasCurrentUserPermissionToEdit(Project project) {
User current = userService.getCurrentUser();
if (project.getTeam() != null) {
Optional<TeamRole> optionalTeamRole = teamRoleRepository.findByTeamAndAndUser(project.getTeam(), current);
return optionalTeamRole.isPresent() && optionalTeamRole.get().getName().equals(TeamRoles.MANAGER);
}
Optional<ProjectRole> optionalRole = projectRoleRepository.findRoleByUserAndProject(current, project);
return optionalRole.isPresent() && optionalRole.get().getName().equals(ProjectRoles.ADMIN);
}

public boolean hasCurrentUserPermissionToView(Project project) {
User current = userService.getCurrentUser();
if (project.getTeam() != null) {
return teamRoleRepository.findByTeamAndAndUser(project.getTeam(), current).isPresent();
}
return hasUserRoleInProject(current, project);
}

public boolean hasUserRoleInProject(User user, Project project) {
return projectRoleRepository.findRoleByUserAndProject(user, project).isPresent();
}

Project createNewProjectAndSave(Project project, List<String> usernames) {
projectRoleService.addCurrentUserToProjectAsAdmin(project);
projectRoleService.addRolesToProjectByUsernames(project, usernames);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.projecty.projectyweb.project;

import com.projecty.projectyweb.user.UserService;

public class UserServiceField {
protected UserService userService;

public UserServiceField(UserService userService) {
this.userService = userService;
}
}
9 changes: 6 additions & 3 deletions src/main/java/com/projecty/projectyweb/task/TaskAspect.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.projecty.projectyweb.task;

import com.projecty.projectyweb.project.ProjectPermissionAspect;
import com.projecty.projectyweb.project.ProjectService;
import com.projecty.projectyweb.user.User;
import com.projecty.projectyweb.user.UserService;
Expand All @@ -20,12 +21,14 @@ public class TaskAspect {
private final UserService userService;
private final TaskRepository taskRepository;
private final ProjectService projectService;
private final ProjectPermissionAspect projectPermissionAspect;
private Logger logger = Logger.getLogger(getClass().getName());

public TaskAspect(UserService userService, TaskRepository taskRepository, ProjectService projectService) {
public TaskAspect(UserService userService, TaskRepository taskRepository, ProjectService projectService, ProjectPermissionAspect projectPermissionAspect ) {
this.userService = userService;
this.taskRepository = taskRepository;
this.projectService = projectService;
this.projectPermissionAspect = projectPermissionAspect;
}

@Pointcut("execution (* com.projecty.projectyweb.task.TaskController.*(Long,..))" +
Expand All @@ -43,7 +46,7 @@ public void checkEditPermission(JoinPoint joinPoint) {
Long taskId = (Long) joinPoint.getArgs()[0];
User current = userService.getCurrentUser();
Optional<Task> optionalTask = taskRepository.findById(taskId);
if (!(optionalTask.isPresent() && projectService.hasCurrentUserPermissionToEdit(optionalTask.get().getProject()))) {
if (!(optionalTask.isPresent() && projectPermissionAspect.hasCurrentUserPermissionToEdit(optionalTask.get().getProject()))) {
logger.warning("User: "
+ current.getUsername()
+ " tried to execute "
Expand All @@ -58,7 +61,7 @@ public void checkAnyPermission(JoinPoint joinPoint) {
Long taskId = (Long) joinPoint.getArgs()[0];
User current = userService.getCurrentUser();
Optional<Task> optionalTask = taskRepository.findById(taskId);
if (!(optionalTask.isPresent() && projectService.hasCurrentUserPermissionToView(optionalTask.get().getProject()))) {
if (!(optionalTask.isPresent() && projectPermissionAspect.hasCurrentUserPermissionToView(optionalTask.get().getProject()))) {
logger.warning("User: " + current.getUsername()
+ " tried to execute "
+ joinPoint.getSignature().toString()
Expand Down
Loading