Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
431 commits
Select commit Hold shift + click to select a range
12be0e2
fix: 탈퇴 시 전체 세션 refresh token 삭제 및 재발급 시 유저 존재 검증 추가
Jy000n Jul 7, 2026
6ebaea8
chore: AuthController의 미사용 cookieSecure 필드 제거
Jy000n Jul 7, 2026
559fa53
chore: 불필요한 import, 빈칸 제거
Jy000n Jul 7, 2026
e7a67e2
[merge] #29 투두 생성 api
laura-jung Jul 7, 2026
77fee04
[merge] #37 - 온보딩
Jy000n Jul 7, 2026
a22794f
feat: 투두 통계 조회용 데이터 접근 추가
aneykrap Jul 7, 2026
e2178cc
feat: 통계 캘린더 조회 API 구현
aneykrap Jul 7, 2026
77ce9ec
feat: daily 완료 상태 추가
aneykrap Jul 7, 2026
9f57f03
fix: remove invalid todo date count query
aneykrap Jul 7, 2026
22536be
feat: 투두 소요시간 예상 api
aneykrap Jul 7, 2026
ca7020b
feat: 추천 소요 시간 요청 및 응답 DTO 추가
aneykrap Jul 7, 2026
f719757
feat: 추가된 투두 소요 시간 추천 로직 및 패턴 기준 정의
aneykrap Jul 7, 2026
0ecde8d
feat: 타이머 기록 조회
aneykrap Jul 7, 2026
6abb055
feat: gemini 호출
aneykrap Jul 7, 2026
95d76b7
feat: 스웨거 설정 추가
aneykrap Jul 7, 2026
158c71b
feat: gemini 추가
aneykrap Jul 7, 2026
609ca41
feat: 개선된 예상 소요 시간 추천 로직 및 응답 형식 수정
aneykrap Jul 7, 2026
437e393
feat: AI request rate limiter 추가
aneykrap Jul 7, 2026
d093cb5
feat: gemini 모델 설정을 환경 변수로 변경
aneykrap Jul 7, 2026
eaa3ad3
feat: 할 일 소요 시간 이력 관리를 위한 AiTodoHistories 및 AiTodoHistoryService 추가
aneykrap Jul 7, 2026
d1e8919
feat: 수정된 AI 소요 시간 추천 API 로그에서 제목 정보 제거
aneykrap Jul 7, 2026
e990b81
feat: 개선된 GeminiService에서 API 요청 시 타임아웃 설정 추가 및 API 키 헤더 처리
aneykrap Jul 7, 2026
3ef8e07
feat: TodoDurationPromptBuilder에서 문자열 처리 개선을 위한 공백 및 탭 문자 제거 추가
aneykrap Jul 7, 2026
1f4e3fe
feat: AiTodoService에서 AiTodoHistoryService를 사용하여 이력 조회 로직 통합
aneykrap Jul 7, 2026
f9d44a2
fix: application-local.yml에서 오타 수정
aneykrap Jul 7, 2026
bd8ba46
merge: develop 브랜치와 머지
Jy000n Jul 8, 2026
80ece1a
feat: 타이머 시작 컨트롤러 구현
Jy000n Jul 8, 2026
52e9844
chore: 불필요한 여백 제거
Jy000n Jul 8, 2026
3f85830
refactor: TimerResponseFactory 도입 및 TimerController 리팩터링
Jy000n Jul 8, 2026
7ca1c1d
fix: 로그아웃/탈퇴 응답에 Cache-Control no-store 헤더 추가
Jy000n Jul 8, 2026
c79cfb6
docs: swagger 문서 내용 수정
Jy000n Jul 8, 2026
ba397ee
feat: 타이머 시작 Service 추가
Jy000n Jul 8, 2026
9900126
fix: TimerRecord pause/resume에 상태 전이 검증 추가
Jy000n Jul 8, 2026
130e73e
fix: 타이머 시작 API의 TOCTOU race condition 수정
Jy000n Jul 8, 2026
c580368
refactor: TimerRecord 시간 단위를 분에서 초로 변경
Jy000n Jul 8, 2026
a71066f
feat(todo): 투두 조회용 엔티티 보강 (타이머 상태·완료 여부 등)
laura-jung Jul 8, 2026
a430a6e
feat(user): 사용자별 시간대(zoneId) 설정 기능 추가
laura-jung Jul 8, 2026
7c0589a
feat: UTC 시간대 기준 통일
laura-jung Jul 8, 2026
295c077
chore: trigger CodeRabbit review
aneykrap Jul 8, 2026
85c2a7a
feat: 사용자별 시간대 설정 APT 문서/DTO 보강
laura-jung Jul 8, 2026
e0cff25
feat(home): 홈화면 조회 기능
laura-jung Jul 8, 2026
3c6a918
Merge remote-tracking branch 'origin/develop' into feat/#30-getTodo
laura-jung Jul 8, 2026
e60b7ec
refactor(home): filter 빈값으로 들어올 시 defualt 반환으로 수정
laura-jung Jul 8, 2026
9381897
refactor(tag): 태그 이름 필수 값 설정
laura-jung Jul 8, 2026
03af13c
fix: UTC 시간대 설정을 main()으로 이동해 앱 시작 전 보장
laura-jung Jul 8, 2026
4485877
refactor:yearMonth 파싱 및 검증 파일 분리
aneykrap Jul 8, 2026
72fee6d
feat: API 경로를 /api/v1/todos로 변경하여 일관성 개선
aneykrap Jul 8, 2026
7a7b904
fix: 공백제거
aneykrap Jul 8, 2026
f0f341b
feat: 개선된 JSON 응답 형식 및 문자열 처리 로직 수정
aneykrap Jul 8, 2026
0e647f6
feat: 개선된 정렬 로직 및 TodoDurationHistory DTO 수정
aneykrap Jul 8, 2026
2e58c38
refacotr : dto로 이동
aneykrap Jul 8, 2026
289d4c2
refactor: move TodoDurationHistory to dto package
aneykrap Jul 8, 2026
e68eea6
refactor: move TodoDurationHistory to dto package
aneykrap Jul 8, 2026
a0d10aa
refactor: 중복 어노테이션 @SecurityRequirement(name = "bearerAuth") 제거
laura-jung Jul 8, 2026
ad628f2
[merge] #30 TODO 조회 기본/7일
laura-jung Jul 8, 2026
2e77108
refactor: 불필요한 null 체크 제거
Jy000n Jul 8, 2026
a27fb0b
refactor: getUserId() 사용으로 변경
Jy000n Jul 8, 2026
8aa7c6e
refactor: 공백제거
aneykrap Jul 8, 2026
28be588
feat: application-prod.yml 수정
aneykrap Jul 8, 2026
ea410d5
fix: 마크다운 코드 블록 제거 로직 수정
aneykrap Jul 8, 2026
aad168b
refactor(home): 중복 코드를 줄이기 위해 enum 코드에 날짜 계산 로직 추가
laura-jung Jul 8, 2026
01ba43b
feat: 홈화면 오늘 조회 service 책임 분리
laura-jung Jul 8, 2026
7bf9396
feat: 홈화면 오늘 조회 성공 응답 추가
laura-jung Jul 8, 2026
c180215
feat: 홈화면 오늘 조회 controller 및 swagger 문서 정리
laura-jung Jul 8, 2026
cf2b870
fix: 세션 stateless로 되돌리기
aneykrap Jul 8, 2026
8ca8811
fix: 회원 탈퇴 시 DB-Redis 데이터 불일치 가능성 수정
Jy000n Jul 8, 2026
edb98c1
fix: RefreshTokenService 리프레시토큰 삭제 시 KEYS 대신 SCAN 사용
Jy000n Jul 8, 2026
8ca5e57
chore: swagger 문서 설명 수정
laura-jung Jul 8, 2026
d3da767
merge: develop 브랜치와 머지
Jy000n Jul 8, 2026
b18ab99
[merge] #27 - 타이머 시작
Jy000n Jul 8, 2026
0c0190b
[merge] #55 - 회원 탈퇴 시 DB-Redis 불일치 및 Redis 성능 이슈 수정
Jy000n Jul 8, 2026
1d1799a
feat: TimerAction enum 추가
Jy000n Jul 8, 2026
46c77f7
feat: TimerSessionRepository에 findByTimerRecordId 추가
Jy000n Jul 8, 2026
b4871a5
feat: 약관 엔드포인트 추기
aneykrap Jul 8, 2026
6bddedd
feat: 약관 controller & 스웨거 내용 추가
aneykrap Jul 8, 2026
9200f83
feat: TermsSuccessCode and TermsType enums 추가
aneykrap Jul 8, 2026
c7a3f02
feat:Terms entity and TermsListResponse DTO 추가
aneykrap Jul 8, 2026
00c5383
feat:TermsRepository and TermsService 추가
aneykrap Jul 8, 2026
d547ca5
fix:스웨거 오타 수정
aneykrap Jul 8, 2026
35bb9ea
feat: 타이머 상태변경(일시정지/재개) Request/Response DTO 추가
Jy000n Jul 8, 2026
1e7b581
chore:공백제거 및 불필요 예시 제거
aneykrap Jul 8, 2026
33e0d09
feat: TimerService에 타이머 상태변경(일시정지/재개) 로직 구현
Jy000n Jul 8, 2026
f1045c1
feat: 타이머 일시정지/재개 API 엔드포인트 추가
Jy000n Jul 8, 2026
86a1581
docs: 타이머 일시정지/재개 API Swagger 문서화
Jy000n Jul 8, 2026
8ce4f5e
fix: TimerStartResponse의 startedAt 응답 포맷 지정
Jy000n Jul 8, 2026
878d8fd
feat(todo): 하위 태스트 완료 여부 추가
laura-jung Jul 8, 2026
46ab188
feat(todo): todo 수정 로직
laura-jung Jul 8, 2026
6d9593a
feat: 완료/종료 에러/성공 코드 추가
Jy000n Jul 8, 2026
81381e4
feat: todo 삭제전 timer 상태 확인을 위한 메서드 추가
laura-jung Jul 8, 2026
8737d59
feat: TimerRecord에 종료 처리 도메인 메서드 추가
Jy000n Jul 8, 2026
628efc1
feat: TimerFinishResponse DTO 추가
Jy000n Jul 8, 2026
74b1e78
feat: todo 삭제를 위해 순차 삭제 로직 적용
laura-jung Jul 8, 2026
94dedf4
feat: todo 삭제 관련 에러, 응답 코드 추가
laura-jung Jul 8, 2026
fa212fe
feat: todo 삭제 api
laura-jung Jul 8, 2026
8f2efc5
feat: todo 완료여부 변경 dto
laura-jung Jul 8, 2026
fc7622a
feat: todo 완료여부 변경 응답코드
laura-jung Jul 8, 2026
e647966
feat: timer 활성화 여부 확인 메서드 추가
laura-jung Jul 8, 2026
2ebcc6d
feat: todo 완료 여부 관련 repository 추가
laura-jung Jul 8, 2026
8c57bc6
feat: todo 완료 여부 관련 순서 재정렬 로직 추가
laura-jung Jul 8, 2026
a734422
feat: todo 완료 여부 로직 service
laura-jung Jul 8, 2026
3d4560f
feat: todo 완료 여부 controller
laura-jung Jul 8, 2026
7960742
refactor: todo 변경시 용량 검사 추가
laura-jung Jul 8, 2026
89251c9
refactor: 컨트롤러 DTO 처리 일관성 유지
laura-jung Jul 8, 2026
54f8130
chore: 여백 제거
laura-jung Jul 8, 2026
dc74f9b
[merge] #53 TODO 완료/미완료
laura-jung Jul 8, 2026
bb7a56a
Merge branch 'develop' of https://github.com/Team-Timo/Timo-Server in…
Jy000n Jul 8, 2026
6ac8dd4
chore: TimeController 파일명 변경
Jy000n Jul 9, 2026
5a53195
feat: 타이머 시작/일시정지/재개 시 TodoInstance timerStatus 동기화
Jy000n Jul 9, 2026
385497a
feat: TimerService에 타이머 완료/종료 로직 구현
Jy000n Jul 9, 2026
8b448bb
feat: 타이머 완료/종료 API 엔드포인트 추가
Jy000n Jul 9, 2026
782a6f7
docs: 완료/종료 API Swagger 문서화
Jy000n Jul 9, 2026
0a0e699
fix:COMMON_400에서 STATISTICS_400으로 변경
aneykrap Jul 9, 2026
6e1a55d
[merge] #26 - 통계(날짜, 캘린더 정보) 조회
aneykrap Jul 9, 2026
0c42f6f
[merge] #35 - 소요시간 ai 추천
aneykrap Jul 9, 2026
bfce3e2
refactor: TimerResponseFactory 제거, Controller로 응답 조립 통합
Jy000n Jul 9, 2026
4c24b96
refactor: TimerResponseFactory 제거, Controller로 응답 조립 통합
Jy000n Jul 9, 2026
dda0f08
fix: changeStatus에 비관적 락 적용
Jy000n Jul 9, 2026
4226273
fix: finishTimer에 비관적 락 적용
Jy000n Jul 9, 2026
681a439
refactor: changeStatus의 if/else를 명시적 분기로 변경
Jy000n Jul 9, 2026
ce477c2
fix: 잘못 가져온 패키지 import 수정
Jy000n Jul 9, 2026
a8b18a0
fix: 잘못 가져온 패키지 import 수정
Jy000n Jul 9, 2026
16573ce
Merge branch 'develop' of https://github.com/Team-Timo/Timo-Server in…
Jy000n Jul 9, 2026
9db08bf
merge: develop 브랜치와 머지
Jy000n Jul 9, 2026
a74f634
feat: 통계 요약 조회를 위한 StatisticsSummaryDocs 인터페이스 추가
aneykrap Jul 8, 2026
1d3bd7c
feat: 통계 요약 조회를 위한 StatisticsSummaryService 및 StatisticsSummary 추가
aneykrap Jul 8, 2026
33c3c94
feat: 통계 요약 조회를 위한 StatisticsQueryRepository 및 StatisticsSummaryRespo…
aneykrap Jul 8, 2026
849f1f5
feat: 월별 통계 요약 조회를 위한 SUMMARY_RETRIEVED 추가
aneykrap Jul 8, 2026
d3228f1
feat: 월별 통계 조회 로직을 엔티티 기반으로 변경
aneykrap Jul 8, 2026
fffc8f2
feat: 통계 조회에서 yearMonth 파싱 로직을 StatisticsDateParser로 이동
aneykrap Jul 8, 2026
d29bf8e
[merge] #50 - TODO 오늘 조회
laura-jung Jul 9, 2026
6c26811
refactor(todo): 존재하지 않는 하위 태스크에 대한 에러코드 추가
laura-jung Jul 9, 2026
55436b2
fix(todo): 수정시에도 락 조건 추가
laura-jung Jul 9, 2026
21ab4e8
fix(todo): 수정 시 타이머 활성화 여부에 따라 변경 가드 추가
laura-jung Jul 9, 2026
040355c
fix: 타이머 완료/종료 시 활성 TimerSession 닫기 처리
Jy000n Jul 9, 2026
190cb5b
fix(todo): 반복 유형 변경시 사용하지 않는 설정 초기화
laura-jung Jul 9, 2026
bae197b
[merge] #45 - 월별 통계 요약 조회
aneykrap Jul 9, 2026
942d487
feat: 타이머 연장용 DTO 추가
Jy000n Jul 9, 2026
41d9ca6
feat: TimerRecord에 연장 도메인 메서드 추가
Jy000n Jul 9, 2026
ba7fd2c
feat: 타이머 연장 서비스 로직 구현
Jy000n Jul 9, 2026
eb4c77d
feat: 타이머 연장 엔드포인트 추가
Jy000n Jul 9, 2026
abe1d98
docs: 타이머 연장 Swagger 문서화
Jy000n Jul 9, 2026
e9498ab
chore: 불필요한 여백 제거
Jy000n Jul 9, 2026
20a98ce
docs: 스웨거 문서 내용 수정
Jy000n Jul 9, 2026
0479f8a
feat: TimerAction enum 추가
Jy000n Jul 8, 2026
a4b3a56
feat: TimerSessionRepository에 findByTimerRecordId 추가
Jy000n Jul 8, 2026
e64080c
feat: 타이머 상태변경(일시정지/재개) Request/Response DTO 추가
Jy000n Jul 8, 2026
1cce3fe
feat: TimerService에 타이머 상태변경(일시정지/재개) 로직 구현
Jy000n Jul 8, 2026
1421bf7
feat: 타이머 일시정지/재개 API 엔드포인트 추가
Jy000n Jul 8, 2026
9c9accc
docs: 타이머 일시정지/재개 API Swagger 문서화
Jy000n Jul 8, 2026
2dba079
fix: TimerStartResponse의 startedAt 응답 포맷 지정
Jy000n Jul 8, 2026
4ccfd22
chore: TimeController 파일명 변경
Jy000n Jul 9, 2026
d8fd31a
feat(subtask): 하위 태스크 완료 여부 변경 dto
laura-jung Jul 9, 2026
a64656c
feat(subtask): 하위 태스크 완료 여부 변경
laura-jung Jul 9, 2026
78cbd74
feat(subtask): 하위 태스크 완료 여부 관련 응답 코드
laura-jung Jul 9, 2026
d144711
feat(subtask): 하위 태스크 완료 여부 service
laura-jung Jul 9, 2026
9c483cc
feat(subtask): 하위 태스크 완료 여부 controller 및 swagger 문서
laura-jung Jul 9, 2026
35a2895
feat: 타이머 시작/일시정지/재개 시 TodoInstance timerStatus 동기화
Jy000n Jul 9, 2026
ed6a1a8
refactor: TimerResponseFactory 제거, Controller로 응답 조립 통합
Jy000n Jul 9, 2026
15f4360
fix: changeStatus에 비관적 락 적용
Jy000n Jul 9, 2026
cef6df7
refactor: changeStatus의 if/else를 명시적 분기로 변경
Jy000n Jul 9, 2026
8baa6c0
merge: develop 브랜치와 머지
Jy000n Jul 9, 2026
6b770e7
feat(focus): 집중 모드 dto
laura-jung Jul 9, 2026
2b82b94
feat(focus): 집중 모드 성공 코드
laura-jung Jul 9, 2026
02f7e1b
feat(focus): 집중 모드 service
laura-jung Jul 9, 2026
da74d8c
feat(focus): 집중 모드 controller 및 swagger
laura-jung Jul 9, 2026
4688ca6
[merge] #33 타이머 일시정지/재개
Jy000n Jul 9, 2026
71a3211
feat: TimerActiveResponse DTO 추가
Jy000n Jul 9, 2026
a6a3b30
feat: 현재 실행 중인 타이머 조회 서비스 로직 구현
Jy000n Jul 9, 2026
afbc6de
feat: 현재 실행 중인 타이머 조회 엔드포인트 추가
Jy000n Jul 9, 2026
d4349e2
docs: 현재 실행 중인 타이머 조회 Swagger 문서화
Jy000n Jul 9, 2026
8be6ac7
feat(tag): tag 생성 api
laura-jung Jul 9, 2026
d5e49d9
feat(tag): tag 삭제 api
laura-jung Jul 9, 2026
41e1654
fix(tag): 태그명 글자수 10개 제한 변경
laura-jung Jul 9, 2026
3516159
feat(tag): 태그 목록 조회 api
laura-jung Jul 9, 2026
c7f478d
feat(tag): 기본 태그용 마이그레이션
laura-jung Jul 9, 2026
b7c3b1e
refactor: 마이그레이션 내용 수정
laura-jung Jul 9, 2026
3c25152
docs: 현재 실행 중인 타이머 조회 Swagger 문서 내용, 형식 수정
Jy000n Jul 9, 2026
3b4ae0a
refactor(tag): 태그 이름 제약 조건 수정
laura-jung Jul 9, 2026
e3a5ac1
feat(todo): todo 상세조회 api 설계
laura-jung Jul 8, 2026
f7a8015
chore: swagger 예시 값 변경
laura-jung Jul 8, 2026
b1e7726
fix(todo): 상세 조회 시 시작일이 아닌 요청 날짜의 인스턴스를 조회하도록 수정
laura-jung Jul 9, 2026
5bf1598
refactor(todo): 경고문구 한글로 통일
laura-jung Jul 9, 2026
8bf1c00
chore: rebase 과정 중 에러 해결
laura-jung Jul 9, 2026
ea699cc
[merge] #51 - TODO 상세 조회
laura-jung Jul 9, 2026
6306ad2
refactor: 타이머 코드 수정
Jy000n Jul 9, 2026
5bf983c
merge: develop 브랜치와 머지
Jy000n Jul 9, 2026
f3b1af8
feat(todo): todo 순서 정렬 dto
laura-jung Jul 9, 2026
03564bc
feat(todo): todo 순서 정렬 응답 코드
laura-jung Jul 9, 2026
d67c2e1
feat(todo): todo 순서 정렬 service
laura-jung Jul 9, 2026
019db5f
feat(todo): todo 순서 정렬 controller 및 swagger
laura-jung Jul 9, 2026
5cdf1ce
chore: 에러코드 code 통일
laura-jung Jul 9, 2026
c187457
chore: 불필요한 여백 제거
Jy000n Jul 9, 2026
06cb13c
fix: 연장 최대 입력 시간을 720분으로 수정
Jy000n Jul 9, 2026
a8174ec
[merge] #64 현재 실행 중인 타이머 조
Jy000n Jul 9, 2026
e5a7594
merge: develop 브랜치와 머지
Jy000n Jul 9, 2026
1524c14
feat: 통계 오류 및 성공 코드에 날짜 관련 메시지 추가
aneykrap Jul 8, 2026
cec8558
feat: 일별 기록 조회를 위한 StatisticsDailyDocs 인터페이스 추가
aneykrap Jul 8, 2026
2ddc561
feat: 일별 통계 조회를 위한 StatisticsDailyResponse 및 관련 메서드 추가
aneykrap Jul 8, 2026
d179692
feat: 통계 일별 투두 응답에서 태그 ID를 태그명으로 변경 및 관련 메서드 수정
aneykrap Jul 8, 2026
3684a1f
feat: 통계 일별 기록 조회를 위한 TimerRecordRepository 메서드 추가 및 StatisticsServic…
aneykrap Jul 8, 2026
bae2e9a
Revert "feat: 통계 일별 기록 조회를 위한 TimerRecordRepository 메서드 추가 및 Statisti…
aneykrap Jul 8, 2026
8dd10d6
fix: 공백제거
aneykrap Jul 8, 2026
e9193fe
feat: 통계 일별 기록 조회를 위한 TimerRecordRepository 및 관련 메서드 추가
aneykrap Jul 9, 2026
f958cc7
chore : 공백제거
aneykrap Jul 9, 2026
e4f29a4
[merge] #69 - 통계 jpql 수정
aneykrap Jul 9, 2026
4672269
[merge] #58 - 약관 조회
aneykrap Jul 9, 2026
be3ba02
refactor: notnull 조건 추가
laura-jung Jul 9, 2026
09eeb0f
fix(statistics):불필요한 공백 제거
aneykrap Jul 9, 2026
d5e36c0
fix(statistics):타임존 반영
aneykrap Jul 9, 2026
ad7b337
[merge] #34 타이머 완료/종료
Jy000n Jul 9, 2026
1f036f5
merge: develop 브랜치와 머지
Jy000n Jul 9, 2026
a4ac4b5
merge: develop 브랜치와 머지
laura-jung Jul 9, 2026
33b7f48
[merge] #63 타이머 연장
Jy000n Jul 9, 2026
3b61e5c
[merge] #52 - TODO 수정, 삭제
laura-jung Jul 9, 2026
a168db0
merge: develop 브랜치와 머지
laura-jung Jul 9, 2026
05df534
[merge] #70 - TODO 순서 변경
laura-jung Jul 9, 2026
8a0ec85
merge: develop 브랜치와 머지
laura-jung Jul 9, 2026
c12e3bf
[merge] #79 - 태그 api
laura-jung Jul 9, 2026
73bb4c4
[merge] #48 - 통계(특정 날짜 총시간, todolist)
aneykrap Jul 9, 2026
4da12b6
feat: 타이머 완료/종료 API 엔드포인트 추가
Jy000n Jul 9, 2026
f989816
chore: trigger CodeRabbit review
aneykrap Jul 8, 2026
fa80180
feat: AI 스웨거 추가
aneykrap Jul 9, 2026
b08937b
feat: AI 투두 피드백 생성 및 오류 코드 추가
aneykrap Jul 9, 2026
836667f
feat: request&response 추가
aneykrap Jul 9, 2026
373f094
feat: prompt
aneykrap Jul 9, 2026
72eb2b8
feat: AI feedback 엔드포인트 및 서비스 추가
aneykrap Jul 9, 2026
34f894b
feat: 제미나이 피드백 추가
aneykrap Jul 9, 2026
d346ba2
chore: 공백 및 여백 제거
aneykrap Jul 9, 2026
31455a9
feat: AI 태그 업데이트 및 문서 수정
aneykrap Jul 9, 2026
9c7811f
docs: AI 피드백 반영 스웨거 문서 수정
aneykrap Jul 9, 2026
338226e
feat: ai todo 소요시간 엔드포인트 수정
aneykrap Jul 9, 2026
f186350
feat: AI 피드백 업데이트 response 추가
aneykrap Jul 9, 2026
c89ffeb
chore: 공백제거
aneykrap Jul 9, 2026
6513ed6
refactor: ai 피드백 중복 스웨거 및 api 제거
aneykrap Jul 9, 2026
56d289f
refactor: 타임존 반영하여 오늘 계산
aneykrap Jul 9, 2026
6ee6090
feat: ai 피드백 실패하면 null
aneykrap Jul 9, 2026
30ad42f
fix(ai):url 주소 변경
aneykrap Jul 9, 2026
e0b22dc
fix(ai): ai 피드백은 트랜잭션 제외
aneykrap Jul 9, 2026
57269bc
feat(ai): AI 도메인 예외로 분리해서 AiErrorCode 기반으로 수정
aneykrap Jul 9, 2026
91cd60f
refactor(ai): 네이티브 쿼리 JPQL로 변경
aneykrap Jul 9, 2026
c5c4048
[merge] #71 - 하위 태스크 완료/미완료
laura-jung Jul 9, 2026
2d7258c
[merge] #78 - 집중 모드
laura-jung Jul 9, 2026
374e0d9
[merge] #36 - 타이머완료/종료시 ai 피드백 생성
aneykrap Jul 9, 2026
58d414c
chore: trigger CodeRabbit review
aneykrap Jul 8, 2026
95a6c68
feat(TimeBox): TimeBoxAction enum & error/success codes 추가
aneykrap Jul 9, 2026
fbe5766
feat(TimeBox): 타임박스 세션
aneykrap Jul 9, 2026
33bcf5a
feat(TimeBox): 타임박스 컨트롤러 추가
aneykrap Jul 9, 2026
657b1b6
feat(TimeBox): 타임박스 날짜 파서 및 응답 DTO 추가
aneykrap Jul 9, 2026
9490365
[merge] #72 - 타임박스 조회
aneykrap Jul 9, 2026
57939d9
[fix] 배포 db를 위해 ddl-auto 수정
laura-jung Jul 9, 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
Binary file added .DS_Store
Binary file not shown.
237 changes: 119 additions & 118 deletions .github/workflows/auto-label.yml
Original file line number Diff line number Diff line change
@@ -1,118 +1,119 @@
#name: Auto Label
#
#on:
# issues:
# types: [opened, edited]
# pull_request_target:
# types: [opened, edited, reopened, synchronize]
#
#permissions:
# issues: write
#
#jobs:
# label:
# runs-on: ubuntu-latest
# steps:
# - uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b
# with:
# script: |
# const isIssue = context.eventName === 'issues';
# const item = isIssue
# ? context.payload.issue
# : context.payload.pull_request;
#
# const title = item.title.toLowerCase();
# const body = (item.body || '').toLowerCase();
# const author = item.user.login;
#
# const labels = new Set();
#
# const titleRules = [
# {
# label: '✨ feat',
# patterns: [/\[feat\]/, /(?:^|[^a-z0-9])feat:/]
# },
# {
# label: '🛠️ fix',
# patterns: [/\[fix\]/, /(?:^|[^a-z0-9])fix:/]
# },
# {
# label: '🚨 hotfix',
# patterns: [/\[hotfix\]/, /(?:^|[^a-z0-9])hotfix:/]
# },
# {
# label: '📃 docs',
# patterns: [/\[docs\]/, /(?:^|[^a-z0-9])docs:/]
# },
# {
# label: '🔁 refactor',
# patterns: [/\[refactor\]/, /(?:^|[^a-z0-9])refactor:/]
# },
# {
# label: '📝 chore',
# patterns: [/\[chore\]/, /(?:^|[^a-z0-9])chore:/]
# },
# {
# label: '🧪 test',
# patterns: [/\[test\]/, /(?:^|[^a-z0-9])test:/]
# },
# {
# label: '✏️ style',
# patterns: [/\[style\]/, /(?:^|[^a-z0-9])style:/]
# },
# {
# label: '✒️ comment',
# patterns: [/\[comment\]/, /(?:^|[^a-z0-9])comment:/]
# },
# {
# label: '📄 rename',
# patterns: [/\[rename\]/, /(?:^|[^a-z0-9])rename:/]
# },
# {
# label: '♻️ remove',
# patterns: [/\[remove\]/, /(?:^|[^a-z0-9])remove:/]
# }
# ];
#
# for (const rule of titleRules) {
# if (rule.patterns.some(pattern => pattern.test(title))) {
# labels.add(rule.label);
# }
# }
#
# const authorLabels = {
# 'Jy000n': '🌸 자윤',
# 'aneykrap': '🌵 예나',
# 'laura-jung': '🍀️ 윤아'
# };
#
# const managedLabels = new Set([
# ...titleRules.map(rule => rule.label),
# ...Object.values(authorLabels)
# ]);
#
# if (authorLabels[author]) {
# labels.add(authorLabels[author]);
# }
#
# const currentLabels = (item.labels || []).map(label => label.name || label);
# const labelsToRemove = currentLabels.filter(label => managedLabels.has(label));
#
# await Promise.all(labelsToRemove.map(label => github.rest.issues.removeLabel({
# owner: context.repo.owner,
# repo: context.repo.repo,
# issue_number: item.number,
# name: label
# }).catch(error => {
# if (error.status !== 404) {
# throw error;
# }
# })));
#
# if (labels.size > 0) {
# await github.rest.issues.addLabels({
# owner: context.repo.owner,
# repo: context.repo.repo,
# issue_number: item.number,
# labels: [...labels]
# });
name: Auto Label

