-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathProjectService.java
More file actions
123 lines (105 loc) · 4.58 KB
/
Copy pathProjectService.java
File metadata and controls
123 lines (105 loc) · 4.58 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
package demo.codeexample.project.application.usecase;
import demo.codeexample.project.CreateProjectDto;
import demo.codeexample.logger.LoggerLookup;
import demo.codeexample.project.ProjectCreatedEvent;
import demo.codeexample.project.ProjectDto;
import demo.codeexample.project.application.out.ProjectEventPort;
import demo.codeexample.project.application.out.SecurityPort;
import demo.codeexample.shared.Category;
import demo.codeexample.project.application.out.CompanyPort;
import demo.codeexample.project.domain.Genre;
import demo.codeexample.project.application.in.ProjectUseCase;
import demo.codeexample.project.application.out.ProjectRepositoryPort;
import demo.codeexample.project.application.out.UserPort;
import demo.codeexample.project.domain.Project;
import demo.codeexample.shared.LoggerAction;
import jakarta.persistence.EntityNotFoundException;
import org.modelmapper.ModelMapper;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;
public class ProjectService implements ProjectUseCase {
private final ProjectRepositoryPort repository;
private final UserPort userPort;
private final ProjectEventPort projectEventPort;
private final SecurityPort securityPort;
private final ModelMapper mapper;
private final LoggerLookup logger;
public ProjectService(ProjectRepositoryPort repository, UserPort userPort,
ProjectEventPort projectEventPort, SecurityPort securityPort, ModelMapper mapper, LoggerLookup logger) {
this.repository = repository;
this.userPort = userPort;
this.projectEventPort = projectEventPort;
this.securityPort = securityPort;
this.mapper = mapper;
this.logger = logger;
}
@Override
public List<ProjectDto> findAllCompletedProjectsByCompany(String companyName) {
return repository.findAllProjectsBelongingToCompany(companyName, true).stream()
.map(entity -> mapper.map(entity, ProjectDto.class))
.toList();
}
@Override
public List<ProjectDto> findAllNotCompleteProjectsByCompany(String companyName) {
return repository.findAllProjectsBelongingToCompany(companyName, false).stream()
.map(entity -> mapper.map(entity, ProjectDto.class))
.toList();
}
@Override
public List<ProjectDto> findProjectByCategory(Category category) {
return repository.findProjectByCategory(category).stream()
.map(project -> mapper.map(project, ProjectDto.class))
.toList();
}
@Override
public List<ProjectDto> findProjectByGenre(Genre genre) {
return repository.findProjectByGenre(genre).stream()
.map(project -> mapper.map(project, ProjectDto.class))
.toList();
}
@Override
public Project createProject(CreateProjectDto projectDto) {
userPort.validateEmployees(projectDto.employeesId());
Project project = repository.save(projectDto);
Long currentUserId = securityPort.getCurrentUserId();
String creatorName = securityPort.getCurrentUserName();
logger.log(
LoggerAction.PROJECT_CREATED,
currentUserId,
"PROJECT",
project.getId(),
project.getId(),
"New project created: " + project.getTitle() + ". Created by: " + creatorName
);
ProjectCreatedEvent event = new ProjectCreatedEvent(
project.getId(),
project.getTitle(),
project.getEmployeesId(),
project.getReleaseDate(),
project.getCompanyName(),
projectDto.recruitingDeadline(),
projectDto.recordingDeadline(),
projectDto.editingDeadline()
);
projectEventPort.publish(event);
return project;
}
@Override
public List<ProjectDto> findProjectContainingTitle(String title) {
return repository.findProjectContainingTitle(title).stream()
.map(project -> mapper.map(project, ProjectDto.class))
.toList();
}
@Override
public Optional<ProjectDto> findProjectByTitle(String title) {
return repository.findByTitle(title)
.map(k -> mapper.map(k, ProjectDto.class));
}
public ProjectDto getProjectDetails(Long projectId) {
return repository.findById(projectId)
.map(project -> mapper.map(project, ProjectDto.class))
.orElseThrow(() -> new EntityNotFoundException("Project not found: " + projectId));
}
}