Skip to content

Commit 5b4e3b9

Browse files
committed
feat: PDF 비밀번호 적용
1 parent 42eb366 commit 5b4e3b9

3 files changed

Lines changed: 276 additions & 40 deletions

File tree

src/main/java/com/neeis/neeis/domain/student/controller/StudentReportController.java

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626
import java.nio.charset.StandardCharsets;
2727
import java.time.LocalDateTime;
2828
import java.time.format.DateTimeFormatter;
29+
import java.util.HashMap;
30+
import java.util.Map;
2931

3032
import static com.neeis.neeis.global.common.StatusCode.SUCCESS_GET_PDF;
3133

@@ -120,7 +122,7 @@ public ResponseEntity<byte[]> downloadMyStudentReportPdf(
120122
StudentReportResponseDto reportData = studentReportService.generateMyStudentReport(userDetails.getUsername(), requestDto);
121123

122124
// PDF 생성
123-
byte[] pdfBytes = pdfGeneratorService.generateStudentReportPdf(reportData);
125+
byte[] pdfBytes = pdfGeneratorService.generateStudentReportPdf(reportData, userDetails.getUsername());
124126

125127
// 파일명 생성
126128
String fileName = generateFileName(reportData.getStudentInfo().getName());
@@ -224,7 +226,7 @@ public ResponseEntity<byte[]> downloadStudentReportPdfByTeacher(
224226
try {
225227
StudentReportResponseDto reportData = studentReportService.generateStudentReportByTeacher(userDetails.getUsername(), requestDto);
226228

227-
byte[] pdfBytes = pdfGeneratorService.generateStudentReportPdf(reportData);
229+
byte[] pdfBytes = pdfGeneratorService.generateStudentReportPdf(reportData, userDetails.getUsername());
228230

229231
String fileName = generateFileName(reportData.getStudentInfo().getName());
230232
String encodedFileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8);
@@ -242,6 +244,50 @@ public ResponseEntity<byte[]> downloadStudentReportPdfByTeacher(
242244
}
243245
}
244246

247+
@GetMapping("/password-info")
248+
public ResponseEntity<Map<String, String>> getPasswordInfo(
249+
@AuthenticationPrincipal UserDetails userDetails) {
250+
251+
try {
252+
String username = userDetails.getUsername();
253+
String userRole = pdfGeneratorService.getUserRoleByUsername(username);
254+
Map<String, String> response = new HashMap<>();
255+
256+
switch (userRole.toUpperCase()) {
257+
case "STUDENT":
258+
response.put("message", "PDF 문서의 암호는 본인의 생년월일 6자리입니다.");
259+
response.put("format", "YYMMDD (예: 051225)");
260+
response.put("example", "2005년 12월 25일생 → 051225");
261+
break;
262+
263+
case "PARENT":
264+
response.put("message", "PDF 문서의 암호는 자녀의 생년월일 6자리입니다.");
265+
response.put("format", "YYMMDD (예: 051225)");
266+
response.put("example", "자녀가 2005년 12월 25일생 → 051225");
267+
break;
268+
269+
case "TEACHER":
270+
response.put("message", "PDF 문서의 암호는 선생님의 핸드폰 번호 뒷자리 4자리입니다.");
271+
response.put("format", "핸드폰 뒷자리 4자리 (예: 1234)");
272+
response.put("example", "010-1234-5678 → 5678");
273+
break;
274+
275+
default:
276+
response.put("message", "패스워드 정보를 확인할 수 없습니다.");
277+
response.put("format", "관리자에게 문의하세요.");
278+
}
279+
280+
response.put("role", userRole);
281+
response.put("username", username);
282+
return ResponseEntity.ok(response);
283+
284+
} catch (Exception e) {
285+
Map<String, String> errorResponse = new HashMap<>();
286+
errorResponse.put("error", "패스워드 정보를 조회할 수 없습니다.");
287+
return ResponseEntity.badRequest().body(errorResponse);
288+
}
289+
}
290+
245291
/**
246292
* 파일명 생성 유틸리티
247293
* @param studentName 학생 이름

src/main/java/com/neeis/neeis/domain/student/service/StudentReportService.java

Lines changed: 13 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@ public class StudentReportService {
4444

4545
private final ScoreSummaryService scoreSummaryService;
4646
private final ClassroomStudentService classroomStudentService;
47-
private final ClassroomService classroomService;
4847
private final TeacherService teacherService;
4948
private final UserService userService;
5049
private final StudentService studentService; // StudentService 추가
@@ -164,33 +163,6 @@ public StudentReportResponseDto generateStudentReportByTeacher(String teacherUse
164163
return generateStudentReport(requestDto);
165164
}
166165

167-
/**
168-
* TODO: 반 전체 학생 보고서 일괄 생성 (비동기 처리 권장)
169-
*/
170-
@Transactional
171-
public String generateBulkClassReports(String teacherUsername, int year, int semester,
172-
int grade, int classNum, StudentReportRequestDto template) {
173-
log.info("반 전체 보고서 일괄 생성 - 교사: {}, {}년 {}학기 {}학년 {}반",
174-
teacherUsername, year, semester, grade, classNum);
175-
176-
// 교사 권한 확인
177-
teacherService.authenticate(teacherUsername);
178-
179-
// 해당 반 학생 목록 조회
180-
List<ClassroomStudent> students = classroomStudentService.findByClassroom(
181-
classroomService.findClassroom(year, grade, classNum));
182-
183-
// 작업 ID 생성
184-
String jobId = UUID.randomUUID().toString();
185-
186-
// TODO: 비동기 처리로 각 학생별 보고서 생성
187-
// 예: @Async 메서드 호출 또는 Queue 시스템 사용
188-
189-
log.info("일괄 생성 작업 시작 - 작업 ID: {}, 대상 학생 수: {}", jobId, students.size());
190-
191-
return jobId;
192-
}
193-
194166

195167
/**
196168
* 특정 연도의 ClassroomStudent 조회
@@ -307,17 +279,24 @@ private CounselingReportDto createCounselingReport(ClassroomStudent classroomStu
307279
log.debug("상담 정보 생성 중 - 학생: {}", classroomStudent.getStudent().getName());
308280

309281
try {
310-
// TODO: 실제 CounselService 구현 후 사용
282+
Student student = classroomStudent.getStudent();
311283

312-
List<CounselDetailDto> counsels = counselService.getCounsels(
313-
classroomStudent.getStudent().getUser().getUsername(),
314-
classroomStudent.getStudent().getId());
284+
// 상담 정보 조회 (권한에 따른 자동 복호화/마스킹 적용)
285+
List<CounselDetailDto> counsels = counselService.getCounsels(
286+
student.getUser().getUsername(),
287+
student.getId()
288+
);
289+
290+
// CounselingReportDto로 변환
291+
CounselingReportDto counselingReport = CounselingReportDto.from(counsels);
315292

316-
return CounselingReportDto.from(counsels);
293+
log.debug("상담 정보 생성 완료 - 학생: {}, 상담 건수: {}",
294+
student.getName(), counselingReport.getTotalSessions());
317295

296+
return counselingReport;
318297

319298
} catch (Exception e) {
320-
log.warn("상담 정보 조회 실패 - 학생: {}, 오류: {}",
299+
log.warn("상담 정보 조회 실패, 기본값 반환 - 학생: {}, 오류: {}",
321300
classroomStudent.getStudent().getName(), e.getMessage());
322301

323302
return CounselingReportDto.builder()

0 commit comments

Comments
 (0)