on:
issues:
types: [opened, edited]
pull_request_target:
types: [opened, edited, reopened, synchronize]

permissions:
issues: write
pull-requests: write

jobs:
label:
runs-on: ubuntu-latest
steps:
- uses: actions/github-script@v8
with:
script: |
const isIssue = context.eventName === 'issues';
const item = isIssue
? context.payload.issue
: context.payload.pull_request;

const title = item.title.toLowerCase();
const author = item.user.login;

const labels = new Set();

const titleRules = [
{
label: '✨ feat',
patterns: [/\[feat\]/, /(?:^|[^a-z0-9])feat:/]
},
{
label: '🛠️ fix',
patterns: [/\[fix\]/, /(?:^|[^a-z0-9])fix:/]
},
{
label: '🚨 hotfix',
patterns: [/\[hotfix\]/, /(?:^|[^a-z0-9])hotfix:/]
},
{
label: '📃 docs',
patterns: [/\[docs\]/, /(?:^|[^a-z0-9])docs:/]
},
{
label: '🔁 refactor',
patterns: [/\[refactor\]/, /(?:^|[^a-z0-9])refactor:/]
},
{
label: '📝 chore',
patterns: [/\[chore\]/, /(?:^|[^a-z0-9])chore:/]
},
{
label: '🧪 test',
patterns: [/\[test\]/, /(?:^|[^a-z0-9])test:/]
},
{
label: '✏️ style',
patterns: [/\[style\]/, /(?:^|[^a-z0-9])style:/]
},
{
label: '✒️ comment',
patterns: [/\[comment\]/, /(?:^|[^a-z0-9])comment:/]
},
{
label: '📄 rename',
patterns: [/\[rename\]/, /(?:^|[^a-z0-9])rename:/]
},
{
label: '♻️ remove',
patterns: [/\[remove\]/, /(?:^|[^a-z0-9])remove:/]
}
];

