Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
77327dc
feat(image): images 원본 파일명 컬럼 추가 및 업로드 상태 전이 리포지토리 메서드 추가
hwangdaesun Jul 27, 2026
1c695af
feat(board): 도메인 간 접근용 BoardQueryService 추가
hwangdaesun Jul 27, 2026
2f9c875
feat(config): GCS Storage 빈 및 서명 URL 설정 프로퍼티 추가
hwangdaesun Jul 27, 2026
b31184b
feat(image): 서명 URL 발급 및 업로드 완료 API 구현
hwangdaesun Jul 27, 2026
82578d7
docs(agents): BoardQueryService/GCS 설정/이미지 업로드 기능 문서 갱신
hwangdaesun Jul 27, 2026
91461fa
refactor(image): analysis/photos API로 대체되며 기존 image 도메인 제거
hwangdaesun Jul 28, 2026
0dc8391
feat(analysis): analysis/photos 스키마로 마이그레이션 재구성 및 jOOQ 코드 재생성
hwangdaesun Jul 28, 2026
fd71d2a
feat(storage): 도메인 공용 ObjectKeyGenerator 추가
hwangdaesun Jul 28, 2026
70d9278
feat(analysis): 분석 생성/업로드 URL 발급 및 업로드 완료 확인 API 구현
hwangdaesun Jul 28, 2026
f881ac6
fix(analysis): PhotoRepositoryTest의 uploadedAt 비교를 마이크로초로 truncate
hwangdaesun Jul 28, 2026
9d65bd1
refactor(analysis): API 버저닝을 경로 프리픽스에서 X-API-Version 헤더 방식으로 전환
hwangdaesun Jul 28, 2026
0cc5594
fix(analysis): startUpload이 진행 중이 아닌 분석을 거부하고 누락 사진을 PENDING으로 유지하도록 수정
hwangdaesun Jul 28, 2026
c9fbf94
fix(analysis): startUpload의 GCS 호출 중 DB 커넥션 점유 방지 및 GCS 타임아웃 설정
hwangdaesun Jul 28, 2026
808dd6b
fix(analysis): startUpload 응답을 delta 대신 최종 집계로 구성해 레이스 컨디션 제거
hwangdaesun Jul 28, 2026
35f81a5
fix(analysis): issueUploadUrls 반환 개수 검증 추가
hwangdaesun Jul 28, 2026
163c18f
fix(analysis): /start 응답 상태 코드를 202 Accepted로 변경
hwangdaesun Jul 28, 2026
a25b8a8
fix(analysis): 업로드 signed URL에 15MB 크기 제한 헤더 서명 추가
hwangdaesun Jul 28, 2026
5439d2f
docs(analysis): GcsPhotoStorage 크기 제한 헤더 서명 내용을 AGENTS.md에 반영
hwangdaesun Jul 28, 2026
6eec0fb
fix(analysis): existingObjectKeys가 버리던 Blob 크기/생성시각을 반영
hwangdaesun Jul 28, 2026
4694929
docs(analysis): BlobMeta 기반 existingObjects/updateStatusBatch 변경 내용을 …
hwangdaesun Jul 28, 2026
054b8bc
refactor(analysis): PhotoObjectKeys를 infrastructure로 이동하고 object로 전환
hwangdaesun Jul 28, 2026
a405085
docs(analysis): PhotoObjectKeys의 infrastructure 이동을 AGENTS.md에 반영
hwangdaesun Jul 28, 2026
d336731
fix(analysis): PhotoRepository의 DB 값 역매핑이 요청 검증 예외 대신 500을 던지도록 수정
hwangdaesun Jul 28, 2026
432cef9
docs(analysis): PhotoRepository의 DB 값 역매핑 방식을 AGENTS.md에 반영
hwangdaesun Jul 28, 2026
9f839a7
fix(analysis): CreateAnalysisRequest.photos에 명세 기준 개수(90~100) 제약 추가
hwangdaesun Jul 28, 2026
9d914c6
docs(analysis): CreateAnalysisRequest의 Size 제약을 AGENTS.md에 반영
hwangdaesun Jul 28, 2026
f336681
fix(analysis): 업로드 signed URL 만료 시간을 명세 기준 15분으로 수정하고 프로퍼티명을 용도별로 명확화
hwangdaesun Jul 28, 2026
b42176b
docs(config): GCS signed URL 만료 프로퍼티명 변경을 AGENTS.md에 반영
hwangdaesun Jul 28, 2026
d7eb9a2
fix(analysis): analysis.progress에 0~100 범위 CHECK 제약 추가
hwangdaesun Jul 29, 2026
680c78f
fix(analysis): analysis 인덱스를 (user_id, created_at) 복합으로 변경
hwangdaesun Jul 29, 2026
12b310d
fix(analysis): photos.taken_at을 NOT NULL로 변경하고 PhotoCreate.takenAt도 n…
hwangdaesun Jul 29, 2026
182f095
test(analysis): AnalysisServiceTest의 순서 검증을 인덱스별 비교로 개선
hwangdaesun Jul 29, 2026
0a9ee69
test(analysis): 중복된 contentType 검증 컨트롤러 테스트 제거
hwangdaesun Jul 29, 2026
9fd91a9
docs(analysis): 90~100장 수량 검증과 lifecycle business rules 분리 문서화
hwangdaesun Jul 29, 2026
8cd4c78
style(test): AnalysisServiceTest 불필요한 주석 제거
hwangdaesun Jul 29, 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
4 changes: 4 additions & 0 deletions .env.template
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,7 @@ SERVER_PORT=8080
CORS_ALLOWED_ORIGINS=http://localhost:3000
SWAGGER_USER=ppotto
SWAGGER_PASSWORD=ppotto
GCS_BUCKET=
GCS_CREDENTIALS_PATH=./secrets/gcs-service-account.json
GCS_UPLOAD_SIGNED_URL_EXPIRATION_MINUTES=15
GCS_TIMEOUT_MILLIS=5000
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,4 @@ out/
.env
.env.*
!.env.template
/secrets/
2 changes: 1 addition & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,11 +51,11 @@ photo/
- `@ConfigurationProperties` data classes get `@Validated` + jakarta validation annotations.
- Validation annotations on data class constructor properties always use the `@field:` use-site (`@field:NotBlank val title: String`); without it Hibernate Validator may not see them. Controllers take `@Valid @RequestBody`.
- Never write a fully-qualified name (FQN) inline. Import the short name whenever there's no naming conflict.
- API versioning: `X-API-Version` 요청 헤더로 버전을 지정한다(Spring Framework 7 네이티브 API 버저닝, `WebMvcConfigurer.configureApiVersioning`, 설정은 `global/config/WebMvcConfig.kt`). 헤더가 없으면 기본값 `1`로 처리한다. URL 경로에는 버전을 포함하지 않으며 `/api` 프리픽스도 쓰지 않는다(예: `/analysis`). 각 컨트롤러의 클래스 레벨 `@RequestMapping`에 `version = "N"`을 명시한다.

