Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
258 commits
Select commit Hold shift + click to select a range
7ce20ff
Merge pull request #306 from JNU-econovation/refactor/dev-cd
rlajm1203 Mar 1, 2025
537059f
feat: 배포 자동화 셸 스크립트 작성
rlajm1203 Mar 2, 2025
2968b1d
feat: 배포 자동화 셸 스크립트 적용
rlajm1203 Mar 2, 2025
db31f77
feat: 가장 최신 내용의 브랜치로 이동
rlajm1203 Mar 2, 2025
62e2e7d
feat: nginx proxy 컨테이너 추가
rlajm1203 Mar 2, 2025
9a9c17d
chore: gitignore에 .pem 추가
rlajm1203 Mar 2, 2025
9f691e3
feat: redis config 추가
rlajm1203 Mar 2, 2025
4db3659
Merge pull request #308 from JNU-econovation/refactor/dev-cd
rlajm1203 Mar 2, 2025
d556a22
refactor: git 디렉터리 에러 해결
rlajm1203 Mar 2, 2025
3ffa459
chore: gitignore 에 .key 추가
rlajm1203 Mar 2, 2025
245f863
refactor: 실행 권한 설정 명령 추가
rlajm1203 Mar 2, 2025
4e537fb
Merge pull request #309 from JNU-econovation/refactor/dev-cd
rlajm1203 Mar 2, 2025
1bedeaa
rename: 레디스 설정 파일 이름 변경
rlajm1203 Mar 2, 2025
e4a5a09
refactor: 잘못된 파일 이름 변경
rlajm1203 Mar 2, 2025
d3ca5dd
Merge pull request #310 from JNU-econovation/refactor/dev-cd
rlajm1203 Mar 2, 2025
b4c9d99
refactor: 디스코드 발송 에러 해결
rlajm1203 Mar 2, 2025
6ef907a
refactor: 디스코드 발송 스크립트 수정
rlajm1203 Mar 2, 2025
224b6de
Merge pull request #311 from JNU-econovation/refactor/dev-cd
rlajm1203 Mar 2, 2025
66bdd25
refactor: 디스코드 발송 스크립트 수정 - env 가 아닌 run 에서 바디 정의
rlajm1203 Mar 2, 2025
02862a6
Merge pull request #312 from JNU-econovation/refactor/dev-cd
rlajm1203 Mar 2, 2025
d8f4580
refactor: discord 알림 발송 워크 플로우 확정
rlajm1203 Mar 2, 2025
98794fc
refactor: discord 알림 발송 워크 플로우 확정 (prod)
rlajm1203 Mar 2, 2025
eb348bc
Merge pull request #313 from JNU-econovation/refactor/dev-cd
rlajm1203 Mar 2, 2025
4f6abf1
refactor: 디스코드 알림 환경 변수 step 제거
rlajm1203 Mar 2, 2025
2d19c9f
refactor: 디스코드 알림 환경 변수 step 제거 (Prod)
rlajm1203 Mar 2, 2025
dcb45a6
feat: github action 테스트 스크립트 작성
rlajm1203 Mar 2, 2025
60366d8
refactor: 파일 인코딩 변경
rlajm1203 Mar 2, 2025
16b79ed
chore: 테스트 스크립트 삭제
rlajm1203 Mar 2, 2025
18018d8
refactor: 필요 없는 주석 삭제
rlajm1203 Mar 2, 2025
9d2100e
refactor: 투명 블록 제거
rlajm1203 Mar 2, 2025
0deb57f
Merge pull request #314 from JNU-econovation/refactor/dev-cd
rlajm1203 Mar 2, 2025
4a3abf0
[chore]: spotless plugin version 6.11.0 -> 6.22.0 변경
injae-348 Mar 2, 2025
218da58
Merge pull request #316 from JNU-econovation/chore/BE-114
injae-348 Mar 2, 2025
415eba3
[feat]: 지원 완료 html 템플릿
westzeroright Mar 2, 2025
bd961e8
[refactor]: html 생성에 템플릿 엔진으로 타임리프 적용
westzeroright Mar 2, 2025
c9ae5b9
Merge pull request #318 from JNU-econovation/feature/BE-115
rlajm1203 Mar 3, 2025
cf8e449
Merge pull request #273 from JNU-econovation/feature/BE-96
rlajm1203 Mar 4, 2025
9266db2
refactor: 지원서의 합/불 상태 리스트 조회 API에 description 추가
rlajm1203 Mar 11, 2025
b61eb4e
refactor: PassStateToEnum 은 Response 에 포함되지 않도록 수정
rlajm1203 Mar 11, 2025
b44468d
refactor: ApplicantStateResponse 정의
rlajm1203 Mar 11, 2025
a5489b7
fix: backup 디렉터리가 존재하지 않을 경우, 디렉터리를 생성하도록 수정
rlajm1203 Mar 18, 2025
7a051d8
refactor: backup 실패 시, printStackTrace 출력하지 않도록 수정
rlajm1203 Mar 18, 2025
95ed4c4
feat: 사용하지 않는 도커 볼륨 삭제 스크립트 추가
rlajm1203 Mar 18, 2025
87ec737
refactor: 서류 지원 확인 이메일 템플릿 명 변경
rlajm1203 Mar 18, 2025
2664a8a
feat: email-first-passed-email 템플릿 추가
rlajm1203 Mar 19, 2025
8b027b8
feat: template -> templates
rlajm1203 Mar 19, 2025
0edb687
feat: email-first-passed-email -> email-first-passed
rlajm1203 Mar 19, 2025
649a8b0
chore: api -> infra 모듈로 이동
rlajm1203 Mar 19, 2025
335508f
style: inline css 적용
rlajm1203 Mar 19, 2025
9ad6cbb
refactor: 멘트 수정
rlajm1203 Mar 19, 2025
f166197
feat: 최종합격자 이메일 템플릿 추가
rlajm1203 Mar 20, 2025
a8ac487
feat: 서류 불합격자 메일 템플릿 추가
rlajm1203 Mar 20, 2025
4e899b3
feat: 최종 불합격자 메일 템플릿 추가
rlajm1203 Mar 20, 2025
d3ccc69
refactor: 최종 합격자 메일 변수 수정
rlajm1203 Mar 20, 2025
9b1a03e
feat: 합격 상태 별, 이메일 템플릿 추가
rlajm1203 Mar 20, 2025
5306226
refactor: switch case 문에, break 추가
rlajm1203 Mar 20, 2025
fffd032
feat: DefaultTemplate 클래스 정의
rlajm1203 Mar 21, 2025
97f87a8
feat: ApplicantEmailService 클래스 작성
rlajm1203 Mar 21, 2025
a601b30
refactor: FinalEmailDiscussionEmailScheduler 로직 수정
rlajm1203 Mar 21, 2025
ee2a2f3
refactor: 패키지 이동 및 클래스명 변경
rlajm1203 Mar 21, 2025
9f01a90
refactor: EmailTemplateType 수정
rlajm1203 Mar 21, 2025
14d6bcb
refactor: EnumType 이름 변경
rlajm1203 Mar 21, 2025
c9e3c40
refactor: email 템플릿 infrastructure 모듈에서 domain 모듈로 이전
rlajm1203 Mar 21, 2025
a63809e
refactor: application.yml 수정
rlajm1203 Mar 21, 2025
1c2d03b
feat: DefaultEmailProperties 클래스 정의
rlajm1203 Mar 21, 2025
91a7ac2
feat: DefaultEmailTemplateGenerator 추가
rlajm1203 Mar 21, 2025
1c39469
feat: 포트폴리어 파일 경로 추가
rlajm1203 Mar 21, 2025
8771f79
refactor: DefaultEmailGenerator 사용
rlajm1203 Mar 21, 2025
594538b
comment: 주석 내용 수정
rlajm1203 Mar 21, 2025
91803da
refactor: switch-case에 걸리지 않을 경우 그대로 리턴
rlajm1203 Mar 21, 2025
e885500
refactor: DefaultEmailProperties 수정
rlajm1203 Mar 21, 2025
be7e649
refactor: 시간 정보 text로 변경
rlajm1203 Mar 21, 2025
9e1d15b
refactor: temporals.format 으로 변경
rlajm1203 Mar 21, 2025
d837b26
feat: Ncp Sms 관련 설정 추가
rlajm1203 Mar 22, 2025
8ba3e8f
rename: Response -> NcpResponse 클래스 명 변경
rlajm1203 Mar 22, 2025
b799460
feat: NcpSmsResponse 정의
rlajm1203 Mar 22, 2025
8aefd88
feat: NcpSmsResponse 적용
rlajm1203 Mar 22, 2025
8def220
feat: NcpSmsSender 정의
rlajm1203 Mar 22, 2025
a519c20
feat: SmsMessageGenerator 정의
rlajm1203 Mar 22, 2025
b417234
feat: ApplicantSmsService 구현
rlajm1203 Mar 22, 2025
c8e66d4
refactor: EmailSendEvent 수정
rlajm1203 Mar 22, 2025
4c43892
feat: EmailSendEventHandler 정의
rlajm1203 Mar 22, 2025
401842e
feat: sendSms(applicantId) 메소드 추가
rlajm1203 Mar 22, 2025
024cde9
refactor: record @Getter 제거
rlajm1203 Mar 22, 2025
0441a15
feat: NcpClients 클래스 정의
rlajm1203 Mar 22, 2025
8156747
delete: NcpClient 삭제
rlajm1203 Mar 22, 2025
df40573
refactor: 패키지 명 변경 및, NcpClients 적용
rlajm1203 Mar 22, 2025
94d050d
rename: NcpSmsSender -> NcpSmsHelper
rlajm1203 Mar 22, 2025
6b22947
refactor: ncp api url 분리
rlajm1203 Mar 22, 2025
6ff531f
refactor: 패키지 이동에 따른 수정
rlajm1203 Mar 22, 2025
06561d3
refactor: 패키지 이동
rlajm1203 Mar 22, 2025
011dc73
refactor: 휴대폰 번호 추출 키 phone -> contacted
rlajm1203 Mar 22, 2025
8c80991
refactor: FeignClient 에러 발생 시, Response 값 String 으로 볼 수 있도록 변경
rlajm1203 Mar 22, 2025
a998767
refactor: charset 변경
rlajm1203 Mar 22, 2025
6a1c372
refactor: Message 객체에 Getter 추가
rlajm1203 Mar 22, 2025
abeaf6b
refactor: NcpSmsClient return type change
rlajm1203 Mar 22, 2025
56e2cce
refactor: add default constructor
rlajm1203 Mar 22, 2025
75fe685
feat: add fromPhoneNumber
rlajm1203 Mar 22, 2025
a114186
feat: 메일 전송 시, 메일 전송 이벤트 발행
rlajm1203 Mar 22, 2025
be7293b
feat: EmailTemplateInvalidStateException 정의
rlajm1203 Mar 23, 2025
5e74a98
refactor: 상태에 맞지 않는 템플릿일 경우 던지는 예외 변경
rlajm1203 Mar 23, 2025
f2c3c1a
refactor: retry 횟수 3회로 변경 및 에러 로그 수정
rlajm1203 Mar 23, 2025
4122216
feat: 최종 합격 공지 대상 필터링 메소드 추가
rlajm1203 Mar 23, 2025
8444274
refactor: 최종 합격자 대상 ot 시간 형식 수정
rlajm1203 Mar 23, 2025
5f4fd63
feat: 이메일 API 컨트롤러 추가
rlajm1203 Mar 23, 2025
78e1ee6
style: spotlessApply
rlajm1203 Mar 23, 2025
02788f9
fix: Redisson Lock 해제 조건 추가
rlajm1203 Mar 23, 2025
bd88714
style: spotlessApply
rlajm1203 Mar 23, 2025
92c3ebb
Merge pull request #324 from JNU-econovation/refactor/BE-119
rlajm1203 Mar 23, 2025
a271f55
Merge pull request #327 from JNU-econovation/bug/BE-121
rlajm1203 Mar 23, 2025
c5c3931
comment: 주석 추가
rlajm1203 Mar 23, 2025
0676212
refactor: 메일 발송 성공 시 이벤트 발행 로직 제거
rlajm1203 Mar 23, 2025
ea1fda4
feat: SecurityConfig에 email 관련 api 추가
rlajm1203 Mar 23, 2025
dc4152b
feat: 이벤트 발행 로그 다시 추가
rlajm1203 Mar 23, 2025
8483d26
feat: email api 추가
rlajm1203 Mar 23, 2025
1cb4d6f
feat: sendEmail(year, state) 메소드 추가
rlajm1203 Mar 23, 2025
acd3a20
feat: applicantId로 MongoAnswer 찾는 메소드 추가
rlajm1203 Mar 23, 2025
ac7f077
feat: applicantId로 지원자 한 명 에게 메일 발송 API 추가
rlajm1203 Mar 23, 2025
5746712
refactor: 님! 추가
rlajm1203 Mar 23, 2025
4d8a264
Merge pull request #329 from JNU-econovation/feat/BE-122
rlajm1203 Mar 23, 2025
36da3d2
style: spotlessApply
rlajm1203 Mar 23, 2025
e5fb7a7
style: spotlessApply
rlajm1203 Mar 23, 2025
973d393
Merge pull request #330 from JNU-econovation/feat/BE-122
rlajm1203 Mar 23, 2025
26d9f65
docs: 포트폴리오 새로운 버전으로 변경
rlajm1203 Mar 23, 2025
219a24e
refactor: 구글폼 링크 추가
rlajm1203 Mar 23, 2025
a3750e6
refactor: ot url 설정 추가
rlajm1203 Mar 23, 2025
5aba1fe
fix: 오타 수정
rlajm1203 Mar 23, 2025
7cccae1
fix: orientation url key 수정
rlajm1203 Mar 23, 2025
1085408
refactor: 불합격자 멘트 수정
rlajm1203 Mar 23, 2025
c1daf50
fix: 오타 수정
rlajm1203 Mar 23, 2025
5f9c678
refactor: 문자 기본 멘트 변경
rlajm1203 Mar 23, 2025
db5a0ed
refactor: 띄어쓰기 추가
rlajm1203 Mar 23, 2025
2714e27
Merge pull request #332 from JNU-econovation/docs/BE-123
rlajm1203 Mar 23, 2025
c8ee017
[BE-122] 이메일 발송 이벤트 처리를 수정합니다. (#336)
rlajm1203 May 27, 2025
fd2c5be
[feat]: 레디스에 저장할 액세스토큰 엔티티
westzeroright May 28, 2025
53ebfe2
[feat]: 화이트리스트 레포지토리 및 레디스 설정
westzeroright May 28, 2025
a8ae4d8
[feat]: 매 요청 접속 시 화이트리스트에 액세스 토큰이 있는지 검사
westzeroright May 28, 2025
2c8ac01
[feat]: 로그인 시 액세스 토큰을 저장하고 로그아웃 시 삭제
westzeroright May 28, 2025
471c97c
[refactor]: 기존에 있는 InvalideTokenException을 사용
westzeroright May 29, 2025
bd4171d
[refactor]: 필터에서 레포지토리보다는 포트를 주입받아서 사용
westzeroright May 29, 2025
9666b9a
[feat]: 간소화된 면접 기록 응답 DTO 추가
injae-348 May 29, 2025
a8fa1bf
[feat]: 간단한 면접 목록 조회를 위한 executeSimple 메서드 추가
injae-348 May 29, 2025
e6c3099
[feat]: RecordService에 executeSimple 구현
injae-348 May 29, 2025
dbb99d6
[feat]: 간소화된 면접 기록 목록 조회 엔드포인트 추가
injae-348 May 29, 2025
4ff67c6
[feat]: Record, Applicant, 점수, 페이지 정보를 담는 FilteredRecordsApplicantsDt…
injae-348 Jun 4, 2025
5facd2b
[refactor]: RecordsService의 공통 로직을 private 메서드로 분리
injae-348 Jun 4, 2025
21b3994
Merge pull request #341 from JNU-econovation/feature/BE-125
injae-348 Jun 5, 2025
9babac2
Merge pull request #340 from JNU-econovation/feature/BE-127
westzeroright Jun 5, 2025
ef68720
[feat]: 비밀번호 재설정 기능 구현
westzeroright Jun 26, 2025
0c38a56
[style]: spotless
westzeroright Jun 26, 2025
f7a60c2
[feat]: 이메일로 인증코드 발송 구현
westzeroright Jun 26, 2025
9326bf7
[feat]: 이메일로 인증코드 발송 구현
westzeroright Jun 29, 2025
109e3d6
[feat]: 비밀번호 재설정 시 인증 완료 기록 없으면 예외 발생
westzeroright Jun 29, 2025
ced6515
[style]: spotless
westzeroright Jun 29, 2025
9613f6f
[chore]: Graphql 의존성 추가
injae-348 Jul 4, 2025
399f13b
[chore]: GraphQL 스키마 초기화 설정 및 로깅 설정 추가
injae-348 Jul 4, 2025
3a71f84
Merge pull request #344 from JNU-econovation/feature/BE-129
westzeroright Jul 4, 2025
eafa063
[feat]: 요청/응답 캐싱 필터에 GraphQL 제외 전략 적용
injae-348 Jul 4, 2025
21d4cd6
[feat]: Method Level 인가 활성화 및 GraphQL 경로 permitAll 설정
injae-348 Jul 4, 2025
1669677
[feat]: GraphQL JSON 스칼라 등록 및 Jackson 메시지 컨버터 설정
injae-348 Jul 4, 2025
201f490
[feat]: GraphQL을 통한 필터링된 목록 및 단일 조회 기능 구현
injae-348 Jul 4, 2025
671b7da
[feat]: GraphQLExceptionHandler 추가
injae-348 Jul 4, 2025
22a0b2d
Merge branch 'develop' of https://github.com/JNU-econovation/econo-re…
injae-348 Jul 4, 2025
f0e8bab
[style]: spotless
injae-348 Jul 4, 2025
69589ed
[BE-113] 칸반 보드 Columns 조회 시 QueryString으로 year 정보를 받는 V2 API 추가, 지원서 …
injae-348 Jul 5, 2025
9db08e7
Revert "[BE-113] 칸반 보드 Columns 조회 시 QueryString으로 year 정보를 받는 V2 API …
rlajm1203 Jul 5, 2025
d0ba54d
[feat]: 비밀번호 재설정을 위한 이메일 인증 시 존재하지 않는 면접관이면 예외 처리
westzeroright Jul 9, 2025
99b6817
[feat]: 회원가입 시 이메일 인증 기능 추가
westzeroright Jul 9, 2025
bd9f840
[feat]: 시큐리티 경로 추가
westzeroright Jul 9, 2025
594e3e0
[feat]: 회원가입 시 이메일 인증이 완료되지 않았으면 예외 처리
westzeroright Jul 9, 2025
6322acf
[style]: spotless
westzeroright Jul 9, 2025
c7fe140
[refactor]: GraphQL 에외 처리 빌더 메서드를 통한 중복 코드 제거
injae-348 Jul 9, 2025
7887f85
[style]: spotless
injae-348 Jul 9, 2025
6aefc35
Merge pull request #347 from JNU-econovation/feature/BE-128
injae-348 Jul 9, 2025
935c83b
[refactor]: Graphql 경로 /graphql 에서 /api/graphql로 변경
injae-348 Jul 9, 2025
0dce671
Merge pull request #351 from JNU-econovation/refactor/BE-132
injae-348 Jul 9, 2025
3a5848b
[refactor]: Optional 객체에 ifPresentOrElse 적용
westzeroright Jul 10, 2025
b08bc4e
[feat]: 비밀번호 재설정 및 회원가입 완료 시 코드 인증 완료 데이터 삭제
westzeroright Jul 10, 2025
095aa48
[refactor]: UserService에 ifPresentOrElse 적용
westzeroright Jul 10, 2025
958579a
Merge pull request #349 from JNU-econovation/feature/BE-131
westzeroright Jul 10, 2025
8bb505d
[BE-130] 리크루트 모집 on/off 기능 구현 (#352)
rlajm1203 Jul 21, 2025
c1fbd8d
[BE-133] 등록된 모집이 존재하지 않을경우, 유효성 검증 시 예외가 발생하는 오류 수정 (#353)
rlajm1203 Jul 21, 2025
4c8cb45
[BE-133] 생성된 모집 조회 페이지네이션 오류를 수정합니다. (#354)
rlajm1203 Jul 21, 2025
2955aeb
[BE-113] 칸반 보드 Columns 조회 시 QueryString으로 year 정보를 받는 V2 API 추가, 지원서 …
rlajm1203 Aug 20, 2025
0f6a045
[feat]: year에 해당하는 지원서 전체 삭제 컨트롤러 코드
westzeroright Aug 26, 2025
8c34d2a
[style]: 사용하지 않는 클래스 선언 제거
westzeroright Aug 26, 2025
82638dd
[feat]: year에 해당하는 전체 지원서 삭제 기능 구현
westzeroright Aug 26, 2025
a4bc9fd
[BE-136] 가장 최신 Recruitment 조회 API 추가 및 PageSize 동적 설정 (#360)
rlajm1203 Aug 27, 2025
dac83ee
[BE-137] 모집 정보 조회 필드 추가 (#362)
rlajm1203 Aug 28, 2025
734d431
[BE-138] Recruitment 등록 시 Columns 을 자동으로 생성합니다. (#364)
rlajm1203 Aug 29, 2025
9afe937
refactor: 시스템 전체 로그 레벨 환경 변수로 변경 (#366)
rlajm1203 Aug 29, 2025
635b00d
[BE-139] AsyncConfig 추가 및 비동기 이벤트 핸들 설정 (#367)
rlajm1203 Aug 29, 2025
82b383f
[BE-139] Quartz 로깅 설정 추가 (#368)
rlajm1203 Aug 29, 2025
cd8fd60
[BE-139] RecruitmentRegisteredEventHandler @Async 제거 (#369)
rlajm1203 Aug 29, 2025
78a18d4
Merge branch 'backend' into develop
rlajm1203 Aug 31, 2025
0835c2d
style: spotlessApply
rlajm1203 Aug 31, 2025
41faf4c
[BE-141] 지원서 접수 시, 기수에 맞지 않는 컬럼에 보드가 생성되는 오류를 수정합니다. (#372)
rlajm1203 Aug 31, 2025
dce1f8e
Merge branch 'backend' into develop
rlajm1203 Aug 31, 2025
fc7023f
[BE-141] Card, Board 생성 시 ColumnsId 를 잘못 가져오는 오류를 수정합니다. (#375)
rlajm1203 Aug 31, 2025
9938082
[docs]: 스웨거 설명 추가
westzeroright Sep 4, 2025
1bb5c55
[docs]: TODO 작성
westzeroright Sep 4, 2025
54f9ea3
[feat]: year에 해당하는 applicantId들을 리스트로 조회
westzeroright Sep 4, 2025
913cf86
[feat]: applicantIds에 해당하는 time_table 데이터 삭제
westzeroright Sep 4, 2025
bafdca4
[refactor]: 변수명 수정
westzeroright Sep 4, 2025
de25b1c
[feat]: timetable 삭제 로직 리팩토링 및 score 데이터 삭제
westzeroright Sep 4, 2025
bca7c94
[feat]: score 데이터 삭제
westzeroright Sep 4, 2025
2540b4b
[feat]: card & board 데이터 삭제
westzeroright Sep 4, 2025
a9e6f9c
[style]: spotless
westzeroright Sep 4, 2025
d914a1c
[BE-141] 이메일 인증 로직에서 Optional 리팩토링 및 입력 형식 검증 실패 시 400을 반환 (#377)
westzeroright Sep 7, 2025
58461b6
Merge pull request #378 from JNU-econovation/feature/BE-133
westzeroright Sep 7, 2025
4b16620
[feat]: 지원서 ID들을 기반으로 지원서 일괄 삭제
westzeroright Sep 11, 2025
c6fd46b
[feat]: mysql 데이터 삭제
westzeroright Sep 11, 2025
2a947ce
[feat]: 관리자만 해당 기능을 사용할 수 있도록 설정
westzeroright Sep 11, 2025
1f1f58f
[refactor]: Optional 객체에 대한 get 메서드보다 orElseThrow 사용
westzeroright Sep 11, 2025
67dd17e
[feat]: 지원서의 name 항목에 대하여 앞뒤 공백 제거
westzeroright Sep 12, 2025
c2d7fc1
[feat]: year와 classOf(학번)에 대한 중복 지원 검사를 위해 unique key 설정
westzeroright Sep 12, 2025
5b6c66e
Merge pull request #379 from JNU-econovation/feaeture/BE-133
westzeroright Sep 21, 2025
486e085
Merge pull request #382 from JNU-econovation/feature/BE-143
westzeroright Sep 21, 2025
276cf26
Merge pull request #383 from JNU-econovation/feature/BE-144
westzeroright Sep 21, 2025
0267c91
feat: 지원자 검색을 위한 MongoAnswer에 name 필드 추가
westzeroright Dec 28, 2025
08681a6
feat: 지원자 이름 자동완성 검색 기능 구현
westzeroright Dec 28, 2025
b5b0123
feat: 지원자 이름 자동완성 API
westzeroright Dec 28, 2025
3c68e7d
feat: 게스트는 해당 요청 불가
westzeroright Jan 2, 2026
c46b54a
Merge pull request #388 from JNU-econovation/feature/BE-145
westzeroright Jan 4, 2026
18c0a9c
feat: 코멘트 조회 시 TF들은 서로의 코멘트 조회 불가
westzeroright Feb 14, 2026
acf9937
feat: 다른 면접관의 댓글은 볼 수 있지만 블러 처리
westzeroright Feb 14, 2026
3d636a2
refactor: 블러 코멘트 문구 수정
westzeroright Feb 14, 2026
2676613
refactor: 시간 형식을 long에서 LocalDateTime으로 변경
westzeroright Feb 14, 2026
288864b
Merge pull request #390 from JNU-econovation/feature/BE-148
westzeroright Feb 15, 2026
c61f7e1
Merge pull request #392 from JNU-econovation/refactor/BE-149
westzeroright Feb 15, 2026
58912a4
feat: 코멘트 전체 공개 전환 기능 구현
westzeroright Feb 15, 2026
f1741d1
refactor: 용어 통일
westzeroright Feb 15, 2026
91df09f
feat: 댓글 공개 여부에 따라 블러 처리
westzeroright Feb 15, 2026
2367296
style: spotless
westzeroright Feb 15, 2026
54ca5bd
fix: 잘못된 예외 타입 수정
westzeroright Feb 18, 2026
a8c8973
refactor: 40기까지의 컬럼 데이터 초기화 (#396)
rlajm1203 Feb 18, 2026
1345c01
feat: 초기화 sql 추가
westzeroright Feb 18, 2026
51b4062
Merge branch 'develop' into feature/BE-150
westzeroright Feb 18, 2026
0439e33
[BE-152] SQL 문법 오류 제거 + 회원가입시 이메일 인증 코드 주석 처리 (#399)
rlajm1203 Feb 18, 2026
6fbb350
Merge branch 'develop' into feature/BE-150
rlajm1203 Feb 18, 2026
ace00ca
[feat]: 댓글 전체 공개 상태 조회
westzeroright Feb 19, 2026
a41bb7f
[feat]: 댓글 전체 공개 상태 조회 시큐리티 설정 추가
westzeroright Feb 19, 2026
334ead2
[refactor]: 불필요한 코드 제거
westzeroright Feb 19, 2026
2b7d525
[chore]: @Schema 어노테이션을 사용하기 위한 springdoc 의존성 추가
westzeroright Feb 19, 2026
ead6a19
[feat]: 스웨거 요청 형식 지정
westzeroright Feb 19, 2026
347896a
Merge pull request #402 from JNU-econovation/fix/BE-155
westzeroright Feb 22, 2026
b33a058
Merge pull request #394 from JNU-econovation/feature/BE-150
westzeroright Feb 22, 2026
817d20a
[BE-156] 운영 환경에서 Swagger 접속을 막기 (#405)
LeeJaeRyun Feb 24, 2026
48477c8
[BE-157] 권한 변경 API 관리자만 허용 (#407)
westzeroright Feb 24, 2026
cd35a60
[BE-146] 합/불 상태 변경 가능 여부 계산 로직 추가 (#386)
rlajm1203 Feb 25, 2026
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

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,14 +1,12 @@
package com.econovation.recruit.api.applicant.command;

import java.util.Map;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.ToString;
import org.axonframework.modelling.command.TargetAggregateIdentifier;

@AllArgsConstructor
@ToString
@Data
@NoArgsConstructor
Expand All @@ -17,4 +15,20 @@ public class CreateAnswerCommand {
@TargetAggregateIdentifier private String id;
private Integer year;
private Map<String, Object> qna;

public CreateAnswerCommand(String id, Integer year, Map<String, Object> qna) {
this.id = id;
this.year = year;
setQna(qna);
}

private void setQna(Map<String, Object> qna) {
if (qna != null && qna.containsKey("name")) {
Object value = qna.get("name");
if (value instanceof String str) {
qna.put("name", str.trim());
}
}
this.qna = qna;
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.econovation.recruit.api.applicant.controller;

import static com.econovation.recruitcommon.consts.RecruitStatic.APPLICANTS_BY_YEAR_SUCCESS_DELETE_MESSAGE;
import static com.econovation.recruitcommon.consts.RecruitStatic.APPLICANTS_SUCCESS_DELETE_MESSAGE;
import static com.econovation.recruitcommon.consts.RecruitStatic.APPLICANT_SUCCESS_REGISTER_MESSAGE;
import static com.econovation.recruitcommon.consts.RecruitStatic.PASS_STATE_KEY;

Expand All @@ -12,7 +14,6 @@
import com.econovation.recruit.api.applicant.usecase.TimeTableLoadUseCase;
import com.econovation.recruit.api.applicant.usecase.TimeTableRegisterUseCase;
import com.econovation.recruit.api.applicant.validate.ApplicantValidator;
import com.econovation.recruit.api.recruitment.usecase.RecruitmentUseCase;
import com.econovation.recruit.api.recruitment.util.LatestRecruitmentVo;
import com.econovation.recruitcommon.annotation.ApiErrorExceptionsExample;
import com.econovation.recruitcommon.annotation.TimeTrace;
Expand All @@ -34,7 +35,15 @@
import org.springdoc.api.annotations.ParameterObject;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PatchMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api/v1")
Expand All @@ -50,7 +59,6 @@ public class ApplicantController {
private final CommandGateway commandGateway;
private final ApplicantValidator applicantValidator;
private final ApplicantCommandUseCase applicantCommandUseCase;
private final RecruitmentUseCase applicationManagementUseCase;
private final LatestRecruitmentVo latestRecruitInfo;

@Operation(summary = "지원자가 지원서를 작성합니다.", description = "반환 값은 생성된 지원자의 ID입니다.")
Expand Down Expand Up @@ -163,10 +171,12 @@ public ResponseEntity<Map<String, String>> updateStatus(
}

@Operation(
summary = "지원서의 합/불 상태를 조회합니다. (합/불 관리자 페이지 전용)",
summary = "지원서의 합/불 상태를 조회합니다.",
description =
"""
응답으로 오는 passState 값의 종류는 non-processed, non-passed, first-passed, final-passed 입니다.
- passState : non-processed | non-passed | first-passed | final-passed
- isPassable : 현재 상태에서 pass 할 수 있는지 여부
- isNonPassable : 현재 상태에서 non-pass 할 수 있는지 여부
""")
@GetMapping("/year/{year}/applicants/pass-state")
public ResponseEntity<List<GetApplicantsStatusResponse>> getApplicantsStatus(
Expand All @@ -175,4 +185,26 @@ public ResponseEntity<List<GetApplicantsStatusResponse>> getApplicantsStatus(
applicantQueryUseCase.getApplicantsStatus(year, sortType);
return new ResponseEntity<>(result, HttpStatus.OK);
}

@Operation(summary = "year에 해당하는 모든 지원서를 삭제합니다.")
@DeleteMapping("/applicants/all/{year}")
public ResponseEntity<String> deleteApplicants(@PathVariable("year") Integer year) {
applicantCommandUseCase.deleteByYear(year);
return new ResponseEntity<>(APPLICANTS_BY_YEAR_SUCCESS_DELETE_MESSAGE, HttpStatus.OK);
}

@Operation(summary = "지원서들을 선택해서 일괄 삭제합니다.")
@DeleteMapping("/applicants")
public ResponseEntity<String> deleteApplicant(@RequestBody List<String> applicantIds) {
applicantCommandUseCase.deleteByApplicantIds(applicantIds);
return new ResponseEntity<>(APPLICANTS_SUCCESS_DELETE_MESSAGE, HttpStatus.OK);
}

@Operation(summary = "지원자 검색 시 성함 자동완성")
@GetMapping("/applicants/names/{year}")
public ResponseEntity<List<String>> getApplicantNames(
@PathVariable Integer year, @RequestParam String keyword) {
return new ResponseEntity<>(
applicantQueryUseCase.autocomplete(year, keyword), HttpStatus.OK);
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
package com.econovation.recruit.api.applicant.dto;

public record ApplicantStateResponse(String passState) {

public static ApplicantStateResponse of(String passState) {
return new ApplicantStateResponse(passState);
public record ApplicantStateResponse(String passState, boolean isPassable, boolean isNonPassable) {

public static ApplicantStateResponse of(String passState, boolean isPassable, boolean isNonPassable) {
return new ApplicantStateResponse(passState, isPassable, isNonPassable);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import static com.econovation.recruitcommon.consts.RecruitStatic.PASS_STATE_KEY;

import com.econovation.recruitdomain.domains.applicant.domain.state.ApplicantState;
import com.econovation.recruitdomain.domains.applicant.domain.state.PeriodStates;
import com.econovation.recruitdomain.domains.applicant.exception.ApplicantWrongStateException;
import java.util.Map;
import lombok.AllArgsConstructor;
Expand All @@ -21,16 +22,20 @@ public class GetApplicantsStatusResponse {
private Integer year;
private ApplicantStateResponse state;

public static GetApplicantsStatusResponse of(Map<String, Object> result) {
public static GetApplicantsStatusResponse of(Map<String, Object> result, PeriodStates period) {
if (result.get(PASS_STATE_KEY) instanceof ApplicantState applicantState) {
String passState = applicantState.getPassState();
boolean isPassable = applicantState.isPassable(period);
boolean isNonPassable = applicantState.isNonPassable(period);

return GetApplicantsStatusResponse.builder()
.field((String) result.get("field"))
.field1((String) result.get("field1"))
.field2((String) result.get("field2"))
.name((String) result.get("name"))
.id((String) result.get("id"))
.year((Integer) result.get("year"))
.state(ApplicantStateResponse.of(applicantState.getPassState()))
.state(ApplicantStateResponse.of(passState, isPassable, isNonPassable))
.build();
}
throw ApplicantWrongStateException.wrongStatusException;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,21 @@
import com.econovation.recruit.api.applicant.usecase.ApplicantCommandUseCase;
import com.econovation.recruit.api.recruitment.util.LatestRecruitmentVo;
import com.econovation.recruitdomain.common.aop.domainEvent.Events;
import com.econovation.recruitdomain.domains.applicant.adaptor.AnswerAdaptor;
import com.econovation.recruitdomain.domains.applicant.domain.MongoAnswer;
import com.econovation.recruitdomain.domains.applicant.domain.MongoAnswerAdaptor;
import com.econovation.recruitdomain.domains.applicant.domain.state.ApplicantState;
import com.econovation.recruitdomain.domains.applicant.event.domainevent.ApplicantRegisterEvent;
import com.econovation.recruitdomain.domains.applicant.event.domainevent.ApplicantStateModifyEvent;
import com.econovation.recruitdomain.domains.board.adaptor.BoardAdaptor;
import com.econovation.recruitdomain.domains.board.domain.Board;
import com.econovation.recruitdomain.domains.board.exception.BoardNotFoundException;
import com.econovation.recruitdomain.domains.card.adaptor.CardAdaptor;
import com.econovation.recruitdomain.domains.card.domain.Card;
import com.econovation.recruitdomain.domains.label.adaptor.LabelAdaptor;
import com.econovation.recruitdomain.domains.score.adaptor.ScoreAdaptor;
import com.econovation.recruitdomain.domains.timetable.adaptor.TimeTableAdapter;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import lombok.RequiredArgsConstructor;
Expand All @@ -18,9 +28,15 @@
@Service
@RequiredArgsConstructor
public class AnswerCommandService implements ApplicantCommandUseCase {
private final MongoAnswerAdaptor answerAdaptor;
private final MongoAnswerAdaptor mongoAnswerAdaptor;
private final ApplicantStateUpdateEventHandler applicantStateUpdateEventHandler;
private final LatestRecruitmentVo latestRecruitInfo;
private final AnswerAdaptor answerAdaptor;
private final TimeTableAdapter timeTableAdapter;
private final ScoreAdaptor scoreAdaptor;
private final LabelAdaptor labelAdaptor;
private final CardAdaptor cardAdaptor;
private final BoardAdaptor boardAdaptor;

@Override
@Transactional
Expand Down Expand Up @@ -51,7 +67,7 @@ public UUID execute(Map<String, Object> qna, UUID id) {
.build();
// 학번으로 중복 체크
// validateRegisterApplicant(qna);
answerAdaptor.save(answer);
mongoAnswerAdaptor.save(answer);

String name = qna.get("name").toString();
String hopeField = qna.get("field").toString();
Expand All @@ -62,4 +78,48 @@ public UUID execute(Map<String, Object> qna, UUID id) {
Events.raise(applicantRegisterEvent);
return null;
}

@Override
@Transactional
public void deleteByYear(Integer year) {
List<String> applicantIds = answerAdaptor.findApplicantIdsByYear(year);
mongoAnswerAdaptor.delete(year);

timeTableAdapter.deleteAllByApplicantIds(applicantIds);
scoreAdaptor.deleteAllByApplicantIds(applicantIds);
labelAdaptor.deleteAllByApplicantIds(applicantIds);

List<Long> cardIds = cardAdaptor.findAllByApplicantIds(applicantIds);
boardAdaptor.deleteAllByCardIds(cardIds);
cardAdaptor.deleteAllByApplicantIds(applicantIds);
}

@Override
@Transactional
public void deleteByApplicantIds(List<String> applicantIds) {
mongoAnswerAdaptor.deleteByApplicantIds(applicantIds);

timeTableAdapter.deleteAllByApplicantIds(applicantIds);
scoreAdaptor.deleteAllByApplicantIds(applicantIds);
labelAdaptor.deleteAllByApplicantIds(applicantIds);

for (String applicantId : applicantIds) {
deleteBoardByApplicantId(applicantId);
}

cardAdaptor.deleteAllByApplicantIds(applicantIds);
}

private void deleteBoardByApplicantId(String applicantId) {
Card card = cardAdaptor.findByApplicantId(applicantId);
Board deleteBoard = boardAdaptor.getBoardByCardId(card.getId());

Board previousBoard =
boardAdaptor
.getByNextBoardId(deleteBoard.getId())
.orElseThrow(() -> BoardNotFoundException.EXCEPTION);
previousBoard.updateNextBoardID(deleteBoard.getNextBoardId());

boardAdaptor.deleteByCardId(card.getId());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,14 @@
import com.econovation.recruit.api.applicant.dto.AnswersResponseDto;
import com.econovation.recruit.api.applicant.dto.GetApplicantsStatusResponse;
import com.econovation.recruit.api.applicant.query.AnswerQuery;
import com.econovation.recruit.api.applicant.state.support.PeriodCalculator;
import com.econovation.recruit.api.applicant.usecase.ApplicantQueryUseCase;
import com.econovation.recruit.api.recruitment.util.LatestRecruitmentVo;
import com.econovation.recruit.utils.sort.SortHelper;
import com.econovation.recruit.utils.vo.PageInfo;
import com.econovation.recruitdomain.domains.applicant.adaptor.AnswerAdaptor;
import com.econovation.recruitdomain.domains.applicant.domain.MongoAnswer;
import com.econovation.recruitdomain.domains.applicant.domain.state.PeriodStates;
import com.econovation.recruitdomain.domains.applicant.exception.ApplicantNotFoundException;
import java.util.Collections;
import java.util.HashMap;
Expand All @@ -30,6 +32,7 @@ public class ApplicantService implements ApplicantQueryUseCase {
private final QueryGateway queryGateway;
private final SortHelper<MongoAnswer> sortHelper;
private final LatestRecruitmentVo latestRecruitInfo;
private final PeriodCalculator periodCalculator;

@Transactional(readOnly = true)
public Map<String, Object> execute(String answerId) {
Expand Down Expand Up @@ -241,7 +244,12 @@ public List<Map<String, Object>> execute(List<String> fields, Integer page) {
public List<GetApplicantsStatusResponse> getApplicantsStatus(Integer year, String sortType) {
List<MongoAnswer> result = answerAdaptor.findByYear(year);
List<Map<String, Object>> sortedResult = sortAndAddIds(result, sortType);
return sortedResult.stream().map(GetApplicantsStatusResponse::of).toList();

PeriodStates period = periodCalculator.execute();

return sortedResult.stream()
.map(map -> GetApplicantsStatusResponse.of(map, period))
.toList();
}

private List<Map<String, Object>> sortAndAddIds(List<MongoAnswer> result, String sortType) {
Expand Down Expand Up @@ -285,4 +293,9 @@ public Map<String, Object> executeFiltered(
qna.put(PASS_STATE_KEY, mongoAnswer.getApplicantStateOrDefault());
return qna;
}

@Transactional(readOnly = true)
public List<String> autocomplete(Integer year, String keyword) {
return answerAdaptor.findApplicantNamesForAutocomplete(year, keyword);
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.econovation.recruit.api.applicant.usecase;

import com.econovation.recruitcommon.annotation.UseCase;
import java.util.List;
import java.util.Map;
import java.util.UUID;

Expand All @@ -11,4 +12,8 @@ public interface ApplicantCommandUseCase {
String execute(String applicantId, String state);

UUID execute(Map<String, Object> blocks, UUID id);

void deleteByYear(Integer year);

void deleteByApplicantIds(List<String> applicantIds);
}
Original file line number Diff line number Diff line change
Expand Up @@ -55,4 +55,6 @@ AnswersResponseDto executeFiltered(
List<String> requestedQnaFields);

Map<String, Object> executeFiltered(String applicantId, List<String> requestedQnaFields);

List<String> autocomplete(Integer year, String keyword);
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import com.econovation.recruit.api.recruitment.util.LatestRecruitmentVo;
import com.econovation.recruitcommon.exception.RecruitCodeException;
import com.econovation.recruitdomain.domains.applicant.domain.MongoAnswerAdaptor;
import com.econovation.recruitdomain.domains.applicant.domain.state.RecruitmentStates;
import com.econovation.recruitdomain.domains.recruitment.domain.RecruitmentStates;
import com.econovation.recruitdomain.domains.applicant.exception.ApplicantDuplicateSubmitException;
import com.econovation.recruitdomain.domains.applicant.exception.ApplicantOutOfDateException;
import com.econovation.recruitdomain.domains.applicant.exception.ApplicantWrongPositionException;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -166,19 +166,16 @@ public Columns createColumn(String title, Integer navigationId) {
public void createApplicantBoard(String applicantId, String hopeField, Long cardId) {
// \"hopeField\" -> hopeField 로 변경
hopeField = hopeField;
Integer columnsId = 0;
if (hopeField.equals("개발자")) {
columnsId = DEVELOPER_COLUMNS_ID;
} else if (hopeField.equals("디자이너")) {
columnsId = DESIGNER_COLUMNS_ID;
} else if (hopeField.equals("기획자")) {
columnsId = PLANNER_COLUMNS_ID;
Integer year = latestRecruitmentVo.getYear();
if (hopeField.equals("개발자") || hopeField.equals("디자이너") || hopeField.equals("기획자")) {
log.info("ApplicantBoard 생성 : {}, applicantId : {}", hopeField, applicantId);
} else {
log.info("hopeField = {} 는 적절한 지원 분야가 아닙니다.", hopeField);
throw InvalidHopeFieldException.EXCEPTION;
}

Columns column = columnLoadPort.getColumnByNextColumnsId(columnsId);
Columns column = columnLoadPort.getColumnByYearAndTitle(hopeField, year);

Board board =
Board.builder()
.cardType(CardType.APPLICANT)
Expand All @@ -189,7 +186,7 @@ public void createApplicantBoard(String applicantId, String hopeField, Long card
.build();
Board save = boardRecordPort.save(board);
// 기존에 null 인 nextBoardId를 현재 boardId로 업데이트
boardLoadPort.getBoardByNavigationIdAndColumnsId(1, columnsId).stream()
boardLoadPort.getBoardByNavigationIdAndColumnsId(1, column.getId()).stream()
.filter(b -> b.getNextBoardId() == null)
.findFirst()
.ifPresent(
Expand Down
Loading
Loading