for (const rule of titleRules) {
if (rule.patterns.some(pattern => pattern.test(title))) {
labels.add(rule.label);
}
}

const authorLabels = {
'Jy000n': '🌸 자윤',
'aneykrap': '🌵 예나',
'laura-jung': '🍀️ 윤아'
};

const managedLabels = new Set([
...titleRules.map(rule => rule.label),
...Object.values(authorLabels)
]);

if (authorLabels[author]) {
labels.add(authorLabels[author]);
}

const currentLabels = (item.labels || []).map(label => label.name || label);
const labelsToRemove = currentLabels.filter(label => managedLabels.has(label));

await Promise.all(labelsToRemove.map(label => github.rest.issues.removeLabel({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: item.number,
name: label
}).catch(error => {
if (error.status !== 404) {
throw error;
}
})));

if (labels.size > 0) {
await github.rest.issues.addLabels({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: item.number,
labels: [...labels]
});
}
9 changes: 9 additions & 0 deletions db/migration/2026-07-09__tags_add_owner_and_default.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
-- 태그 소유자(user_id)와 기본 태그 여부(is_default) 컬럼 추가.
-- 운영은 ddl-auto: validate 이므로 배포 전에 반드시 먼저 실행해야 한다.

-- 모든 사용자가 공유하는 기본 태그. 소유자가 없으므로 user_id는 NULL이다.
INSERT INTO tags (user_id, name, is_default)
VALUES (NULL, '일상', b'1'),
(NULL, '운동', b'1'),
(NULL, '업무', b'1'),
(NULL, '과제', b'1');
3 changes: 3 additions & 0 deletions src/main/java/com/Timo/Timo/TimoApplication.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.Timo.Timo;