## Planned Conventions

- Primary keys for new tables: `uuid primary key default uuidv7()` (Postgres 18 built-in, time-ordered).
- API versioning: adopt Spring Framework 7 native API versioning when the first public API ships.

## DB Workflow

Expand Down
1 change: 1 addition & 0 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ dependencies {
implementation(platform(libs.spring.cloud.dependencies))

implementation(libs.flyway.database.postgresql)
implementation(libs.google.cloud.storage)
implementation(libs.jackson.module.kotlin)
implementation(libs.jooq.kotlin)
implementation(libs.kotlin.reflect)
Expand Down
2 changes: 2 additions & 0 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ spring-dependency-management = "1.1.7"
spring-cloud = "2025.1.2"
jooq = "3.21.6"
flyway = "12.4.0"
google-cloud-storage = "2.70.0"
postgresql = "42.7.11"
kotest = "6.2.3"
spring-dotenv = "5.1.0"
Expand All @@ -31,6 +32,7 @@ kotlin-reflect = { module = "org.jetbrains.kotlin:kotlin-reflect" }
jackson-module-kotlin = { module = "tools.jackson.module:jackson-module-kotlin" }
jooq-kotlin = { module = "org.jooq:jooq-kotlin", version.ref = "jooq" }
flyway-database-postgresql = { module = "org.flywaydb:flyway-database-postgresql", version.ref = "flyway" }
google-cloud-storage = { module = "com.google.cloud:google-cloud-storage", version.ref = "google-cloud-storage" }
postgresql = { module = "org.postgresql:postgresql", version.ref = "postgresql" }
spring-dotenv = { module = "me.paulschwarz:springboot4-dotenv", version.ref = "spring-dotenv" }
testcontainers-junit-jupiter = { module = "org.testcontainers:testcontainers-junit-jupiter" }
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

19 changes: 13 additions & 6 deletions src/generated/jooq/com/github/nexters/ppotto/jooq/Public.kt

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

219 changes: 219 additions & 0 deletions src/generated/jooq/com/github/nexters/ppotto/jooq/tables/Analysis.kt

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading