-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathProgramService.java
More file actions
129 lines (113 loc) · 4.51 KB
/
Copy pathProgramService.java
File metadata and controls
129 lines (113 loc) · 4.51 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
124
125
126
127
128
129
package com.ontario.program.service;
import java.time.LocalDateTime;
import java.util.List;
import com.ontario.program.dto.ProgramResponse;
import com.ontario.program.dto.ProgramReviewRequest;
import com.ontario.program.dto.ProgramSubmitRequest;
import com.ontario.program.dto.ProgramTypeResponse;
import com.ontario.program.exception.ResourceNotFoundException;
import com.ontario.program.model.Program;
import com.ontario.program.model.ProgramType;
import com.ontario.program.repository.ProgramRepository;
import com.ontario.program.repository.ProgramTypeRepository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
* Service layer for program submission and review operations.
*/
@Service
@Transactional(readOnly = true)
public class ProgramService {
private final ProgramRepository programRepository;
private final ProgramTypeRepository programTypeRepository;
public ProgramService(ProgramRepository programRepository,
ProgramTypeRepository programTypeRepository) {
this.programRepository = programRepository;
this.programTypeRepository = programTypeRepository;
}
/**
* Submit a new program request. Sets status to SUBMITTED with a timestamp.
*/
@Transactional
public ProgramResponse submitProgram(ProgramSubmitRequest request) {
ProgramType programType = programTypeRepository.findById(request.programTypeId())
.orElseThrow(() -> new ResourceNotFoundException(
"Program type not found with id: " + request.programTypeId()));
Program program = new Program(
request.programName(),
request.programDescription(),
programType,
request.createdBy()
);
program.setStatus("SUBMITTED");
program.setSubmittedAt(LocalDateTime.now());
program.setProgramBudget(request.programBudget());
Program saved = programRepository.save(program);
return toResponse(saved);
}
/**
* Retrieve all programs.
*/
public List<ProgramResponse> getAllPrograms() {
return programRepository.findAll().stream()
.map(this::toResponse)
.toList();
}
/**
* Retrieve a single program by ID.
*/
public ProgramResponse getProgramById(Integer id) {
Program program = programRepository.findById(id)
.orElseThrow(() -> new ResourceNotFoundException(
"Program not found with id: " + id));
return toResponse(program);
}
/**
* Review (approve or reject) a program submission.
*/
@Transactional
public ProgramResponse reviewProgram(Integer id, ProgramReviewRequest request) {
Program program = programRepository.findById(id)
.orElseThrow(() -> new ResourceNotFoundException(
"Program not found with id: " + id));
program.setStatus(request.status());
program.setReviewerComments(request.reviewerComments());
program.setReviewedAt(LocalDateTime.now());
Program saved = programRepository.save(program);
return toResponse(saved);
}
/**
* Retrieve all program types for dropdown population.
*/
public List<ProgramTypeResponse> getAllProgramTypes() {
return programTypeRepository.findAll().stream()
.map(this::toTypeResponse)
.toList();
}
private ProgramResponse toResponse(Program program) {
ProgramType type = program.getProgramType();
return new ProgramResponse(
program.getId(),
program.getProgramName(),
program.getProgramDescription(),
type.getId(),
type.getTypeName(),
type.getTypeNameFr(),
program.getStatus(),
program.getReviewerComments(),
program.getSubmittedAt(),
program.getReviewedAt(),
program.getCreatedAt(),
program.getUpdatedAt(),
program.getCreatedBy(),
program.getProgramBudget()
);
}
private ProgramTypeResponse toTypeResponse(ProgramType type) {
return new ProgramTypeResponse(
type.getId(),
type.getTypeName(),
type.getTypeNameFr()
);
}
}