import java.util.TimeZone;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
Expand All @@ -9,6 +11,7 @@
public class TimoApplication {

public static void main(String[] args) {
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
SpringApplication.run(TimoApplication.class, args);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package com.Timo.Timo.domain.ai.controller;

import org.springframework.http.ResponseEntity;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
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.RestController;

import com.Timo.Timo.domain.ai.docs.AiTodoDocs;
import com.Timo.Timo.domain.ai.dto.request.RecommendDurationRequest;
import com.Timo.Timo.domain.ai.dto.response.RecommendDurationResponse;
import com.Timo.Timo.domain.ai.exception.AiSuccessCode;
import com.Timo.Timo.domain.ai.service.AiTodoService;
import com.Timo.Timo.global.auth.principal.CustomUserDetails;
import com.Timo.Timo.global.response.BaseResponse;

import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@RestController
@RequestMapping("/api/v1/ai")
@RequiredArgsConstructor
public class AiTodoController implements AiTodoDocs {

private final AiTodoService aiTodoService;

@Override
@PostMapping("/duration")
public ResponseEntity<BaseResponse<RecommendDurationResponse>> recommendDuration(
@AuthenticationPrincipal CustomUserDetails userDetails,
@Valid @RequestBody RecommendDurationRequest request
) {
log.info(
"AI duration recommendation API called. userId={}, tagId={}",
userDetails.getUserId(),
request.tagId()
);

RecommendDurationResponse response = aiTodoService.recommendDuration(
userDetails.getUserId(),
request
);

return ResponseEntity.ok(
BaseResponse.onSuccess(AiSuccessCode.DURATION_RECOMMENDED, response)
);
}

}
Loading
Loading