From a6b702d0e8acb43ced69d9db18e5b3a4096a710f Mon Sep 17 00:00:00 2001 From: zyovn Date: Thu, 2 Oct 2025 00:34:31 +0900 Subject: [PATCH 001/402] =?UTF-8?q?#1=20chore:=20=ED=94=84=EB=A1=9C?= =?UTF-8?q?=EC=A0=9D=ED=8A=B8=20=EC=B4=88=EA=B8=B0=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitattributes | 3 + .gitignore | 37 +++ build.gradle | 40 +++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 43764 bytes gradle/wrapper/gradle-wrapper.properties | 7 + gradlew | 251 ++++++++++++++++++ gradlew.bat | 94 +++++++ settings.gradle | 1 + .../com/cheeeese/CheeeeseApplication.java | 13 + src/main/resources/application.properties | 1 + .../cheeeese/CheeeeseApplicationTests.java | 13 + 11 files changed, 460 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 build.gradle create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle create mode 100644 src/main/java/com/cheeeese/CheeeeseApplication.java create mode 100644 src/main/resources/application.properties create mode 100644 src/test/java/com/cheeeese/CheeeeseApplicationTests.java diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..8af972c --- /dev/null +++ b/.gitattributes @@ -0,0 +1,3 @@ +/gradlew text eol=lf +*.bat text eol=crlf +*.jar binary diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c2065bc --- /dev/null +++ b/.gitignore @@ -0,0 +1,37 @@ +HELP.md +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..66ae636 --- /dev/null +++ b/build.gradle @@ -0,0 +1,40 @@ +plugins { + id 'java' + id 'org.springframework.boot' version '3.5.6' + id 'io.spring.dependency-management' version '1.1.7' +} + +group = 'com' +version = '0.0.1-SNAPSHOT' +description = 'Kusitms 32nd Cheeeese Server' + +java { + toolchain { + languageVersion = JavaLanguageVersion.of(21) + } +} + +configurations { + compileOnly { + extendsFrom annotationProcessor + } +} + +repositories { + mavenCentral() +} + +dependencies { + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + implementation 'org.springframework.boot:spring-boot-starter-validation' + implementation 'org.springframework.boot:spring-boot-starter-web' + compileOnly 'org.projectlombok:lombok' + runtimeOnly 'com.mysql:mysql-connector-j' + annotationProcessor 'org.projectlombok:lombok' + testImplementation 'org.springframework.boot:spring-boot-starter-test' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher' +} + +tasks.named('test') { + useJUnitPlatform() +} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..1b33c55baabb587c669f562ae36f953de2481846 GIT binary patch literal 43764 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 '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH="\\\"\\\"" + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..db3a6ac --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,94 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH= + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..116850a --- /dev/null +++ b/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'cheeeese' diff --git a/src/main/java/com/cheeeese/CheeeeseApplication.java b/src/main/java/com/cheeeese/CheeeeseApplication.java new file mode 100644 index 0000000..19ae660 --- /dev/null +++ b/src/main/java/com/cheeeese/CheeeeseApplication.java @@ -0,0 +1,13 @@ +package com.cheeeese; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class CheeeeseApplication { + + public static void main(String[] args) { + SpringApplication.run(CheeeeseApplication.class, args); + } + +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 0000000..c6678bd --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1 @@ +spring.application.name=cheeeese diff --git a/src/test/java/com/cheeeese/CheeeeseApplicationTests.java b/src/test/java/com/cheeeese/CheeeeseApplicationTests.java new file mode 100644 index 0000000..3c28ce9 --- /dev/null +++ b/src/test/java/com/cheeeese/CheeeeseApplicationTests.java @@ -0,0 +1,13 @@ +package com.cheeeese; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class CheeeeseApplicationTests { + + @Test + void contextLoads() { + } + +} From 0f4cfa3e94192e3fed87a46ca615a29264608e67 Mon Sep 17 00:00:00 2001 From: zyovn Date: Thu, 2 Oct 2025 01:18:36 +0900 Subject: [PATCH 002/402] =?UTF-8?q?#1=20docs:=20issue=20template=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/ISSUE_TEMPLATE/bug.yml | 41 +++++++++++++++++++++++++++++ .github/ISSUE_TEMPLATE/chore.yml | 30 +++++++++++++++++++++ .github/ISSUE_TEMPLATE/docs.yml | 30 +++++++++++++++++++++ .github/ISSUE_TEMPLATE/feature.yml | 29 ++++++++++++++++++++ .github/ISSUE_TEMPLATE/refactor.yml | 41 +++++++++++++++++++++++++++++ .github/ISSUE_TEMPLATE/test.yml | 40 ++++++++++++++++++++++++++++ 6 files changed, 211 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug.yml create mode 100644 .github/ISSUE_TEMPLATE/chore.yml create mode 100644 .github/ISSUE_TEMPLATE/docs.yml create mode 100644 .github/ISSUE_TEMPLATE/feature.yml create mode 100644 .github/ISSUE_TEMPLATE/refactor.yml create mode 100644 .github/ISSUE_TEMPLATE/test.yml diff --git a/.github/ISSUE_TEMPLATE/bug.yml b/.github/ISSUE_TEMPLATE/bug.yml new file mode 100644 index 0000000..290ada1 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug.yml @@ -0,0 +1,41 @@ +name: 🐛 버그 리포트 +description: 버그가 발생했을 때 사용하는 템플릿입니다. +title: "fix: " +labels: ["🐛bug"] +assignees: [] + +body: + - type: textarea + id: bug_summary + attributes: + label: 🐛 어떤 버그인가요? + description: 발견된 버그를 간단하게 설명해주세요. + placeholder: | + 예) 로그인 버튼 클릭 시 500 에러 발생 + value: "- " + validations: + required: true + + - type: textarea + id: bug_scenario + attributes: + label: 🤷‍♂️ 어떤 상황에서 발생한 버그인가요? + description: 가능하다면 Given-When-Then 형식으로 작성해주세요. + placeholder: | + **Given:** 로그인 페이지에 접속한 상태에서 + **When:** 로그인 버튼을 클릭했을 때 + **Then:** 메인 페이지로 이동해야 하지만 500 에러 발생 + value: "> " + validations: + required: true + + - type: textarea + id: expected_result + attributes: + label: 🤔 예상 결과 + description: 기대했던 정상 동작을 설명해주세요. + placeholder: | + 예) 로그인 버튼 클릭 시 정상적으로 메인 페이지로 이동 + value: "- " + validations: + required: false \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/chore.yml b/.github/ISSUE_TEMPLATE/chore.yml new file mode 100644 index 0000000..223abc3 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/chore.yml @@ -0,0 +1,30 @@ +name: ⚙️ 작업 +description: 세팅, 배포, 환경설정 등 기능 외 작업을 기록하는 템플릿입니다. +title: "chore: " +labels: ["⚙️setting"] +assignees: [] + +body: + - type: textarea + id: chore_type + attributes: + label: ⚙️ 어떤 작업인가요? + description: 작업의 범위와 목적을 간단히 설명해주세요. (CI/CD 파이프라인 세팅, Dockerfile 수정 등) + placeholder: | + 예) GitHub Actions 워크플로우에서 테스트 단계 추가 + value: "- " + validations: + required: true + + - type: textarea + id: tasks + attributes: + label: 📝 작업 상세 내용 + description: 작업해야 할 항목들을 체크리스트 형식으로 정리해주세요. + placeholder: | + - [ ] Dockerfile 수정 + - [ ] Nginx 설정 업데이트 + - [ ] 배포 스크립트 개선 + value: "- [ ] " + validations: + required: false \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/docs.yml b/.github/ISSUE_TEMPLATE/docs.yml new file mode 100644 index 0000000..d26f14f --- /dev/null +++ b/.github/ISSUE_TEMPLATE/docs.yml @@ -0,0 +1,30 @@ +name: 📝 문서 작업 +description: README, 이슈/PR 템플릿, 가이드 등 문서 관련 작업을 기록하는 템플릿입니다. +title: "docs: " +labels: ["📝docs"] +assignees: [] + +body: + - type: textarea + id: doc_type + attributes: + label: 📄 어떤 문서인가요? + description: 작성하거나 수정하려는 문서의 종류와 목적을 간단히 설명해주세요. + placeholder: | + 예) README에 프로젝트 빌드 방법 추가 + value: "- " + validations: + required: true + + - type: textarea + id: tasks + attributes: + label: 📝 작업 상세 내용 + description: 문서 작업의 주요 내용을 체크리스트로 정리해주세요. + placeholder: | + - [ ] README에 빌드 및 실행 방법 추가 + - [ ] CONTRIBUTING.md 작성 + - [ ] API 사용 가이드 업데이트 + value: "- [ ] " + validations: + required: false \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/feature.yml b/.github/ISSUE_TEMPLATE/feature.yml new file mode 100644 index 0000000..53b467d --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature.yml @@ -0,0 +1,29 @@ +name: ✨ 기능 추가 +description: 새로운 기능을 추가할 때 사용하는 템플릿입니다. +title: "feat: " +labels: ["✨feature"] +assignees: [] + +body: + - type: textarea + id: summary + attributes: + label: 📌 어떤 기능인가요? + description: 추가하려는 기능에 대해 간결하게 설명해주세요. + placeholder: | + 예) 사용자 회원가입, 로그인 기능 구현 + value: "- " + validations: + required: true + + - type: textarea + id: tasks + attributes: + label: 📝 작업 상세 내용 + description: 구현해야 할 작업 항목을 체크리스트로 작성해주세요. + placeholder: | + - [ ] 사용자 로그인 API + - [ ] 사용자 온보딩 API + value: "- [ ] " + validations: + required: false \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/refactor.yml b/.github/ISSUE_TEMPLATE/refactor.yml new file mode 100644 index 0000000..6823224 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/refactor.yml @@ -0,0 +1,41 @@ +name: ♻️ 리팩토링 +description: 리팩토링 작업을 기록하는 템플릿입니다. +title: "refactor: " +labels: ["♻️refactor"] +assignees: [] + +body: + - type: textarea + id: target + attributes: + label: 📌 리팩토링 대상 + description: 어떤 기능/모듈을 리팩토링했는지 명확히 작성해주세요. + placeholder: | + 예) UserService 회원가입 로직 + value: "- " + validations: + required: true + + - type: textarea + id: reason + attributes: + label: 🛠️ 리팩토링 사유 + description: 리팩토링을 하게 된 배경이나 필요성을 간단히 설명해주세요. + placeholder: | + 예) 코드 중복 제거 및 테스트 용이성 향상 + value: "- " + validations: + required: true + + - type: textarea + id: tasks + attributes: + label: 📝 작업 상세 내용 + description: 주요 변경 사항을 체크리스트 형식으로 정리해주세요. + placeholder: | + - [ ] 중복된 로직 분리 + - [ ] 메서드 네이밍 개선 + - [ ] 단위 테스트 보강 + value: "- [ ] " + validations: + required: false \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/test.yml b/.github/ISSUE_TEMPLATE/test.yml new file mode 100644 index 0000000..05cf479 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/test.yml @@ -0,0 +1,40 @@ +name: 🧪 테스트 코드 작성 +description: 테스트 코드 작성 이슈를 기록하는 템플릿입니다. +title: "test: " +labels: ["🧪test"] +assignees: [] + +body: + - type: textarea + id: test_scope + attributes: + label: 🧪 어떤 테스트인가요? + description: 작성할 테스트의 범위와 목적을 간단히 설명해주세요. + placeholder: | + 예) UserService 회원가입 로직 단위 테스트 + value: "- " + validations: + required: true + + - type: textarea + id: test_items + attributes: + label: 📝 테스트 항목 + description: 작성할 테스트 케이스들을 체크리스트로 정리해주세요. + placeholder: | + - [ ] 잘못된 ID로 조회 시 404 반환 + - [ ] 유효한 입력값으로 저장 시 정상적으로 데이터가 반영됨 + value: "- [ ] " + validations: + required: false + + - type: textarea + id: expected_result + attributes: + label: 🎯 기대 결과 + description: 테스트가 통과해야 하는 기준이나 시나리오를 작성해주세요. + placeholder: | + 예) 잘못된 ID로 조회 시 404 반환 + value: "- " + validations: + required: false \ No newline at end of file From 65ae33f0abf9a84be47e31eb5e2bdf2d20f44d1c Mon Sep 17 00:00:00 2001 From: zyovn Date: Thu, 2 Oct 2025 01:19:57 +0900 Subject: [PATCH 003/402] =?UTF-8?q?#1=20docs:=20pr=20template=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/PULL_REQUEST_TEMPLATE.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 .github/PULL_REQUEST_TEMPLATE.md diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..7a2052f --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,21 @@ +## 🔗 연관된 이슈 +- # + +## 🚀 변경 유형 +- [ ] ✨ 기능 추가 (feature) +- [ ] 🐛 버그 수정 (fix) +- [ ] 📝 문서 변경 (docs) +- [ ] ♻️ 리팩토링 (refactor) +- [ ] 🧪 테스트 추가 / 수정 (test) +- [ ] ⚙️ 설정 변경 (chore) + +## 📝 작업 내용 + +- + +## 📸 스크린샷 +> + +## 💬 리뷰 요구사항 + +- \ No newline at end of file From 65afdb52064e4853fb901f2023f71ae812f18b55 Mon Sep 17 00:00:00 2001 From: zyovn Date: Thu, 2 Oct 2025 10:08:22 +0900 Subject: [PATCH 004/402] =?UTF-8?q?#1=20feat:=20=EA=B3=B5=ED=86=B5=20?= =?UTF-8?q?=EC=9D=91=EB=8B=B5=20=ED=98=95=EC=8B=9D=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../global/common/CommonResponse.java | 28 +++++++++++++++++++ .../cheeeese/global/common/code/BaseCode.java | 8 ++++++ .../global/common/code/ErrorCode.java | 20 +++++++++++++ .../global/common/code/SuccessCode.java | 17 +++++++++++ 4 files changed, 73 insertions(+) create mode 100644 src/main/java/com/cheeeese/global/common/CommonResponse.java create mode 100644 src/main/java/com/cheeeese/global/common/code/BaseCode.java create mode 100644 src/main/java/com/cheeeese/global/common/code/ErrorCode.java create mode 100644 src/main/java/com/cheeeese/global/common/code/SuccessCode.java diff --git a/src/main/java/com/cheeeese/global/common/CommonResponse.java b/src/main/java/com/cheeeese/global/common/CommonResponse.java new file mode 100644 index 0000000..e7d471b --- /dev/null +++ b/src/main/java/com/cheeeese/global/common/CommonResponse.java @@ -0,0 +1,28 @@ +package com.cheeeese.global.common; + +import com.cheeeese.global.common.code.BaseCode; +import com.fasterxml.jackson.annotation.JsonInclude; + +public record CommonResponse( + boolean isSuccess, + int code, + String message, + @JsonInclude(JsonInclude.Include.NON_NULL) + T result +) { + public static CommonResponse success(BaseCode successCode, T data) { + return new CommonResponse<>(true, successCode.getHttpStatus().value(), successCode.getMessage(), data); + } + + public static CommonResponse success(BaseCode successCode) { + return new CommonResponse<>(true, successCode.getHttpStatus().value(), successCode.getMessage(), null); + } + + public static CommonResponse failure(BaseCode errorCode, T data) { + return new CommonResponse<>(false, errorCode.getHttpStatus().value(), errorCode.getMessage(), data); + } + + public static CommonResponse failure(BaseCode errorCode) { + return new CommonResponse<>(false, errorCode.getHttpStatus().value(), errorCode.getMessage(), null); + } +} diff --git a/src/main/java/com/cheeeese/global/common/code/BaseCode.java b/src/main/java/com/cheeeese/global/common/code/BaseCode.java new file mode 100644 index 0000000..ff4304f --- /dev/null +++ b/src/main/java/com/cheeeese/global/common/code/BaseCode.java @@ -0,0 +1,8 @@ +package com.cheeeese.global.common.code; + +import org.springframework.http.HttpStatus; + +public interface BaseCode { + HttpStatus getHttpStatus(); + String getMessage(); +} diff --git a/src/main/java/com/cheeeese/global/common/code/ErrorCode.java b/src/main/java/com/cheeeese/global/common/code/ErrorCode.java new file mode 100644 index 0000000..a181663 --- /dev/null +++ b/src/main/java/com/cheeeese/global/common/code/ErrorCode.java @@ -0,0 +1,20 @@ +package com.cheeeese.global.common.code; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; + +@Getter +@RequiredArgsConstructor +public enum ErrorCode implements BaseCode { + + // 공통 에러 + INTERNAL_SERVER_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "서버 내부 오류가 발생했습니다."), + BAD_REQUEST(HttpStatus.BAD_REQUEST, "잘못된 요청입니다."), + UNAUTHORIZED(HttpStatus.UNAUTHORIZED, "인증이 필요합니다."), + FORBIDDEN(HttpStatus.FORBIDDEN, "접근 권한이 없습니다."), + ; + + private final HttpStatus httpStatus; + private final String message; +} diff --git a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java new file mode 100644 index 0000000..c4244ea --- /dev/null +++ b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java @@ -0,0 +1,17 @@ +package com.cheeeese.global.common.code; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; + +@Getter +@RequiredArgsConstructor +public enum SuccessCode implements BaseCode{ + + // health_check + HEALTH_CHECK_SUCCESS(HttpStatus.OK, "Health Check Success"), + ; + + private final HttpStatus httpStatus; + private final String message; +} From 6f259427b1ac22ee9b704ba38850b03868493b23 Mon Sep 17 00:00:00 2001 From: zyovn Date: Thu, 2 Oct 2025 10:12:43 +0900 Subject: [PATCH 005/402] =?UTF-8?q?#1=20feat:=20=EC=97=90=EB=9F=AC=20?= =?UTF-8?q?=ED=95=B8=EB=93=A4=EB=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../global/exception/BusinessException.java | 14 +++++ .../handler/GlobalExceptionHandler.java | 57 +++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 src/main/java/com/cheeeese/global/exception/BusinessException.java create mode 100644 src/main/java/com/cheeeese/global/exception/handler/GlobalExceptionHandler.java diff --git a/src/main/java/com/cheeeese/global/exception/BusinessException.java b/src/main/java/com/cheeeese/global/exception/BusinessException.java new file mode 100644 index 0000000..c26c79c --- /dev/null +++ b/src/main/java/com/cheeeese/global/exception/BusinessException.java @@ -0,0 +1,14 @@ +package com.cheeeese.global.exception; + +import com.cheeeese.global.common.code.BaseCode; +import lombok.Getter; + +@Getter +public class BusinessException extends RuntimeException { + private final BaseCode errorCode; + + public BusinessException(BaseCode errorCode) { + super(errorCode.getMessage()); + this.errorCode = errorCode; + } +} diff --git a/src/main/java/com/cheeeese/global/exception/handler/GlobalExceptionHandler.java b/src/main/java/com/cheeeese/global/exception/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..8fb43f5 --- /dev/null +++ b/src/main/java/com/cheeeese/global/exception/handler/GlobalExceptionHandler.java @@ -0,0 +1,57 @@ +package com.cheeeese.global.exception.handler; + +import com.cheeeese.global.common.CommonResponse; +import com.cheeeese.global.common.code.BaseCode; +import com.cheeeese.global.common.code.ErrorCode; +import com.cheeeese.global.exception.BusinessException; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.http.converter.HttpMessageNotReadableException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; +import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException; + +@Slf4j +@RestControllerAdvice +public class GlobalExceptionHandler { + + @ExceptionHandler(BusinessException.class) + protected ResponseEntity> handleBusinessException(BusinessException e) { + BaseCode errorCode = e.getErrorCode(); + return ResponseEntity + .status(errorCode.getHttpStatus()) + .body(CommonResponse.failure(errorCode)); + } + + @ExceptionHandler(MethodArgumentNotValidException.class) + protected ResponseEntity> handleMethodArgumentNotValidException(MethodArgumentNotValidException e) { + return ResponseEntity + .status(ErrorCode.BAD_REQUEST.getHttpStatus()) + .body(CommonResponse.failure(ErrorCode.BAD_REQUEST)); + } + + @ExceptionHandler(HttpMessageNotReadableException.class) + ResponseEntity> handleHttpMessageNotReadableException(HttpMessageNotReadableException e) { + return ResponseEntity + .status(ErrorCode.BAD_REQUEST.getHttpStatus()) + .body(CommonResponse.failure(ErrorCode.BAD_REQUEST)); + } + + @ExceptionHandler(MethodArgumentTypeMismatchException.class) + ResponseEntity> handleMethodArgumentTypeMismatchException(MethodArgumentTypeMismatchException e) { + return ResponseEntity + .status(ErrorCode.BAD_REQUEST.getHttpStatus()) + .body(CommonResponse.failure(ErrorCode.BAD_REQUEST)); + } + + @ExceptionHandler(Exception.class) + protected ResponseEntity> handleUnexpectedException(Exception e) { + log.error("🚨 Unexpected Error Log: {}", e.getMessage()); + + return ResponseEntity + .status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(CommonResponse.failure(ErrorCode.INTERNAL_SERVER_ERROR)); + } +} From d9ddc7ce88304e29a0d178df0aafd8fdd9a343f3 Mon Sep 17 00:00:00 2001 From: zyovn Date: Thu, 2 Oct 2025 10:18:54 +0900 Subject: [PATCH 006/402] =?UTF-8?q?#1=20feat:=20baseEntity=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cheeeese/global/domain/BaseEntity.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 src/main/java/com/cheeeese/global/domain/BaseEntity.java diff --git a/src/main/java/com/cheeeese/global/domain/BaseEntity.java b/src/main/java/com/cheeeese/global/domain/BaseEntity.java new file mode 100644 index 0000000..6151d46 --- /dev/null +++ b/src/main/java/com/cheeeese/global/domain/BaseEntity.java @@ -0,0 +1,25 @@ +package com.cheeeese.global.domain; + +import jakarta.persistence.Column; +import jakarta.persistence.EntityListeners; +import jakarta.persistence.MappedSuperclass; +import lombok.Getter; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +import java.time.LocalDateTime; + +@Getter +@MappedSuperclass +@EntityListeners(AuditingEntityListener.class) +public abstract class BaseEntity { + + @CreatedDate + @Column(name = "created_at", updatable = false) + private LocalDateTime createdAt; + + @LastModifiedDate + @Column(name = "updated_at") + private LocalDateTime updatedAt; +} From 505c58b30b6fe500f6f3631f7d649632ea5ff640 Mon Sep 17 00:00:00 2001 From: zyovn Date: Thu, 2 Oct 2025 10:25:31 +0900 Subject: [PATCH 007/402] =?UTF-8?q?#1=20chore:=20swagger=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 3 +++ .../cheeeese/global/config/SwaggerConfig.java | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+) create mode 100644 src/main/java/com/cheeeese/global/config/SwaggerConfig.java diff --git a/build.gradle b/build.gradle index 66ae636..3b24e7b 100644 --- a/build.gradle +++ b/build.gradle @@ -33,6 +33,9 @@ dependencies { annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' + + // swagger + implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.8.9' } tasks.named('test') { diff --git a/src/main/java/com/cheeeese/global/config/SwaggerConfig.java b/src/main/java/com/cheeeese/global/config/SwaggerConfig.java new file mode 100644 index 0000000..0fe0eae --- /dev/null +++ b/src/main/java/com/cheeeese/global/config/SwaggerConfig.java @@ -0,0 +1,19 @@ +package com.cheeeese.global.config; + +import io.swagger.v3.oas.annotations.OpenAPIDefinition; +import io.swagger.v3.oas.annotations.info.Info; +import io.swagger.v3.oas.annotations.servers.Server; + +@OpenAPIDefinition( + info = @Info( + title = "Cheeeese API 명세서", + description = "Cheeeese API 명세서", + version = "v1" + ), + servers = @Server( + url = "/", + description = "Default Server URL" + ) +) +public class SwaggerConfig { +} From de56caf299f2fa51051956abe6a45d05c0700246 Mon Sep 17 00:00:00 2001 From: zyovn Date: Thu, 2 Oct 2025 10:36:03 +0900 Subject: [PATCH 008/402] =?UTF-8?q?#1=20feat:=20healthCheck=20api=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../global/presentation/GlobalController.java | 22 +++++++++++++++++++ .../presentation/swagger/GlobalSwagger.java | 22 +++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 src/main/java/com/cheeeese/global/presentation/GlobalController.java create mode 100644 src/main/java/com/cheeeese/global/presentation/swagger/GlobalSwagger.java diff --git a/src/main/java/com/cheeeese/global/presentation/GlobalController.java b/src/main/java/com/cheeeese/global/presentation/GlobalController.java new file mode 100644 index 0000000..1b96205 --- /dev/null +++ b/src/main/java/com/cheeeese/global/presentation/GlobalController.java @@ -0,0 +1,22 @@ +package com.cheeeese.global.presentation; + +import com.cheeeese.global.common.CommonResponse; +import com.cheeeese.global.presentation.swagger.GlobalSwagger; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import static com.cheeeese.global.common.code.SuccessCode.HEALTH_CHECK_SUCCESS; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/v1/global") +public class GlobalController implements GlobalSwagger { + + @Override + @GetMapping("/health-check") + public CommonResponse healthCheck() { + return CommonResponse.success(HEALTH_CHECK_SUCCESS, "OK"); + } +} diff --git a/src/main/java/com/cheeeese/global/presentation/swagger/GlobalSwagger.java b/src/main/java/com/cheeeese/global/presentation/swagger/GlobalSwagger.java new file mode 100644 index 0000000..2c2e031 --- /dev/null +++ b/src/main/java/com/cheeeese/global/presentation/swagger/GlobalSwagger.java @@ -0,0 +1,22 @@ +package com.cheeeese.global.presentation.swagger; + +import com.cheeeese.global.common.CommonResponse; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; + +@Tag(name = "[Global]", description = "설정 확인을 위한 API") +public interface GlobalSwagger { + @Operation( + summary = "health check", + description = "health check API" + ) + @ApiResponses(value = { + @ApiResponse( + responseCode = "200", + description = "health check success" + ) + }) + CommonResponse healthCheck(); +} From b2ce7f6abb6fb9758addb2514594d7b89ded9680 Mon Sep 17 00:00:00 2001 From: zyovn Date: Thu, 2 Oct 2025 10:41:28 +0900 Subject: [PATCH 009/402] =?UTF-8?q?#1=20chore:=20coderabbit=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .coderabbit.yaml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 .coderabbit.yaml diff --git a/.coderabbit.yaml b/.coderabbit.yaml new file mode 100644 index 0000000..2590a64 --- /dev/null +++ b/.coderabbit.yaml @@ -0,0 +1,14 @@ +language: "ko-KR" +early_access: false +reviews: + profile: "chill" + request_changes_workflow: false + high_level_summary: true + poem: true + review_status: true + collapse_walkthrough: false + auto_review: + enabled: true + drafts: false +chat: + auto_reply: true \ No newline at end of file From b480acf271572eebcafb4a1504fe0db3c996ae38 Mon Sep 17 00:00:00 2001 From: zyovn Date: Thu, 2 Oct 2025 11:59:47 +0900 Subject: [PATCH 010/402] =?UTF-8?q?#1=20chore:=20gitignore=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.gitignore b/.gitignore index c2065bc..391a66a 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,11 @@ build/ !**/src/main/**/build/ !**/src/test/**/build/ +### application.yml ### +application.yml +application-dev.yml +application-prod.yml + ### STS ### .apt_generated .classpath From a4efc4138bdb41a0e775e0dca014fdbc96c04aeb Mon Sep 17 00:00:00 2001 From: zyovn Date: Thu, 2 Oct 2025 12:00:15 +0900 Subject: [PATCH 011/402] =?UTF-8?q?#1=20chore:=20swaggerConfig=EC=97=90=20?= =?UTF-8?q?configuration=20=EC=96=B4=EB=85=B8=ED=85=8C=EC=9D=B4=EC=85=98?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/cheeeese/global/config/SwaggerConfig.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/cheeeese/global/config/SwaggerConfig.java b/src/main/java/com/cheeeese/global/config/SwaggerConfig.java index 0fe0eae..5d82c9c 100644 --- a/src/main/java/com/cheeeese/global/config/SwaggerConfig.java +++ b/src/main/java/com/cheeeese/global/config/SwaggerConfig.java @@ -3,7 +3,9 @@ import io.swagger.v3.oas.annotations.OpenAPIDefinition; import io.swagger.v3.oas.annotations.info.Info; import io.swagger.v3.oas.annotations.servers.Server; +import org.springframework.context.annotation.Configuration; +@Configuration @OpenAPIDefinition( info = @Info( title = "Cheeeese API 명세서", From e6f7875c93b7b55cacf4b472a8f0ca95406ff056 Mon Sep 17 00:00:00 2001 From: zyovn Date: Thu, 2 Oct 2025 15:57:44 +0900 Subject: [PATCH 012/402] =?UTF-8?q?#1=20remove:=20application.properties?= =?UTF-8?q?=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application.properties | 1 - 1 file changed, 1 deletion(-) delete mode 100644 src/main/resources/application.properties diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties deleted file mode 100644 index c6678bd..0000000 --- a/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ -spring.application.name=cheeeese From 79bd507dad31186e32c60d365a454bd33d8edd2c Mon Sep 17 00:00:00 2001 From: zyovn Date: Thu, 2 Oct 2025 15:58:14 +0900 Subject: [PATCH 013/402] =?UTF-8?q?#1=20chore:=20jpaAuditing=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/cheeeese/CheeeeseApplication.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/cheeeese/CheeeeseApplication.java b/src/main/java/com/cheeeese/CheeeeseApplication.java index 19ae660..2ad8b7e 100644 --- a/src/main/java/com/cheeeese/CheeeeseApplication.java +++ b/src/main/java/com/cheeeese/CheeeeseApplication.java @@ -2,8 +2,10 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.data.jpa.repository.config.EnableJpaAuditing; @SpringBootApplication +@EnableJpaAuditing public class CheeeeseApplication { public static void main(String[] args) { From 88e44c576d8b6e1ceadf558fe28043dcbd41d774 Mon Sep 17 00:00:00 2001 From: zyovn Date: Thu, 2 Oct 2025 18:01:41 +0900 Subject: [PATCH 014/402] =?UTF-8?q?#1=20fix:=20=ED=94=BC=EB=93=9C=EB=B0=B1?= =?UTF-8?q?=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../global/exception/handler/GlobalExceptionHandler.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/cheeeese/global/exception/handler/GlobalExceptionHandler.java b/src/main/java/com/cheeeese/global/exception/handler/GlobalExceptionHandler.java index 8fb43f5..5fd05ab 100644 --- a/src/main/java/com/cheeeese/global/exception/handler/GlobalExceptionHandler.java +++ b/src/main/java/com/cheeeese/global/exception/handler/GlobalExceptionHandler.java @@ -27,6 +27,8 @@ protected ResponseEntity> handleBusinessException(BusinessE @ExceptionHandler(MethodArgumentNotValidException.class) protected ResponseEntity> handleMethodArgumentNotValidException(MethodArgumentNotValidException e) { + log.warn("⚠️ Validation failed: {}", e.getBindingResult().getAllErrors()); + return ResponseEntity .status(ErrorCode.BAD_REQUEST.getHttpStatus()) .body(CommonResponse.failure(ErrorCode.BAD_REQUEST)); From 7b91308ca25b7f32b5766c8a5b1c1deae4921a2f Mon Sep 17 00:00:00 2001 From: zyovn Date: Thu, 2 Oct 2025 19:48:08 +0900 Subject: [PATCH 015/402] =?UTF-8?q?#3=20chore:=20security,=20oauth2,=20jwt?= =?UTF-8?q?=20=EA=B4=80=EB=A0=A8=20=EC=9D=98=EC=A1=B4=EC=84=B1=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/build.gradle b/build.gradle index 3b24e7b..fb6c371 100644 --- a/build.gradle +++ b/build.gradle @@ -36,6 +36,17 @@ dependencies { // swagger implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.8.9' + + // security + testImplementation 'org.springframework.security:spring-security-test' + + // oauth + implementation 'org.springframework.boot:spring-boot-starter-oauth2-client' + + // jwt + implementation 'io.jsonwebtoken:jjwt-api:0.11.5' + implementation 'io.jsonwebtoken:jjwt-impl:0.11.5' + implementation 'io.jsonwebtoken:jjwt-jackson:0.11.5' } tasks.named('test') { From 7f0ad2c35c9957850a0ad5bd182907113f171bf0 Mon Sep 17 00:00:00 2001 From: zyovn Date: Thu, 2 Oct 2025 19:51:17 +0900 Subject: [PATCH 016/402] =?UTF-8?q?#3=20feat:=20swagger=EC=97=90=20jwt=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20=EC=84=A4=EC=A0=95=20=EC=A3=BC=EC=9E=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cheeeese/global/config/SwaggerConfig.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/main/java/com/cheeeese/global/config/SwaggerConfig.java b/src/main/java/com/cheeeese/global/config/SwaggerConfig.java index 5d82c9c..9fb9653 100644 --- a/src/main/java/com/cheeeese/global/config/SwaggerConfig.java +++ b/src/main/java/com/cheeeese/global/config/SwaggerConfig.java @@ -3,8 +3,15 @@ import io.swagger.v3.oas.annotations.OpenAPIDefinition; import io.swagger.v3.oas.annotations.info.Info; import io.swagger.v3.oas.annotations.servers.Server; +import io.swagger.v3.oas.models.Components; +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.security.SecurityRequirement; +import io.swagger.v3.oas.models.security.SecurityScheme; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import java.util.Collections; + @Configuration @OpenAPIDefinition( info = @Info( @@ -18,4 +25,15 @@ ) ) public class SwaggerConfig { + @Bean + public OpenAPI openAPI() { + SecurityScheme securityScheme = new SecurityScheme() + .type(SecurityScheme.Type.HTTP).scheme("Bearer").bearerFormat("JWT") + .in(SecurityScheme.In.HEADER).name("Authorization"); + SecurityRequirement securityRequirement = new SecurityRequirement().addList("BearerAuth"); + + return new OpenAPI() + .components(new Components().addSecuritySchemes("BearerAuth", securityScheme)) + .security(Collections.singletonList(securityRequirement)); + } } From e6dabb0f1f231fe57eb46773513f8617b2639b4b Mon Sep 17 00:00:00 2001 From: zyovn Date: Sat, 4 Oct 2025 02:06:32 +0900 Subject: [PATCH 017/402] =?UTF-8?q?#3=20feat:=20jwt=20=EB=B0=9C=EA=B8=89?= =?UTF-8?q?=20=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../global/common/code/ErrorCode.java | 4 ++ .../config/ConfigurationPropertiesConfig.java | 10 +++ .../global/security/jwt/JwtProperties.java | 11 +++ .../global/security/jwt/JwtProvider.java | 72 +++++++++++++++++++ 4 files changed, 97 insertions(+) create mode 100644 src/main/java/com/cheeeese/global/config/ConfigurationPropertiesConfig.java create mode 100644 src/main/java/com/cheeeese/global/security/jwt/JwtProperties.java create mode 100644 src/main/java/com/cheeeese/global/security/jwt/JwtProvider.java diff --git a/src/main/java/com/cheeeese/global/common/code/ErrorCode.java b/src/main/java/com/cheeeese/global/common/code/ErrorCode.java index a181663..cc76825 100644 --- a/src/main/java/com/cheeeese/global/common/code/ErrorCode.java +++ b/src/main/java/com/cheeeese/global/common/code/ErrorCode.java @@ -13,6 +13,10 @@ public enum ErrorCode implements BaseCode { BAD_REQUEST(HttpStatus.BAD_REQUEST, "잘못된 요청입니다."), UNAUTHORIZED(HttpStatus.UNAUTHORIZED, "인증이 필요합니다."), FORBIDDEN(HttpStatus.FORBIDDEN, "접근 권한이 없습니다."), + + // TODO: 패키지 이동 + INVALID_TOKEN(HttpStatus.UNAUTHORIZED, "유효하지 않은 토큰입니다."), + USER_NOT_FOUND(HttpStatus.NOT_FOUND, "존재하지 않는 사용자입니다."), ; private final HttpStatus httpStatus; diff --git a/src/main/java/com/cheeeese/global/config/ConfigurationPropertiesConfig.java b/src/main/java/com/cheeeese/global/config/ConfigurationPropertiesConfig.java new file mode 100644 index 0000000..5ff0a71 --- /dev/null +++ b/src/main/java/com/cheeeese/global/config/ConfigurationPropertiesConfig.java @@ -0,0 +1,10 @@ +package com.cheeeese.global.config; + +import com.cheeeese.global.security.jwt.JwtProperties; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +@Configuration +@EnableConfigurationProperties(value = JwtProperties.class) +public class ConfigurationPropertiesConfig { +} diff --git a/src/main/java/com/cheeeese/global/security/jwt/JwtProperties.java b/src/main/java/com/cheeeese/global/security/jwt/JwtProperties.java new file mode 100644 index 0000000..12fd728 --- /dev/null +++ b/src/main/java/com/cheeeese/global/security/jwt/JwtProperties.java @@ -0,0 +1,11 @@ +package com.cheeeese.global.security.jwt; + +import org.springframework.boot.context.properties.ConfigurationProperties; + +@ConfigurationProperties(prefix = "jwt") +public record JwtProperties( + String secret, + String accessExp, + String refreshExp +) { +} diff --git a/src/main/java/com/cheeeese/global/security/jwt/JwtProvider.java b/src/main/java/com/cheeeese/global/security/jwt/JwtProvider.java new file mode 100644 index 0000000..8f2c2b6 --- /dev/null +++ b/src/main/java/com/cheeeese/global/security/jwt/JwtProvider.java @@ -0,0 +1,72 @@ +package com.cheeeese.global.security.jwt; + +import com.cheeeese.global.common.code.ErrorCode; +import com.cheeeese.global.exception.BusinessException; +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.ExpiredJwtException; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; +import io.jsonwebtoken.security.Keys; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +import java.nio.charset.StandardCharsets; +import java.util.Date; + +@Component +@RequiredArgsConstructor +public class JwtProvider { + + private final JwtProperties jwtProperties; + + public String createAccessToken(Long userId) { + Date now = new Date(); + Date expiration = new Date(now.getTime() + jwtProperties.accessExp()); + + return Jwts.builder() + .setSubject(userId.toString()) + .setIssuedAt(now) + .setExpiration(expiration) + .signWith(Keys.hmacShaKeyFor(jwtProperties.secret().getBytes(StandardCharsets.UTF_8)), SignatureAlgorithm.HS256) + .compact(); + } + + public String createRefreshToken(Long userId) { + Date now = new Date(); + Date expiration = new Date(now.getTime() + jwtProperties.refreshExp()); + + return Jwts.builder() + .setSubject(userId.toString()) + .setIssuedAt(now) + .setExpiration(expiration) + .signWith(Keys.hmacShaKeyFor(jwtProperties.secret().getBytes(StandardCharsets.UTF_8)), SignatureAlgorithm.HS256) + .compact(); + } + + public Claims getClaims(String token) { + try { + return Jwts.parserBuilder() + .setSigningKey(Keys.hmacShaKeyFor(jwtProperties.secret().getBytes())) + .build() + .parseClaimsJws(token) + .getBody(); + } catch (ExpiredJwtException e) { + return e.getClaims(); + } + } + + public boolean validateToken(String token) { + try { + Claims claims = getClaims(token); + + Jwts.parserBuilder() + .setSigningKey(Keys.hmacShaKeyFor(jwtProperties.secret().getBytes(StandardCharsets.UTF_8))) + .build() + .parseClaimsJws(token); + + return true; + } catch (ExpiredJwtException e) { + throw new BusinessException(ErrorCode.INVALID_TOKEN); + } + } +} From 80b28ab53b2701026484edd379618383eb586dc5 Mon Sep 17 00:00:00 2001 From: zyovn Date: Sat, 4 Oct 2025 16:22:28 +0900 Subject: [PATCH 018/402] =?UTF-8?q?#3=20feat:=20user=20=EC=97=94=ED=8B=B0?= =?UTF-8?q?=ED=8B=B0=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cheeeese/user/domain/User.java | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 src/main/java/com/cheeeese/user/domain/User.java diff --git a/src/main/java/com/cheeeese/user/domain/User.java b/src/main/java/com/cheeeese/user/domain/User.java new file mode 100644 index 0000000..a0da622 --- /dev/null +++ b/src/main/java/com/cheeeese/user/domain/User.java @@ -0,0 +1,44 @@ +package com.cheeeese.user.domain; + +import com.cheeeese.global.domain.BaseEntity; +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class User extends BaseEntity { + + @Id + @Column(name = "user_id", nullable = false) + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "name", nullable = false) + private String name; + + @Column(name = "email", nullable = false) + private String email; + + @Column(name = "profile_image") + private String profileImage; + + @Column(name = "provider_id", nullable = false) + private String providerId; + + @Builder + private User( + String name, + String email, + String profileImage, + String providerId + ) { + this.name = name; + this.email = email; + this.profileImage = profileImage; + this.providerId = providerId; + } +} From a32a7cc25217343f47d0298e40faa70244542f6c Mon Sep 17 00:00:00 2001 From: zyovn Date: Sat, 4 Oct 2025 16:27:16 +0900 Subject: [PATCH 019/402] =?UTF-8?q?#3=20feat:=20userJpaRepository=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../user/infrastructure/persistence/UserRepository.java | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 src/main/java/com/cheeeese/user/infrastructure/persistence/UserRepository.java diff --git a/src/main/java/com/cheeeese/user/infrastructure/persistence/UserRepository.java b/src/main/java/com/cheeeese/user/infrastructure/persistence/UserRepository.java new file mode 100644 index 0000000..e8088d6 --- /dev/null +++ b/src/main/java/com/cheeeese/user/infrastructure/persistence/UserRepository.java @@ -0,0 +1,7 @@ +package com.cheeeese.user.infrastructure.persistence; + +import com.cheeeese.user.domain.User; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface UserRepository extends JpaRepository { +} From 08d7fe95ff4830acaac75a28c5b5cf66563f4210 Mon Sep 17 00:00:00 2001 From: zyovn Date: Sun, 5 Oct 2025 15:06:29 +0900 Subject: [PATCH 020/402] =?UTF-8?q?#3=20feat:=20kakaoUserInfo=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../oauth2/domain/OAuth2UserInfo.java | 8 +++ .../userinfo/KakaoUserInfo.java | 52 +++++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 src/main/java/com/cheeeese/oauth2/domain/OAuth2UserInfo.java create mode 100644 src/main/java/com/cheeeese/oauth2/infrastructure/userinfo/KakaoUserInfo.java diff --git a/src/main/java/com/cheeeese/oauth2/domain/OAuth2UserInfo.java b/src/main/java/com/cheeeese/oauth2/domain/OAuth2UserInfo.java new file mode 100644 index 0000000..1852d7b --- /dev/null +++ b/src/main/java/com/cheeeese/oauth2/domain/OAuth2UserInfo.java @@ -0,0 +1,8 @@ +package com.cheeeese.oauth2.domain; + +public interface OAuth2UserInfo { + String getProviderId(); + String getEmail(); + String getName (); + String getProfileImage(); +} diff --git a/src/main/java/com/cheeeese/oauth2/infrastructure/userinfo/KakaoUserInfo.java b/src/main/java/com/cheeeese/oauth2/infrastructure/userinfo/KakaoUserInfo.java new file mode 100644 index 0000000..f34ae6a --- /dev/null +++ b/src/main/java/com/cheeeese/oauth2/infrastructure/userinfo/KakaoUserInfo.java @@ -0,0 +1,52 @@ +package com.cheeeese.oauth2.infrastructure.userinfo; + +import com.cheeeese.oauth2.domain.OAuth2UserInfo; +import lombok.RequiredArgsConstructor; + +import java.util.Map; + +@RequiredArgsConstructor +public class KakaoUserInfo implements OAuth2UserInfo { + + private final Map attributes; + + @Override + public String getProviderId() { + return String.valueOf(attributes.get("id")); + } + + @Override + public String getEmail() { + Map accountMap = (Map) attributes.get("kakao_account"); + if (accountMap == null) { + return null; + } + return (String) accountMap.get("email"); + } + + @Override + public String getName() { + Map accountMap = (Map) attributes.get("kakao_account"); + if (accountMap == null) { + return null; + } + Map profileMap = (Map) accountMap.get("profile"); + if (profileMap == null) { + return null; + } + return (String) profileMap.get("nickname"); + } + + @Override + public String getProfileImage() { + Map accountMap = (Map) attributes.get("kakao_account"); + if (accountMap == null) { + return null; + } + Map profileMap = (Map) accountMap.get("profile"); + if (profileMap == null) { + return null; + } + return (String) profileMap.get("profile_image_url"); + } +} From cfa41add540304cb3da03643266e7e99c06c28fa Mon Sep 17 00:00:00 2001 From: zyovn Date: Sun, 5 Oct 2025 16:15:14 +0900 Subject: [PATCH 021/402] =?UTF-8?q?#3=20feat:=20security=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../security/CustomUserDetailService.java | 26 ++++++ .../global/security/CustomUserDetails.java | 81 +++++++++++++++++++ .../global/security/SecurityUtils.java | 29 +++++++ 3 files changed, 136 insertions(+) create mode 100644 src/main/java/com/cheeeese/global/security/CustomUserDetailService.java create mode 100644 src/main/java/com/cheeeese/global/security/CustomUserDetails.java create mode 100644 src/main/java/com/cheeeese/global/security/SecurityUtils.java diff --git a/src/main/java/com/cheeeese/global/security/CustomUserDetailService.java b/src/main/java/com/cheeeese/global/security/CustomUserDetailService.java new file mode 100644 index 0000000..23b85f2 --- /dev/null +++ b/src/main/java/com/cheeeese/global/security/CustomUserDetailService.java @@ -0,0 +1,26 @@ +package com.cheeeese.global.security; + +import com.cheeeese.global.common.code.ErrorCode; +import com.cheeeese.global.exception.BusinessException; +import com.cheeeese.user.domain.User; +import com.cheeeese.user.infrastructure.persistence.UserRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class CustomUserDetailService implements UserDetailsService { + + private final UserRepository userRepository; + + @Override + public UserDetails loadUserByUsername(String userId) throws UsernameNotFoundException { + User user = userRepository.findById(Long.valueOf(userId)) + .orElseThrow(() -> new BusinessException(ErrorCode.USER_NOT_FOUND)); // TODO: 에러 코드 수정 + + return new CustomUserDetails(user); + } +} diff --git a/src/main/java/com/cheeeese/global/security/CustomUserDetails.java b/src/main/java/com/cheeeese/global/security/CustomUserDetails.java new file mode 100644 index 0000000..abaf7ff --- /dev/null +++ b/src/main/java/com/cheeeese/global/security/CustomUserDetails.java @@ -0,0 +1,81 @@ +package com.cheeeese.global.security; + +import com.cheeeese.user.domain.User; +import lombok.Getter; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.oauth2.core.user.OAuth2User; + +import java.util.Collection; +import java.util.Collections; +import java.util.Map; + +@Getter +public class CustomUserDetails implements UserDetails, OAuth2User { + + private final User user; + private final Map attributes; + + public CustomUserDetails(User user) { + this.user = user; + this.attributes = Collections.emptyMap(); + } + + public CustomUserDetails(User user, Map attributes) { + this.user = user; + this.attributes = attributes; + } + + public Long getId() { + return user.getId(); + } + + public String getEmail() { + return user.getEmail(); + } + + @Override + public Collection getAuthorities() { + return Collections.emptyList(); + } + + @Override + public String getPassword() { + return null; + } + + @Override + public String getUsername() { + return user.getEmail(); + } + + @Override + public boolean isAccountNonExpired() { + return true; + } + + @Override + public boolean isAccountNonLocked() { + return true; + } + + @Override + public boolean isCredentialsNonExpired() { + return true; + } + + @Override + public boolean isEnabled() { + return true; + } + + @Override + public Map getAttributes() { + return attributes; + } + + @Override + public String getName() { + return user.getName(); + } +} diff --git a/src/main/java/com/cheeeese/global/security/SecurityUtils.java b/src/main/java/com/cheeeese/global/security/SecurityUtils.java new file mode 100644 index 0000000..c541e3e --- /dev/null +++ b/src/main/java/com/cheeeese/global/security/SecurityUtils.java @@ -0,0 +1,29 @@ +package com.cheeeese.global.security; + +import com.cheeeese.global.common.code.ErrorCode; +import com.cheeeese.global.exception.BusinessException; +import com.cheeeese.user.domain.User; +import org.springframework.security.authentication.AnonymousAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Component; + +@Component +public class SecurityUtils { + + public static User getCurrentUser() { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + + if (authentication == null || + !authentication.isAuthenticated() || + authentication instanceof AnonymousAuthenticationToken + ) { + throw new BusinessException(ErrorCode.UNAUTHORIZED); + } + return ((CustomUserDetails) authentication.getPrincipal()).getUser(); + } + + public static Long getCurrentUserId() { + return getCurrentUser().getId(); + } +} From 30410547a6edde6b1e7cb72e3f949ab3bdd2b2ca Mon Sep 17 00:00:00 2001 From: zyovn Date: Sun, 5 Oct 2025 16:22:41 +0900 Subject: [PATCH 022/402] =?UTF-8?q?#3=20feat:=20jwt=20=EC=9D=B8=EC=A6=9D,?= =?UTF-8?q?=20=EC=9D=B8=EA=B0=80=20=ED=95=B8=EB=93=A4=EB=9F=AC=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../handler/JwtAccessDeniedHandler.java | 33 ++++++++++++++++++ .../handler/JwtAuthenticationEntryPoint.java | 34 +++++++++++++++++++ 2 files changed, 67 insertions(+) create mode 100644 src/main/java/com/cheeeese/global/security/handler/JwtAccessDeniedHandler.java create mode 100644 src/main/java/com/cheeeese/global/security/handler/JwtAuthenticationEntryPoint.java diff --git a/src/main/java/com/cheeeese/global/security/handler/JwtAccessDeniedHandler.java b/src/main/java/com/cheeeese/global/security/handler/JwtAccessDeniedHandler.java new file mode 100644 index 0000000..5e81950 --- /dev/null +++ b/src/main/java/com/cheeeese/global/security/handler/JwtAccessDeniedHandler.java @@ -0,0 +1,33 @@ +package com.cheeeese.global.security.handler; + +import com.cheeeese.global.common.CommonResponse; +import com.cheeeese.global.common.code.ErrorCode; +import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import org.springframework.http.MediaType; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.security.web.access.AccessDeniedHandler; +import org.springframework.stereotype.Component; + +import java.io.IOException; + +@Component +@RequiredArgsConstructor +public class JwtAccessDeniedHandler implements AccessDeniedHandler { + + private final ObjectMapper objectMapper; + + @Override + public void handle( + HttpServletRequest request, + HttpServletResponse response, + AccessDeniedException accessDeniedException + ) throws IOException { + response.setStatus(HttpServletResponse.SC_FORBIDDEN); + response.setContentType(MediaType.APPLICATION_JSON_VALUE); + response.setCharacterEncoding("UTF-8"); + objectMapper.writeValue(response.getWriter(), CommonResponse.failure(ErrorCode.FORBIDDEN)); + } +} diff --git a/src/main/java/com/cheeeese/global/security/handler/JwtAuthenticationEntryPoint.java b/src/main/java/com/cheeeese/global/security/handler/JwtAuthenticationEntryPoint.java new file mode 100644 index 0000000..af64178 --- /dev/null +++ b/src/main/java/com/cheeeese/global/security/handler/JwtAuthenticationEntryPoint.java @@ -0,0 +1,34 @@ +package com.cheeeese.global.security.handler; + +import com.cheeeese.global.common.CommonResponse; +import com.cheeeese.global.common.code.ErrorCode; +import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.web.AuthenticationEntryPoint; +import org.springframework.stereotype.Component; + +import java.io.IOException; + +@Component +@RequiredArgsConstructor +public class JwtAuthenticationEntryPoint implements AuthenticationEntryPoint { + + private final ObjectMapper objectMapper; + + @Override + public void commence( + HttpServletRequest request, + HttpServletResponse response, + AuthenticationException authException + ) throws IOException { + response.setStatus(HttpStatus.UNAUTHORIZED.value()); + response.setContentType(MediaType.APPLICATION_JSON_VALUE); + response.setCharacterEncoding("UTF-8"); + objectMapper.writeValue(response.getWriter(), CommonResponse.failure(ErrorCode.UNAUTHORIZED)); + } +} From 16f8ff87595158993e494d236230c3591b0e13ee Mon Sep 17 00:00:00 2001 From: zyovn Date: Sun, 5 Oct 2025 16:34:40 +0900 Subject: [PATCH 023/402] =?UTF-8?q?#3=20feat:=20jwtFilter=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../security/jwt/JwtAuthenticationFilter.java | 48 +++++++++++++++++++ .../global/security/jwt/JwtProvider.java | 10 ++++ 2 files changed, 58 insertions(+) create mode 100644 src/main/java/com/cheeeese/global/security/jwt/JwtAuthenticationFilter.java diff --git a/src/main/java/com/cheeeese/global/security/jwt/JwtAuthenticationFilter.java b/src/main/java/com/cheeeese/global/security/jwt/JwtAuthenticationFilter.java new file mode 100644 index 0000000..34b414d --- /dev/null +++ b/src/main/java/com/cheeeese/global/security/jwt/JwtAuthenticationFilter.java @@ -0,0 +1,48 @@ +package com.cheeeese.global.security.jwt; + +import com.cheeeese.global.security.CustomUserDetailService; +import io.jsonwebtoken.Claims; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.stereotype.Component; +import org.springframework.web.filter.OncePerRequestFilter; + +import java.io.IOException; + +@Component +@RequiredArgsConstructor +public class JwtAuthenticationFilter extends OncePerRequestFilter { + + private final JwtProvider jwtProvider; + private final CustomUserDetailService customUserDetailService; + + @Override + protected void doFilterInternal( + HttpServletRequest request, + HttpServletResponse response, + FilterChain filterChain + ) throws ServletException, IOException { + String token = jwtProvider.resolveToken(request); + + // TODO: 로그아웃 구현 후 관련 로직 추가 + + if (token != null && jwtProvider.validateToken(token)) { + Claims claims = jwtProvider.getClaims(token); + String userId = claims.getSubject(); + + UserDetails userDetails = customUserDetailService.loadUserByUsername(userId); + + UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken( + userDetails, null, userDetails.getAuthorities() + ); + SecurityContextHolder.getContext().setAuthentication(authentication); + } + filterChain.doFilter(request, response); + } +} diff --git a/src/main/java/com/cheeeese/global/security/jwt/JwtProvider.java b/src/main/java/com/cheeeese/global/security/jwt/JwtProvider.java index 8f2c2b6..100c52f 100644 --- a/src/main/java/com/cheeeese/global/security/jwt/JwtProvider.java +++ b/src/main/java/com/cheeeese/global/security/jwt/JwtProvider.java @@ -7,6 +7,7 @@ import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import io.jsonwebtoken.security.Keys; +import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; @@ -69,4 +70,13 @@ public boolean validateToken(String token) { throw new BusinessException(ErrorCode.INVALID_TOKEN); } } + + public String resolveToken(HttpServletRequest request) { + String bearerToken = request.getHeader("Authorization"); + + if (bearerToken != null && bearerToken.startsWith("Bearer ")) { + return bearerToken.substring(7); + } + return null; + } } From ea3ae9939fd1144d6832f1f15726b2d8823d0760 Mon Sep 17 00:00:00 2001 From: zyovn Date: Sun, 5 Oct 2025 18:20:03 +0900 Subject: [PATCH 024/402] =?UTF-8?q?#3=20feat:=20=EC=B9=B4=EC=B9=B4?= =?UTF-8?q?=EC=98=A4=20=EC=86=8C=EC=85=9C=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/CustomOAuth2UserService.java | 44 +++++++++++++++++++ .../infrastructure/mapper/UserMapper.java | 16 +++++++ .../persistence/UserRepository.java | 3 ++ 3 files changed, 63 insertions(+) create mode 100644 src/main/java/com/cheeeese/oauth2/application/CustomOAuth2UserService.java create mode 100644 src/main/java/com/cheeeese/user/infrastructure/mapper/UserMapper.java diff --git a/src/main/java/com/cheeeese/oauth2/application/CustomOAuth2UserService.java b/src/main/java/com/cheeeese/oauth2/application/CustomOAuth2UserService.java new file mode 100644 index 0000000..87916c2 --- /dev/null +++ b/src/main/java/com/cheeeese/oauth2/application/CustomOAuth2UserService.java @@ -0,0 +1,44 @@ +package com.cheeeese.oauth2.application; + +import com.cheeeese.global.security.CustomUserDetails; +import com.cheeeese.oauth2.infrastructure.userinfo.KakaoUserInfo; +import com.cheeeese.user.domain.User; +import com.cheeeese.user.infrastructure.mapper.UserMapper; +import com.cheeeese.user.infrastructure.persistence.UserRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.security.oauth2.client.userinfo.DefaultOAuth2UserService; +import org.springframework.security.oauth2.client.userinfo.OAuth2UserRequest; +import org.springframework.security.oauth2.core.OAuth2AuthenticationException; +import org.springframework.security.oauth2.core.user.OAuth2User; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Map; + +@Service +@RequiredArgsConstructor +public class CustomOAuth2UserService extends DefaultOAuth2UserService { + + private final UserRepository userRepository; + + @Override + @Transactional + public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException { + OAuth2User oAuth2User = super.loadUser(userRequest); + Map attributes = oAuth2User.getAttributes(); + + KakaoUserInfo userInfo = extractKakaoUserInfo(attributes); + + User user = userRepository.findByEmail(userInfo.getEmail()) + .orElseGet(() -> { + User newUser = UserMapper.toEntity(userInfo); + return userRepository.save(newUser); + }); + + return new CustomUserDetails(user, attributes); + } + + private KakaoUserInfo extractKakaoUserInfo(Map attributes) { + return new KakaoUserInfo(attributes); + } +} diff --git a/src/main/java/com/cheeeese/user/infrastructure/mapper/UserMapper.java b/src/main/java/com/cheeeese/user/infrastructure/mapper/UserMapper.java new file mode 100644 index 0000000..87e3489 --- /dev/null +++ b/src/main/java/com/cheeeese/user/infrastructure/mapper/UserMapper.java @@ -0,0 +1,16 @@ +package com.cheeeese.user.infrastructure.mapper; + +import com.cheeeese.oauth2.domain.OAuth2UserInfo; +import com.cheeeese.user.domain.User; + +public class UserMapper { + + public static User toEntity(OAuth2UserInfo oAuth2UserInfo) { + return User.builder() + .email(oAuth2UserInfo.getEmail()) + .name(oAuth2UserInfo.getName()) + .profileImage(oAuth2UserInfo.getProfileImage()) + .providerId(oAuth2UserInfo.getProviderId()) + .build(); + } +} diff --git a/src/main/java/com/cheeeese/user/infrastructure/persistence/UserRepository.java b/src/main/java/com/cheeeese/user/infrastructure/persistence/UserRepository.java index e8088d6..db9a721 100644 --- a/src/main/java/com/cheeeese/user/infrastructure/persistence/UserRepository.java +++ b/src/main/java/com/cheeeese/user/infrastructure/persistence/UserRepository.java @@ -3,5 +3,8 @@ import com.cheeeese.user.domain.User; import org.springframework.data.jpa.repository.JpaRepository; +import java.util.Optional; + public interface UserRepository extends JpaRepository { + Optional findByEmail(String email); } From 14847cdd8fef388cf8a49af21746b7041f34d8ab Mon Sep 17 00:00:00 2001 From: zyovn Date: Sun, 5 Oct 2025 18:32:49 +0900 Subject: [PATCH 025/402] =?UTF-8?q?#3=20feat:=20refreshToken=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 3 ++ .../cheeeese/oauth2/domain/RefreshToken.java | 30 +++++++++++++++++++ .../persistence/RefreshTokenRepository.java | 7 +++++ 3 files changed, 40 insertions(+) create mode 100644 src/main/java/com/cheeeese/oauth2/domain/RefreshToken.java create mode 100644 src/main/java/com/cheeeese/oauth2/infrastructure/persistence/RefreshTokenRepository.java diff --git a/build.gradle b/build.gradle index fb6c371..373b36a 100644 --- a/build.gradle +++ b/build.gradle @@ -47,6 +47,9 @@ dependencies { implementation 'io.jsonwebtoken:jjwt-api:0.11.5' implementation 'io.jsonwebtoken:jjwt-impl:0.11.5' implementation 'io.jsonwebtoken:jjwt-jackson:0.11.5' + + // redis + implementation 'org.springframework.boot:spring-boot-starter-data-redis' } tasks.named('test') { diff --git a/src/main/java/com/cheeeese/oauth2/domain/RefreshToken.java b/src/main/java/com/cheeeese/oauth2/domain/RefreshToken.java new file mode 100644 index 0000000..0b653c1 --- /dev/null +++ b/src/main/java/com/cheeeese/oauth2/domain/RefreshToken.java @@ -0,0 +1,30 @@ +package com.cheeeese.oauth2.domain; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.springframework.data.annotation.Id; +import org.springframework.data.redis.core.RedisHash; +import org.springframework.data.redis.core.TimeToLive; + +@Getter +@NoArgsConstructor +@RedisHash(value = "refreshToken") +public class RefreshToken { + + @Id + private Long userId; + + private String refreshToken; + + @TimeToLive + private Long expiration = 604800L; + + public RefreshToken(Long userId, String refreshToken) { + this.userId = userId; + this.refreshToken = refreshToken; + } + + public void updateRefreshToken(String refreshToken) { + this.refreshToken = refreshToken; + } +} diff --git a/src/main/java/com/cheeeese/oauth2/infrastructure/persistence/RefreshTokenRepository.java b/src/main/java/com/cheeeese/oauth2/infrastructure/persistence/RefreshTokenRepository.java new file mode 100644 index 0000000..36ed9dd --- /dev/null +++ b/src/main/java/com/cheeeese/oauth2/infrastructure/persistence/RefreshTokenRepository.java @@ -0,0 +1,7 @@ +package com.cheeeese.oauth2.infrastructure.persistence; + +import com.cheeeese.oauth2.domain.RefreshToken; +import org.springframework.data.repository.CrudRepository; + +public interface RefreshTokenRepository extends CrudRepository { +} From c59438de427983c0e6ab57cbd3f864999fc81194 Mon Sep 17 00:00:00 2001 From: zyovn Date: Sun, 5 Oct 2025 18:56:57 +0900 Subject: [PATCH 026/402] =?UTF-8?q?#3=20feat:=20=ED=86=A0=ED=81=B0=20?= =?UTF-8?q?=EB=B0=9C=EA=B8=89=20=EB=B0=8F=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20?= =?UTF-8?q?=EC=84=B1=EA=B3=B5=20=ED=95=B8=EB=93=A4=EB=9F=AC=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cheeeese/global/util/RedisUtil.java | 26 ++++++++ .../cheeeese/oauth2/domain/RefreshToken.java | 4 +- .../oauth2/handler/OAuth2SuccessHandler.java | 61 +++++++++++++++++++ .../infrastructure/RefreshTokenMapper.java | 14 +++++ 4 files changed, 104 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/cheeeese/global/util/RedisUtil.java create mode 100644 src/main/java/com/cheeeese/oauth2/handler/OAuth2SuccessHandler.java create mode 100644 src/main/java/com/cheeeese/oauth2/infrastructure/RefreshTokenMapper.java diff --git a/src/main/java/com/cheeeese/global/util/RedisUtil.java b/src/main/java/com/cheeeese/global/util/RedisUtil.java new file mode 100644 index 0000000..a3a78f9 --- /dev/null +++ b/src/main/java/com/cheeeese/global/util/RedisUtil.java @@ -0,0 +1,26 @@ +package com.cheeeese.global.util; + +import lombok.RequiredArgsConstructor; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; + +import java.util.concurrent.TimeUnit; + +@Component +@RequiredArgsConstructor +public class RedisUtil { + + private final RedisTemplate redisTemplate; + + public void setValue(String key, Object value, Long expiredTime) { + redisTemplate.opsForValue().set(key, value, expiredTime, TimeUnit.MILLISECONDS); + } + + public String getValue(String key) { + return (String) redisTemplate.opsForValue().get(key); + } + + public void deleteValue(String key) { + redisTemplate.delete(key); + } +} diff --git a/src/main/java/com/cheeeese/oauth2/domain/RefreshToken.java b/src/main/java/com/cheeeese/oauth2/domain/RefreshToken.java index 0b653c1..2f6a969 100644 --- a/src/main/java/com/cheeeese/oauth2/domain/RefreshToken.java +++ b/src/main/java/com/cheeeese/oauth2/domain/RefreshToken.java @@ -1,5 +1,6 @@ package com.cheeeese.oauth2.domain; +import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import org.springframework.data.annotation.Id; @@ -19,7 +20,8 @@ public class RefreshToken { @TimeToLive private Long expiration = 604800L; - public RefreshToken(Long userId, String refreshToken) { + @Builder + private RefreshToken(Long userId, String refreshToken) { this.userId = userId; this.refreshToken = refreshToken; } diff --git a/src/main/java/com/cheeeese/oauth2/handler/OAuth2SuccessHandler.java b/src/main/java/com/cheeeese/oauth2/handler/OAuth2SuccessHandler.java new file mode 100644 index 0000000..333b64e --- /dev/null +++ b/src/main/java/com/cheeeese/oauth2/handler/OAuth2SuccessHandler.java @@ -0,0 +1,61 @@ +package com.cheeeese.oauth2.handler; + +import com.cheeeese.global.security.CustomUserDetails; +import com.cheeeese.global.security.jwt.JwtProvider; +import com.cheeeese.global.util.RedisUtil; +import com.cheeeese.oauth2.infrastructure.RefreshTokenMapper; +import com.cheeeese.oauth2.infrastructure.persistence.RefreshTokenRepository; +import com.cheeeese.user.domain.User; +import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.security.core.Authentication; +import org.springframework.security.web.authentication.AuthenticationSuccessHandler; +import org.springframework.stereotype.Component; + +import java.io.IOException; +import java.util.Map; +import java.util.UUID; + +@Component +@RequiredArgsConstructor +public class OAuth2SuccessHandler implements AuthenticationSuccessHandler { + + private final JwtProvider jwtProvider; + private final RefreshTokenRepository refreshTokenRepository; + private final ObjectMapper objectMapper; + private final RedisUtil redisUtil; + + @Value("${frontend.oauth2.redirect-uri}") + private String redirectUri; + + @Override + public void onAuthenticationSuccess( + HttpServletRequest request, + HttpServletResponse response, + Authentication authentication + ) throws IOException { + CustomUserDetails customUserDetails = (CustomUserDetails) authentication.getPrincipal(); + User user = customUserDetails.getUser(); + + String accessToken = jwtProvider.createAccessToken(user.getId()); + String refreshToken = jwtProvider.createRefreshToken(user.getId()); + + refreshTokenRepository.save(RefreshTokenMapper.toRefreshToken(user, refreshToken)); + + String tempCode = UUID.randomUUID().toString(); + + redisUtil.setValue("auth:" + tempCode, + objectMapper.writeValueAsString(Map.of( + "accessToken", accessToken, + "refreshToken", refreshToken + )), + 1000 * 60L + ); + + String callbackUri = redirectUri + tempCode; + response.sendRedirect(callbackUri); + } +} diff --git a/src/main/java/com/cheeeese/oauth2/infrastructure/RefreshTokenMapper.java b/src/main/java/com/cheeeese/oauth2/infrastructure/RefreshTokenMapper.java new file mode 100644 index 0000000..8968a90 --- /dev/null +++ b/src/main/java/com/cheeeese/oauth2/infrastructure/RefreshTokenMapper.java @@ -0,0 +1,14 @@ +package com.cheeeese.oauth2.infrastructure; + +import com.cheeeese.oauth2.domain.RefreshToken; +import com.cheeeese.user.domain.User; + +public class RefreshTokenMapper { + + public static RefreshToken toRefreshToken(User user, String refreshToken) { + return RefreshToken.builder() + .userId(user.getId()) + .refreshToken(refreshToken) + .build(); + } +} From a2a62ff8a9c297d31ed7ade69113bedbc2dd38fc Mon Sep 17 00:00:00 2001 From: zyovn Date: Sun, 5 Oct 2025 19:13:37 +0900 Subject: [PATCH 027/402] =?UTF-8?q?#3=20feat:=20=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EC=9D=B8=20=EC=8B=A4=ED=8C=A8=20=ED=95=B8=EB=93=A4=EB=9F=AC=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../oauth2/handler/OAuth2FailureHandler.java | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 src/main/java/com/cheeeese/oauth2/handler/OAuth2FailureHandler.java diff --git a/src/main/java/com/cheeeese/oauth2/handler/OAuth2FailureHandler.java b/src/main/java/com/cheeeese/oauth2/handler/OAuth2FailureHandler.java new file mode 100644 index 0000000..6bfc2cc --- /dev/null +++ b/src/main/java/com/cheeeese/oauth2/handler/OAuth2FailureHandler.java @@ -0,0 +1,37 @@ +package com.cheeeese.oauth2.handler; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler; +import org.springframework.stereotype.Component; +import org.springframework.web.util.UriComponentsBuilder; + +import java.io.IOException; + +@Slf4j +@Component +@RequiredArgsConstructor +public class OAuth2FailureHandler extends SimpleUrlAuthenticationFailureHandler { + + @Value("${frontend.oauth2.failure-redirect-uri}") + private String failureRedirectUri; + + @Override + public void onAuthenticationFailure( + HttpServletRequest request, + HttpServletResponse response, + AuthenticationException exception + ) throws IOException { + log.warn("⚠️ 로그인 실패: {}", exception.getMessage()); + + String redirectUri = UriComponentsBuilder.fromUriString(failureRedirectUri) + .queryParam("error",exception.getLocalizedMessage()) + .build().toUriString(); + + getRedirectStrategy().sendRedirect(request, response, redirectUri); + } +} From 90e1b5e240fecdb3b30c3b8926c42cab99347bd2 Mon Sep 17 00:00:00 2001 From: zyovn Date: Sun, 5 Oct 2025 19:17:04 +0900 Subject: [PATCH 028/402] =?UTF-8?q?#3=20refactor:=20=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EC=9D=B8=20=EC=84=B1=EA=B3=B5=20=ED=95=B8=EB=93=A4=EB=9F=AC=20?= =?UTF-8?q?uri=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cheeeese/oauth2/handler/OAuth2FailureHandler.java | 8 ++++---- .../com/cheeeese/oauth2/handler/OAuth2SuccessHandler.java | 8 +++++++- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/cheeeese/oauth2/handler/OAuth2FailureHandler.java b/src/main/java/com/cheeeese/oauth2/handler/OAuth2FailureHandler.java index 6bfc2cc..9fcb631 100644 --- a/src/main/java/com/cheeeese/oauth2/handler/OAuth2FailureHandler.java +++ b/src/main/java/com/cheeeese/oauth2/handler/OAuth2FailureHandler.java @@ -17,8 +17,8 @@ @RequiredArgsConstructor public class OAuth2FailureHandler extends SimpleUrlAuthenticationFailureHandler { - @Value("${frontend.oauth2.failure-redirect-uri}") - private String failureRedirectUri; + @Value("${frontend.oauth2.redirect-uri}") + private String redirectUri; @Override public void onAuthenticationFailure( @@ -28,10 +28,10 @@ public void onAuthenticationFailure( ) throws IOException { log.warn("⚠️ 로그인 실패: {}", exception.getMessage()); - String redirectUri = UriComponentsBuilder.fromUriString(failureRedirectUri) + String targetUri = UriComponentsBuilder.fromUriString(redirectUri) .queryParam("error",exception.getLocalizedMessage()) .build().toUriString(); - getRedirectStrategy().sendRedirect(request, response, redirectUri); + getRedirectStrategy().sendRedirect(request, response, targetUri); } } diff --git a/src/main/java/com/cheeeese/oauth2/handler/OAuth2SuccessHandler.java b/src/main/java/com/cheeeese/oauth2/handler/OAuth2SuccessHandler.java index 333b64e..e714dff 100644 --- a/src/main/java/com/cheeeese/oauth2/handler/OAuth2SuccessHandler.java +++ b/src/main/java/com/cheeeese/oauth2/handler/OAuth2SuccessHandler.java @@ -14,6 +14,7 @@ import org.springframework.security.core.Authentication; import org.springframework.security.web.authentication.AuthenticationSuccessHandler; import org.springframework.stereotype.Component; +import org.springframework.web.util.UriComponentsBuilder; import java.io.IOException; import java.util.Map; @@ -55,7 +56,12 @@ public void onAuthenticationSuccess( 1000 * 60L ); - String callbackUri = redirectUri + tempCode; + String callbackUri = UriComponentsBuilder + .fromUriString(redirectUri) + .queryParam("code", tempCode) + .build() + .toUriString(); + response.sendRedirect(callbackUri); } } From 61e8173088912e752a2ac8759a13767c75708199 Mon Sep 17 00:00:00 2001 From: zyovn Date: Sun, 5 Oct 2025 19:21:14 +0900 Subject: [PATCH 029/402] =?UTF-8?q?#3=20feat:=20securityConfig=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../global/config/SecurityConfig.java | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 src/main/java/com/cheeeese/global/config/SecurityConfig.java diff --git a/src/main/java/com/cheeeese/global/config/SecurityConfig.java b/src/main/java/com/cheeeese/global/config/SecurityConfig.java new file mode 100644 index 0000000..a218837 --- /dev/null +++ b/src/main/java/com/cheeeese/global/config/SecurityConfig.java @@ -0,0 +1,64 @@ +package com.cheeeese.global.config; + +import com.cheeeese.global.security.handler.JwtAccessDeniedHandler; +import com.cheeeese.global.security.handler.JwtAuthenticationEntryPoint; +import com.cheeeese.global.security.jwt.JwtAuthenticationFilter; +import com.cheeeese.oauth2.application.CustomOAuth2UserService; +import com.cheeeese.oauth2.handler.OAuth2FailureHandler; +import com.cheeeese.oauth2.handler.OAuth2SuccessHandler; +import lombok.RequiredArgsConstructor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.Customizer; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; +import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.oauth2.client.web.OAuth2AuthorizationRequestRedirectFilter; +import org.springframework.security.web.SecurityFilterChain; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; + +@Configuration +@EnableWebSecurity +@RequiredArgsConstructor +public class SecurityConfig { + + private final CustomOAuth2UserService customOAuth2UserService; + private final OAuth2SuccessHandler oAuth2SuccessHandler; + private final OAuth2FailureHandler oAuth2FailureHandler; + private final JwtAuthenticationFilter jwtAuthenticationFilter; + private final JwtAuthenticationEntryPoint jwtAuthenticationEntryPoint; + private final JwtAccessDeniedHandler jwtAccessDeniedHandler; + + @Bean + public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { + http + .cors(Customizer.withDefaults()) + .csrf(AbstractHttpConfigurer::disable) + .sessionManagement((sessionManagement) -> sessionManagement + .sessionCreationPolicy(SessionCreationPolicy.STATELESS)) + .httpBasic(AbstractHttpConfigurer::disable) + .formLogin(AbstractHttpConfigurer::disable) + .authorizeHttpRequests((requests) -> requests + .requestMatchers( + "/swagger-ui/**", + "/v3/api-docs/**", + "/v1/global/health-check", + "/login/oauth2/**" + ).permitAll() + .anyRequest().authenticated()) + .exceptionHandling(exceptions -> exceptions + .authenticationEntryPoint(jwtAuthenticationEntryPoint) + .accessDeniedHandler(jwtAccessDeniedHandler) + ) + .oauth2Login(oauth2 -> oauth2 + .userInfoEndpoint(userInfo -> userInfo + .userService(customOAuth2UserService)) + .successHandler(oAuth2SuccessHandler) + .failureHandler(oAuth2FailureHandler) + ) + .addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class); + + return http.build(); + } +} From 63992291245804461b3b4b69cd4a6ec819e0b885 Mon Sep 17 00:00:00 2001 From: zyovn Date: Sun, 5 Oct 2025 19:48:08 +0900 Subject: [PATCH 030/402] =?UTF-8?q?#3=20feat:=20=EC=9E=84=EC=8B=9C=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=EB=A1=9C=20=ED=86=A0=ED=81=B0=20=EB=B0=9C?= =?UTF-8?q?=EA=B8=89=20API=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../auth/application/AuthService.java | 61 +++++++++++++++++++ .../response/TempCodeExchangeResponse.java | 13 ++++ .../auth/exception/AuthException.java | 12 ++++ .../auth/exception/code/AuthErrorCode.java | 19 ++++++ .../infrastructure/mapper/AuthMapper.java | 17 ++++++ .../auth/presentation/AuthController.java | 27 ++++++++ .../presentation/swagger/AuthSwagger.java | 26 ++++++++ .../global/common/code/SuccessCode.java | 3 + 8 files changed, 178 insertions(+) create mode 100644 src/main/java/com/cheeeese/auth/application/AuthService.java create mode 100644 src/main/java/com/cheeeese/auth/dto/response/TempCodeExchangeResponse.java create mode 100644 src/main/java/com/cheeeese/auth/exception/AuthException.java create mode 100644 src/main/java/com/cheeeese/auth/exception/code/AuthErrorCode.java create mode 100644 src/main/java/com/cheeeese/auth/infrastructure/mapper/AuthMapper.java create mode 100644 src/main/java/com/cheeeese/auth/presentation/AuthController.java create mode 100644 src/main/java/com/cheeeese/auth/presentation/swagger/AuthSwagger.java diff --git a/src/main/java/com/cheeeese/auth/application/AuthService.java b/src/main/java/com/cheeeese/auth/application/AuthService.java new file mode 100644 index 0000000..df1254b --- /dev/null +++ b/src/main/java/com/cheeeese/auth/application/AuthService.java @@ -0,0 +1,61 @@ +package com.cheeeese.auth.application; + +import com.cheeeese.auth.dto.response.TempCodeExchangeResponse; +import com.cheeeese.auth.exception.AuthException; +import com.cheeeese.auth.exception.code.AuthErrorCode; +import com.cheeeese.auth.infrastructure.mapper.AuthMapper; +import com.cheeeese.global.common.code.ErrorCode; +import com.cheeeese.global.exception.BusinessException; +import com.cheeeese.global.security.jwt.JwtProvider; +import com.cheeeese.global.util.RedisUtil; +import com.cheeeese.user.domain.User; +import com.cheeeese.user.infrastructure.persistence.UserRepository; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import io.jsonwebtoken.Claims; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Map; + +@Service +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class AuthService { + + private final JwtProvider jwtProvider; + private final UserRepository userRepository; + private final ObjectMapper objectMapper; + private final RedisUtil redisUtil; + + public TempCodeExchangeResponse exchangeTempCode(String code) { + String key = "auth:" + code; + String json = redisUtil.getValue(key); + + if (json == null) { + throw new AuthException(AuthErrorCode.INVALID_AUTH_CODE); + } + + try { + Map data = objectMapper.readValue(json, new TypeReference<>() {}); + + String accessToken = data.get("accessToken"); + String refreshToken = data.get("refreshToken"); + + Claims claims = jwtProvider.getClaims(accessToken); + String userId = claims.getSubject(); + + User user = userRepository.findById(Long.valueOf(userId)) + .orElseThrow(() -> new BusinessException(ErrorCode.USER_NOT_FOUND)); + + redisUtil.deleteValue(key); + + return AuthMapper.toResponse(accessToken, refreshToken, user); + } catch (JsonProcessingException e) { + redisUtil.deleteValue(key); + throw new AuthException(AuthErrorCode.TOKEN_PARSE_FAILED); + } + } +} diff --git a/src/main/java/com/cheeeese/auth/dto/response/TempCodeExchangeResponse.java b/src/main/java/com/cheeeese/auth/dto/response/TempCodeExchangeResponse.java new file mode 100644 index 0000000..a5dcb4f --- /dev/null +++ b/src/main/java/com/cheeeese/auth/dto/response/TempCodeExchangeResponse.java @@ -0,0 +1,13 @@ +package com.cheeeese.auth.dto.response; + +import lombok.Builder; + +@Builder +public record TempCodeExchangeResponse( + String accessToken, + String refreshToken, + Long userId, + String name, + String email +) { +} diff --git a/src/main/java/com/cheeeese/auth/exception/AuthException.java b/src/main/java/com/cheeeese/auth/exception/AuthException.java new file mode 100644 index 0000000..0590f0d --- /dev/null +++ b/src/main/java/com/cheeeese/auth/exception/AuthException.java @@ -0,0 +1,12 @@ +package com.cheeeese.auth.exception; + +import com.cheeeese.auth.exception.code.AuthErrorCode; +import com.cheeeese.global.exception.BusinessException; +import lombok.Getter; + +@Getter +public class AuthException extends BusinessException { + public AuthException(AuthErrorCode errorCode) { + super(errorCode); + } +} diff --git a/src/main/java/com/cheeeese/auth/exception/code/AuthErrorCode.java b/src/main/java/com/cheeeese/auth/exception/code/AuthErrorCode.java new file mode 100644 index 0000000..63a881a --- /dev/null +++ b/src/main/java/com/cheeeese/auth/exception/code/AuthErrorCode.java @@ -0,0 +1,19 @@ +package com.cheeeese.auth.exception.code; + +import com.cheeeese.global.common.code.BaseCode; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; + +@Getter +@RequiredArgsConstructor +public enum AuthErrorCode implements BaseCode { + + INVALID_TOKEN(HttpStatus.UNAUTHORIZED, "유효하지 않은 토큰입니다."), + TOKEN_PARSE_FAILED(HttpStatus.INTERNAL_SERVER_ERROR, "토큰 파싱에 실패했습니다."), + INVALID_AUTH_CODE(HttpStatus.BAD_REQUEST, "유효하지 않은 인증 코드 입니다."), + ; + + private final HttpStatus httpStatus; + private final String message; +} diff --git a/src/main/java/com/cheeeese/auth/infrastructure/mapper/AuthMapper.java b/src/main/java/com/cheeeese/auth/infrastructure/mapper/AuthMapper.java new file mode 100644 index 0000000..3966df7 --- /dev/null +++ b/src/main/java/com/cheeeese/auth/infrastructure/mapper/AuthMapper.java @@ -0,0 +1,17 @@ +package com.cheeeese.auth.infrastructure.mapper; + +import com.cheeeese.auth.dto.response.TempCodeExchangeResponse; +import com.cheeeese.user.domain.User; + +public class AuthMapper { + + public static TempCodeExchangeResponse toResponse(String accessToken, String refreshToken, User user) { + return TempCodeExchangeResponse.builder() + .accessToken(accessToken) + .refreshToken(refreshToken) + .userId(user.getId()) + .name(user.getName()) + .email(user.getEmail()) + .build(); + } +} diff --git a/src/main/java/com/cheeeese/auth/presentation/AuthController.java b/src/main/java/com/cheeeese/auth/presentation/AuthController.java new file mode 100644 index 0000000..1574ef5 --- /dev/null +++ b/src/main/java/com/cheeeese/auth/presentation/AuthController.java @@ -0,0 +1,27 @@ +package com.cheeeese.auth.presentation; + +import com.cheeeese.auth.application.AuthService; +import com.cheeeese.auth.dto.response.TempCodeExchangeResponse; +import com.cheeeese.auth.presentation.swagger.AuthSwagger; +import com.cheeeese.global.common.CommonResponse; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import static com.cheeeese.global.common.code.SuccessCode.EXCHANGE_TOKEN_SUCCESS; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/v1/auth") +public class AuthController implements AuthSwagger { + + private final AuthService authService; + + @Override + @GetMapping("/exchange") + public CommonResponse exchangeTempCode(@RequestParam String code) { + return CommonResponse.success(EXCHANGE_TOKEN_SUCCESS, authService.exchangeTempCode(code)); + } +} diff --git a/src/main/java/com/cheeeese/auth/presentation/swagger/AuthSwagger.java b/src/main/java/com/cheeeese/auth/presentation/swagger/AuthSwagger.java new file mode 100644 index 0000000..40c3639 --- /dev/null +++ b/src/main/java/com/cheeeese/auth/presentation/swagger/AuthSwagger.java @@ -0,0 +1,26 @@ +package com.cheeeese.auth.presentation.swagger; + +import com.cheeeese.auth.dto.response.TempCodeExchangeResponse; +import com.cheeeese.global.common.CommonResponse; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.web.bind.annotation.RequestParam; + +@Tag(name = "[사용자 인증/인가]", description = "사용자 로그아웃, 토큰 재발급 관련 API") +public interface AuthSwagger { + @Operation( + summary = "사용자 토큰 및 정보 조회 API", + description = "발급된 임시 코드를 통해 사용자의 accessToken, refreshToken 및 정보를 반환합니다." + ) + @ApiResponses(value = { + @ApiResponse( + responseCode = "200", + description = "사용자 토큰 및 정보 조회가 성공적으로 실행되었습니다." + ) + }) + CommonResponse exchangeTempCode( + @RequestParam String code + ); +} diff --git a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java index c4244ea..954b347 100644 --- a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java +++ b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java @@ -10,6 +10,9 @@ public enum SuccessCode implements BaseCode{ // health_check HEALTH_CHECK_SUCCESS(HttpStatus.OK, "Health Check Success"), + + // auth + EXCHANGE_TOKEN_SUCCESS(HttpStatus.OK, "Exchange Token Success"), ; private final HttpStatus httpStatus; From f5751f290c3eba355167cf41d4b61c1da19a0f00 Mon Sep 17 00:00:00 2001 From: zyovn Date: Sun, 5 Oct 2025 19:55:07 +0900 Subject: [PATCH 031/402] =?UTF-8?q?#3=20feat:=20currentUserProvider=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20=EB=B0=8F=20=EC=97=90=EB=9F=AC=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../auth/application/AuthService.java | 6 +++--- .../global/common/code/ErrorCode.java | 4 ---- .../global/security/CurrentUserProvider.java | 21 +++++++++++++++++++ .../security/CustomUserDetailService.java | 6 +++--- .../user/exception/UserException.java | 12 +++++++++++ .../user/exception/code/UserErrorCode.java | 17 +++++++++++++++ 6 files changed, 56 insertions(+), 10 deletions(-) create mode 100644 src/main/java/com/cheeeese/global/security/CurrentUserProvider.java create mode 100644 src/main/java/com/cheeeese/user/exception/UserException.java create mode 100644 src/main/java/com/cheeeese/user/exception/code/UserErrorCode.java diff --git a/src/main/java/com/cheeeese/auth/application/AuthService.java b/src/main/java/com/cheeeese/auth/application/AuthService.java index df1254b..2f97609 100644 --- a/src/main/java/com/cheeeese/auth/application/AuthService.java +++ b/src/main/java/com/cheeeese/auth/application/AuthService.java @@ -4,11 +4,11 @@ import com.cheeeese.auth.exception.AuthException; import com.cheeeese.auth.exception.code.AuthErrorCode; import com.cheeeese.auth.infrastructure.mapper.AuthMapper; -import com.cheeeese.global.common.code.ErrorCode; -import com.cheeeese.global.exception.BusinessException; import com.cheeeese.global.security.jwt.JwtProvider; import com.cheeeese.global.util.RedisUtil; import com.cheeeese.user.domain.User; +import com.cheeeese.user.exception.UserException; +import com.cheeeese.user.exception.code.UserErrorCode; import com.cheeeese.user.infrastructure.persistence.UserRepository; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; @@ -48,7 +48,7 @@ public TempCodeExchangeResponse exchangeTempCode(String code) { String userId = claims.getSubject(); User user = userRepository.findById(Long.valueOf(userId)) - .orElseThrow(() -> new BusinessException(ErrorCode.USER_NOT_FOUND)); + .orElseThrow(() -> new UserException(UserErrorCode.USER_NOT_FOUND)); redisUtil.deleteValue(key); diff --git a/src/main/java/com/cheeeese/global/common/code/ErrorCode.java b/src/main/java/com/cheeeese/global/common/code/ErrorCode.java index cc76825..a181663 100644 --- a/src/main/java/com/cheeeese/global/common/code/ErrorCode.java +++ b/src/main/java/com/cheeeese/global/common/code/ErrorCode.java @@ -13,10 +13,6 @@ public enum ErrorCode implements BaseCode { BAD_REQUEST(HttpStatus.BAD_REQUEST, "잘못된 요청입니다."), UNAUTHORIZED(HttpStatus.UNAUTHORIZED, "인증이 필요합니다."), FORBIDDEN(HttpStatus.FORBIDDEN, "접근 권한이 없습니다."), - - // TODO: 패키지 이동 - INVALID_TOKEN(HttpStatus.UNAUTHORIZED, "유효하지 않은 토큰입니다."), - USER_NOT_FOUND(HttpStatus.NOT_FOUND, "존재하지 않는 사용자입니다."), ; private final HttpStatus httpStatus; diff --git a/src/main/java/com/cheeeese/global/security/CurrentUserProvider.java b/src/main/java/com/cheeeese/global/security/CurrentUserProvider.java new file mode 100644 index 0000000..a03cc3f --- /dev/null +++ b/src/main/java/com/cheeeese/global/security/CurrentUserProvider.java @@ -0,0 +1,21 @@ +package com.cheeeese.global.security; + +import com.cheeeese.user.domain.User; +import com.cheeeese.user.exception.UserException; +import com.cheeeese.user.exception.code.UserErrorCode; +import com.cheeeese.user.infrastructure.persistence.UserRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class CurrentUserProvider { + + private final UserRepository userRepository; + + public User getCurrentUser() { + Long userId = SecurityUtils.getCurrentUserId(); + return userRepository.findById(userId) + .orElseThrow(() -> new UserException(UserErrorCode.USER_NOT_FOUND)); + } +} diff --git a/src/main/java/com/cheeeese/global/security/CustomUserDetailService.java b/src/main/java/com/cheeeese/global/security/CustomUserDetailService.java index 23b85f2..e0e550c 100644 --- a/src/main/java/com/cheeeese/global/security/CustomUserDetailService.java +++ b/src/main/java/com/cheeeese/global/security/CustomUserDetailService.java @@ -1,8 +1,8 @@ package com.cheeeese.global.security; -import com.cheeeese.global.common.code.ErrorCode; -import com.cheeeese.global.exception.BusinessException; import com.cheeeese.user.domain.User; +import com.cheeeese.user.exception.UserException; +import com.cheeeese.user.exception.code.UserErrorCode; import com.cheeeese.user.infrastructure.persistence.UserRepository; import lombok.RequiredArgsConstructor; import org.springframework.security.core.userdetails.UserDetails; @@ -19,7 +19,7 @@ public class CustomUserDetailService implements UserDetailsService { @Override public UserDetails loadUserByUsername(String userId) throws UsernameNotFoundException { User user = userRepository.findById(Long.valueOf(userId)) - .orElseThrow(() -> new BusinessException(ErrorCode.USER_NOT_FOUND)); // TODO: 에러 코드 수정 + .orElseThrow(() -> new UserException(UserErrorCode.USER_NOT_FOUND)); return new CustomUserDetails(user); } diff --git a/src/main/java/com/cheeeese/user/exception/UserException.java b/src/main/java/com/cheeeese/user/exception/UserException.java new file mode 100644 index 0000000..e95431d --- /dev/null +++ b/src/main/java/com/cheeeese/user/exception/UserException.java @@ -0,0 +1,12 @@ +package com.cheeeese.user.exception; + +import com.cheeeese.global.exception.BusinessException; +import com.cheeeese.user.exception.code.UserErrorCode; +import lombok.Getter; + +@Getter +public class UserException extends BusinessException { + public UserException(UserErrorCode errorCode) { + super(errorCode); + } +} diff --git a/src/main/java/com/cheeeese/user/exception/code/UserErrorCode.java b/src/main/java/com/cheeeese/user/exception/code/UserErrorCode.java new file mode 100644 index 0000000..bfcf1fc --- /dev/null +++ b/src/main/java/com/cheeeese/user/exception/code/UserErrorCode.java @@ -0,0 +1,17 @@ +package com.cheeeese.user.exception.code; + +import com.cheeeese.global.common.code.BaseCode; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; + +@Getter +@RequiredArgsConstructor +public enum UserErrorCode implements BaseCode { + + USER_NOT_FOUND(HttpStatus.NOT_FOUND, "존재하지 않는 사용자입니다."), + ; + + private final HttpStatus httpStatus; + private final String message; +} From e9afff2e4cabdec69541235a68ddf6cde60688cc Mon Sep 17 00:00:00 2001 From: zyovn Date: Sun, 5 Oct 2025 20:00:19 +0900 Subject: [PATCH 032/402] =?UTF-8?q?#3=20feat:=20redisConfig=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cheeeese/global/config/RedisConfig.java | 43 +++++++++++++++++++ .../global/security/jwt/JwtProvider.java | 2 + 2 files changed, 45 insertions(+) create mode 100644 src/main/java/com/cheeeese/global/config/RedisConfig.java diff --git a/src/main/java/com/cheeeese/global/config/RedisConfig.java b/src/main/java/com/cheeeese/global/config/RedisConfig.java new file mode 100644 index 0000000..a2023d2 --- /dev/null +++ b/src/main/java/com/cheeeese/global/config/RedisConfig.java @@ -0,0 +1,43 @@ +package com.cheeeese.global.config; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.RedisStandaloneConfiguration; +import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.repository.configuration.EnableRedisRepositories; +import org.springframework.data.redis.serializer.StringRedisSerializer; + +@Configuration +@EnableRedisRepositories +public class RedisConfig { + + @Value("${spring.data.redis.host}") + private String host; + + @Value("${spring.data.redis.port}") + private int port; + + @Value("${spring.data.redis.password}") + private String password; + + @Bean + public LettuceConnectionFactory redisConnectionFactory() { + RedisStandaloneConfiguration config = new RedisStandaloneConfiguration(host, port); + config.setPassword(password); + + return new LettuceConnectionFactory(config); + } + + @Bean + public RedisTemplate redisTemplate() { + RedisTemplate redisTemplate = new RedisTemplate<>(); + redisTemplate.setConnectionFactory(redisConnectionFactory()); + + redisTemplate.setKeySerializer(new StringRedisSerializer()); + redisTemplate.setValueSerializer(new StringRedisSerializer()); + + return redisTemplate; + } +} diff --git a/src/main/java/com/cheeeese/global/security/jwt/JwtProvider.java b/src/main/java/com/cheeeese/global/security/jwt/JwtProvider.java index 100c52f..e197369 100644 --- a/src/main/java/com/cheeeese/global/security/jwt/JwtProvider.java +++ b/src/main/java/com/cheeeese/global/security/jwt/JwtProvider.java @@ -1,5 +1,7 @@ package com.cheeeese.global.security.jwt; +import com.cheeeese.auth.exception.AuthException; +import com.cheeeese.auth.exception.code.AuthErrorCode; import com.cheeeese.global.common.code.ErrorCode; import com.cheeeese.global.exception.BusinessException; import io.jsonwebtoken.Claims; From 0ed009128a1570a12cff04e496f693bff86590c9 Mon Sep 17 00:00:00 2001 From: zyovn Date: Sun, 5 Oct 2025 20:00:40 +0900 Subject: [PATCH 033/402] =?UTF-8?q?#3=20fix:=20jwtProvider=20=EC=97=90?= =?UTF-8?q?=EB=9F=AC=20=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/cheeeese/global/security/jwt/JwtProvider.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/cheeeese/global/security/jwt/JwtProvider.java b/src/main/java/com/cheeeese/global/security/jwt/JwtProvider.java index e197369..a308912 100644 --- a/src/main/java/com/cheeeese/global/security/jwt/JwtProvider.java +++ b/src/main/java/com/cheeeese/global/security/jwt/JwtProvider.java @@ -69,7 +69,7 @@ public boolean validateToken(String token) { return true; } catch (ExpiredJwtException e) { - throw new BusinessException(ErrorCode.INVALID_TOKEN); + throw new AuthException(AuthErrorCode.INVALID_TOKEN); } } From 07bcdeca795a27abde073b79d51d96594e035e8b Mon Sep 17 00:00:00 2001 From: zyovn Date: Sun, 5 Oct 2025 20:02:15 +0900 Subject: [PATCH 034/402] =?UTF-8?q?#3=20chore:=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=EB=B3=80=EC=88=98=20=EB=B0=8F=20import?= =?UTF-8?q?=EB=AC=B8=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cheeeese/global/security/jwt/JwtProvider.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main/java/com/cheeeese/global/security/jwt/JwtProvider.java b/src/main/java/com/cheeeese/global/security/jwt/JwtProvider.java index a308912..5af2b22 100644 --- a/src/main/java/com/cheeeese/global/security/jwt/JwtProvider.java +++ b/src/main/java/com/cheeeese/global/security/jwt/JwtProvider.java @@ -2,8 +2,6 @@ import com.cheeeese.auth.exception.AuthException; import com.cheeeese.auth.exception.code.AuthErrorCode; -import com.cheeeese.global.common.code.ErrorCode; -import com.cheeeese.global.exception.BusinessException; import io.jsonwebtoken.Claims; import io.jsonwebtoken.ExpiredJwtException; import io.jsonwebtoken.Jwts; @@ -60,8 +58,6 @@ public Claims getClaims(String token) { public boolean validateToken(String token) { try { - Claims claims = getClaims(token); - Jwts.parserBuilder() .setSigningKey(Keys.hmacShaKeyFor(jwtProperties.secret().getBytes(StandardCharsets.UTF_8))) .build() From 7a96ebca5acdbd9297202683f3a7d92a826a309d Mon Sep 17 00:00:00 2001 From: zyovn Date: Sun, 5 Oct 2025 20:02:47 +0900 Subject: [PATCH 035/402] =?UTF-8?q?#3=20style:=20=EB=9D=84=EC=96=B4?= =?UTF-8?q?=EC=93=B0=EA=B8=B0=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/cheeeese/global/common/code/SuccessCode.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java index 954b347..e033351 100644 --- a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java +++ b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java @@ -6,7 +6,7 @@ @Getter @RequiredArgsConstructor -public enum SuccessCode implements BaseCode{ +public enum SuccessCode implements BaseCode { // health_check HEALTH_CHECK_SUCCESS(HttpStatus.OK, "Health Check Success"), From 3db1f068f505671289690641b3000805e745ec0e Mon Sep 17 00:00:00 2001 From: zyovn Date: Mon, 6 Oct 2025 00:45:27 +0900 Subject: [PATCH 036/402] =?UTF-8?q?#3=20feat:=20currentUser=20=EC=96=B4?= =?UTF-8?q?=EB=85=B8=ED=85=8C=EC=9D=B4=EC=85=98=20=EA=B5=AC=ED=98=84=20?= =?UTF-8?q?=EB=B0=8F=20redisRepository=20=EC=9C=84=EC=B9=98=20=EB=AA=85?= =?UTF-8?q?=EC=8B=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cheeeese/CheeeeseApplication.java | 2 + .../com/cheeeese/global/config/WebConfig.java | 21 ++++++++++ .../com/cheeeese/global/util/CurrentUser.java | 14 +++++++ .../util/resolver/CurrentUserResolver.java | 39 +++++++++++++++++++ 4 files changed, 76 insertions(+) create mode 100644 src/main/java/com/cheeeese/global/config/WebConfig.java create mode 100644 src/main/java/com/cheeeese/global/util/CurrentUser.java create mode 100644 src/main/java/com/cheeeese/global/util/resolver/CurrentUserResolver.java diff --git a/src/main/java/com/cheeeese/CheeeeseApplication.java b/src/main/java/com/cheeeese/CheeeeseApplication.java index 2ad8b7e..9617587 100644 --- a/src/main/java/com/cheeeese/CheeeeseApplication.java +++ b/src/main/java/com/cheeeese/CheeeeseApplication.java @@ -3,9 +3,11 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.data.jpa.repository.config.EnableJpaAuditing; +import org.springframework.data.redis.repository.configuration.EnableRedisRepositories; @SpringBootApplication @EnableJpaAuditing +@EnableRedisRepositories(basePackages = "com.cheeeese.oauth2.infrastructure.persistence") public class CheeeeseApplication { public static void main(String[] args) { diff --git a/src/main/java/com/cheeeese/global/config/WebConfig.java b/src/main/java/com/cheeeese/global/config/WebConfig.java new file mode 100644 index 0000000..470e658 --- /dev/null +++ b/src/main/java/com/cheeeese/global/config/WebConfig.java @@ -0,0 +1,21 @@ +package com.cheeeese.global.config; + +import com.cheeeese.global.util.resolver.CurrentUserResolver; +import lombok.RequiredArgsConstructor; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.method.support.HandlerMethodArgumentResolver; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import java.util.List; + +@Configuration +@RequiredArgsConstructor +public class WebConfig implements WebMvcConfigurer { + + private final CurrentUserResolver currentUserResolver; + + @Override + public void addArgumentResolvers(List resolvers) { + resolvers.add(currentUserResolver); + } +} diff --git a/src/main/java/com/cheeeese/global/util/CurrentUser.java b/src/main/java/com/cheeeese/global/util/CurrentUser.java new file mode 100644 index 0000000..16c9bec --- /dev/null +++ b/src/main/java/com/cheeeese/global/util/CurrentUser.java @@ -0,0 +1,14 @@ +package com.cheeeese.global.util; + +import io.swagger.v3.oas.annotations.Parameter; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target({ElementType.PARAMETER}) +@Retention(RetentionPolicy.RUNTIME) +@Parameter(hidden = true) +public @interface CurrentUser { +} diff --git a/src/main/java/com/cheeeese/global/util/resolver/CurrentUserResolver.java b/src/main/java/com/cheeeese/global/util/resolver/CurrentUserResolver.java new file mode 100644 index 0000000..0616166 --- /dev/null +++ b/src/main/java/com/cheeeese/global/util/resolver/CurrentUserResolver.java @@ -0,0 +1,39 @@ +package com.cheeeese.global.util.resolver; + +import com.cheeeese.global.security.SecurityUtils; +import com.cheeeese.global.util.CurrentUser; +import com.cheeeese.user.domain.User; +import com.cheeeese.user.exception.UserException; +import com.cheeeese.user.exception.code.UserErrorCode; +import com.cheeeese.user.infrastructure.persistence.UserRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.core.MethodParameter; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.support.WebDataBinderFactory; +import org.springframework.web.context.request.NativeWebRequest; +import org.springframework.web.method.support.HandlerMethodArgumentResolver; +import org.springframework.web.method.support.ModelAndViewContainer; + +@Component +@RequiredArgsConstructor +public class CurrentUserResolver implements HandlerMethodArgumentResolver { + + private final UserRepository userRepository; + + @Override + public boolean supportsParameter(MethodParameter parameter) { + return parameter.hasParameterAnnotation(CurrentUser.class) && parameter.getParameterType().equals(User.class); + } + + @Override + public Object resolveArgument( + MethodParameter parameter, + ModelAndViewContainer mavContainer, + NativeWebRequest webRequest, + WebDataBinderFactory binderFactory + ) { + Long userId = SecurityUtils.getCurrentUserId(); + return userRepository.findById(userId) + .orElseThrow(() -> new UserException(UserErrorCode.USER_NOT_FOUND)); + } +} From f9fe3c1a94e4fb595f515b40c10fab0a55b07a5d Mon Sep 17 00:00:00 2001 From: zyovn Date: Mon, 6 Oct 2025 01:21:05 +0900 Subject: [PATCH 037/402] =?UTF-8?q?#3=20refactor:=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=EC=97=AD=ED=95=A0=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../auth/application/AuthService.java | 33 ++++++++++--------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/cheeeese/auth/application/AuthService.java b/src/main/java/com/cheeeese/auth/application/AuthService.java index 2f97609..6bb7a65 100644 --- a/src/main/java/com/cheeeese/auth/application/AuthService.java +++ b/src/main/java/com/cheeeese/auth/application/AuthService.java @@ -31,6 +31,15 @@ public class AuthService { private final RedisUtil redisUtil; public TempCodeExchangeResponse exchangeTempCode(String code) { + Map tokens = getTokenFromTempCode(code); + User user = getUserFromToken(tokens.get("accessToken")); + + redisUtil.deleteValue("auth:" + code); + + return AuthMapper.toResponse(tokens.get("accessToken"), tokens.get("refreshToken"), user); + } + + private Map getTokenFromTempCode(String code) { String key = "auth:" + code; String json = redisUtil.getValue(key); @@ -39,23 +48,17 @@ public TempCodeExchangeResponse exchangeTempCode(String code) { } try { - Map data = objectMapper.readValue(json, new TypeReference<>() {}); - - String accessToken = data.get("accessToken"); - String refreshToken = data.get("refreshToken"); - - Claims claims = jwtProvider.getClaims(accessToken); - String userId = claims.getSubject(); - - User user = userRepository.findById(Long.valueOf(userId)) - .orElseThrow(() -> new UserException(UserErrorCode.USER_NOT_FOUND)); - - redisUtil.deleteValue(key); - - return AuthMapper.toResponse(accessToken, refreshToken, user); + return objectMapper.readValue(json, new TypeReference<>() {}); } catch (JsonProcessingException e) { - redisUtil.deleteValue(key); throw new AuthException(AuthErrorCode.TOKEN_PARSE_FAILED); } } + + private User getUserFromToken(String accessToken) { + Claims claims = jwtProvider.getClaims(accessToken); + String userId = claims.getSubject(); + + return userRepository.findById(Long.valueOf(userId)) + .orElseThrow(() -> new UserException(UserErrorCode.USER_NOT_FOUND)); + } } From 7ae2891d640a151e9dcef3da8c972b94ef358788 Mon Sep 17 00:00:00 2001 From: zyovn Date: Mon, 6 Oct 2025 01:21:33 +0900 Subject: [PATCH 038/402] =?UTF-8?q?#3=20chore:=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20import=EB=AC=B8=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/cheeeese/global/config/SecurityConfig.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/cheeeese/global/config/SecurityConfig.java b/src/main/java/com/cheeeese/global/config/SecurityConfig.java index a218837..1ed3da9 100644 --- a/src/main/java/com/cheeeese/global/config/SecurityConfig.java +++ b/src/main/java/com/cheeeese/global/config/SecurityConfig.java @@ -14,7 +14,6 @@ import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; import org.springframework.security.config.http.SessionCreationPolicy; -import org.springframework.security.oauth2.client.web.OAuth2AuthorizationRequestRedirectFilter; import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; From a14e090de2abcff866283f9cae0dcba443066606 Mon Sep 17 00:00:00 2001 From: zyovn Date: Mon, 6 Oct 2025 01:22:04 +0900 Subject: [PATCH 039/402] =?UTF-8?q?#3=20feat:=20accessExp,=20refreshExp=20?= =?UTF-8?q?Long=20=ED=83=80=EC=9E=85=EC=9C=BC=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cheeeese/global/security/jwt/JwtProperties.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/cheeeese/global/security/jwt/JwtProperties.java b/src/main/java/com/cheeeese/global/security/jwt/JwtProperties.java index 12fd728..63be647 100644 --- a/src/main/java/com/cheeeese/global/security/jwt/JwtProperties.java +++ b/src/main/java/com/cheeeese/global/security/jwt/JwtProperties.java @@ -5,7 +5,7 @@ @ConfigurationProperties(prefix = "jwt") public record JwtProperties( String secret, - String accessExp, - String refreshExp + Long accessExp, + Long refreshExp ) { } From 054f432e27637436cdf18b0124a9028e1a019157 Mon Sep 17 00:00:00 2001 From: zyovn Date: Mon, 6 Oct 2025 01:24:52 +0900 Subject: [PATCH 040/402] =?UTF-8?q?#3=20feat:=20=ED=86=A0=ED=81=B0=20?= =?UTF-8?q?=EA=B5=90=ED=99=98=20API=20securityConfig=EC=97=90=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/cheeeese/global/config/SecurityConfig.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/cheeeese/global/config/SecurityConfig.java b/src/main/java/com/cheeeese/global/config/SecurityConfig.java index 1ed3da9..e3a45b8 100644 --- a/src/main/java/com/cheeeese/global/config/SecurityConfig.java +++ b/src/main/java/com/cheeeese/global/config/SecurityConfig.java @@ -43,7 +43,8 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti "/swagger-ui/**", "/v3/api-docs/**", "/v1/global/health-check", - "/login/oauth2/**" + "/login/oauth2/**", + "/v1/auth/exchange" ).permitAll() .anyRequest().authenticated()) .exceptionHandling(exceptions -> exceptions From 1f442fb8d26eba4053ac1290f3e63b56b1f4ffa8 Mon Sep 17 00:00:00 2001 From: zyovn Date: Mon, 6 Oct 2025 01:41:57 +0900 Subject: [PATCH 041/402] =?UTF-8?q?#3=20feat:=20user=20=EC=BB=AC=EB=9F=BC?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cheeeese/user/domain/User.java | 37 ++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/cheeeese/user/domain/User.java b/src/main/java/com/cheeeese/user/domain/User.java index a0da622..eac2ef2 100644 --- a/src/main/java/com/cheeeese/user/domain/User.java +++ b/src/main/java/com/cheeeese/user/domain/User.java @@ -29,16 +29,51 @@ public class User extends BaseEntity { @Column(name = "provider_id", nullable = false) private String providerId; + @Column(name = "is_service_agreement") + private Boolean isServiceAgreement; + + @Column(name = "is_user_info_agreement") + private Boolean isUserInfoAgreement; + + @Column(name = "is_marketing_agreement") + private Boolean isMarketingAgreement; + + @Column(name = "is_third_party_agreement") + private Boolean isThirdPartyAgreement; + + @Column(name = "album_cnt") + private int albumCnt; + + @Column(name = "photo_cnt") + private int photoCnt; + + @Column(name = "likes_cnt") + private int likesCnt; + @Builder private User( String name, String email, String profileImage, - String providerId + String providerId, + Boolean isServiceAgreement, + Boolean isUserInfoAgreement, + Boolean isMarketingAgreement, + Boolean isThirdPartyAgreement, + int albumCnt, + int photoCnt, + int likesCnt ) { this.name = name; this.email = email; this.profileImage = profileImage; this.providerId = providerId; + this.isServiceAgreement = isServiceAgreement; + this.isUserInfoAgreement = isUserInfoAgreement; + this.isMarketingAgreement = isMarketingAgreement; + this.isThirdPartyAgreement = isThirdPartyAgreement; + this.albumCnt = albumCnt; + this.photoCnt = photoCnt; + this.likesCnt = likesCnt; } } From 745f9628a0485f47031067e6f78a533af21fe61f Mon Sep 17 00:00:00 2001 From: zyovn Date: Mon, 6 Oct 2025 16:08:23 +0900 Subject: [PATCH 042/402] =?UTF-8?q?#3=20fix:=20=ED=94=BC=EB=93=9C=EB=B0=B1?= =?UTF-8?q?=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../auth/exception/code/AuthErrorCode.java | 1 + .../global/security/SecurityUtils.java | 7 +++- .../global/security/jwt/JwtProvider.java | 20 +++++---- .../application/CustomOAuth2UserService.java | 2 +- .../oauth2/domain/OAuth2UserInfo.java | 2 +- .../oauth2/handler/OAuth2SuccessHandler.java | 2 +- .../{ => mapper}/RefreshTokenMapper.java | 2 +- .../userinfo/KakaoUserInfo.java | 41 +++++++++---------- .../java/com/cheeeese/user/domain/User.java | 2 +- .../persistence/UserRepository.java | 2 +- 10 files changed, 45 insertions(+), 36 deletions(-) rename src/main/java/com/cheeeese/oauth2/infrastructure/{ => mapper}/RefreshTokenMapper.java (87%) diff --git a/src/main/java/com/cheeeese/auth/exception/code/AuthErrorCode.java b/src/main/java/com/cheeeese/auth/exception/code/AuthErrorCode.java index 63a881a..65efd09 100644 --- a/src/main/java/com/cheeeese/auth/exception/code/AuthErrorCode.java +++ b/src/main/java/com/cheeeese/auth/exception/code/AuthErrorCode.java @@ -12,6 +12,7 @@ public enum AuthErrorCode implements BaseCode { INVALID_TOKEN(HttpStatus.UNAUTHORIZED, "유효하지 않은 토큰입니다."), TOKEN_PARSE_FAILED(HttpStatus.INTERNAL_SERVER_ERROR, "토큰 파싱에 실패했습니다."), INVALID_AUTH_CODE(HttpStatus.BAD_REQUEST, "유효하지 않은 인증 코드 입니다."), + EXPIRED_TOKEN(HttpStatus.UNAUTHORIZED, "만료된 토큰입니다."), ; private final HttpStatus httpStatus; diff --git a/src/main/java/com/cheeeese/global/security/SecurityUtils.java b/src/main/java/com/cheeeese/global/security/SecurityUtils.java index c541e3e..3805805 100644 --- a/src/main/java/com/cheeeese/global/security/SecurityUtils.java +++ b/src/main/java/com/cheeeese/global/security/SecurityUtils.java @@ -20,7 +20,12 @@ public static User getCurrentUser() { ) { throw new BusinessException(ErrorCode.UNAUTHORIZED); } - return ((CustomUserDetails) authentication.getPrincipal()).getUser(); + Object principal = authentication.getPrincipal(); + + if (!(principal instanceof CustomUserDetails customUserDetails)) { + throw new BusinessException(ErrorCode.UNAUTHORIZED); + } + return customUserDetails.getUser(); } public static Long getCurrentUserId() { diff --git a/src/main/java/com/cheeeese/global/security/jwt/JwtProvider.java b/src/main/java/com/cheeeese/global/security/jwt/JwtProvider.java index 5af2b22..fce5fba 100644 --- a/src/main/java/com/cheeeese/global/security/jwt/JwtProvider.java +++ b/src/main/java/com/cheeeese/global/security/jwt/JwtProvider.java @@ -2,15 +2,13 @@ import com.cheeeese.auth.exception.AuthException; import com.cheeeese.auth.exception.code.AuthErrorCode; -import io.jsonwebtoken.Claims; -import io.jsonwebtoken.ExpiredJwtException; -import io.jsonwebtoken.Jwts; -import io.jsonwebtoken.SignatureAlgorithm; +import io.jsonwebtoken.*; import io.jsonwebtoken.security.Keys; import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; +import javax.crypto.SecretKey; import java.nio.charset.StandardCharsets; import java.util.Date; @@ -28,7 +26,7 @@ public String createAccessToken(Long userId) { .setSubject(userId.toString()) .setIssuedAt(now) .setExpiration(expiration) - .signWith(Keys.hmacShaKeyFor(jwtProperties.secret().getBytes(StandardCharsets.UTF_8)), SignatureAlgorithm.HS256) + .signWith(getSigningKey(), SignatureAlgorithm.HS256) .compact(); } @@ -40,14 +38,14 @@ public String createRefreshToken(Long userId) { .setSubject(userId.toString()) .setIssuedAt(now) .setExpiration(expiration) - .signWith(Keys.hmacShaKeyFor(jwtProperties.secret().getBytes(StandardCharsets.UTF_8)), SignatureAlgorithm.HS256) + .signWith(getSigningKey(), SignatureAlgorithm.HS256) .compact(); } public Claims getClaims(String token) { try { return Jwts.parserBuilder() - .setSigningKey(Keys.hmacShaKeyFor(jwtProperties.secret().getBytes())) + .setSigningKey(getSigningKey()) .build() .parseClaimsJws(token) .getBody(); @@ -59,12 +57,14 @@ public Claims getClaims(String token) { public boolean validateToken(String token) { try { Jwts.parserBuilder() - .setSigningKey(Keys.hmacShaKeyFor(jwtProperties.secret().getBytes(StandardCharsets.UTF_8))) + .setSigningKey(getSigningKey()) .build() .parseClaimsJws(token); return true; } catch (ExpiredJwtException e) { + throw new AuthException(AuthErrorCode.EXPIRED_TOKEN); + } catch (MalformedJwtException | UnsupportedJwtException e) { throw new AuthException(AuthErrorCode.INVALID_TOKEN); } } @@ -77,4 +77,8 @@ public String resolveToken(HttpServletRequest request) { } return null; } + + private SecretKey getSigningKey() { + return Keys.hmacShaKeyFor(jwtProperties.secret().getBytes(StandardCharsets.UTF_8)); + } } diff --git a/src/main/java/com/cheeeese/oauth2/application/CustomOAuth2UserService.java b/src/main/java/com/cheeeese/oauth2/application/CustomOAuth2UserService.java index 87916c2..0e92b20 100644 --- a/src/main/java/com/cheeeese/oauth2/application/CustomOAuth2UserService.java +++ b/src/main/java/com/cheeeese/oauth2/application/CustomOAuth2UserService.java @@ -29,7 +29,7 @@ public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2Authentic KakaoUserInfo userInfo = extractKakaoUserInfo(attributes); - User user = userRepository.findByEmail(userInfo.getEmail()) + User user = userRepository.findByProviderId(userInfo.getProviderId()) .orElseGet(() -> { User newUser = UserMapper.toEntity(userInfo); return userRepository.save(newUser); diff --git a/src/main/java/com/cheeeese/oauth2/domain/OAuth2UserInfo.java b/src/main/java/com/cheeeese/oauth2/domain/OAuth2UserInfo.java index 1852d7b..e03650c 100644 --- a/src/main/java/com/cheeeese/oauth2/domain/OAuth2UserInfo.java +++ b/src/main/java/com/cheeeese/oauth2/domain/OAuth2UserInfo.java @@ -3,6 +3,6 @@ public interface OAuth2UserInfo { String getProviderId(); String getEmail(); - String getName (); + String getName(); String getProfileImage(); } diff --git a/src/main/java/com/cheeeese/oauth2/handler/OAuth2SuccessHandler.java b/src/main/java/com/cheeeese/oauth2/handler/OAuth2SuccessHandler.java index e714dff..f79cef4 100644 --- a/src/main/java/com/cheeeese/oauth2/handler/OAuth2SuccessHandler.java +++ b/src/main/java/com/cheeeese/oauth2/handler/OAuth2SuccessHandler.java @@ -3,7 +3,7 @@ import com.cheeeese.global.security.CustomUserDetails; import com.cheeeese.global.security.jwt.JwtProvider; import com.cheeeese.global.util.RedisUtil; -import com.cheeeese.oauth2.infrastructure.RefreshTokenMapper; +import com.cheeeese.oauth2.infrastructure.mapper.RefreshTokenMapper; import com.cheeeese.oauth2.infrastructure.persistence.RefreshTokenRepository; import com.cheeeese.user.domain.User; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/src/main/java/com/cheeeese/oauth2/infrastructure/RefreshTokenMapper.java b/src/main/java/com/cheeeese/oauth2/infrastructure/mapper/RefreshTokenMapper.java similarity index 87% rename from src/main/java/com/cheeeese/oauth2/infrastructure/RefreshTokenMapper.java rename to src/main/java/com/cheeeese/oauth2/infrastructure/mapper/RefreshTokenMapper.java index 8968a90..a522043 100644 --- a/src/main/java/com/cheeeese/oauth2/infrastructure/RefreshTokenMapper.java +++ b/src/main/java/com/cheeeese/oauth2/infrastructure/mapper/RefreshTokenMapper.java @@ -1,4 +1,4 @@ -package com.cheeeese.oauth2.infrastructure; +package com.cheeeese.oauth2.infrastructure.mapper; import com.cheeeese.oauth2.domain.RefreshToken; import com.cheeeese.user.domain.User; diff --git a/src/main/java/com/cheeeese/oauth2/infrastructure/userinfo/KakaoUserInfo.java b/src/main/java/com/cheeeese/oauth2/infrastructure/userinfo/KakaoUserInfo.java index f34ae6a..c5345b0 100644 --- a/src/main/java/com/cheeeese/oauth2/infrastructure/userinfo/KakaoUserInfo.java +++ b/src/main/java/com/cheeeese/oauth2/infrastructure/userinfo/KakaoUserInfo.java @@ -3,6 +3,7 @@ import com.cheeeese.oauth2.domain.OAuth2UserInfo; import lombok.RequiredArgsConstructor; +import java.util.Collections; import java.util.Map; @RequiredArgsConstructor @@ -17,36 +18,34 @@ public String getProviderId() { @Override public String getEmail() { - Map accountMap = (Map) attributes.get("kakao_account"); - if (accountMap == null) { - return null; - } - return (String) accountMap.get("email"); + return (String) getKakaoAccount().get("email"); } @Override public String getName() { - Map accountMap = (Map) attributes.get("kakao_account"); - if (accountMap == null) { - return null; - } - Map profileMap = (Map) accountMap.get("profile"); - if (profileMap == null) { - return null; - } - return (String) profileMap.get("nickname"); + return (String) getKakaoProfile().get("nickname"); } @Override public String getProfileImage() { - Map accountMap = (Map) attributes.get("kakao_account"); - if (accountMap == null) { - return null; + return (String) getKakaoProfile().get("profile_image_url"); + } + + @SuppressWarnings("unchecked") + private Map getKakaoAccount() { + Object account = attributes.get("kakao_account"); + if (account instanceof Map) { + return (Map) account; } - Map profileMap = (Map) accountMap.get("profile"); - if (profileMap == null) { - return null; + return Collections.emptyMap(); + } + + @SuppressWarnings("unchecked") + private Map getKakaoProfile() { + Object profile = attributes.get("profile"); + if (profile instanceof Map) { + return (Map) profile; } - return (String) profileMap.get("profile_image_url"); + return Collections.emptyMap(); } } diff --git a/src/main/java/com/cheeeese/user/domain/User.java b/src/main/java/com/cheeeese/user/domain/User.java index eac2ef2..a6d8b05 100644 --- a/src/main/java/com/cheeeese/user/domain/User.java +++ b/src/main/java/com/cheeeese/user/domain/User.java @@ -20,7 +20,7 @@ public class User extends BaseEntity { @Column(name = "name", nullable = false) private String name; - @Column(name = "email", nullable = false) + @Column(name = "email", nullable = false, unique = true) private String email; @Column(name = "profile_image") diff --git a/src/main/java/com/cheeeese/user/infrastructure/persistence/UserRepository.java b/src/main/java/com/cheeeese/user/infrastructure/persistence/UserRepository.java index db9a721..7b208b3 100644 --- a/src/main/java/com/cheeeese/user/infrastructure/persistence/UserRepository.java +++ b/src/main/java/com/cheeeese/user/infrastructure/persistence/UserRepository.java @@ -6,5 +6,5 @@ import java.util.Optional; public interface UserRepository extends JpaRepository { - Optional findByEmail(String email); + Optional findByProviderId(String providerId); } From b6a8af8e7dbd8ff2ded41642f71cc3e7a5a44e1c Mon Sep 17 00:00:00 2001 From: zyovn Date: Mon, 6 Oct 2025 23:17:04 +0900 Subject: [PATCH 043/402] =?UTF-8?q?#6=20feat:=20refreshToken=20=EC=9E=AC?= =?UTF-8?q?=EB=B0=9C=EA=B8=89=20api=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../auth/application/AuthService.java | 23 +++++++++++++++++++ .../auth/dto/request/AuthReissueRequest.java | 11 +++++++++ .../dto/response/AuthReissueResponse.java | 12 ++++++++++ .../auth/exception/code/AuthErrorCode.java | 1 + .../infrastructure/mapper/AuthMapper.java | 8 +++++++ .../auth/presentation/AuthController.java | 14 +++++++---- .../global/common/code/SuccessCode.java | 1 + .../persistence/RefreshTokenRepository.java | 3 +++ 8 files changed, 69 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/cheeeese/auth/dto/request/AuthReissueRequest.java create mode 100644 src/main/java/com/cheeeese/auth/dto/response/AuthReissueResponse.java diff --git a/src/main/java/com/cheeeese/auth/application/AuthService.java b/src/main/java/com/cheeeese/auth/application/AuthService.java index 6bb7a65..ec5d735 100644 --- a/src/main/java/com/cheeeese/auth/application/AuthService.java +++ b/src/main/java/com/cheeeese/auth/application/AuthService.java @@ -1,11 +1,15 @@ package com.cheeeese.auth.application; +import com.cheeeese.auth.dto.request.AuthReissueRequest; +import com.cheeeese.auth.dto.response.AuthReissueResponse; import com.cheeeese.auth.dto.response.TempCodeExchangeResponse; import com.cheeeese.auth.exception.AuthException; import com.cheeeese.auth.exception.code.AuthErrorCode; import com.cheeeese.auth.infrastructure.mapper.AuthMapper; import com.cheeeese.global.security.jwt.JwtProvider; import com.cheeeese.global.util.RedisUtil; +import com.cheeeese.oauth2.domain.RefreshToken; +import com.cheeeese.oauth2.infrastructure.persistence.RefreshTokenRepository; import com.cheeeese.user.domain.User; import com.cheeeese.user.exception.UserException; import com.cheeeese.user.exception.code.UserErrorCode; @@ -27,6 +31,7 @@ public class AuthService { private final JwtProvider jwtProvider; private final UserRepository userRepository; + private final RefreshTokenRepository refreshTokenRepository; private final ObjectMapper objectMapper; private final RedisUtil redisUtil; @@ -39,6 +44,24 @@ public TempCodeExchangeResponse exchangeTempCode(String code) { return AuthMapper.toResponse(tokens.get("accessToken"), tokens.get("refreshToken"), user); } + @Transactional + public AuthReissueResponse reissueToken(AuthReissueRequest request) { + jwtProvider.validateToken(request.refreshToken()); + + User user = getUserFromToken(request.refreshToken()); + + RefreshToken savedToken = refreshTokenRepository.findByUserId(user.getId()) + .orElseThrow(() -> new AuthException(AuthErrorCode.REFRESH_TOKEN_NOT_FOUND)); + + String newAccessToken = jwtProvider.createAccessToken(user.getId()); + String newRefreshToken = jwtProvider.createRefreshToken(user.getId()); + + savedToken.updateRefreshToken(newRefreshToken); + refreshTokenRepository.save(savedToken); + + return AuthMapper.toResponse(newAccessToken, newRefreshToken); + } + private Map getTokenFromTempCode(String code) { String key = "auth:" + code; String json = redisUtil.getValue(key); diff --git a/src/main/java/com/cheeeese/auth/dto/request/AuthReissueRequest.java b/src/main/java/com/cheeeese/auth/dto/request/AuthReissueRequest.java new file mode 100644 index 0000000..fc7d63b --- /dev/null +++ b/src/main/java/com/cheeeese/auth/dto/request/AuthReissueRequest.java @@ -0,0 +1,11 @@ +package com.cheeeese.auth.dto.request; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Builder; + +@Builder +@Schema(description = "token 재발급") +public record AuthReissueRequest( + String refreshToken +) { +} diff --git a/src/main/java/com/cheeeese/auth/dto/response/AuthReissueResponse.java b/src/main/java/com/cheeeese/auth/dto/response/AuthReissueResponse.java new file mode 100644 index 0000000..7c432ac --- /dev/null +++ b/src/main/java/com/cheeeese/auth/dto/response/AuthReissueResponse.java @@ -0,0 +1,12 @@ +package com.cheeeese.auth.dto.response; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Builder; + +@Builder +@Schema(description = "token 재발급") +public record AuthReissueResponse( + String accessToken, + String refreshToken +) { +} diff --git a/src/main/java/com/cheeeese/auth/exception/code/AuthErrorCode.java b/src/main/java/com/cheeeese/auth/exception/code/AuthErrorCode.java index 65efd09..9df9a15 100644 --- a/src/main/java/com/cheeeese/auth/exception/code/AuthErrorCode.java +++ b/src/main/java/com/cheeeese/auth/exception/code/AuthErrorCode.java @@ -13,6 +13,7 @@ public enum AuthErrorCode implements BaseCode { TOKEN_PARSE_FAILED(HttpStatus.INTERNAL_SERVER_ERROR, "토큰 파싱에 실패했습니다."), INVALID_AUTH_CODE(HttpStatus.BAD_REQUEST, "유효하지 않은 인증 코드 입니다."), EXPIRED_TOKEN(HttpStatus.UNAUTHORIZED, "만료된 토큰입니다."), + REFRESH_TOKEN_NOT_FOUND(HttpStatus.NOT_FOUND, "리프레시 토큰을 찾을 수 없습니다."), ; private final HttpStatus httpStatus; diff --git a/src/main/java/com/cheeeese/auth/infrastructure/mapper/AuthMapper.java b/src/main/java/com/cheeeese/auth/infrastructure/mapper/AuthMapper.java index 3966df7..2505823 100644 --- a/src/main/java/com/cheeeese/auth/infrastructure/mapper/AuthMapper.java +++ b/src/main/java/com/cheeeese/auth/infrastructure/mapper/AuthMapper.java @@ -1,5 +1,6 @@ package com.cheeeese.auth.infrastructure.mapper; +import com.cheeeese.auth.dto.response.AuthReissueResponse; import com.cheeeese.auth.dto.response.TempCodeExchangeResponse; import com.cheeeese.user.domain.User; @@ -14,4 +15,11 @@ public static TempCodeExchangeResponse toResponse(String accessToken, String ref .email(user.getEmail()) .build(); } + + public static AuthReissueResponse toResponse(String accessToken, String refreshToken) { + return AuthReissueResponse.builder() + .accessToken(accessToken) + .refreshToken(refreshToken) + .build(); + } } diff --git a/src/main/java/com/cheeeese/auth/presentation/AuthController.java b/src/main/java/com/cheeeese/auth/presentation/AuthController.java index 1574ef5..e19d7ef 100644 --- a/src/main/java/com/cheeeese/auth/presentation/AuthController.java +++ b/src/main/java/com/cheeeese/auth/presentation/AuthController.java @@ -1,16 +1,17 @@ package com.cheeeese.auth.presentation; import com.cheeeese.auth.application.AuthService; +import com.cheeeese.auth.dto.request.AuthReissueRequest; +import com.cheeeese.auth.dto.response.AuthReissueResponse; import com.cheeeese.auth.dto.response.TempCodeExchangeResponse; import com.cheeeese.auth.presentation.swagger.AuthSwagger; import com.cheeeese.global.common.CommonResponse; +import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import static com.cheeeese.global.common.code.SuccessCode.EXCHANGE_TOKEN_SUCCESS; +import static com.cheeeese.global.common.code.SuccessCode.REISSUE_TOKEN_SUCCESS; @RestController @RequiredArgsConstructor @@ -24,4 +25,9 @@ public class AuthController implements AuthSwagger { public CommonResponse exchangeTempCode(@RequestParam String code) { return CommonResponse.success(EXCHANGE_TOKEN_SUCCESS, authService.exchangeTempCode(code)); } + + @PostMapping("/reissue") + public CommonResponse reissueToken(@RequestBody @Valid AuthReissueRequest request) { + return CommonResponse.success(REISSUE_TOKEN_SUCCESS, authService.reissueToken(request)); + } } diff --git a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java index e033351..0726d81 100644 --- a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java +++ b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java @@ -13,6 +13,7 @@ public enum SuccessCode implements BaseCode { // auth EXCHANGE_TOKEN_SUCCESS(HttpStatus.OK, "Exchange Token Success"), + REISSUE_TOKEN_SUCCESS(HttpStatus.OK, "Reissue Token Success"), ; private final HttpStatus httpStatus; diff --git a/src/main/java/com/cheeeese/oauth2/infrastructure/persistence/RefreshTokenRepository.java b/src/main/java/com/cheeeese/oauth2/infrastructure/persistence/RefreshTokenRepository.java index 36ed9dd..1d7b725 100644 --- a/src/main/java/com/cheeeese/oauth2/infrastructure/persistence/RefreshTokenRepository.java +++ b/src/main/java/com/cheeeese/oauth2/infrastructure/persistence/RefreshTokenRepository.java @@ -3,5 +3,8 @@ import com.cheeeese.oauth2.domain.RefreshToken; import org.springframework.data.repository.CrudRepository; +import java.util.Optional; + public interface RefreshTokenRepository extends CrudRepository { + Optional findByUserId(Long userId); } From 2ab8f1cd9f56b0fad1b34213fb507f278922a0ee Mon Sep 17 00:00:00 2001 From: zyovn Date: Mon, 6 Oct 2025 23:40:51 +0900 Subject: [PATCH 044/402] =?UTF-8?q?#6=20rename:=20tempCodeExchangeResponse?= =?UTF-8?q?=20->=20authExchangeResponse=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cheeeese/auth/application/AuthService.java | 4 ++-- ...pCodeExchangeResponse.java => AuthExchangeResponse.java} | 2 +- .../com/cheeeese/auth/infrastructure/mapper/AuthMapper.java | 6 +++--- .../java/com/cheeeese/auth/presentation/AuthController.java | 4 ++-- .../com/cheeeese/auth/presentation/swagger/AuthSwagger.java | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) rename src/main/java/com/cheeeese/auth/dto/response/{TempCodeExchangeResponse.java => AuthExchangeResponse.java} (83%) diff --git a/src/main/java/com/cheeeese/auth/application/AuthService.java b/src/main/java/com/cheeeese/auth/application/AuthService.java index ec5d735..20e5289 100644 --- a/src/main/java/com/cheeeese/auth/application/AuthService.java +++ b/src/main/java/com/cheeeese/auth/application/AuthService.java @@ -2,7 +2,7 @@ import com.cheeeese.auth.dto.request.AuthReissueRequest; import com.cheeeese.auth.dto.response.AuthReissueResponse; -import com.cheeeese.auth.dto.response.TempCodeExchangeResponse; +import com.cheeeese.auth.dto.response.AuthExchangeResponse; import com.cheeeese.auth.exception.AuthException; import com.cheeeese.auth.exception.code.AuthErrorCode; import com.cheeeese.auth.infrastructure.mapper.AuthMapper; @@ -35,7 +35,7 @@ public class AuthService { private final ObjectMapper objectMapper; private final RedisUtil redisUtil; - public TempCodeExchangeResponse exchangeTempCode(String code) { + public AuthExchangeResponse exchangeTempCode(String code) { Map tokens = getTokenFromTempCode(code); User user = getUserFromToken(tokens.get("accessToken")); diff --git a/src/main/java/com/cheeeese/auth/dto/response/TempCodeExchangeResponse.java b/src/main/java/com/cheeeese/auth/dto/response/AuthExchangeResponse.java similarity index 83% rename from src/main/java/com/cheeeese/auth/dto/response/TempCodeExchangeResponse.java rename to src/main/java/com/cheeeese/auth/dto/response/AuthExchangeResponse.java index a5dcb4f..6b0e550 100644 --- a/src/main/java/com/cheeeese/auth/dto/response/TempCodeExchangeResponse.java +++ b/src/main/java/com/cheeeese/auth/dto/response/AuthExchangeResponse.java @@ -3,7 +3,7 @@ import lombok.Builder; @Builder -public record TempCodeExchangeResponse( +public record AuthExchangeResponse( String accessToken, String refreshToken, Long userId, diff --git a/src/main/java/com/cheeeese/auth/infrastructure/mapper/AuthMapper.java b/src/main/java/com/cheeeese/auth/infrastructure/mapper/AuthMapper.java index 2505823..d4d0f38 100644 --- a/src/main/java/com/cheeeese/auth/infrastructure/mapper/AuthMapper.java +++ b/src/main/java/com/cheeeese/auth/infrastructure/mapper/AuthMapper.java @@ -1,13 +1,13 @@ package com.cheeeese.auth.infrastructure.mapper; import com.cheeeese.auth.dto.response.AuthReissueResponse; -import com.cheeeese.auth.dto.response.TempCodeExchangeResponse; +import com.cheeeese.auth.dto.response.AuthExchangeResponse; import com.cheeeese.user.domain.User; public class AuthMapper { - public static TempCodeExchangeResponse toResponse(String accessToken, String refreshToken, User user) { - return TempCodeExchangeResponse.builder() + public static AuthExchangeResponse toResponse(String accessToken, String refreshToken, User user) { + return AuthExchangeResponse.builder() .accessToken(accessToken) .refreshToken(refreshToken) .userId(user.getId()) diff --git a/src/main/java/com/cheeeese/auth/presentation/AuthController.java b/src/main/java/com/cheeeese/auth/presentation/AuthController.java index e19d7ef..0f7b5d4 100644 --- a/src/main/java/com/cheeeese/auth/presentation/AuthController.java +++ b/src/main/java/com/cheeeese/auth/presentation/AuthController.java @@ -3,7 +3,7 @@ import com.cheeeese.auth.application.AuthService; import com.cheeeese.auth.dto.request.AuthReissueRequest; import com.cheeeese.auth.dto.response.AuthReissueResponse; -import com.cheeeese.auth.dto.response.TempCodeExchangeResponse; +import com.cheeeese.auth.dto.response.AuthExchangeResponse; import com.cheeeese.auth.presentation.swagger.AuthSwagger; import com.cheeeese.global.common.CommonResponse; import jakarta.validation.Valid; @@ -22,7 +22,7 @@ public class AuthController implements AuthSwagger { @Override @GetMapping("/exchange") - public CommonResponse exchangeTempCode(@RequestParam String code) { + public CommonResponse exchangeTempCode(@RequestParam String code) { return CommonResponse.success(EXCHANGE_TOKEN_SUCCESS, authService.exchangeTempCode(code)); } diff --git a/src/main/java/com/cheeeese/auth/presentation/swagger/AuthSwagger.java b/src/main/java/com/cheeeese/auth/presentation/swagger/AuthSwagger.java index 40c3639..ef6c9c4 100644 --- a/src/main/java/com/cheeeese/auth/presentation/swagger/AuthSwagger.java +++ b/src/main/java/com/cheeeese/auth/presentation/swagger/AuthSwagger.java @@ -1,6 +1,6 @@ package com.cheeeese.auth.presentation.swagger; -import com.cheeeese.auth.dto.response.TempCodeExchangeResponse; +import com.cheeeese.auth.dto.response.AuthExchangeResponse; import com.cheeeese.global.common.CommonResponse; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.responses.ApiResponse; @@ -20,7 +20,7 @@ public interface AuthSwagger { description = "사용자 토큰 및 정보 조회가 성공적으로 실행되었습니다." ) }) - CommonResponse exchangeTempCode( + CommonResponse exchangeTempCode( @RequestParam String code ); } From c3f7efbb8aa9af155703f73aa147562ce486c8bc Mon Sep 17 00:00:00 2001 From: zyovn Date: Mon, 6 Oct 2025 23:42:02 +0900 Subject: [PATCH 045/402] =?UTF-8?q?#6=20rename:=20=EC=9D=B8=EC=9E=90?= =?UTF-8?q?=EB=AA=85=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/cheeeese/auth/application/AuthService.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/cheeeese/auth/application/AuthService.java b/src/main/java/com/cheeeese/auth/application/AuthService.java index 20e5289..943f6ee 100644 --- a/src/main/java/com/cheeeese/auth/application/AuthService.java +++ b/src/main/java/com/cheeeese/auth/application/AuthService.java @@ -77,8 +77,8 @@ private Map getTokenFromTempCode(String code) { } } - private User getUserFromToken(String accessToken) { - Claims claims = jwtProvider.getClaims(accessToken); + private User getUserFromToken(String token) { + Claims claims = jwtProvider.getClaims(token); String userId = claims.getSubject(); return userRepository.findById(Long.valueOf(userId)) From da95734c4649ff0bf2c6e40d9e90cc12da097e01 Mon Sep 17 00:00:00 2001 From: zyovn Date: Tue, 7 Oct 2025 02:03:09 +0900 Subject: [PATCH 046/402] =?UTF-8?q?#6=20feat:=20=EC=9E=84=EC=8B=9C=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=9D=B8=EC=A6=9D=20=EC=8B=A4=ED=8C=A8=20?= =?UTF-8?q?=EC=8B=9C=EC=97=90=EB=8F=84=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/cheeeese/auth/application/AuthService.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/cheeeese/auth/application/AuthService.java b/src/main/java/com/cheeeese/auth/application/AuthService.java index 943f6ee..38e7e59 100644 --- a/src/main/java/com/cheeeese/auth/application/AuthService.java +++ b/src/main/java/com/cheeeese/auth/application/AuthService.java @@ -73,6 +73,7 @@ private Map getTokenFromTempCode(String code) { try { return objectMapper.readValue(json, new TypeReference<>() {}); } catch (JsonProcessingException e) { + redisUtil.deleteValue(key); throw new AuthException(AuthErrorCode.TOKEN_PARSE_FAILED); } } From 2cea316f6a381e046ac2e55ab7d4df9e6d849c93 Mon Sep 17 00:00:00 2001 From: zyovn Date: Tue, 7 Oct 2025 03:15:49 +0900 Subject: [PATCH 047/402] =?UTF-8?q?#6=20feat:=20securityConfig=EC=97=90=20?= =?UTF-8?q?=ED=95=B4=EB=8B=B9=20api=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/cheeeese/global/config/SecurityConfig.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/cheeeese/global/config/SecurityConfig.java b/src/main/java/com/cheeeese/global/config/SecurityConfig.java index e3a45b8..4bdebdc 100644 --- a/src/main/java/com/cheeeese/global/config/SecurityConfig.java +++ b/src/main/java/com/cheeeese/global/config/SecurityConfig.java @@ -44,7 +44,8 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti "/v3/api-docs/**", "/v1/global/health-check", "/login/oauth2/**", - "/v1/auth/exchange" + "/v1/auth/exchange", + "/v1/auth/reissue" ).permitAll() .anyRequest().authenticated()) .exceptionHandling(exceptions -> exceptions From 096962fe4633879efc26fcf69b81012f79d5068a Mon Sep 17 00:00:00 2001 From: zyovn Date: Tue, 7 Oct 2025 04:11:07 +0900 Subject: [PATCH 048/402] =?UTF-8?q?#6=20feat:=20refreshToken=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20=EB=B0=8F=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8=20?= =?UTF-8?q?=EB=A7=8C=EB=A3=8C=20=EC=8B=9C=EA=B0=84=EC=9D=84=20jwt=20?= =?UTF-8?q?=EB=A7=8C=EB=A3=8C=20=EC=8B=9C=EA=B0=84=EA=B3=BC=20=EB=8F=99?= =?UTF-8?q?=EC=9D=BC=ED=95=98=EA=B2=8C=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cheeeese/auth/application/AuthService.java | 4 +++- .../com/cheeeese/oauth2/domain/RefreshToken.java | 12 ++++++++---- .../oauth2/handler/OAuth2SuccessHandler.java | 4 +++- .../infrastructure/mapper/RefreshTokenMapper.java | 3 ++- 4 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/cheeeese/auth/application/AuthService.java b/src/main/java/com/cheeeese/auth/application/AuthService.java index 38e7e59..842c999 100644 --- a/src/main/java/com/cheeeese/auth/application/AuthService.java +++ b/src/main/java/com/cheeeese/auth/application/AuthService.java @@ -6,6 +6,7 @@ import com.cheeeese.auth.exception.AuthException; import com.cheeeese.auth.exception.code.AuthErrorCode; import com.cheeeese.auth.infrastructure.mapper.AuthMapper; +import com.cheeeese.global.security.jwt.JwtProperties; import com.cheeeese.global.security.jwt.JwtProvider; import com.cheeeese.global.util.RedisUtil; import com.cheeeese.oauth2.domain.RefreshToken; @@ -30,6 +31,7 @@ public class AuthService { private final JwtProvider jwtProvider; + private final JwtProperties jwtProperties; private final UserRepository userRepository; private final RefreshTokenRepository refreshTokenRepository; private final ObjectMapper objectMapper; @@ -56,7 +58,7 @@ public AuthReissueResponse reissueToken(AuthReissueRequest request) { String newAccessToken = jwtProvider.createAccessToken(user.getId()); String newRefreshToken = jwtProvider.createRefreshToken(user.getId()); - savedToken.updateRefreshToken(newRefreshToken); + savedToken.updateRefreshToken(newRefreshToken, jwtProperties.refreshExp()); refreshTokenRepository.save(savedToken); return AuthMapper.toResponse(newAccessToken, newRefreshToken); diff --git a/src/main/java/com/cheeeese/oauth2/domain/RefreshToken.java b/src/main/java/com/cheeeese/oauth2/domain/RefreshToken.java index 2f6a969..ffb2530 100644 --- a/src/main/java/com/cheeeese/oauth2/domain/RefreshToken.java +++ b/src/main/java/com/cheeeese/oauth2/domain/RefreshToken.java @@ -7,6 +7,8 @@ import org.springframework.data.redis.core.RedisHash; import org.springframework.data.redis.core.TimeToLive; +import java.util.concurrent.TimeUnit; + @Getter @NoArgsConstructor @RedisHash(value = "refreshToken") @@ -17,16 +19,18 @@ public class RefreshToken { private String refreshToken; - @TimeToLive - private Long expiration = 604800L; + @TimeToLive(unit = TimeUnit.MILLISECONDS) + private Long expiration; @Builder - private RefreshToken(Long userId, String refreshToken) { + private RefreshToken(Long userId, String refreshToken, Long expiration) { this.userId = userId; this.refreshToken = refreshToken; + this.expiration = expiration; } - public void updateRefreshToken(String refreshToken) { + public void updateRefreshToken(String refreshToken, Long expiration) { this.refreshToken = refreshToken; + this.expiration = expiration; } } diff --git a/src/main/java/com/cheeeese/oauth2/handler/OAuth2SuccessHandler.java b/src/main/java/com/cheeeese/oauth2/handler/OAuth2SuccessHandler.java index f79cef4..b1d2b6e 100644 --- a/src/main/java/com/cheeeese/oauth2/handler/OAuth2SuccessHandler.java +++ b/src/main/java/com/cheeeese/oauth2/handler/OAuth2SuccessHandler.java @@ -1,6 +1,7 @@ package com.cheeeese.oauth2.handler; import com.cheeeese.global.security.CustomUserDetails; +import com.cheeeese.global.security.jwt.JwtProperties; import com.cheeeese.global.security.jwt.JwtProvider; import com.cheeeese.global.util.RedisUtil; import com.cheeeese.oauth2.infrastructure.mapper.RefreshTokenMapper; @@ -25,6 +26,7 @@ public class OAuth2SuccessHandler implements AuthenticationSuccessHandler { private final JwtProvider jwtProvider; + private final JwtProperties jwtProperties; private final RefreshTokenRepository refreshTokenRepository; private final ObjectMapper objectMapper; private final RedisUtil redisUtil; @@ -44,7 +46,7 @@ public void onAuthenticationSuccess( String accessToken = jwtProvider.createAccessToken(user.getId()); String refreshToken = jwtProvider.createRefreshToken(user.getId()); - refreshTokenRepository.save(RefreshTokenMapper.toRefreshToken(user, refreshToken)); + refreshTokenRepository.save(RefreshTokenMapper.toRefreshToken(user, refreshToken, jwtProperties.refreshExp())); String tempCode = UUID.randomUUID().toString(); diff --git a/src/main/java/com/cheeeese/oauth2/infrastructure/mapper/RefreshTokenMapper.java b/src/main/java/com/cheeeese/oauth2/infrastructure/mapper/RefreshTokenMapper.java index a522043..1f65449 100644 --- a/src/main/java/com/cheeeese/oauth2/infrastructure/mapper/RefreshTokenMapper.java +++ b/src/main/java/com/cheeeese/oauth2/infrastructure/mapper/RefreshTokenMapper.java @@ -5,10 +5,11 @@ public class RefreshTokenMapper { - public static RefreshToken toRefreshToken(User user, String refreshToken) { + public static RefreshToken toRefreshToken(User user, String refreshToken, Long expiration) { return RefreshToken.builder() .userId(user.getId()) .refreshToken(refreshToken) + .expiration(expiration) .build(); } } From 583a0cbcd97b9c9692c550ed70ab32291ce42bf1 Mon Sep 17 00:00:00 2001 From: zyovn Date: Tue, 7 Oct 2025 04:14:14 +0900 Subject: [PATCH 049/402] =?UTF-8?q?#6=20refactor:=20=EC=83=81=EC=88=98=20?= =?UTF-8?q?=EB=B0=B0=EC=97=B4=EB=A1=9C=20whiteList=20=EA=B4=80=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cheeeese/global/config/SecurityConfig.java | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/cheeeese/global/config/SecurityConfig.java b/src/main/java/com/cheeeese/global/config/SecurityConfig.java index 4bdebdc..11c12df 100644 --- a/src/main/java/com/cheeeese/global/config/SecurityConfig.java +++ b/src/main/java/com/cheeeese/global/config/SecurityConfig.java @@ -29,6 +29,15 @@ public class SecurityConfig { private final JwtAuthenticationEntryPoint jwtAuthenticationEntryPoint; private final JwtAccessDeniedHandler jwtAccessDeniedHandler; + private final String[] WHITE_LIST = { + "/swagger-ui/**", + "/v3/api-docs/**", + "/v1/global/health-check", + "/login/oauth2/**", + "/v1/auth/exchange", + "/v1/auth/reissue" + }; + @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http @@ -39,14 +48,7 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti .httpBasic(AbstractHttpConfigurer::disable) .formLogin(AbstractHttpConfigurer::disable) .authorizeHttpRequests((requests) -> requests - .requestMatchers( - "/swagger-ui/**", - "/v3/api-docs/**", - "/v1/global/health-check", - "/login/oauth2/**", - "/v1/auth/exchange", - "/v1/auth/reissue" - ).permitAll() + .requestMatchers(WHITE_LIST).permitAll() .anyRequest().authenticated()) .exceptionHandling(exceptions -> exceptions .authenticationEntryPoint(jwtAuthenticationEntryPoint) From a60362d6231ab182e174d33ce76da2ef3dc85719 Mon Sep 17 00:00:00 2001 From: zyovn Date: Tue, 7 Oct 2025 04:18:43 +0900 Subject: [PATCH 050/402] =?UTF-8?q?#6=20refactor:=20refreshToken=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20=ED=8C=A8=ED=82=A4=EC=A7=80=20auth=20?= =?UTF-8?q?=EB=8F=84=EB=A9=94=EC=9D=B8=EC=9C=BC=EB=A1=9C=20=EC=9D=B4?= =?UTF-8?q?=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/cheeeese/auth/application/AuthService.java | 4 ++-- .../com/cheeeese/{oauth2 => auth}/domain/RefreshToken.java | 2 +- .../infrastructure/mapper/RefreshTokenMapper.java | 4 ++-- .../infrastructure/persistence/RefreshTokenRepository.java | 4 ++-- .../com/cheeeese/oauth2/handler/OAuth2SuccessHandler.java | 4 ++-- 5 files changed, 9 insertions(+), 9 deletions(-) rename src/main/java/com/cheeeese/{oauth2 => auth}/domain/RefreshToken.java (96%) rename src/main/java/com/cheeeese/{oauth2 => auth}/infrastructure/mapper/RefreshTokenMapper.java (78%) rename src/main/java/com/cheeeese/{oauth2 => auth}/infrastructure/persistence/RefreshTokenRepository.java (68%) diff --git a/src/main/java/com/cheeeese/auth/application/AuthService.java b/src/main/java/com/cheeeese/auth/application/AuthService.java index 842c999..8bdce09 100644 --- a/src/main/java/com/cheeeese/auth/application/AuthService.java +++ b/src/main/java/com/cheeeese/auth/application/AuthService.java @@ -9,8 +9,8 @@ import com.cheeeese.global.security.jwt.JwtProperties; import com.cheeeese.global.security.jwt.JwtProvider; import com.cheeeese.global.util.RedisUtil; -import com.cheeeese.oauth2.domain.RefreshToken; -import com.cheeeese.oauth2.infrastructure.persistence.RefreshTokenRepository; +import com.cheeeese.auth.domain.RefreshToken; +import com.cheeeese.auth.infrastructure.persistence.RefreshTokenRepository; import com.cheeeese.user.domain.User; import com.cheeeese.user.exception.UserException; import com.cheeeese.user.exception.code.UserErrorCode; diff --git a/src/main/java/com/cheeeese/oauth2/domain/RefreshToken.java b/src/main/java/com/cheeeese/auth/domain/RefreshToken.java similarity index 96% rename from src/main/java/com/cheeeese/oauth2/domain/RefreshToken.java rename to src/main/java/com/cheeeese/auth/domain/RefreshToken.java index ffb2530..aef52b0 100644 --- a/src/main/java/com/cheeeese/oauth2/domain/RefreshToken.java +++ b/src/main/java/com/cheeeese/auth/domain/RefreshToken.java @@ -1,4 +1,4 @@ -package com.cheeeese.oauth2.domain; +package com.cheeeese.auth.domain; import lombok.Builder; import lombok.Getter; diff --git a/src/main/java/com/cheeeese/oauth2/infrastructure/mapper/RefreshTokenMapper.java b/src/main/java/com/cheeeese/auth/infrastructure/mapper/RefreshTokenMapper.java similarity index 78% rename from src/main/java/com/cheeeese/oauth2/infrastructure/mapper/RefreshTokenMapper.java rename to src/main/java/com/cheeeese/auth/infrastructure/mapper/RefreshTokenMapper.java index 1f65449..d43bd09 100644 --- a/src/main/java/com/cheeeese/oauth2/infrastructure/mapper/RefreshTokenMapper.java +++ b/src/main/java/com/cheeeese/auth/infrastructure/mapper/RefreshTokenMapper.java @@ -1,6 +1,6 @@ -package com.cheeeese.oauth2.infrastructure.mapper; +package com.cheeeese.auth.infrastructure.mapper; -import com.cheeeese.oauth2.domain.RefreshToken; +import com.cheeeese.auth.domain.RefreshToken; import com.cheeeese.user.domain.User; public class RefreshTokenMapper { diff --git a/src/main/java/com/cheeeese/oauth2/infrastructure/persistence/RefreshTokenRepository.java b/src/main/java/com/cheeeese/auth/infrastructure/persistence/RefreshTokenRepository.java similarity index 68% rename from src/main/java/com/cheeeese/oauth2/infrastructure/persistence/RefreshTokenRepository.java rename to src/main/java/com/cheeeese/auth/infrastructure/persistence/RefreshTokenRepository.java index 1d7b725..3d29490 100644 --- a/src/main/java/com/cheeeese/oauth2/infrastructure/persistence/RefreshTokenRepository.java +++ b/src/main/java/com/cheeeese/auth/infrastructure/persistence/RefreshTokenRepository.java @@ -1,6 +1,6 @@ -package com.cheeeese.oauth2.infrastructure.persistence; +package com.cheeeese.auth.infrastructure.persistence; -import com.cheeeese.oauth2.domain.RefreshToken; +import com.cheeeese.auth.domain.RefreshToken; import org.springframework.data.repository.CrudRepository; import java.util.Optional; diff --git a/src/main/java/com/cheeeese/oauth2/handler/OAuth2SuccessHandler.java b/src/main/java/com/cheeeese/oauth2/handler/OAuth2SuccessHandler.java index b1d2b6e..6e26379 100644 --- a/src/main/java/com/cheeeese/oauth2/handler/OAuth2SuccessHandler.java +++ b/src/main/java/com/cheeeese/oauth2/handler/OAuth2SuccessHandler.java @@ -4,8 +4,8 @@ import com.cheeeese.global.security.jwt.JwtProperties; import com.cheeeese.global.security.jwt.JwtProvider; import com.cheeeese.global.util.RedisUtil; -import com.cheeeese.oauth2.infrastructure.mapper.RefreshTokenMapper; -import com.cheeeese.oauth2.infrastructure.persistence.RefreshTokenRepository; +import com.cheeeese.auth.infrastructure.mapper.RefreshTokenMapper; +import com.cheeeese.auth.infrastructure.persistence.RefreshTokenRepository; import com.cheeeese.user.domain.User; import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.servlet.http.HttpServletRequest; From 7e5d28ccea0ec5fe6a0da2cd1cff4814408d6be4 Mon Sep 17 00:00:00 2001 From: zyovn Date: Tue, 7 Oct 2025 15:00:58 +0900 Subject: [PATCH 051/402] =?UTF-8?q?#6=20docs:=20swagger=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../auth/dto/request/AuthReissueRequest.java | 4 +++ .../dto/response/AuthExchangeResponse.java | 25 +++++++++++++++++ .../dto/response/AuthReissueResponse.java | 9 ++++++ .../auth/presentation/AuthController.java | 1 + .../presentation/swagger/AuthSwagger.java | 28 ++++++++++++++++++- 5 files changed, 66 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/cheeeese/auth/dto/request/AuthReissueRequest.java b/src/main/java/com/cheeeese/auth/dto/request/AuthReissueRequest.java index fc7d63b..a4e65ce 100644 --- a/src/main/java/com/cheeeese/auth/dto/request/AuthReissueRequest.java +++ b/src/main/java/com/cheeeese/auth/dto/request/AuthReissueRequest.java @@ -6,6 +6,10 @@ @Builder @Schema(description = "token 재발급") public record AuthReissueRequest( + @Schema( + description = "유효한 refreshToken", + example = "eyJh.eqi57hK" + ) String refreshToken ) { } diff --git a/src/main/java/com/cheeeese/auth/dto/response/AuthExchangeResponse.java b/src/main/java/com/cheeeese/auth/dto/response/AuthExchangeResponse.java index 6b0e550..822a6c4 100644 --- a/src/main/java/com/cheeeese/auth/dto/response/AuthExchangeResponse.java +++ b/src/main/java/com/cheeeese/auth/dto/response/AuthExchangeResponse.java @@ -1,13 +1,38 @@ package com.cheeeese.auth.dto.response; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Builder; @Builder public record AuthExchangeResponse( + @Schema( + description = "accessToken", + example = "eyJh.eqi57hK" + ) String accessToken, + + @Schema( + description = "refreshToken", + example = "eyJh.eqi57hK" + ) String refreshToken, + + @Schema( + description = "사용자 고유 식별 ID", + example = "1" + ) Long userId, + + @Schema( + description = "사용자 이름", + example = "주정빈" + ) String name, + + @Schema( + description = "사용자 이메일", + example = "yui2507@naver.com" + ) String email ) { } diff --git a/src/main/java/com/cheeeese/auth/dto/response/AuthReissueResponse.java b/src/main/java/com/cheeeese/auth/dto/response/AuthReissueResponse.java index 7c432ac..13ef6ea 100644 --- a/src/main/java/com/cheeeese/auth/dto/response/AuthReissueResponse.java +++ b/src/main/java/com/cheeeese/auth/dto/response/AuthReissueResponse.java @@ -6,7 +6,16 @@ @Builder @Schema(description = "token 재발급") public record AuthReissueResponse( + @Schema( + description = "새로 발급된 accessToken", + example = "eyJh.eqi57hK" + ) String accessToken, + + @Schema( + description = "새로 발급된 refreshToken", + example = "eyJh.eqi57hK" + ) String refreshToken ) { } diff --git a/src/main/java/com/cheeeese/auth/presentation/AuthController.java b/src/main/java/com/cheeeese/auth/presentation/AuthController.java index 0f7b5d4..0671ede 100644 --- a/src/main/java/com/cheeeese/auth/presentation/AuthController.java +++ b/src/main/java/com/cheeeese/auth/presentation/AuthController.java @@ -26,6 +26,7 @@ public CommonResponse exchangeTempCode(@RequestParam Strin return CommonResponse.success(EXCHANGE_TOKEN_SUCCESS, authService.exchangeTempCode(code)); } + @Override @PostMapping("/reissue") public CommonResponse reissueToken(@RequestBody @Valid AuthReissueRequest request) { return CommonResponse.success(REISSUE_TOKEN_SUCCESS, authService.reissueToken(request)); diff --git a/src/main/java/com/cheeeese/auth/presentation/swagger/AuthSwagger.java b/src/main/java/com/cheeeese/auth/presentation/swagger/AuthSwagger.java index ef6c9c4..9e4175d 100644 --- a/src/main/java/com/cheeeese/auth/presentation/swagger/AuthSwagger.java +++ b/src/main/java/com/cheeeese/auth/presentation/swagger/AuthSwagger.java @@ -1,18 +1,26 @@ package com.cheeeese.auth.presentation.swagger; +import com.cheeeese.auth.dto.request.AuthReissueRequest; import com.cheeeese.auth.dto.response.AuthExchangeResponse; +import com.cheeeese.auth.dto.response.AuthReissueResponse; import com.cheeeese.global.common.CommonResponse; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; @Tag(name = "[사용자 인증/인가]", description = "사용자 로그아웃, 토큰 재발급 관련 API") public interface AuthSwagger { @Operation( summary = "사용자 토큰 및 정보 조회 API", - description = "발급된 임시 코드를 통해 사용자의 accessToken, refreshToken 및 정보를 반환합니다." + description = """ + ### RequestBody + --- + `code`: 발급된 임시 코드 + """ ) @ApiResponses(value = { @ApiResponse( @@ -23,4 +31,22 @@ public interface AuthSwagger { CommonResponse exchangeTempCode( @RequestParam String code ); + + @Operation( + summary = "token 재발급 API", + description = """ + ### RequestBody + --- + `refreshToken`: 유효한 refreshToken + """ + ) + @ApiResponses(value = { + @ApiResponse( + responseCode = "200", + description = "token 재발급이 성공적으로 실행되었습니다." + ) + }) + CommonResponse reissueToken( + @RequestBody @Valid AuthReissueRequest request + ); } From 0545da76391b3e74a751dacda55d789533702e44 Mon Sep 17 00:00:00 2001 From: zyovn Date: Tue, 7 Oct 2025 15:02:25 +0900 Subject: [PATCH 052/402] =?UTF-8?q?#6=20refactor:=20mapper=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=EB=AA=85=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/cheeeese/auth/application/AuthService.java | 4 ++-- .../com/cheeeese/auth/infrastructure/mapper/AuthMapper.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/cheeeese/auth/application/AuthService.java b/src/main/java/com/cheeeese/auth/application/AuthService.java index 8bdce09..a75b0c4 100644 --- a/src/main/java/com/cheeeese/auth/application/AuthService.java +++ b/src/main/java/com/cheeeese/auth/application/AuthService.java @@ -43,7 +43,7 @@ public AuthExchangeResponse exchangeTempCode(String code) { redisUtil.deleteValue("auth:" + code); - return AuthMapper.toResponse(tokens.get("accessToken"), tokens.get("refreshToken"), user); + return AuthMapper.toExchangeResponse(tokens.get("accessToken"), tokens.get("refreshToken"), user); } @Transactional @@ -61,7 +61,7 @@ public AuthReissueResponse reissueToken(AuthReissueRequest request) { savedToken.updateRefreshToken(newRefreshToken, jwtProperties.refreshExp()); refreshTokenRepository.save(savedToken); - return AuthMapper.toResponse(newAccessToken, newRefreshToken); + return AuthMapper.toReissueResponse(newAccessToken, newRefreshToken); } private Map getTokenFromTempCode(String code) { diff --git a/src/main/java/com/cheeeese/auth/infrastructure/mapper/AuthMapper.java b/src/main/java/com/cheeeese/auth/infrastructure/mapper/AuthMapper.java index d4d0f38..7a75265 100644 --- a/src/main/java/com/cheeeese/auth/infrastructure/mapper/AuthMapper.java +++ b/src/main/java/com/cheeeese/auth/infrastructure/mapper/AuthMapper.java @@ -6,7 +6,7 @@ public class AuthMapper { - public static AuthExchangeResponse toResponse(String accessToken, String refreshToken, User user) { + public static AuthExchangeResponse toExchangeResponse(String accessToken, String refreshToken, User user) { return AuthExchangeResponse.builder() .accessToken(accessToken) .refreshToken(refreshToken) @@ -16,7 +16,7 @@ public static AuthExchangeResponse toResponse(String accessToken, String refresh .build(); } - public static AuthReissueResponse toResponse(String accessToken, String refreshToken) { + public static AuthReissueResponse toReissueResponse(String accessToken, String refreshToken) { return AuthReissueResponse.builder() .accessToken(accessToken) .refreshToken(refreshToken) From 23422f3793cd22be4af4ee3be05b43cf0753500b Mon Sep 17 00:00:00 2001 From: zyovn Date: Tue, 7 Oct 2025 15:08:09 +0900 Subject: [PATCH 053/402] =?UTF-8?q?#6=20fix:=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cheeeese/auth/application/AuthService.java | 4 +--- .../java/com/cheeeese/auth/domain/RefreshToken.java | 12 ++++-------- .../infrastructure/mapper/RefreshTokenMapper.java | 3 +-- .../oauth2/handler/OAuth2SuccessHandler.java | 3 +-- 4 files changed, 7 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/cheeeese/auth/application/AuthService.java b/src/main/java/com/cheeeese/auth/application/AuthService.java index a75b0c4..a118aa1 100644 --- a/src/main/java/com/cheeeese/auth/application/AuthService.java +++ b/src/main/java/com/cheeeese/auth/application/AuthService.java @@ -6,7 +6,6 @@ import com.cheeeese.auth.exception.AuthException; import com.cheeeese.auth.exception.code.AuthErrorCode; import com.cheeeese.auth.infrastructure.mapper.AuthMapper; -import com.cheeeese.global.security.jwt.JwtProperties; import com.cheeeese.global.security.jwt.JwtProvider; import com.cheeeese.global.util.RedisUtil; import com.cheeeese.auth.domain.RefreshToken; @@ -31,7 +30,6 @@ public class AuthService { private final JwtProvider jwtProvider; - private final JwtProperties jwtProperties; private final UserRepository userRepository; private final RefreshTokenRepository refreshTokenRepository; private final ObjectMapper objectMapper; @@ -58,7 +56,7 @@ public AuthReissueResponse reissueToken(AuthReissueRequest request) { String newAccessToken = jwtProvider.createAccessToken(user.getId()); String newRefreshToken = jwtProvider.createRefreshToken(user.getId()); - savedToken.updateRefreshToken(newRefreshToken, jwtProperties.refreshExp()); + savedToken.updateRefreshToken(newRefreshToken); refreshTokenRepository.save(savedToken); return AuthMapper.toReissueResponse(newAccessToken, newRefreshToken); diff --git a/src/main/java/com/cheeeese/auth/domain/RefreshToken.java b/src/main/java/com/cheeeese/auth/domain/RefreshToken.java index aef52b0..8960e8a 100644 --- a/src/main/java/com/cheeeese/auth/domain/RefreshToken.java +++ b/src/main/java/com/cheeeese/auth/domain/RefreshToken.java @@ -7,8 +7,6 @@ import org.springframework.data.redis.core.RedisHash; import org.springframework.data.redis.core.TimeToLive; -import java.util.concurrent.TimeUnit; - @Getter @NoArgsConstructor @RedisHash(value = "refreshToken") @@ -19,18 +17,16 @@ public class RefreshToken { private String refreshToken; - @TimeToLive(unit = TimeUnit.MILLISECONDS) - private Long expiration; + @TimeToLive + private Long expiration = 604800L; @Builder - private RefreshToken(Long userId, String refreshToken, Long expiration) { + private RefreshToken(Long userId, String refreshToken) { this.userId = userId; this.refreshToken = refreshToken; - this.expiration = expiration; } - public void updateRefreshToken(String refreshToken, Long expiration) { + public void updateRefreshToken(String refreshToken) { this.refreshToken = refreshToken; - this.expiration = expiration; } } diff --git a/src/main/java/com/cheeeese/auth/infrastructure/mapper/RefreshTokenMapper.java b/src/main/java/com/cheeeese/auth/infrastructure/mapper/RefreshTokenMapper.java index d43bd09..ce68988 100644 --- a/src/main/java/com/cheeeese/auth/infrastructure/mapper/RefreshTokenMapper.java +++ b/src/main/java/com/cheeeese/auth/infrastructure/mapper/RefreshTokenMapper.java @@ -5,11 +5,10 @@ public class RefreshTokenMapper { - public static RefreshToken toRefreshToken(User user, String refreshToken, Long expiration) { + public static RefreshToken toRefreshToken(User user, String refreshToken) { return RefreshToken.builder() .userId(user.getId()) .refreshToken(refreshToken) - .expiration(expiration) .build(); } } diff --git a/src/main/java/com/cheeeese/oauth2/handler/OAuth2SuccessHandler.java b/src/main/java/com/cheeeese/oauth2/handler/OAuth2SuccessHandler.java index 6e26379..ed9f49e 100644 --- a/src/main/java/com/cheeeese/oauth2/handler/OAuth2SuccessHandler.java +++ b/src/main/java/com/cheeeese/oauth2/handler/OAuth2SuccessHandler.java @@ -26,7 +26,6 @@ public class OAuth2SuccessHandler implements AuthenticationSuccessHandler { private final JwtProvider jwtProvider; - private final JwtProperties jwtProperties; private final RefreshTokenRepository refreshTokenRepository; private final ObjectMapper objectMapper; private final RedisUtil redisUtil; @@ -46,7 +45,7 @@ public void onAuthenticationSuccess( String accessToken = jwtProvider.createAccessToken(user.getId()); String refreshToken = jwtProvider.createRefreshToken(user.getId()); - refreshTokenRepository.save(RefreshTokenMapper.toRefreshToken(user, refreshToken, jwtProperties.refreshExp())); + refreshTokenRepository.save(RefreshTokenMapper.toRefreshToken(user, refreshToken)); String tempCode = UUID.randomUUID().toString(); From 45b2426e3ea2940b459389a650dde1b43a0687c1 Mon Sep 17 00:00:00 2001 From: zyovn Date: Tue, 7 Oct 2025 15:08:58 +0900 Subject: [PATCH 054/402] =?UTF-8?q?#6=20refactor:=20=EC=84=B1=EA=B3=B5=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cheeeese/auth/presentation/AuthController.java | 4 ++-- .../java/com/cheeeese/global/common/code/SuccessCode.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/cheeeese/auth/presentation/AuthController.java b/src/main/java/com/cheeeese/auth/presentation/AuthController.java index 0671ede..694df54 100644 --- a/src/main/java/com/cheeeese/auth/presentation/AuthController.java +++ b/src/main/java/com/cheeeese/auth/presentation/AuthController.java @@ -10,7 +10,7 @@ import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; -import static com.cheeeese.global.common.code.SuccessCode.EXCHANGE_TOKEN_SUCCESS; +import static com.cheeeese.global.common.code.SuccessCode.TOKEN_EXCHANGE_SUCCESS; import static com.cheeeese.global.common.code.SuccessCode.REISSUE_TOKEN_SUCCESS; @RestController @@ -23,7 +23,7 @@ public class AuthController implements AuthSwagger { @Override @GetMapping("/exchange") public CommonResponse exchangeTempCode(@RequestParam String code) { - return CommonResponse.success(EXCHANGE_TOKEN_SUCCESS, authService.exchangeTempCode(code)); + return CommonResponse.success(TOKEN_EXCHANGE_SUCCESS, authService.exchangeTempCode(code)); } @Override diff --git a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java index 0726d81..02aec56 100644 --- a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java +++ b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java @@ -12,8 +12,8 @@ public enum SuccessCode implements BaseCode { HEALTH_CHECK_SUCCESS(HttpStatus.OK, "Health Check Success"), // auth - EXCHANGE_TOKEN_SUCCESS(HttpStatus.OK, "Exchange Token Success"), - REISSUE_TOKEN_SUCCESS(HttpStatus.OK, "Reissue Token Success"), + TOKEN_EXCHANGE_SUCCESS(HttpStatus.OK, "Token Exchange Success"), + TOKEN_REISSUE_SUCCESS(HttpStatus.OK, "Token Reissue Success"), ; private final HttpStatus httpStatus; From 987acb3667442fe75cbe8347e66f694ffdf9dad4 Mon Sep 17 00:00:00 2001 From: zyovn Date: Tue, 7 Oct 2025 15:11:07 +0900 Subject: [PATCH 055/402] =?UTF-8?q?#6=20fix:=20reissueToken=20=EC=84=B1?= =?UTF-8?q?=EA=B3=B5=20=EC=BD=94=EB=93=9C=20=EC=98=A4=EB=A5=98=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cheeeese/auth/presentation/AuthController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/cheeeese/auth/presentation/AuthController.java b/src/main/java/com/cheeeese/auth/presentation/AuthController.java index 694df54..e740af1 100644 --- a/src/main/java/com/cheeeese/auth/presentation/AuthController.java +++ b/src/main/java/com/cheeeese/auth/presentation/AuthController.java @@ -11,7 +11,7 @@ import org.springframework.web.bind.annotation.*; import static com.cheeeese.global.common.code.SuccessCode.TOKEN_EXCHANGE_SUCCESS; -import static com.cheeeese.global.common.code.SuccessCode.REISSUE_TOKEN_SUCCESS; +import static com.cheeeese.global.common.code.SuccessCode.TOKEN_REISSUE_SUCCESS; @RestController @RequiredArgsConstructor @@ -29,6 +29,6 @@ public CommonResponse exchangeTempCode(@RequestParam Strin @Override @PostMapping("/reissue") public CommonResponse reissueToken(@RequestBody @Valid AuthReissueRequest request) { - return CommonResponse.success(REISSUE_TOKEN_SUCCESS, authService.reissueToken(request)); + return CommonResponse.success(TOKEN_REISSUE_SUCCESS, authService.reissueToken(request)); } } From 86fd632bc7a45d7b07f3d7cc3ba59905bacd02b3 Mon Sep 17 00:00:00 2001 From: zyovn Date: Wed, 8 Oct 2025 01:10:01 +0900 Subject: [PATCH 056/402] =?UTF-8?q?#6=20fix:=20=ED=94=BC=EB=93=9C=EB=B0=B1?= =?UTF-8?q?=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../auth/application/AuthService.java | 5 ++-- .../application/validator/AuthValidator.java | 25 +++++++++++++++++++ .../oauth2/handler/OAuth2SuccessHandler.java | 1 - 3 files changed, 28 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/cheeeese/auth/application/validator/AuthValidator.java diff --git a/src/main/java/com/cheeeese/auth/application/AuthService.java b/src/main/java/com/cheeeese/auth/application/AuthService.java index a118aa1..b6c0d00 100644 --- a/src/main/java/com/cheeeese/auth/application/AuthService.java +++ b/src/main/java/com/cheeeese/auth/application/AuthService.java @@ -1,5 +1,6 @@ package com.cheeeese.auth.application; +import com.cheeeese.auth.application.validator.AuthValidator; import com.cheeeese.auth.dto.request.AuthReissueRequest; import com.cheeeese.auth.dto.response.AuthReissueResponse; import com.cheeeese.auth.dto.response.AuthExchangeResponse; @@ -34,6 +35,7 @@ public class AuthService { private final RefreshTokenRepository refreshTokenRepository; private final ObjectMapper objectMapper; private final RedisUtil redisUtil; + private final AuthValidator authValidator; public AuthExchangeResponse exchangeTempCode(String code) { Map tokens = getTokenFromTempCode(code); @@ -50,8 +52,7 @@ public AuthReissueResponse reissueToken(AuthReissueRequest request) { User user = getUserFromToken(request.refreshToken()); - RefreshToken savedToken = refreshTokenRepository.findByUserId(user.getId()) - .orElseThrow(() -> new AuthException(AuthErrorCode.REFRESH_TOKEN_NOT_FOUND)); + RefreshToken savedToken = authValidator.validateRefreshToken(user.getId(), request.refreshToken()); String newAccessToken = jwtProvider.createAccessToken(user.getId()); String newRefreshToken = jwtProvider.createRefreshToken(user.getId()); diff --git a/src/main/java/com/cheeeese/auth/application/validator/AuthValidator.java b/src/main/java/com/cheeeese/auth/application/validator/AuthValidator.java new file mode 100644 index 0000000..a9b4736 --- /dev/null +++ b/src/main/java/com/cheeeese/auth/application/validator/AuthValidator.java @@ -0,0 +1,25 @@ +package com.cheeeese.auth.application.validator; + +import com.cheeeese.auth.domain.RefreshToken; +import com.cheeeese.auth.exception.AuthException; +import com.cheeeese.auth.exception.code.AuthErrorCode; +import com.cheeeese.auth.infrastructure.persistence.RefreshTokenRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class AuthValidator { + + private final RefreshTokenRepository refreshTokenRepository; + + public RefreshToken validateRefreshToken(Long userId, String refreshToken) { + RefreshToken savedToken = refreshTokenRepository.findByUserId(userId) + .orElseThrow(() -> new AuthException(AuthErrorCode.REFRESH_TOKEN_NOT_FOUND)); + + if (!savedToken.getRefreshToken().equals(refreshToken)) { + throw new AuthException(AuthErrorCode.INVALID_TOKEN); + } + return savedToken; + } +} diff --git a/src/main/java/com/cheeeese/oauth2/handler/OAuth2SuccessHandler.java b/src/main/java/com/cheeeese/oauth2/handler/OAuth2SuccessHandler.java index ed9f49e..69870ad 100644 --- a/src/main/java/com/cheeeese/oauth2/handler/OAuth2SuccessHandler.java +++ b/src/main/java/com/cheeeese/oauth2/handler/OAuth2SuccessHandler.java @@ -1,7 +1,6 @@ package com.cheeeese.oauth2.handler; import com.cheeeese.global.security.CustomUserDetails; -import com.cheeeese.global.security.jwt.JwtProperties; import com.cheeeese.global.security.jwt.JwtProvider; import com.cheeeese.global.util.RedisUtil; import com.cheeeese.auth.infrastructure.mapper.RefreshTokenMapper; From 32df120e41919b3d99b9b5bae78b85c4d7d248c5 Mon Sep 17 00:00:00 2001 From: zyovn Date: Thu, 9 Oct 2025 19:03:10 +0900 Subject: [PATCH 057/402] =?UTF-8?q?#8=20feat:=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=9E=90=20=EB=A1=9C=EA=B7=B8=EC=95=84=EC=9B=83=20API=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../auth/application/AuthService.java | 20 +++++++++++++++ .../application/TokenBlackListService.java | 25 +++++++++++++++++++ .../auth/presentation/AuthController.java | 12 +++++++-- .../global/common/code/SuccessCode.java | 1 + .../security/jwt/JwtAuthenticationFilter.java | 10 ++++++-- 5 files changed, 64 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/cheeeese/auth/application/TokenBlackListService.java diff --git a/src/main/java/com/cheeeese/auth/application/AuthService.java b/src/main/java/com/cheeeese/auth/application/AuthService.java index b6c0d00..5bfeceb 100644 --- a/src/main/java/com/cheeeese/auth/application/AuthService.java +++ b/src/main/java/com/cheeeese/auth/application/AuthService.java @@ -23,6 +23,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.time.Duration; import java.util.Map; @Service @@ -36,6 +37,7 @@ public class AuthService { private final ObjectMapper objectMapper; private final RedisUtil redisUtil; private final AuthValidator authValidator; + private final TokenBlackListService tokenBlackListService; public AuthExchangeResponse exchangeTempCode(String code) { Map tokens = getTokenFromTempCode(code); @@ -63,6 +65,24 @@ public AuthReissueResponse reissueToken(AuthReissueRequest request) { return AuthMapper.toReissueResponse(newAccessToken, newRefreshToken); } + @Transactional + public void logout(String accessToken) { + User user = getUserFromToken(accessToken); + Claims claims = jwtProvider.getClaims(accessToken); + + RefreshToken refreshToken = refreshTokenRepository.findByUserId(user.getId()) + .orElseThrow(() -> new AuthException(AuthErrorCode.REFRESH_TOKEN_NOT_FOUND)); + + refreshTokenRepository.delete(refreshToken); + + long expiration = claims.getExpiration().getTime() - System.currentTimeMillis(); + + if (expiration <= 0) { + expiration = 1000; + } + tokenBlackListService.addBlackList(accessToken, "logout", Duration.ofMillis(expiration)); + } + private Map getTokenFromTempCode(String code) { String key = "auth:" + code; String json = redisUtil.getValue(key); diff --git a/src/main/java/com/cheeeese/auth/application/TokenBlackListService.java b/src/main/java/com/cheeeese/auth/application/TokenBlackListService.java new file mode 100644 index 0000000..50d491c --- /dev/null +++ b/src/main/java/com/cheeeese/auth/application/TokenBlackListService.java @@ -0,0 +1,25 @@ +package com.cheeeese.auth.application; + +import lombok.RequiredArgsConstructor; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Service; + +import java.time.Duration; + +@Service +@RequiredArgsConstructor +public class TokenBlackListService { + + private final RedisTemplate redisTemplate; + private static final String BLACKLIST_PREFIX = "accessTokenBlackList:"; + + public void addBlackList(String token, Object o, Duration expiration) { + String key = BLACKLIST_PREFIX + token; + redisTemplate.opsForValue().set(key, o, expiration); + } + + public boolean isBlackListed(String token) { + String key = BLACKLIST_PREFIX + token; + return redisTemplate.hasKey(key); + } +} diff --git a/src/main/java/com/cheeeese/auth/presentation/AuthController.java b/src/main/java/com/cheeeese/auth/presentation/AuthController.java index e740af1..4626dd7 100644 --- a/src/main/java/com/cheeeese/auth/presentation/AuthController.java +++ b/src/main/java/com/cheeeese/auth/presentation/AuthController.java @@ -6,18 +6,20 @@ import com.cheeeese.auth.dto.response.AuthExchangeResponse; import com.cheeeese.auth.presentation.swagger.AuthSwagger; import com.cheeeese.global.common.CommonResponse; +import com.cheeeese.global.security.jwt.JwtProvider; +import jakarta.servlet.http.HttpServletRequest; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; -import static com.cheeeese.global.common.code.SuccessCode.TOKEN_EXCHANGE_SUCCESS; -import static com.cheeeese.global.common.code.SuccessCode.TOKEN_REISSUE_SUCCESS; +import static com.cheeeese.global.common.code.SuccessCode.*; @RestController @RequiredArgsConstructor @RequestMapping("/v1/auth") public class AuthController implements AuthSwagger { + private final JwtProvider jwtProvider; private final AuthService authService; @Override @@ -31,4 +33,10 @@ public CommonResponse exchangeTempCode(@RequestParam Strin public CommonResponse reissueToken(@RequestBody @Valid AuthReissueRequest request) { return CommonResponse.success(TOKEN_REISSUE_SUCCESS, authService.reissueToken(request)); } + + @PostMapping("/logout") + public CommonResponse logout(HttpServletRequest request) { + authService.logout(jwtProvider.resolveToken(request)); + return CommonResponse.success(LOGOUT_SUCCESS); + } } diff --git a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java index 02aec56..3ccd70e 100644 --- a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java +++ b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java @@ -14,6 +14,7 @@ public enum SuccessCode implements BaseCode { // auth TOKEN_EXCHANGE_SUCCESS(HttpStatus.OK, "Token Exchange Success"), TOKEN_REISSUE_SUCCESS(HttpStatus.OK, "Token Reissue Success"), + LOGOUT_SUCCESS(HttpStatus.OK, "Logout Success"), ; private final HttpStatus httpStatus; diff --git a/src/main/java/com/cheeeese/global/security/jwt/JwtAuthenticationFilter.java b/src/main/java/com/cheeeese/global/security/jwt/JwtAuthenticationFilter.java index 34b414d..634fd62 100644 --- a/src/main/java/com/cheeeese/global/security/jwt/JwtAuthenticationFilter.java +++ b/src/main/java/com/cheeeese/global/security/jwt/JwtAuthenticationFilter.java @@ -1,5 +1,6 @@ package com.cheeeese.global.security.jwt; +import com.cheeeese.auth.application.TokenBlackListService; import com.cheeeese.global.security.CustomUserDetailService; import io.jsonwebtoken.Claims; import jakarta.servlet.FilterChain; @@ -21,6 +22,7 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter { private final JwtProvider jwtProvider; private final CustomUserDetailService customUserDetailService; + private final TokenBlackListService tokenBlackListService; @Override protected void doFilterInternal( @@ -30,9 +32,13 @@ protected void doFilterInternal( ) throws ServletException, IOException { String token = jwtProvider.resolveToken(request); - // TODO: 로그아웃 구현 후 관련 로직 추가 - if (token != null && jwtProvider.validateToken(token)) { + if (tokenBlackListService.isBlackListed(token)) { + response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); + response.setContentType("application/json;charset=UTF-8"); + response.getWriter().write("{\"error\": \"로그아웃된 토큰입니다.\"}"); + return; + } Claims claims = jwtProvider.getClaims(token); String userId = claims.getSubject(); From bb1ffa0574015338f552e0365e7150f876fde845 Mon Sep 17 00:00:00 2001 From: zyovn Date: Thu, 9 Oct 2025 19:07:58 +0900 Subject: [PATCH 058/402] =?UTF-8?q?#8=20docs:=20swagger=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cheeeese/auth/presentation/AuthController.java | 1 + .../auth/presentation/swagger/AuthSwagger.java | 13 +++++++++++++ 2 files changed, 14 insertions(+) diff --git a/src/main/java/com/cheeeese/auth/presentation/AuthController.java b/src/main/java/com/cheeeese/auth/presentation/AuthController.java index 4626dd7..c56fafc 100644 --- a/src/main/java/com/cheeeese/auth/presentation/AuthController.java +++ b/src/main/java/com/cheeeese/auth/presentation/AuthController.java @@ -34,6 +34,7 @@ public CommonResponse reissueToken(@RequestBody @Valid Auth return CommonResponse.success(TOKEN_REISSUE_SUCCESS, authService.reissueToken(request)); } + @Override @PostMapping("/logout") public CommonResponse logout(HttpServletRequest request) { authService.logout(jwtProvider.resolveToken(request)); diff --git a/src/main/java/com/cheeeese/auth/presentation/swagger/AuthSwagger.java b/src/main/java/com/cheeeese/auth/presentation/swagger/AuthSwagger.java index 9e4175d..debdde0 100644 --- a/src/main/java/com/cheeeese/auth/presentation/swagger/AuthSwagger.java +++ b/src/main/java/com/cheeeese/auth/presentation/swagger/AuthSwagger.java @@ -8,6 +8,7 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletRequest; import jakarta.validation.Valid; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; @@ -49,4 +50,16 @@ CommonResponse exchangeTempCode( CommonResponse reissueToken( @RequestBody @Valid AuthReissueRequest request ); + + @Operation( + summary = "사용자 로그아웃 API", + description = "사용자 로그아웃을 진행합니다." + ) + @ApiResponses(value = { + @ApiResponse( + responseCode = "200", + description = "사용자 로그아웃이 성공적으로 실행되었습니다." + ) + }) + CommonResponse logout(HttpServletRequest request); } From bcb538af8b22caae1e288c42cb235f807d353916 Mon Sep 17 00:00:00 2001 From: zyovn Date: Thu, 9 Oct 2025 19:29:15 +0900 Subject: [PATCH 059/402] =?UTF-8?q?#8=20refactor:=20=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EC=95=84=EC=9B=83=20=EC=97=90=EB=9F=AC=20=EC=B2=98=EB=A6=AC=20?= =?UTF-8?q?handler=EB=A1=9C=20=EB=B6=84=EB=A6=AC=20=EB=B0=8F=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=EB=AA=85=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../auth/application/AuthService.java | 4 +-- ...ervice.java => TokenBlacklistService.java} | 2 +- .../auth/exception/code/AuthErrorCode.java | 1 + .../handler/TokenBlacklistHandler.java | 26 +++++++++++++++++++ .../security/jwt/JwtAuthenticationFilter.java | 12 ++++----- 5 files changed, 36 insertions(+), 9 deletions(-) rename src/main/java/com/cheeeese/auth/application/{TokenBlackListService.java => TokenBlacklistService.java} (95%) create mode 100644 src/main/java/com/cheeeese/global/security/handler/TokenBlacklistHandler.java diff --git a/src/main/java/com/cheeeese/auth/application/AuthService.java b/src/main/java/com/cheeeese/auth/application/AuthService.java index 5bfeceb..04a7b4e 100644 --- a/src/main/java/com/cheeeese/auth/application/AuthService.java +++ b/src/main/java/com/cheeeese/auth/application/AuthService.java @@ -37,7 +37,7 @@ public class AuthService { private final ObjectMapper objectMapper; private final RedisUtil redisUtil; private final AuthValidator authValidator; - private final TokenBlackListService tokenBlackListService; + private final TokenBlacklistService tokenBlacklistService; public AuthExchangeResponse exchangeTempCode(String code) { Map tokens = getTokenFromTempCode(code); @@ -80,7 +80,7 @@ public void logout(String accessToken) { if (expiration <= 0) { expiration = 1000; } - tokenBlackListService.addBlackList(accessToken, "logout", Duration.ofMillis(expiration)); + tokenBlacklistService.addBlackList(accessToken, "logout", Duration.ofMillis(expiration)); } private Map getTokenFromTempCode(String code) { diff --git a/src/main/java/com/cheeeese/auth/application/TokenBlackListService.java b/src/main/java/com/cheeeese/auth/application/TokenBlacklistService.java similarity index 95% rename from src/main/java/com/cheeeese/auth/application/TokenBlackListService.java rename to src/main/java/com/cheeeese/auth/application/TokenBlacklistService.java index 50d491c..5b6dbf1 100644 --- a/src/main/java/com/cheeeese/auth/application/TokenBlackListService.java +++ b/src/main/java/com/cheeeese/auth/application/TokenBlacklistService.java @@ -8,7 +8,7 @@ @Service @RequiredArgsConstructor -public class TokenBlackListService { +public class TokenBlacklistService { private final RedisTemplate redisTemplate; private static final String BLACKLIST_PREFIX = "accessTokenBlackList:"; diff --git a/src/main/java/com/cheeeese/auth/exception/code/AuthErrorCode.java b/src/main/java/com/cheeeese/auth/exception/code/AuthErrorCode.java index 9df9a15..d9667e8 100644 --- a/src/main/java/com/cheeeese/auth/exception/code/AuthErrorCode.java +++ b/src/main/java/com/cheeeese/auth/exception/code/AuthErrorCode.java @@ -14,6 +14,7 @@ public enum AuthErrorCode implements BaseCode { INVALID_AUTH_CODE(HttpStatus.BAD_REQUEST, "유효하지 않은 인증 코드 입니다."), EXPIRED_TOKEN(HttpStatus.UNAUTHORIZED, "만료된 토큰입니다."), REFRESH_TOKEN_NOT_FOUND(HttpStatus.NOT_FOUND, "리프레시 토큰을 찾을 수 없습니다."), + LOGGED_OUT_TOKEN(HttpStatus.UNAUTHORIZED, "이미 로그아웃된 토큰입니다."), ; private final HttpStatus httpStatus; diff --git a/src/main/java/com/cheeeese/global/security/handler/TokenBlacklistHandler.java b/src/main/java/com/cheeeese/global/security/handler/TokenBlacklistHandler.java new file mode 100644 index 0000000..afae35c --- /dev/null +++ b/src/main/java/com/cheeeese/global/security/handler/TokenBlacklistHandler.java @@ -0,0 +1,26 @@ +package com.cheeeese.global.security.handler; + +import com.cheeeese.auth.exception.code.AuthErrorCode; +import com.cheeeese.global.common.CommonResponse; +import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +import java.io.IOException; + +@Component +@RequiredArgsConstructor +public class TokenBlacklistHandler { + + private final ObjectMapper objectMapper; + + public void handleBlacklistedToken(HttpServletResponse response) throws IOException { + response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); + response.setContentType("application/json;charset=UTF-8"); + + CommonResponse errorResponse = CommonResponse.failure(AuthErrorCode.LOGGED_OUT_TOKEN); + + response.getWriter().write(objectMapper.writeValueAsString(errorResponse)); + } +} diff --git a/src/main/java/com/cheeeese/global/security/jwt/JwtAuthenticationFilter.java b/src/main/java/com/cheeeese/global/security/jwt/JwtAuthenticationFilter.java index 634fd62..213d319 100644 --- a/src/main/java/com/cheeeese/global/security/jwt/JwtAuthenticationFilter.java +++ b/src/main/java/com/cheeeese/global/security/jwt/JwtAuthenticationFilter.java @@ -1,7 +1,8 @@ package com.cheeeese.global.security.jwt; -import com.cheeeese.auth.application.TokenBlackListService; +import com.cheeeese.auth.application.TokenBlacklistService; import com.cheeeese.global.security.CustomUserDetailService; +import com.cheeeese.global.security.handler.TokenBlacklistHandler; import io.jsonwebtoken.Claims; import jakarta.servlet.FilterChain; import jakarta.servlet.ServletException; @@ -22,7 +23,8 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter { private final JwtProvider jwtProvider; private final CustomUserDetailService customUserDetailService; - private final TokenBlackListService tokenBlackListService; + private final TokenBlacklistService tokenBlacklistService; + private final TokenBlacklistHandler tokenBlacklistHandler; @Override protected void doFilterInternal( @@ -33,10 +35,8 @@ protected void doFilterInternal( String token = jwtProvider.resolveToken(request); if (token != null && jwtProvider.validateToken(token)) { - if (tokenBlackListService.isBlackListed(token)) { - response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); - response.setContentType("application/json;charset=UTF-8"); - response.getWriter().write("{\"error\": \"로그아웃된 토큰입니다.\"}"); + if (tokenBlacklistService.isBlackListed(token)) { + tokenBlacklistHandler.handleBlacklistedToken(response); return; } Claims claims = jwtProvider.getClaims(token); From 2ef425727f2b76e35ce8fcdfe531bf56d98cdad0 Mon Sep 17 00:00:00 2001 From: zyovn Date: Thu, 9 Oct 2025 19:37:46 +0900 Subject: [PATCH 060/402] =?UTF-8?q?#8=20refactor:=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cheeeese/auth/application/AuthService.java | 4 +--- .../auth/application/validator/AuthValidator.java | 8 ++++++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/cheeeese/auth/application/AuthService.java b/src/main/java/com/cheeeese/auth/application/AuthService.java index 04a7b4e..030319b 100644 --- a/src/main/java/com/cheeeese/auth/application/AuthService.java +++ b/src/main/java/com/cheeeese/auth/application/AuthService.java @@ -70,9 +70,7 @@ public void logout(String accessToken) { User user = getUserFromToken(accessToken); Claims claims = jwtProvider.getClaims(accessToken); - RefreshToken refreshToken = refreshTokenRepository.findByUserId(user.getId()) - .orElseThrow(() -> new AuthException(AuthErrorCode.REFRESH_TOKEN_NOT_FOUND)); - + RefreshToken refreshToken = authValidator.getRefreshTokenByUserId(user.getId()); refreshTokenRepository.delete(refreshToken); long expiration = claims.getExpiration().getTime() - System.currentTimeMillis(); diff --git a/src/main/java/com/cheeeese/auth/application/validator/AuthValidator.java b/src/main/java/com/cheeeese/auth/application/validator/AuthValidator.java index a9b4736..a9ec329 100644 --- a/src/main/java/com/cheeeese/auth/application/validator/AuthValidator.java +++ b/src/main/java/com/cheeeese/auth/application/validator/AuthValidator.java @@ -13,9 +13,13 @@ public class AuthValidator { private final RefreshTokenRepository refreshTokenRepository; - public RefreshToken validateRefreshToken(Long userId, String refreshToken) { - RefreshToken savedToken = refreshTokenRepository.findByUserId(userId) + public RefreshToken getRefreshTokenByUserId(Long userId) { + return refreshTokenRepository.findByUserId(userId) .orElseThrow(() -> new AuthException(AuthErrorCode.REFRESH_TOKEN_NOT_FOUND)); + } + + public RefreshToken validateRefreshToken(Long userId, String refreshToken) { + RefreshToken savedToken = getRefreshTokenByUserId(userId); if (!savedToken.getRefreshToken().equals(refreshToken)) { throw new AuthException(AuthErrorCode.INVALID_TOKEN); From 7fa9c089c141ffe698f20c6c1269d6888aeb937d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Fri, 10 Oct 2025 13:27:45 +0900 Subject: [PATCH 061/402] =?UTF-8?q?#4=20chore:=20Dockerfile=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dockerfile | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 Dockerfile diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..e5cc0bf --- /dev/null +++ b/Dockerfile @@ -0,0 +1,6 @@ +FROM amazoncorretto:21-alpine +WORKDIR /app +COPY ./build/libs/cheeeese-0.0.1-SNAPSHOT.jar /app/cheeeese.jar +EXPOSE 8080 +ENTRYPOINT ["java"] +CMD ["-jar", "cheeeese.jar"] \ No newline at end of file From c91d78e9ab99b2be8b61097b393370daa63bfcbe Mon Sep 17 00:00:00 2001 From: zyovn Date: Mon, 13 Oct 2025 04:08:57 +0900 Subject: [PATCH 062/402] =?UTF-8?q?#10=20feat:=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=9E=90=20=EC=98=A8=EB=B3=B4=EB=94=A9=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../global/common/code/SuccessCode.java | 3 ++ .../user/application/UserService.java | 21 ++++++++++++ .../java/com/cheeeese/user/domain/User.java | 4 +++ .../dto/request/UserOnboardingRequest.java | 9 ++++++ .../user/presentation/UserController.java | 32 +++++++++++++++++++ 5 files changed, 69 insertions(+) create mode 100644 src/main/java/com/cheeeese/user/application/UserService.java create mode 100644 src/main/java/com/cheeeese/user/dto/request/UserOnboardingRequest.java create mode 100644 src/main/java/com/cheeeese/user/presentation/UserController.java diff --git a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java index 3ccd70e..0243d47 100644 --- a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java +++ b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java @@ -15,6 +15,9 @@ public enum SuccessCode implements BaseCode { TOKEN_EXCHANGE_SUCCESS(HttpStatus.OK, "Token Exchange Success"), TOKEN_REISSUE_SUCCESS(HttpStatus.OK, "Token Reissue Success"), LOGOUT_SUCCESS(HttpStatus.OK, "Logout Success"), + + // user + USER_ONBOARDING_SUCCESS(HttpStatus.OK, "User Onboarding Success"), ; private final HttpStatus httpStatus; diff --git a/src/main/java/com/cheeeese/user/application/UserService.java b/src/main/java/com/cheeeese/user/application/UserService.java new file mode 100644 index 0000000..c4f3bc8 --- /dev/null +++ b/src/main/java/com/cheeeese/user/application/UserService.java @@ -0,0 +1,21 @@ +package com.cheeeese.user.application; + +import com.cheeeese.user.domain.User; +import com.cheeeese.user.dto.request.UserOnboardingRequest; +import com.cheeeese.user.infrastructure.persistence.UserRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class UserService { + + private final UserRepository userRepository; + + @Transactional + public void saveUserOnboarding(User user, UserOnboardingRequest request) { + user.saveUserOnboarding(request.name()); + } +} diff --git a/src/main/java/com/cheeeese/user/domain/User.java b/src/main/java/com/cheeeese/user/domain/User.java index a6d8b05..13aca92 100644 --- a/src/main/java/com/cheeeese/user/domain/User.java +++ b/src/main/java/com/cheeeese/user/domain/User.java @@ -76,4 +76,8 @@ private User( this.photoCnt = photoCnt; this.likesCnt = likesCnt; } + + public void saveUserOnboarding(String name) { + this.name = name; + } } diff --git a/src/main/java/com/cheeeese/user/dto/request/UserOnboardingRequest.java b/src/main/java/com/cheeeese/user/dto/request/UserOnboardingRequest.java new file mode 100644 index 0000000..abb495e --- /dev/null +++ b/src/main/java/com/cheeeese/user/dto/request/UserOnboardingRequest.java @@ -0,0 +1,9 @@ +package com.cheeeese.user.dto.request; + +import lombok.Builder; + +@Builder +public record UserOnboardingRequest( + String name +) { +} diff --git a/src/main/java/com/cheeeese/user/presentation/UserController.java b/src/main/java/com/cheeeese/user/presentation/UserController.java new file mode 100644 index 0000000..81c7468 --- /dev/null +++ b/src/main/java/com/cheeeese/user/presentation/UserController.java @@ -0,0 +1,32 @@ +package com.cheeeese.user.presentation; + +import com.cheeeese.global.common.CommonResponse; +import com.cheeeese.global.util.CurrentUser; +import com.cheeeese.user.application.UserService; +import com.cheeeese.user.domain.User; +import com.cheeeese.user.dto.request.UserOnboardingRequest; +import io.swagger.v3.oas.annotations.parameters.RequestBody; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import static com.cheeeese.global.common.code.SuccessCode.USER_ONBOARDING_SUCCESS; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/v1/user") +public class UserController { + + private final UserService userService; + + @PostMapping("/onboarding") + public CommonResponse saveUserOnboarding( + @CurrentUser User user, + @RequestBody @Valid UserOnboardingRequest request + ) { + userService.saveUserOnboarding(user, request); + return CommonResponse.success(USER_ONBOARDING_SUCCESS); + } +} From 47d2a2c9a07eda25fdb5d5c72ee9524db45a0d81 Mon Sep 17 00:00:00 2001 From: zyovn Date: Mon, 13 Oct 2025 12:17:44 +0900 Subject: [PATCH 063/402] =?UTF-8?q?#10=20feat:=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=9E=90=20=EC=9D=B4=EC=9A=A9=EC=95=BD=EA=B4=80=20=EB=8F=99?= =?UTF-8?q?=EC=9D=98=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cheeeese/global/common/code/SuccessCode.java | 1 + .../com/cheeeese/user/application/UserService.java | 11 +++++++++++ src/main/java/com/cheeeese/user/domain/User.java | 12 ++++++++++++ .../user/dto/request/UserAgreementRequest.java | 12 ++++++++++++ .../cheeeese/user/presentation/UserController.java | 11 +++++++++++ 5 files changed, 47 insertions(+) create mode 100644 src/main/java/com/cheeeese/user/dto/request/UserAgreementRequest.java diff --git a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java index 0243d47..4d11bdf 100644 --- a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java +++ b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java @@ -18,6 +18,7 @@ public enum SuccessCode implements BaseCode { // user USER_ONBOARDING_SUCCESS(HttpStatus.OK, "User Onboarding Success"), + USER_AGREEMENT_SUCCESS(HttpStatus.OK, "User Agreement Success"), ; private final HttpStatus httpStatus; diff --git a/src/main/java/com/cheeeese/user/application/UserService.java b/src/main/java/com/cheeeese/user/application/UserService.java index c4f3bc8..aa226cf 100644 --- a/src/main/java/com/cheeeese/user/application/UserService.java +++ b/src/main/java/com/cheeeese/user/application/UserService.java @@ -1,6 +1,7 @@ package com.cheeeese.user.application; import com.cheeeese.user.domain.User; +import com.cheeeese.user.dto.request.UserAgreementRequest; import com.cheeeese.user.dto.request.UserOnboardingRequest; import com.cheeeese.user.infrastructure.persistence.UserRepository; import lombok.RequiredArgsConstructor; @@ -18,4 +19,14 @@ public class UserService { public void saveUserOnboarding(User user, UserOnboardingRequest request) { user.saveUserOnboarding(request.name()); } + + @Transactional + public void saveUserAgreement(User user, UserAgreementRequest request) { + user.saveUserAgreement( + true, + true, + request.isMarketingAgreement(), + request.isThirdPartyAgreement() + ); + } } diff --git a/src/main/java/com/cheeeese/user/domain/User.java b/src/main/java/com/cheeeese/user/domain/User.java index 13aca92..3e7961f 100644 --- a/src/main/java/com/cheeeese/user/domain/User.java +++ b/src/main/java/com/cheeeese/user/domain/User.java @@ -80,4 +80,16 @@ private User( public void saveUserOnboarding(String name) { this.name = name; } + + public void saveUserAgreement( + boolean isServiceAgreement, + boolean isUserInfoAgreement, + boolean isMarketingAgreement, + boolean isThirdPartyAgreement + ) { + this.isServiceAgreement = isServiceAgreement; + this.isUserInfoAgreement = isUserInfoAgreement; + this.isMarketingAgreement = isMarketingAgreement; + this.isThirdPartyAgreement = isThirdPartyAgreement; + } } diff --git a/src/main/java/com/cheeeese/user/dto/request/UserAgreementRequest.java b/src/main/java/com/cheeeese/user/dto/request/UserAgreementRequest.java new file mode 100644 index 0000000..9110444 --- /dev/null +++ b/src/main/java/com/cheeeese/user/dto/request/UserAgreementRequest.java @@ -0,0 +1,12 @@ +package com.cheeeese.user.dto.request; + +import lombok.Builder; + +@Builder +public record UserAgreementRequest( + boolean isServiceAgreement, + boolean isUserInfoAgreement, + boolean isMarketingAgreement, + boolean isThirdPartyAgreement +) { +} diff --git a/src/main/java/com/cheeeese/user/presentation/UserController.java b/src/main/java/com/cheeeese/user/presentation/UserController.java index 81c7468..f369d93 100644 --- a/src/main/java/com/cheeeese/user/presentation/UserController.java +++ b/src/main/java/com/cheeeese/user/presentation/UserController.java @@ -4,6 +4,7 @@ import com.cheeeese.global.util.CurrentUser; import com.cheeeese.user.application.UserService; import com.cheeeese.user.domain.User; +import com.cheeeese.user.dto.request.UserAgreementRequest; import com.cheeeese.user.dto.request.UserOnboardingRequest; import io.swagger.v3.oas.annotations.parameters.RequestBody; import jakarta.validation.Valid; @@ -12,6 +13,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import static com.cheeeese.global.common.code.SuccessCode.USER_AGREEMENT_SUCCESS; import static com.cheeeese.global.common.code.SuccessCode.USER_ONBOARDING_SUCCESS; @RestController @@ -29,4 +31,13 @@ public CommonResponse saveUserOnboarding( userService.saveUserOnboarding(user, request); return CommonResponse.success(USER_ONBOARDING_SUCCESS); } + + @PostMapping("/agreement") + public CommonResponse saveUserAgreement( + @CurrentUser User user, + @RequestBody @Valid UserAgreementRequest request + ) { + userService.saveUserAgreement(user, request); + return CommonResponse.success(USER_AGREEMENT_SUCCESS); + } } From 64a813474c190aad877b65e78e4fe7ce3b60c40a Mon Sep 17 00:00:00 2001 From: zyovn Date: Mon, 13 Oct 2025 12:23:51 +0900 Subject: [PATCH 064/402] =?UTF-8?q?#10=20refactor:=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=9E=90=20=EC=9D=B4=EC=9A=A9=20=EC=95=BD=EA=B4=80=20=EB=8F=99?= =?UTF-8?q?=EC=9D=98=20=EC=84=B1=EA=B3=B5=20=EC=BD=94=EB=93=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cheeeese/global/common/code/SuccessCode.java | 2 +- .../java/com/cheeeese/user/presentation/UserController.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java index 4d11bdf..4a81265 100644 --- a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java +++ b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java @@ -18,7 +18,7 @@ public enum SuccessCode implements BaseCode { // user USER_ONBOARDING_SUCCESS(HttpStatus.OK, "User Onboarding Success"), - USER_AGREEMENT_SUCCESS(HttpStatus.OK, "User Agreement Success"), + USER_AGREEMENT_ACCEPT_SUCCESS(HttpStatus.OK, "User Agreement Accept Success"), ; private final HttpStatus httpStatus; diff --git a/src/main/java/com/cheeeese/user/presentation/UserController.java b/src/main/java/com/cheeeese/user/presentation/UserController.java index f369d93..cfd7846 100644 --- a/src/main/java/com/cheeeese/user/presentation/UserController.java +++ b/src/main/java/com/cheeeese/user/presentation/UserController.java @@ -13,7 +13,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import static com.cheeeese.global.common.code.SuccessCode.USER_AGREEMENT_SUCCESS; +import static com.cheeeese.global.common.code.SuccessCode.USER_AGREEMENT_ACCEPT_SUCCESS; import static com.cheeeese.global.common.code.SuccessCode.USER_ONBOARDING_SUCCESS; @RestController @@ -38,6 +38,6 @@ public CommonResponse saveUserAgreement( @RequestBody @Valid UserAgreementRequest request ) { userService.saveUserAgreement(user, request); - return CommonResponse.success(USER_AGREEMENT_SUCCESS); + return CommonResponse.success(USER_AGREEMENT_ACCEPT_SUCCESS); } } From 0da19f815fb0b4e8acfacfff4b9032457cb6e5c6 Mon Sep 17 00:00:00 2001 From: zyovn Date: Mon, 13 Oct 2025 12:57:35 +0900 Subject: [PATCH 065/402] =?UTF-8?q?#10=20fix:=20=EC=98=A8=EB=B3=B4?= =?UTF-8?q?=EB=94=A9=20API=20->=20=EC=82=AC=EC=9A=A9=EC=9E=90=20=ED=94=84?= =?UTF-8?q?=EB=A1=9C=ED=95=84=20=EC=88=98=EC=A0=95=20API=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cheeeese/global/common/code/SuccessCode.java | 2 +- .../com/cheeeese/user/application/UserService.java | 6 +++--- src/main/java/com/cheeeese/user/domain/User.java | 2 +- ...oardingRequest.java => UserProfileRequest.java} | 2 +- .../cheeeese/user/presentation/UserController.java | 14 +++++++------- 5 files changed, 13 insertions(+), 13 deletions(-) rename src/main/java/com/cheeeese/user/dto/request/{UserOnboardingRequest.java => UserProfileRequest.java} (72%) diff --git a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java index 4a81265..cb2cae5 100644 --- a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java +++ b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java @@ -17,7 +17,7 @@ public enum SuccessCode implements BaseCode { LOGOUT_SUCCESS(HttpStatus.OK, "Logout Success"), // user - USER_ONBOARDING_SUCCESS(HttpStatus.OK, "User Onboarding Success"), + USER_PROFILE_UPDATE_SUCCESS(HttpStatus.OK, "User Profile Update Success"), USER_AGREEMENT_ACCEPT_SUCCESS(HttpStatus.OK, "User Agreement Accept Success"), ; diff --git a/src/main/java/com/cheeeese/user/application/UserService.java b/src/main/java/com/cheeeese/user/application/UserService.java index aa226cf..c717819 100644 --- a/src/main/java/com/cheeeese/user/application/UserService.java +++ b/src/main/java/com/cheeeese/user/application/UserService.java @@ -2,7 +2,7 @@ import com.cheeeese.user.domain.User; import com.cheeeese.user.dto.request.UserAgreementRequest; -import com.cheeeese.user.dto.request.UserOnboardingRequest; +import com.cheeeese.user.dto.request.UserProfileRequest; import com.cheeeese.user.infrastructure.persistence.UserRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -16,8 +16,8 @@ public class UserService { private final UserRepository userRepository; @Transactional - public void saveUserOnboarding(User user, UserOnboardingRequest request) { - user.saveUserOnboarding(request.name()); + public void updateUserProfile(User user, UserProfileRequest request) { + user.updateUserProfile(request.name()); } @Transactional diff --git a/src/main/java/com/cheeeese/user/domain/User.java b/src/main/java/com/cheeeese/user/domain/User.java index 3e7961f..1da841e 100644 --- a/src/main/java/com/cheeeese/user/domain/User.java +++ b/src/main/java/com/cheeeese/user/domain/User.java @@ -77,7 +77,7 @@ private User( this.likesCnt = likesCnt; } - public void saveUserOnboarding(String name) { + public void updateUserProfile(String name) { this.name = name; } diff --git a/src/main/java/com/cheeeese/user/dto/request/UserOnboardingRequest.java b/src/main/java/com/cheeeese/user/dto/request/UserProfileRequest.java similarity index 72% rename from src/main/java/com/cheeeese/user/dto/request/UserOnboardingRequest.java rename to src/main/java/com/cheeeese/user/dto/request/UserProfileRequest.java index abb495e..080388a 100644 --- a/src/main/java/com/cheeeese/user/dto/request/UserOnboardingRequest.java +++ b/src/main/java/com/cheeeese/user/dto/request/UserProfileRequest.java @@ -3,7 +3,7 @@ import lombok.Builder; @Builder -public record UserOnboardingRequest( +public record UserProfileRequest( String name ) { } diff --git a/src/main/java/com/cheeeese/user/presentation/UserController.java b/src/main/java/com/cheeeese/user/presentation/UserController.java index cfd7846..81a8bb2 100644 --- a/src/main/java/com/cheeeese/user/presentation/UserController.java +++ b/src/main/java/com/cheeeese/user/presentation/UserController.java @@ -5,7 +5,7 @@ import com.cheeeese.user.application.UserService; import com.cheeeese.user.domain.User; import com.cheeeese.user.dto.request.UserAgreementRequest; -import com.cheeeese.user.dto.request.UserOnboardingRequest; +import com.cheeeese.user.dto.request.UserProfileRequest; import io.swagger.v3.oas.annotations.parameters.RequestBody; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; @@ -14,7 +14,7 @@ import org.springframework.web.bind.annotation.RestController; import static com.cheeeese.global.common.code.SuccessCode.USER_AGREEMENT_ACCEPT_SUCCESS; -import static com.cheeeese.global.common.code.SuccessCode.USER_ONBOARDING_SUCCESS; +import static com.cheeeese.global.common.code.SuccessCode.USER_PROFILE_UPDATE_SUCCESS; @RestController @RequiredArgsConstructor @@ -23,13 +23,13 @@ public class UserController { private final UserService userService; - @PostMapping("/onboarding") - public CommonResponse saveUserOnboarding( + @PostMapping("/me/profile") + public CommonResponse updateUserProfile( @CurrentUser User user, - @RequestBody @Valid UserOnboardingRequest request + @RequestBody @Valid UserProfileRequest request ) { - userService.saveUserOnboarding(user, request); - return CommonResponse.success(USER_ONBOARDING_SUCCESS); + userService.updateUserProfile(user, request); + return CommonResponse.success(USER_PROFILE_UPDATE_SUCCESS); } @PostMapping("/agreement") From 56d7e53e88321d158833496de9b9ba40be114662 Mon Sep 17 00:00:00 2001 From: zyovn Date: Mon, 13 Oct 2025 13:04:40 +0900 Subject: [PATCH 066/402] =?UTF-8?q?#10=20feat:=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=9E=90=20=EC=9D=B4=EC=9A=A9=EC=95=BD=EA=B4=80=20=EB=8F=99?= =?UTF-8?q?=EC=9D=98=20API=20=EC=98=88=EC=99=B8=20=EC=B2=98=EB=A6=AC=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cheeeese/user/application/UserService.java | 5 ++++- .../application/validator/UserValidator.java | 16 ++++++++++++++++ .../user/exception/code/UserErrorCode.java | 1 + 3 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/cheeeese/user/application/validator/UserValidator.java diff --git a/src/main/java/com/cheeeese/user/application/UserService.java b/src/main/java/com/cheeeese/user/application/UserService.java index c717819..2293272 100644 --- a/src/main/java/com/cheeeese/user/application/UserService.java +++ b/src/main/java/com/cheeeese/user/application/UserService.java @@ -1,5 +1,6 @@ package com.cheeeese.user.application; +import com.cheeeese.user.application.validator.UserValidator; import com.cheeeese.user.domain.User; import com.cheeeese.user.dto.request.UserAgreementRequest; import com.cheeeese.user.dto.request.UserProfileRequest; @@ -13,7 +14,7 @@ @Transactional(readOnly = true) public class UserService { - private final UserRepository userRepository; + private final UserValidator userValidator; @Transactional public void updateUserProfile(User user, UserProfileRequest request) { @@ -22,6 +23,8 @@ public void updateUserProfile(User user, UserProfileRequest request) { @Transactional public void saveUserAgreement(User user, UserAgreementRequest request) { + userValidator.validateUserAgreement(request); + user.saveUserAgreement( true, true, diff --git a/src/main/java/com/cheeeese/user/application/validator/UserValidator.java b/src/main/java/com/cheeeese/user/application/validator/UserValidator.java new file mode 100644 index 0000000..2f931a7 --- /dev/null +++ b/src/main/java/com/cheeeese/user/application/validator/UserValidator.java @@ -0,0 +1,16 @@ +package com.cheeeese.user.application.validator; + +import com.cheeeese.user.dto.request.UserAgreementRequest; +import com.cheeeese.user.exception.UserException; +import com.cheeeese.user.exception.code.UserErrorCode; +import org.springframework.stereotype.Component; + +@Component +public class UserValidator { + + public void validateUserAgreement(UserAgreementRequest request) { + if (!request.isServiceAgreement() || !request.isUserInfoAgreement()) { + throw new UserException(UserErrorCode.REQUIRED_TERMS_NOT_AGREED); + } + } +} diff --git a/src/main/java/com/cheeeese/user/exception/code/UserErrorCode.java b/src/main/java/com/cheeeese/user/exception/code/UserErrorCode.java index bfcf1fc..a98d1ea 100644 --- a/src/main/java/com/cheeeese/user/exception/code/UserErrorCode.java +++ b/src/main/java/com/cheeeese/user/exception/code/UserErrorCode.java @@ -10,6 +10,7 @@ public enum UserErrorCode implements BaseCode { USER_NOT_FOUND(HttpStatus.NOT_FOUND, "존재하지 않는 사용자입니다."), + REQUIRED_TERMS_NOT_AGREED(HttpStatus.BAD_REQUEST, "필수 약관에 동의하지 않았습니다."), ; private final HttpStatus httpStatus; From ba589640f68ed1d9939147ef544dec4aa3c82be5 Mon Sep 17 00:00:00 2001 From: zyovn Date: Mon, 13 Oct 2025 13:05:15 +0900 Subject: [PATCH 067/402] =?UTF-8?q?#10=20chore:=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20import=EB=AC=B8=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/cheeeese/user/application/UserService.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/cheeeese/user/application/UserService.java b/src/main/java/com/cheeeese/user/application/UserService.java index 2293272..6271cb0 100644 --- a/src/main/java/com/cheeeese/user/application/UserService.java +++ b/src/main/java/com/cheeeese/user/application/UserService.java @@ -4,7 +4,6 @@ import com.cheeeese.user.domain.User; import com.cheeeese.user.dto.request.UserAgreementRequest; import com.cheeeese.user.dto.request.UserProfileRequest; -import com.cheeeese.user.infrastructure.persistence.UserRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; From 9486a1fd65793d39a7143821a0e2a3aa971953bf Mon Sep 17 00:00:00 2001 From: zyovn Date: Mon, 13 Oct 2025 14:14:59 +0900 Subject: [PATCH 068/402] =?UTF-8?q?#10=20docs:=20swagger=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/request/UserAgreementRequest.java | 29 ++++++++-- .../user/dto/request/UserProfileRequest.java | 3 + .../user/presentation/UserController.java | 5 +- .../presentation/swagger/UserSwagger.java | 57 +++++++++++++++++++ 4 files changed, 89 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/cheeeese/user/presentation/swagger/UserSwagger.java diff --git a/src/main/java/com/cheeeese/user/dto/request/UserAgreementRequest.java b/src/main/java/com/cheeeese/user/dto/request/UserAgreementRequest.java index 9110444..eb76dce 100644 --- a/src/main/java/com/cheeeese/user/dto/request/UserAgreementRequest.java +++ b/src/main/java/com/cheeeese/user/dto/request/UserAgreementRequest.java @@ -1,12 +1,33 @@ package com.cheeeese.user.dto.request; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Builder; @Builder +@Schema(description = "사용자 이용 약관 API") public record UserAgreementRequest( - boolean isServiceAgreement, - boolean isUserInfoAgreement, - boolean isMarketingAgreement, - boolean isThirdPartyAgreement + @Schema( + description = "서비스 이용 약관 동의", + example = "true" + ) + Boolean isServiceAgreement, + + @Schema( + description = "사용자 정보 수집 동의", + example = "true" + ) + Boolean isUserInfoAgreement, + + @Schema( + description = "마케팅 수신 동의", + example = "false" + ) + Boolean isMarketingAgreement, + + @Schema( + description = "제3자 제공 동의", + example = "false" + ) + Boolean isThirdPartyAgreement ) { } diff --git a/src/main/java/com/cheeeese/user/dto/request/UserProfileRequest.java b/src/main/java/com/cheeeese/user/dto/request/UserProfileRequest.java index 080388a..0d0ee21 100644 --- a/src/main/java/com/cheeeese/user/dto/request/UserProfileRequest.java +++ b/src/main/java/com/cheeeese/user/dto/request/UserProfileRequest.java @@ -1,9 +1,12 @@ package com.cheeeese.user.dto.request; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Builder; @Builder +@Schema(description = "사용자 프로필 수정 API") public record UserProfileRequest( + @Schema(description = "사용자 이름", example = "주") String name ) { } diff --git a/src/main/java/com/cheeeese/user/presentation/UserController.java b/src/main/java/com/cheeeese/user/presentation/UserController.java index 81a8bb2..ffc65da 100644 --- a/src/main/java/com/cheeeese/user/presentation/UserController.java +++ b/src/main/java/com/cheeeese/user/presentation/UserController.java @@ -6,6 +6,7 @@ import com.cheeeese.user.domain.User; import com.cheeeese.user.dto.request.UserAgreementRequest; import com.cheeeese.user.dto.request.UserProfileRequest; +import com.cheeeese.user.presentation.swagger.UserSwagger; import io.swagger.v3.oas.annotations.parameters.RequestBody; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; @@ -19,10 +20,11 @@ @RestController @RequiredArgsConstructor @RequestMapping("/v1/user") -public class UserController { +public class UserController implements UserSwagger { private final UserService userService; + @Override @PostMapping("/me/profile") public CommonResponse updateUserProfile( @CurrentUser User user, @@ -32,6 +34,7 @@ public CommonResponse updateUserProfile( return CommonResponse.success(USER_PROFILE_UPDATE_SUCCESS); } + @Override @PostMapping("/agreement") public CommonResponse saveUserAgreement( @CurrentUser User user, diff --git a/src/main/java/com/cheeeese/user/presentation/swagger/UserSwagger.java b/src/main/java/com/cheeeese/user/presentation/swagger/UserSwagger.java new file mode 100644 index 0000000..78f4ae8 --- /dev/null +++ b/src/main/java/com/cheeeese/user/presentation/swagger/UserSwagger.java @@ -0,0 +1,57 @@ +package com.cheeeese.user.presentation.swagger; + +import com.cheeeese.global.common.CommonResponse; +import com.cheeeese.global.util.CurrentUser; +import com.cheeeese.user.domain.User; +import com.cheeeese.user.dto.request.UserAgreementRequest; +import com.cheeeese.user.dto.request.UserProfileRequest; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.parameters.RequestBody; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; + +@Tag(name = "[사용자]", description = "사용자 관련 API") +public interface UserSwagger { + @Operation( + summary = "사용자 프로필 수정 API", + description = """ + ### RequestBody + --- + `name`: 사용자 이름 + """ + ) + @ApiResponses(value = { + @ApiResponse( + responseCode = "200", + description = "사용자 프로필이 성공적으로 수정되었습니다." + ) + }) + CommonResponse updateUserProfile( + @CurrentUser User user, + @RequestBody @Valid UserProfileRequest request + ); + + @Operation( + summary = "사용자 이용 약관 동의 API", + description = """ + ### RequestBody + --- + `isServiceAgreement`: 서비스 이용 약관 동의 (boolean) \n + `isUserInfoAgreement`: 사용자 정보 수집 동의 (boolean) \n + `isMarketingAgreement`: 마케팅 수신 동의 (boolean) \n + `isThirdPartyAgreement`: 제3자 제공 동의 + """ + ) + @ApiResponses(value = { + @ApiResponse( + responseCode = "200", + description = "사용자 이용 약관 동의가 성공적으로 실행되었습니다." + ) + }) + CommonResponse saveUserAgreement( + @CurrentUser User user, + @RequestBody @Valid UserAgreementRequest request + ); +} From 380ee9585514f106528ea7a88f276fae2e1aafab Mon Sep 17 00:00:00 2001 From: zyovn Date: Mon, 13 Oct 2025 14:15:18 +0900 Subject: [PATCH 069/402] =?UTF-8?q?#10=20fix:=20redisRepository=20?= =?UTF-8?q?=EC=9C=84=EC=B9=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/cheeeese/CheeeeseApplication.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/cheeeese/CheeeeseApplication.java b/src/main/java/com/cheeeese/CheeeeseApplication.java index 9617587..1910471 100644 --- a/src/main/java/com/cheeeese/CheeeeseApplication.java +++ b/src/main/java/com/cheeeese/CheeeeseApplication.java @@ -7,7 +7,7 @@ @SpringBootApplication @EnableJpaAuditing -@EnableRedisRepositories(basePackages = "com.cheeeese.oauth2.infrastructure.persistence") +@EnableRedisRepositories(basePackages = "com.cheeeese.auth.infrastructure.persistence") public class CheeeeseApplication { public static void main(String[] args) { From cca1373407cbe5dfabbe66ad2054bc782232d514 Mon Sep 17 00:00:00 2001 From: zyovn Date: Mon, 13 Oct 2025 14:16:02 +0900 Subject: [PATCH 070/402] =?UTF-8?q?#10=20fix:=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=9E=90=20=EC=9D=B4=EC=9A=A9=20=EC=95=BD=EA=B4=80=20=EB=8F=99?= =?UTF-8?q?=EC=9D=98=20=EB=B3=80=EC=88=98=20=ED=83=80=EC=9E=85=20=EB=9E=98?= =?UTF-8?q?=ED=8D=BC=20=ED=81=B4=EB=9E=98=EC=8A=A4=EB=A1=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/cheeeese/user/domain/User.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/cheeeese/user/domain/User.java b/src/main/java/com/cheeeese/user/domain/User.java index 1da841e..7913f39 100644 --- a/src/main/java/com/cheeeese/user/domain/User.java +++ b/src/main/java/com/cheeeese/user/domain/User.java @@ -82,10 +82,10 @@ public void updateUserProfile(String name) { } public void saveUserAgreement( - boolean isServiceAgreement, - boolean isUserInfoAgreement, - boolean isMarketingAgreement, - boolean isThirdPartyAgreement + Boolean isServiceAgreement, + Boolean isUserInfoAgreement, + Boolean isMarketingAgreement, + Boolean isThirdPartyAgreement ) { this.isServiceAgreement = isServiceAgreement; this.isUserInfoAgreement = isUserInfoAgreement; From 6ac0cca7c8fa022e78598b78dd66112f951fb876 Mon Sep 17 00:00:00 2001 From: zyovn Date: Mon, 13 Oct 2025 14:21:41 +0900 Subject: [PATCH 071/402] =?UTF-8?q?#10=20fix:=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=9E=90=20=ED=94=84=EB=A1=9C=ED=95=84=20=EC=88=98=EC=A0=95=20?= =?UTF-8?q?API=20POST=20->=20PATCH=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cheeeese/user/presentation/UserController.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/cheeeese/user/presentation/UserController.java b/src/main/java/com/cheeeese/user/presentation/UserController.java index ffc65da..d31add9 100644 --- a/src/main/java/com/cheeeese/user/presentation/UserController.java +++ b/src/main/java/com/cheeeese/user/presentation/UserController.java @@ -10,6 +10,7 @@ import io.swagger.v3.oas.annotations.parameters.RequestBody; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.PatchMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -25,7 +26,7 @@ public class UserController implements UserSwagger { private final UserService userService; @Override - @PostMapping("/me/profile") + @PatchMapping("/me/profile") public CommonResponse updateUserProfile( @CurrentUser User user, @RequestBody @Valid UserProfileRequest request From 6c9422d3646288051c765dd4b22564443682dd10 Mon Sep 17 00:00:00 2001 From: zyovn Date: Mon, 13 Oct 2025 19:10:42 +0900 Subject: [PATCH 072/402] =?UTF-8?q?#10=20docs:=20TODO=20=EC=A3=BC=EC=84=9D?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/cheeeese/user/application/UserService.java | 1 + .../java/com/cheeeese/user/dto/request/UserProfileRequest.java | 1 + 2 files changed, 2 insertions(+) diff --git a/src/main/java/com/cheeeese/user/application/UserService.java b/src/main/java/com/cheeeese/user/application/UserService.java index 6271cb0..f896d35 100644 --- a/src/main/java/com/cheeeese/user/application/UserService.java +++ b/src/main/java/com/cheeeese/user/application/UserService.java @@ -17,6 +17,7 @@ public class UserService { @Transactional public void updateUserProfile(User user, UserProfileRequest request) { + // TODO: 이미지 수정 추후 추가 user.updateUserProfile(request.name()); } diff --git a/src/main/java/com/cheeeese/user/dto/request/UserProfileRequest.java b/src/main/java/com/cheeeese/user/dto/request/UserProfileRequest.java index 0d0ee21..d656d02 100644 --- a/src/main/java/com/cheeeese/user/dto/request/UserProfileRequest.java +++ b/src/main/java/com/cheeeese/user/dto/request/UserProfileRequest.java @@ -8,5 +8,6 @@ public record UserProfileRequest( @Schema(description = "사용자 이름", example = "주") String name + // TODO: 이미지 수정 추후 추가 ) { } From 70f7da9c30cd12f087545155600e2cf9cc48d5b1 Mon Sep 17 00:00:00 2001 From: zyovn Date: Mon, 13 Oct 2025 20:11:33 +0900 Subject: [PATCH 073/402] =?UTF-8?q?#10=20fix:=20requestBody=20import=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cheeeese/user/presentation/UserController.java | 6 +----- .../com/cheeeese/user/presentation/swagger/UserSwagger.java | 2 +- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/cheeeese/user/presentation/UserController.java b/src/main/java/com/cheeeese/user/presentation/UserController.java index d31add9..6d89341 100644 --- a/src/main/java/com/cheeeese/user/presentation/UserController.java +++ b/src/main/java/com/cheeeese/user/presentation/UserController.java @@ -7,13 +7,9 @@ import com.cheeeese.user.dto.request.UserAgreementRequest; import com.cheeeese.user.dto.request.UserProfileRequest; import com.cheeeese.user.presentation.swagger.UserSwagger; -import io.swagger.v3.oas.annotations.parameters.RequestBody; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.PatchMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import static com.cheeeese.global.common.code.SuccessCode.USER_AGREEMENT_ACCEPT_SUCCESS; import static com.cheeeese.global.common.code.SuccessCode.USER_PROFILE_UPDATE_SUCCESS; diff --git a/src/main/java/com/cheeeese/user/presentation/swagger/UserSwagger.java b/src/main/java/com/cheeeese/user/presentation/swagger/UserSwagger.java index 78f4ae8..3551700 100644 --- a/src/main/java/com/cheeeese/user/presentation/swagger/UserSwagger.java +++ b/src/main/java/com/cheeeese/user/presentation/swagger/UserSwagger.java @@ -6,11 +6,11 @@ import com.cheeeese.user.dto.request.UserAgreementRequest; import com.cheeeese.user.dto.request.UserProfileRequest; import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.parameters.RequestBody; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; +import org.springframework.web.bind.annotation.RequestBody; @Tag(name = "[사용자]", description = "사용자 관련 API") public interface UserSwagger { From e3ab513c3b94fd0705bf079853197fe7fd7cd1ec Mon Sep 17 00:00:00 2001 From: zyovn Date: Mon, 13 Oct 2025 20:28:04 +0900 Subject: [PATCH 074/402] =?UTF-8?q?#10=20fix:=20=ED=94=BC=EB=93=9C?= =?UTF-8?q?=EB=B0=B1=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/cheeeese/user/application/UserService.java | 4 ++-- .../com/cheeeese/user/dto/request/UserAgreementRequest.java | 3 +++ .../com/cheeeese/user/presentation/swagger/UserSwagger.java | 4 ++-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/cheeeese/user/application/UserService.java b/src/main/java/com/cheeeese/user/application/UserService.java index f896d35..9041c66 100644 --- a/src/main/java/com/cheeeese/user/application/UserService.java +++ b/src/main/java/com/cheeeese/user/application/UserService.java @@ -26,8 +26,8 @@ public void saveUserAgreement(User user, UserAgreementRequest request) { userValidator.validateUserAgreement(request); user.saveUserAgreement( - true, - true, + request.isServiceAgreement(), + request.isUserInfoAgreement(), request.isMarketingAgreement(), request.isThirdPartyAgreement() ); diff --git a/src/main/java/com/cheeeese/user/dto/request/UserAgreementRequest.java b/src/main/java/com/cheeeese/user/dto/request/UserAgreementRequest.java index eb76dce..263eca2 100644 --- a/src/main/java/com/cheeeese/user/dto/request/UserAgreementRequest.java +++ b/src/main/java/com/cheeeese/user/dto/request/UserAgreementRequest.java @@ -1,17 +1,20 @@ package com.cheeeese.user.dto.request; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; import lombok.Builder; @Builder @Schema(description = "사용자 이용 약관 API") public record UserAgreementRequest( + @NotNull @Schema( description = "서비스 이용 약관 동의", example = "true" ) Boolean isServiceAgreement, + @NotNull @Schema( description = "사용자 정보 수집 동의", example = "true" diff --git a/src/main/java/com/cheeeese/user/presentation/swagger/UserSwagger.java b/src/main/java/com/cheeeese/user/presentation/swagger/UserSwagger.java index 3551700..8a69a2a 100644 --- a/src/main/java/com/cheeeese/user/presentation/swagger/UserSwagger.java +++ b/src/main/java/com/cheeeese/user/presentation/swagger/UserSwagger.java @@ -19,7 +19,7 @@ public interface UserSwagger { description = """ ### RequestBody --- - `name`: 사용자 이름 + `name`: 사용자 이름 (String) """ ) @ApiResponses(value = { @@ -41,7 +41,7 @@ CommonResponse updateUserProfile( `isServiceAgreement`: 서비스 이용 약관 동의 (boolean) \n `isUserInfoAgreement`: 사용자 정보 수집 동의 (boolean) \n `isMarketingAgreement`: 마케팅 수신 동의 (boolean) \n - `isThirdPartyAgreement`: 제3자 제공 동의 + `isThirdPartyAgreement`: 제3자 제공 동의 (boolean) """ ) @ApiResponses(value = { From 74043ed728774386b5fb3167a262802cb5304edd Mon Sep 17 00:00:00 2001 From: zyovn Date: Tue, 14 Oct 2025 00:45:48 +0900 Subject: [PATCH 075/402] =?UTF-8?q?#10=20fix:=20=ED=94=BC=EB=93=9C?= =?UTF-8?q?=EB=B0=B1=20=EB=B0=98=EC=98=81=20=EB=B0=8F=20=ED=9A=8C=EC=9B=90?= =?UTF-8?q?=EA=B0=80=EC=9E=85=20=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../userinfo/KakaoUserInfo.java | 3 +- .../java/com/cheeeese/user/domain/User.java | 40 +++++++++---------- .../dto/request/UserAgreementRequest.java | 8 ++-- 3 files changed, 26 insertions(+), 25 deletions(-) diff --git a/src/main/java/com/cheeeese/oauth2/infrastructure/userinfo/KakaoUserInfo.java b/src/main/java/com/cheeeese/oauth2/infrastructure/userinfo/KakaoUserInfo.java index c5345b0..e87b27d 100644 --- a/src/main/java/com/cheeeese/oauth2/infrastructure/userinfo/KakaoUserInfo.java +++ b/src/main/java/com/cheeeese/oauth2/infrastructure/userinfo/KakaoUserInfo.java @@ -42,7 +42,8 @@ private Map getKakaoAccount() { @SuppressWarnings("unchecked") private Map getKakaoProfile() { - Object profile = attributes.get("profile"); + Map kakaoAccount = getKakaoAccount(); + Object profile = kakaoAccount.get("profile"); if (profile instanceof Map) { return (Map) profile; } diff --git a/src/main/java/com/cheeeese/user/domain/User.java b/src/main/java/com/cheeeese/user/domain/User.java index 7913f39..e02139b 100644 --- a/src/main/java/com/cheeeese/user/domain/User.java +++ b/src/main/java/com/cheeeese/user/domain/User.java @@ -23,31 +23,31 @@ public class User extends BaseEntity { @Column(name = "email", nullable = false, unique = true) private String email; - @Column(name = "profile_image") + @Column(name = "profile_image", nullable = false) private String profileImage; @Column(name = "provider_id", nullable = false) private String providerId; - @Column(name = "is_service_agreement") - private Boolean isServiceAgreement; + @Column(name = "is_service_agreement", nullable = false) + private boolean isServiceAgreement; - @Column(name = "is_user_info_agreement") - private Boolean isUserInfoAgreement; + @Column(name = "is_user_info_agreement", nullable = false) + private boolean isUserInfoAgreement; - @Column(name = "is_marketing_agreement") - private Boolean isMarketingAgreement; + @Column(name = "is_marketing_agreement", nullable = false) + private boolean isMarketingAgreement; - @Column(name = "is_third_party_agreement") - private Boolean isThirdPartyAgreement; + @Column(name = "is_third_party_agreement", nullable = false) + private boolean isThirdPartyAgreement; - @Column(name = "album_cnt") + @Column(name = "album_cnt", nullable = false) private int albumCnt; - @Column(name = "photo_cnt") + @Column(name = "photo_cnt", nullable = false) private int photoCnt; - @Column(name = "likes_cnt") + @Column(name = "likes_cnt", nullable = false) private int likesCnt; @Builder @@ -56,10 +56,10 @@ private User( String email, String profileImage, String providerId, - Boolean isServiceAgreement, - Boolean isUserInfoAgreement, - Boolean isMarketingAgreement, - Boolean isThirdPartyAgreement, + boolean isServiceAgreement, + boolean isUserInfoAgreement, + boolean isMarketingAgreement, + boolean isThirdPartyAgreement, int albumCnt, int photoCnt, int likesCnt @@ -82,10 +82,10 @@ public void updateUserProfile(String name) { } public void saveUserAgreement( - Boolean isServiceAgreement, - Boolean isUserInfoAgreement, - Boolean isMarketingAgreement, - Boolean isThirdPartyAgreement + boolean isServiceAgreement, + boolean isUserInfoAgreement, + boolean isMarketingAgreement, + boolean isThirdPartyAgreement ) { this.isServiceAgreement = isServiceAgreement; this.isUserInfoAgreement = isUserInfoAgreement; diff --git a/src/main/java/com/cheeeese/user/dto/request/UserAgreementRequest.java b/src/main/java/com/cheeeese/user/dto/request/UserAgreementRequest.java index 263eca2..5b7f8cb 100644 --- a/src/main/java/com/cheeeese/user/dto/request/UserAgreementRequest.java +++ b/src/main/java/com/cheeeese/user/dto/request/UserAgreementRequest.java @@ -12,25 +12,25 @@ public record UserAgreementRequest( description = "서비스 이용 약관 동의", example = "true" ) - Boolean isServiceAgreement, + boolean isServiceAgreement, @NotNull @Schema( description = "사용자 정보 수집 동의", example = "true" ) - Boolean isUserInfoAgreement, + boolean isUserInfoAgreement, @Schema( description = "마케팅 수신 동의", example = "false" ) - Boolean isMarketingAgreement, + boolean isMarketingAgreement, @Schema( description = "제3자 제공 동의", example = "false" ) - Boolean isThirdPartyAgreement + boolean isThirdPartyAgreement ) { } From 2c99faa5fb2e0c3196d4a1173d5875d556c43dc4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Tue, 14 Oct 2025 02:06:03 +0900 Subject: [PATCH 076/402] =?UTF-8?q?#12=20feat:=20album=20=EC=97=94?= =?UTF-8?q?=ED=8B=B0=ED=8B=B0=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cheeeese/album/domain/Album.java | 110 ++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 src/main/java/com/cheeeese/album/domain/Album.java diff --git a/src/main/java/com/cheeeese/album/domain/Album.java b/src/main/java/com/cheeeese/album/domain/Album.java new file mode 100644 index 0000000..c1e9872 --- /dev/null +++ b/src/main/java/com/cheeeese/album/domain/Album.java @@ -0,0 +1,110 @@ +package com.cheeeese.album.domain; + +import com.cheeeese.album.exception.AlbumException; +import com.cheeeese.album.exception.code.AlbumErrorCode; +import com.cheeeese.global.domain.BaseEntity; +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.LocalDate; +import java.time.LocalDateTime; + +@Entity +@Getter +@Table(name = "album") +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class Album extends BaseEntity { + + @Id + @Column(name = "album_id", nullable = false) + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "host_id", nullable = false) + private Long hostId; + + @Column(name = "title", nullable = false) + private String title; + + @Column(name = "code", nullable = false, unique = true) + private String code; + + @Column(name = "theme_image_url") + private String themeImageUrl; + + @Column(name = "participant", nullable = false) + private int participant; + + @Column(name = "current_participant", nullable = false) + private int currentParticipant; + + @Column(name = "event_date", nullable = false) + private LocalDate eventDate; + + @Column(name = "max_photo_count", nullable = false) + private int maxPhotoCount; + + @Column(name = "current_photo_count", nullable = false) + private int currentPhotoCount = 0; + + @Column(name = "Field", nullable = false) + private boolean isInfoAvailable; + + @Column(name = "expired_at", nullable = false) + private LocalDateTime expiredAt; + + @Enumerated(EnumType.STRING) + @Column(name = "status", nullable = false) + private AlbumStatus status; + + public enum AlbumStatus { + ACTIVE, EXPIRED, DELETED + } + + public boolean isExpired() { + return this.expiredAt.isBefore(LocalDateTime.now()) || this.status == AlbumStatus.EXPIRED; + } + + public boolean isFull() { + return this.currentParticipant >= this.participant; + } + + public void incrementParticipantCount() { + if (isFull()) { + throw new AlbumException(AlbumErrorCode.ALBUM_MAX_PARTICIPANT_REACHED); + } + this.currentParticipant++; + } + + @Builder + public Album( + Long hostId, + String title, + String code, + String themeImageUrl, + int participant, + int currentParticipant, + LocalDate eventDate, + int maxPhotoCount, + int currentPhotoCount, + boolean isInfoAvailable, + LocalDateTime expiredAt, + AlbumStatus status + ) { + this.hostId = hostId; + this.title = title; + this.code = code; + this.themeImageUrl = themeImageUrl; + this.participant = participant; + this.currentParticipant = currentParticipant; + this.eventDate = eventDate; + this.maxPhotoCount = maxPhotoCount; + this.currentPhotoCount = currentPhotoCount; + this.isInfoAvailable = isInfoAvailable; + this.expiredAt = expiredAt; + this.status = status; + } +} From 3cdbea3a194324f3530f0e75de4f86f81e6e5b2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Tue, 14 Oct 2025 02:11:33 +0900 Subject: [PATCH 077/402] =?UTF-8?q?#12=20feat:=20useralbum=20=EC=97=94?= =?UTF-8?q?=ED=8B=B0=ED=8B=B0=20=EC=83=9D=EC=84=B1=20=EB=B0=8F=20role=20eu?= =?UTF-8?q?nm=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cheeeese/album/domain/UserAlbum.java | 39 +++++++++++++++++++ .../cheeeese/album/domain/UserAlbumRole.java | 7 ++++ 2 files changed, 46 insertions(+) create mode 100644 src/main/java/com/cheeeese/album/domain/UserAlbum.java create mode 100644 src/main/java/com/cheeeese/album/domain/UserAlbumRole.java diff --git a/src/main/java/com/cheeeese/album/domain/UserAlbum.java b/src/main/java/com/cheeeese/album/domain/UserAlbum.java new file mode 100644 index 0000000..055a96f --- /dev/null +++ b/src/main/java/com/cheeeese/album/domain/UserAlbum.java @@ -0,0 +1,39 @@ +package com.cheeeese.album.domain; + +import com.cheeeese.global.domain.BaseEntity; +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Getter +@Table(name = "user_album") +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class UserAlbum extends BaseEntity { + + @Id + @Column(name = "user_album_id", nullable = false) + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + // TODO: 추후 필요시 ManyToOne, JoinColumn 넣을 예정 + @Column(name = "user_id", nullable = false) + private Long userId; + + // TODO: 추후 필요시 ManyToOne, JoinColumn 넣을 예정 + @Column(name = "album_id", nullable = false) + private Long albumId; + + @Enumerated(EnumType.STRING) + @Column(name = "role", nullable = false) + private UserAlbumRole role; + + @Builder + public UserAlbum(Long userId, Long albumId, UserAlbumRole role) { + this.userId = userId; + this.albumId = albumId; + this.role = role; + } +} \ No newline at end of file diff --git a/src/main/java/com/cheeeese/album/domain/UserAlbumRole.java b/src/main/java/com/cheeeese/album/domain/UserAlbumRole.java new file mode 100644 index 0000000..acbda07 --- /dev/null +++ b/src/main/java/com/cheeeese/album/domain/UserAlbumRole.java @@ -0,0 +1,7 @@ +package com.cheeeese.album.domain; + +public enum UserAlbumRole { + HOST, + GUEST, + BLACK +} From 5e37ff52e0f3d7113c7ce36fdb0dd6fbf6535b14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Tue, 14 Oct 2025 02:23:04 +0900 Subject: [PATCH 078/402] =?UTF-8?q?#12=20feat:=20photo=20=EC=97=94?= =?UTF-8?q?=ED=8B=B0=ED=8B=B0=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cheeeese/photo/domain/Photo.java | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 src/main/java/com/cheeeese/photo/domain/Photo.java diff --git a/src/main/java/com/cheeeese/photo/domain/Photo.java b/src/main/java/com/cheeeese/photo/domain/Photo.java new file mode 100644 index 0000000..8adb91a --- /dev/null +++ b/src/main/java/com/cheeeese/photo/domain/Photo.java @@ -0,0 +1,57 @@ +package com.cheeeese.photo.domain; + +import com.cheeeese.global.domain.BaseEntity; +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@Entity +@Getter +@Table(name = "photo") +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class Photo extends BaseEntity { + + @Id + @Column(name = "photo_id", nullable = false) + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + // TODO: 추후 필요시 ManyToOne, JoinColumn 넣을 예정 + @Column(name = "user_id", nullable = false) + private Long userId; + + // TODO: 추후 필요시 ManyToOne, JoinColumn 넣을 예정 + @Column(name = "album_id", nullable = false) + private Long albumId; + + @Column(name = "image_url", nullable = false, columnDefinition = "TEXT") + private String imageUrl; + + @Column(name = "likes_cnt", nullable = false) + private int likesCnt; + + @Column(name = "capture_time", nullable = false) + private LocalDateTime captureTime; + + @Column(name = "is_deleted", nullable = false) + private boolean isDeleted; + + @Builder + public Photo( + Long userId, + Long albumId, + String imageUrl, + LocalDateTime captureTime + ) { + this.userId = userId; + this.albumId = albumId; + this.imageUrl = imageUrl; + this.captureTime = captureTime; + this.likesCnt = 0; + this.isDeleted = false; + } +} From cedebbf13b474a2faa548e45c676f146e6c1ff9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Tue, 14 Oct 2025 03:20:43 +0900 Subject: [PATCH 079/402] =?UTF-8?q?#12=20feat:=20=EC=95=A8=EB=B2=94=20?= =?UTF-8?q?=EC=B4=88=EB=8C=80=EC=9E=A5=20=EA=B8=B0=EB=B3=B8=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=20=ED=99=95=EC=9D=B8=20controller,=20swagger=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../album/presentation/AlbumController.java | 29 ++++++++++++++ .../presentation/swagger/AlbumSwagger.java | 38 +++++++++++++++++++ 2 files changed, 67 insertions(+) create mode 100644 src/main/java/com/cheeeese/album/presentation/AlbumController.java create mode 100644 src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java diff --git a/src/main/java/com/cheeeese/album/presentation/AlbumController.java b/src/main/java/com/cheeeese/album/presentation/AlbumController.java new file mode 100644 index 0000000..8c0ecca --- /dev/null +++ b/src/main/java/com/cheeeese/album/presentation/AlbumController.java @@ -0,0 +1,29 @@ +package com.cheeeese.album.presentation; + +import com.cheeeese.album.application.AlbumService; +import com.cheeeese.album.dto.response.AlbumInvitationResponse; +import com.cheeeese.album.presentation.swagger.AlbumSwagger; +import com.cheeeese.global.common.CommonResponse; + +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import static com.cheeeese.global.common.code.SuccessCode.ALBUM_INVITATION_FETCH_SUCCESS; + + +@RestController +@RequiredArgsConstructor +@RequestMapping("/v1/album") +public class AlbumController implements AlbumSwagger { + + private final AlbumService albumService; + + @Override + @GetMapping("/{code}/invitation") + public CommonResponse getInvitationInfo(@PathVariable String code) { + return CommonResponse.success(ALBUM_INVITATION_FETCH_SUCCESS, albumService.getInvitationInfo(code)); + } +} \ No newline at end of file diff --git a/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java b/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java new file mode 100644 index 0000000..ec9732e --- /dev/null +++ b/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java @@ -0,0 +1,38 @@ +package com.cheeeese.album.presentation.swagger; + +import com.cheeeese.album.dto.response.AlbumInvitationResponse; +import com.cheeeese.global.common.CommonResponse; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.web.bind.annotation.PathVariable; + +@Tag(name = "[앨범]", description = "앨범 관련 API") +public interface AlbumSwagger { + @Operation( + summary = "앨범 초대장 기본 정보 확인 API (로그인 불필요)", + description = """ + ### RequestParam + --- + `code`: 앨범 입장 code + --- + ### API 설명 + --- + URL/QR을 통해 앨범 코드를 전달 받아 제목, 만료일, 호스트 등 기본 정보를 제공합니다. 로그인 여부와 관계없이 호출 가능 + """ + ) + @ApiResponses(value = { + @ApiResponse( + responseCode = "200", + description = "초대장 정보 조회가 성공적으로 실행되었습니다." + ), + @ApiResponse( + responseCode = "404", + description = "존재하지 않거나 유효하지 않은 앨범 코드입니다." + ) + }) + CommonResponse getInvitationInfo( + @PathVariable String code + ); +} \ No newline at end of file From 347f8b3c0943ce143d7e4fb501a0e8b54e17e41d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Tue, 14 Oct 2025 03:23:53 +0900 Subject: [PATCH 080/402] =?UTF-8?q?#12=20feat:=20=EC=95=A8=EB=B2=94=20?= =?UTF-8?q?=EC=B4=88=EB=8C=80=EC=9E=A5=20=EA=B8=B0=EB=B3=B8=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=20=ED=99=95=EC=9D=B8=20response?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/response/AlbumInvitationResponse.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 src/main/java/com/cheeeese/album/dto/response/AlbumInvitationResponse.java diff --git a/src/main/java/com/cheeeese/album/dto/response/AlbumInvitationResponse.java b/src/main/java/com/cheeeese/album/dto/response/AlbumInvitationResponse.java new file mode 100644 index 0000000..4274f85 --- /dev/null +++ b/src/main/java/com/cheeeese/album/dto/response/AlbumInvitationResponse.java @@ -0,0 +1,26 @@ +package com.cheeeese.album.dto.response; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Builder; + +import java.time.LocalDateTime; + +@Builder +@Schema(description = "앨범 초대장 확인 응답 DTO") +public record AlbumInvitationResponse( + @Schema(description = "앨범 제목", example = "경영학부 졸업식") + String title, + + @Schema(description = "이벤트 날짜", example = "2025-02-26") + String eventDate, + + @Schema(description = "열람 종료 시각 (만료일)", example = "2025-03-05T00:00:00") + LocalDateTime expiredAt, + + @Schema(description = "호스트 이름", example = "이유") + String hostName, + + @Schema(description = "호스트 프로필 이미지 URL", example = "http://example.com/host_profile.png") + String hostProfileImage +) { +} \ No newline at end of file From 3825103fca721be6e6b626780e244584e3fce59a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Tue, 14 Oct 2025 03:33:12 +0900 Subject: [PATCH 081/402] =?UTF-8?q?#12=20feat:=20=EC=95=A8=EB=B2=94=20?= =?UTF-8?q?=EC=B4=88=EB=8C=80=EC=9E=A5=20=EC=A0=95=EB=B3=B4=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20=EC=84=9C=EB=B9=84=EC=8A=A4=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../album/application/AlbumService.java | 33 +++++++++++++++++++ .../application/validator/AlbumValidator.java | 26 +++++++++++++++ .../infrastructure/mapper/AlbumMapper.java | 21 ++++++++++++ .../persistence/AlbumRepository.java | 10 ++++++ 4 files changed, 90 insertions(+) create mode 100644 src/main/java/com/cheeeese/album/application/AlbumService.java create mode 100644 src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java create mode 100644 src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java create mode 100644 src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumRepository.java diff --git a/src/main/java/com/cheeeese/album/application/AlbumService.java b/src/main/java/com/cheeeese/album/application/AlbumService.java new file mode 100644 index 0000000..7e97637 --- /dev/null +++ b/src/main/java/com/cheeeese/album/application/AlbumService.java @@ -0,0 +1,33 @@ +package com.cheeeese.album.application; + +import com.cheeeese.album.application.validator.AlbumValidator; +import com.cheeeese.album.domain.Album; +import com.cheeeese.album.dto.response.AlbumInvitationResponse; +import com.cheeeese.album.infrastructure.mapper.AlbumMapper; +import com.cheeeese.user.domain.User; +import com.cheeeese.user.exception.UserException; +import com.cheeeese.user.exception.code.UserErrorCode; +import com.cheeeese.user.infrastructure.persistence.UserRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class AlbumService { + + private final AlbumValidator albumValidator; + private final UserRepository userRepository; + + public AlbumInvitationResponse getInvitationInfo(String code) { + Album album = albumValidator.validateAlbumCode(code); + + albumValidator.validateAlbumExpiration(album); + + User host = userRepository.findById(album.getHostId()) + .orElseThrow(() -> new UserException(UserErrorCode.USER_NOT_FOUND)); + + return AlbumMapper.toInvitationResponse(album, host); + } +} diff --git a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java new file mode 100644 index 0000000..1eb4730 --- /dev/null +++ b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java @@ -0,0 +1,26 @@ +package com.cheeeese.album.application.validator; + +import com.cheeeese.album.domain.Album; +import com.cheeeese.album.exception.AlbumException; +import com.cheeeese.album.exception.code.AlbumErrorCode; +import com.cheeeese.album.infrastructure.persistence.AlbumRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class AlbumValidator { + + private final AlbumRepository albumRepository; + + public Album validateAlbumCode(String code) { + return albumRepository.findByCode(code) + .orElseThrow(() -> new AlbumException(AlbumErrorCode.ALBUM_NOT_FOUND)); + } + + public void validateAlbumExpiration(Album album) { + if (album.isExpired()) { + throw new AlbumException(AlbumErrorCode.ALBUM_EXPIRED); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java new file mode 100644 index 0000000..101c001 --- /dev/null +++ b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java @@ -0,0 +1,21 @@ +package com.cheeeese.album.infrastructure.mapper; + +import com.cheeeese.album.domain.Album; +import com.cheeeese.album.dto.response.AlbumInvitationResponse; +import com.cheeeese.user.domain.User; + +public class AlbumMapper { + + /** + * Album 엔티티와 Host User 정보를 초대장 응답 DTO로 변환합니다. + */ + public static AlbumInvitationResponse toInvitationResponse(Album album, User host) { + return AlbumInvitationResponse.builder() + .title(album.getTitle()) + .eventDate(album.getEventDate().toString()) + .expiredAt(album.getExpiredAt()) + .hostName(host.getName()) + .hostProfileImage(host.getProfileImage()) + .build(); + } +} \ No newline at end of file diff --git a/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumRepository.java b/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumRepository.java new file mode 100644 index 0000000..1507a31 --- /dev/null +++ b/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumRepository.java @@ -0,0 +1,10 @@ +package com.cheeeese.album.infrastructure.persistence; + +import com.cheeeese.album.domain.Album; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; + +public interface AlbumRepository extends JpaRepository { + Optional findByCode(String code); +} From 31036336bbf952e54364870f80c04ae77d14bace Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Tue, 14 Oct 2025 03:37:40 +0900 Subject: [PATCH 082/402] =?UTF-8?q?#12=20chore:=20swagger=20=EC=98=A4?= =?UTF-8?q?=ED=83=80=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cheeeese/album/presentation/swagger/AlbumSwagger.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java b/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java index ec9732e..cdafdc8 100644 --- a/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java +++ b/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java @@ -13,10 +13,12 @@ public interface AlbumSwagger { @Operation( summary = "앨범 초대장 기본 정보 확인 API (로그인 불필요)", description = """ - ### RequestParam - --- - `code`: 앨범 입장 code + ### PathVariable --- + `code`: 앨범 접근 코드 (URL의 일부) + +
+ ### API 설명 --- URL/QR을 통해 앨범 코드를 전달 받아 제목, 만료일, 호스트 등 기본 정보를 제공합니다. 로그인 여부와 관계없이 호출 가능 From 810ffd55d215d455b373d5f90d3ef4077f0b4825 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Tue, 14 Oct 2025 12:44:11 +0900 Subject: [PATCH 083/402] =?UTF-8?q?#12=20feat:=20=EC=95=A8=EB=B2=94=20?= =?UTF-8?q?=EC=B4=88=EB=8C=80=EC=9E=A5=20=ED=99=95=EC=9D=B8=20response?= =?UTF-8?q?=EC=97=90=20=ED=85=8C=EB=A7=88=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20?= =?UTF-8?q?url=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cheeeese/album/dto/response/AlbumInvitationResponse.java | 3 +++ .../com/cheeeese/album/infrastructure/mapper/AlbumMapper.java | 1 + 2 files changed, 4 insertions(+) diff --git a/src/main/java/com/cheeeese/album/dto/response/AlbumInvitationResponse.java b/src/main/java/com/cheeeese/album/dto/response/AlbumInvitationResponse.java index 4274f85..799f972 100644 --- a/src/main/java/com/cheeeese/album/dto/response/AlbumInvitationResponse.java +++ b/src/main/java/com/cheeeese/album/dto/response/AlbumInvitationResponse.java @@ -11,6 +11,9 @@ public record AlbumInvitationResponse( @Schema(description = "앨범 제목", example = "경영학부 졸업식") String title, + @Schema(description = "앨범 테마 이미지 URL", example = "http://example.com/theme.jpg") + String themeImageUrl, + @Schema(description = "이벤트 날짜", example = "2025-02-26") String eventDate, diff --git a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java index 101c001..b06b62f 100644 --- a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java +++ b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java @@ -12,6 +12,7 @@ public class AlbumMapper { public static AlbumInvitationResponse toInvitationResponse(Album album, User host) { return AlbumInvitationResponse.builder() .title(album.getTitle()) + .themeImageUrl(album.getThemeImageUrl()) .eventDate(album.getEventDate().toString()) .expiredAt(album.getExpiredAt()) .hostName(host.getName()) From e5694342e2d649f6024135ed85939de3f50e90e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Tue, 14 Oct 2025 13:41:44 +0900 Subject: [PATCH 084/402] =?UTF-8?q?#12=20feat:=20=EC=95=A8=EB=B2=94=20?= =?UTF-8?q?=EC=9E=85=EC=9E=A5=20=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../album/application/AlbumService.java | 77 +++++++++++++ .../application/validator/AlbumValidator.java | 22 ++++ .../dto/response/AlbumEnterResponse.java | 66 +++++++++++ .../infrastructure/mapper/AlbumMapper.java | 62 +++++++++++ .../album/presentation/AlbumController.java | 15 ++- .../presentation/swagger/AlbumSwagger.java | 103 +++++++++++++++++- 6 files changed, 343 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/cheeeese/album/dto/response/AlbumEnterResponse.java diff --git a/src/main/java/com/cheeeese/album/application/AlbumService.java b/src/main/java/com/cheeeese/album/application/AlbumService.java index 7e97637..7b11b37 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumService.java +++ b/src/main/java/com/cheeeese/album/application/AlbumService.java @@ -4,6 +4,13 @@ import com.cheeeese.album.domain.Album; import com.cheeeese.album.dto.response.AlbumInvitationResponse; import com.cheeeese.album.infrastructure.mapper.AlbumMapper; +import com.cheeeese.photo.domain.Photo; +import com.cheeeese.album.domain.UserAlbum; +import com.cheeeese.album.dto.response.AlbumEnterResponse; +import com.cheeeese.album.dto.response.AlbumEnterResponse.AlbumHostInfo; +import com.cheeeese.album.dto.response.AlbumEnterResponse.AlbumParticipantResponse; +import com.cheeeese.photo.infrastructure.persistence.PhotoRepository; +import com.cheeeese.album.infrastructure.persistence.UserAlbumRepository; import com.cheeeese.user.domain.User; import com.cheeeese.user.exception.UserException; import com.cheeeese.user.exception.code.UserErrorCode; @@ -12,13 +19,18 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.List; +import java.util.stream.Collectors; + @Service @RequiredArgsConstructor @Transactional(readOnly = true) public class AlbumService { private final AlbumValidator albumValidator; + private final UserAlbumRepository userAlbumRepository; private final UserRepository userRepository; + private final PhotoRepository photoRepository; public AlbumInvitationResponse getInvitationInfo(String code) { Album album = albumValidator.validateAlbumCode(code); @@ -30,4 +42,69 @@ public AlbumInvitationResponse getInvitationInfo(String code) { return AlbumMapper.toInvitationResponse(album, host); } + + @Transactional + public AlbumEnterResponse enterAlbum(String code, User currentUser) { + // 1. 앨범 유효성 검증 (존재 여부) + Album album = albumValidator.validateAlbumCode(code); + + // 2. 앨범 입장 인가 검증 (만료, 블랙리스트, 정원 초과) + albumValidator.validateAlbumEntry(album, currentUser); + + // 3. 사용자 앨범 참가 로직: 첫 입장 시 GUEST로 등록 및 참가자 수 증가 + userAlbumRepository.findByUserIdAndAlbumId(currentUser.getId(), album.getId()) + .ifPresentOrElse( + userAlbum -> { + // 이미 참가한 경우: 아무것도 하지 않음 + }, + () -> { + // 첫 입장: UserAlbum에 GUEST로 저장하고, Album 참가자 수 증가 + UserAlbum newUserAlbum = AlbumMapper.toGuestUserAlbum(currentUser, album); + userAlbumRepository.save(newUserAlbum); + album.incrementParticipantCount(); + } + ); + + // 4. 응답 DTO 생성 + return createAlbumEnterResponse(album); + } + + private AlbumEnterResponse createAlbumEnterResponse(Album album) { + Long albumId = album.getId(); + + // 1. 호스트 정보 조회 + User host = userRepository.findById(album.getHostId()) + .orElseThrow(() -> new UserException(UserErrorCode.USER_NOT_FOUND)); + + AlbumHostInfo hostInfo = AlbumMapper.toHostInfo(host); + + // 2. 총 사진 수 + // TODO: softdelete 논의 필요 + long totalPhotoCount = photoRepository.countByAlbumIdAndIsDeletedFalse(albumId); + + // 3. 참가자 정보 목록 조회 + List participantUserIds = userAlbumRepository.findAllByAlbumId(albumId).stream() + .map(UserAlbum::getUserId) + .collect(Collectors.toList()); + List participants = userRepository.findAllById(participantUserIds); + + List participantResponses = participants.stream() + .map(AlbumMapper::toParticipantResponse) + .collect(Collectors.toList()); + + // 4. 최신 사진 9장 + // TODO: 썸네일 생성 후 썸네일 이미지 제공 + List recentPhotos = photoRepository.findTop9ByAlbumIdAndIsDeletedFalseOrderByCreatedAtDesc(albumId); + List recentPhotoUrls = recentPhotos.stream() + .map(Photo::getImageUrl) + .collect(Collectors.toList()); + + return AlbumMapper.toEnterResponse( + album, + hostInfo, + totalPhotoCount, + participantResponses, + recentPhotoUrls + ); + } } diff --git a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java index 1eb4730..5cc963f 100644 --- a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java +++ b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java @@ -1,9 +1,12 @@ package com.cheeeese.album.application.validator; import com.cheeeese.album.domain.Album; +import com.cheeeese.album.domain.UserAlbumRole; import com.cheeeese.album.exception.AlbumException; import com.cheeeese.album.exception.code.AlbumErrorCode; import com.cheeeese.album.infrastructure.persistence.AlbumRepository; +import com.cheeeese.album.infrastructure.persistence.UserAlbumRepository; +import com.cheeeese.user.domain.User; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; @@ -12,6 +15,7 @@ public class AlbumValidator { private final AlbumRepository albumRepository; + private final UserAlbumRepository userAlbumRepository; public Album validateAlbumCode(String code) { return albumRepository.findByCode(code) @@ -23,4 +27,22 @@ public void validateAlbumExpiration(Album album) { throw new AlbumException(AlbumErrorCode.ALBUM_EXPIRED); } } + + public void validateAlbumEntry(Album album, User user) { + // 1. 앨범 만료 확인 + validateAlbumExpiration(album); + + // 2. 블랙리스트 확인 (권한 체크) + userAlbumRepository.findByAlbumIdAndUserIdAndRole(album.getId(), user.getId(), UserAlbumRole.BLACK) + .ifPresent(userAlbum -> { + throw new AlbumException(AlbumErrorCode.USER_IS_BLACKLISTED); + }); + + // 3. 정원 초과 확인 (신규 참여자에게만 적용) + boolean isAlreadyParticipant = userAlbumRepository.findByUserIdAndAlbumId(user.getId(), album.getId()).isPresent(); + + if (!isAlreadyParticipant && album.isFull()) { + throw new AlbumException(AlbumErrorCode.ALBUM_MAX_PARTICIPANT_REACHED); + } + } } \ No newline at end of file diff --git a/src/main/java/com/cheeeese/album/dto/response/AlbumEnterResponse.java b/src/main/java/com/cheeeese/album/dto/response/AlbumEnterResponse.java new file mode 100644 index 0000000..07a6ee3 --- /dev/null +++ b/src/main/java/com/cheeeese/album/dto/response/AlbumEnterResponse.java @@ -0,0 +1,66 @@ +package com.cheeeese.album.dto.response; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Builder; + +import java.time.LocalDateTime; +import java.util.List; + +@Builder +@Schema(description = "앨범 입장 응답 DTO") +public record AlbumEnterResponse( + @Schema(description = "앨범 제목", example = "졸업 여행 폴라로이드") + String title, + + @Schema(description = "앨범 테마 이미지 URL", example = "http://example.com/theme.jpg") + String themeImageUrl, + + @Schema(description = "이벤트 날짜", example = "2025-02-26") + String eventDate, + + @Schema(description = "열람 종료 시각 (만료일)", example = "2025-03-05T00:00:00") + LocalDateTime expiredAt, + + @Schema(description = "총 참여 가능 인원", example = "64") + Integer maxParticipantCount, + + @Schema(description = "현재 앨범 참가 인원", example = "58") + Integer currentParticipantCount, + + @Schema(description = "앨범 내 총 사진 개수", example = "150") + Long totalPhotoCount, + + @Schema(description = "앨범 최대 사진 개수", example = "1000") + Integer maxPhotoCount, + + @Schema(description = "호스트 정보") + AlbumHostInfo hostInfo, + + @Schema(description = "참가자 목록 (호스트 포함)") + List participants, + + @Schema(description = "최근 사진 미리보기 URL 목록 (최대 9개 등)") + List recentPhotoUrls +) { + @Builder + @Schema(description = "앨범 호스트 정보") + public record AlbumHostInfo( + @Schema(description = "호스트 이름", example = "주정빈") + String hostName, + + @Schema(description = "호스트 프로필 이미지 URL (이모지 포함)", example = "http://example.com/profile.png") + String hostProfileImage + ) { + } + + @Builder + @Schema(description = "앨범 참가자 정보") + public record AlbumParticipantResponse( + @Schema(description = "사용자 이름", example = "주정빈") + String name, + + @Schema(description = "사용자 프로필 이미지 URL (이모지 포함)", example = "http://example.com/profile.png") + String profileImage + ) { + } +} \ No newline at end of file diff --git a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java index b06b62f..c687f17 100644 --- a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java +++ b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java @@ -1,9 +1,16 @@ package com.cheeeese.album.infrastructure.mapper; import com.cheeeese.album.domain.Album; +import com.cheeeese.album.domain.UserAlbum; +import com.cheeeese.album.domain.UserAlbumRole; +import com.cheeeese.album.dto.response.AlbumEnterResponse; +import com.cheeeese.album.dto.response.AlbumEnterResponse.AlbumHostInfo; +import com.cheeeese.album.dto.response.AlbumEnterResponse.AlbumParticipantResponse; import com.cheeeese.album.dto.response.AlbumInvitationResponse; import com.cheeeese.user.domain.User; +import java.util.List; + public class AlbumMapper { /** @@ -19,4 +26,59 @@ public static AlbumInvitationResponse toInvitationResponse(Album album, User hos .hostProfileImage(host.getProfileImage()) .build(); } + + /** + * 앨범 입장 시 필요한 모든 정보들을 통합하여 응답 DTO로 변환합니다. + */ + public static AlbumEnterResponse toEnterResponse( + Album album, + AlbumHostInfo hostInfo, + long totalPhotoCount, + List participants, + List recentPhotoUrls + ) { + return AlbumEnterResponse.builder() + .title(album.getTitle()) + .eventDate(album.getEventDate().toString()) + .expiredAt(album.getExpiredAt()) + .maxParticipantCount(album.getParticipant()) + .currentParticipantCount(album.getCurrentParticipant()) + .hostInfo(hostInfo) + .totalPhotoCount(totalPhotoCount) + .maxPhotoCount(album.getMaxPhotoCount()) + .participants(participants) + .recentPhotoUrls(recentPhotoUrls) + .build(); + } + + /** + * 호스트 User 엔티티를 호스트 정보 응답 DTO로 변환합니다. + */ + public static AlbumHostInfo toHostInfo(User host) { + return AlbumHostInfo.builder() + .hostName(host.getName()) + .hostProfileImage(host.getProfileImage()) + .build(); + } + + /** + * User와 Album 엔티티를 기반으로 GUEST 역할의 UserAlbum 엔티티를 생성합니다. + */ + public static UserAlbum toGuestUserAlbum(User user, Album album) { + return UserAlbum.builder() + .userId(user.getId()) + .albumId(album.getId()) + .role(UserAlbumRole.GUEST) + .build(); + } + + /** + * 참가자 User 엔티티 리스트를 응답 DTO 리스트로 변환합니다. + */ + public static AlbumParticipantResponse toParticipantResponse(User user) { + return AlbumParticipantResponse.builder() + .name(user.getName()) + .profileImage(user.getProfileImage()) + .build(); + } } \ No newline at end of file diff --git a/src/main/java/com/cheeeese/album/presentation/AlbumController.java b/src/main/java/com/cheeeese/album/presentation/AlbumController.java index 8c0ecca..7597e54 100644 --- a/src/main/java/com/cheeeese/album/presentation/AlbumController.java +++ b/src/main/java/com/cheeeese/album/presentation/AlbumController.java @@ -1,16 +1,19 @@ package com.cheeeese.album.presentation; import com.cheeeese.album.application.AlbumService; +import com.cheeeese.album.dto.response.AlbumEnterResponse; import com.cheeeese.album.dto.response.AlbumInvitationResponse; import com.cheeeese.album.presentation.swagger.AlbumSwagger; import com.cheeeese.global.common.CommonResponse; - +import com.cheeeese.global.util.CurrentUser; +import com.cheeeese.user.domain.User; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import static com.cheeeese.global.common.code.SuccessCode.ALBUM_ENTER_SUCCESS; import static com.cheeeese.global.common.code.SuccessCode.ALBUM_INVITATION_FETCH_SUCCESS; @@ -26,4 +29,14 @@ public class AlbumController implements AlbumSwagger { public CommonResponse getInvitationInfo(@PathVariable String code) { return CommonResponse.success(ALBUM_INVITATION_FETCH_SUCCESS, albumService.getInvitationInfo(code)); } + + @Override + @GetMapping("/{code}/enter") + public CommonResponse enterAlbum( + @CurrentUser User user, + @PathVariable String code + ) { + AlbumEnterResponse response = albumService.enterAlbum(code, user); + return CommonResponse.success(ALBUM_ENTER_SUCCESS, response); + } } \ No newline at end of file diff --git a/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java b/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java index cdafdc8..6d98904 100644 --- a/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java +++ b/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java @@ -1,8 +1,13 @@ package com.cheeeese.album.presentation.swagger; +import com.cheeeese.album.dto.response.AlbumEnterResponse; import com.cheeeese.album.dto.response.AlbumInvitationResponse; import com.cheeeese.global.common.CommonResponse; +import com.cheeeese.global.util.CurrentUser; +import com.cheeeese.user.domain.User; import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; @@ -31,10 +36,106 @@ public interface AlbumSwagger { ), @ApiResponse( responseCode = "404", - description = "존재하지 않거나 유효하지 않은 앨범 코드입니다." + description = "존재하지 않거나 유효하지 않은 앨범 코드", + content = @Content( + mediaType = "application/json", + schema = @Schema(example = """ + { + "isSuccess": false, + "code": 404, + "message": "존재하지 않거나 유효하지 않은 앨범 코드입니다." + } + """) + ) ) }) CommonResponse getInvitationInfo( @PathVariable String code ); + + @Operation( + summary = "앨범 입장 및 정보 확인 API", + description = """ + ### PathVariable + --- + `code`: 앨범 접근 코드 (URL의 일부) + +
+ + ### 로직 상세 + --- + 1. **인증 확인**: 로그인 여부 확인 (Spring Security) + 2. **앨범 유효성 확인**: 코드 존재, 만료 여부 확인 + 3. **인가 확인**: 블랙리스트 여부 확인 + 4. **정원 확인**: 앨범 참여자 max 초과 확인 (신규 참여자만 해당) + 5. **참가 처리**: 첫 입장 시 GUEST로 등록 및 참가 인원 수 증가 + 6. **앨범 정보 반환** + """ + ) + @ApiResponses(value = { + @ApiResponse( + responseCode = "200", + description = "앨범 정보 조회가 성공적으로 실행되었습니다." + ), + @ApiResponse( + responseCode = "401", + description = "인증 실패 (로그인 필요)", + content = @Content( + mediaType = "application/json", + schema = @Schema(example = """ + { + "isSuccess": false, + "code": 401, + "message": "인증이 필요합니다." + } + """) + ) + ), + @ApiResponse( + responseCode = "404", + description = "존재하지 않거나 유효하지 않은 앨범 코드", + content = @Content( + mediaType = "application/json", + schema = @Schema(example = """ + { + "isSuccess": false, + "code": 404, + "message": "존재하지 않거나 유효하지 않은 앨범 코드입니다." + } + """) + ) + ), + @ApiResponse( + responseCode = "400", + description = "앨범 만료 또는 최대 참가 인원 초과", + content = @Content( + mediaType = "application/json", + schema = @Schema(example = """ + { + "isSuccess": false, + "code": 400, + "message": "앨범이 만료되었거나 최대 인원을 초과했습니다." + } + """) + ) + ), + @ApiResponse( + responseCode = "403", + description = "블랙리스트 사용자", + content = @Content( + mediaType = "application/json", + schema = @Schema(example = """ + { + "isSuccess": false, + "code": 403, + "message": "앨범 관리자에 의해 접근이 금지된 사용자입니다." + } + """) + ) + ) + }) + CommonResponse enterAlbum( + @CurrentUser User user, + @PathVariable String code + ); } \ No newline at end of file From 4502474fb49d7c835ad53b8cd57fc13034d90b7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Tue, 14 Oct 2025 13:42:37 +0900 Subject: [PATCH 085/402] =?UTF-8?q?#12=20feat:=20=EC=95=A8=EB=B2=94=20?= =?UTF-8?q?=EC=B4=88=EB=8C=80=20=EB=B0=8F=20=EC=9E=85=EC=9E=A5=20success,?= =?UTF-8?q?=20error=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../album/exception/AlbumException.java | 12 +++++++++++ .../album/exception/code/AlbumErrorCode.java | 20 +++++++++++++++++++ .../global/common/code/SuccessCode.java | 4 ++++ 3 files changed, 36 insertions(+) create mode 100644 src/main/java/com/cheeeese/album/exception/AlbumException.java create mode 100644 src/main/java/com/cheeeese/album/exception/code/AlbumErrorCode.java diff --git a/src/main/java/com/cheeeese/album/exception/AlbumException.java b/src/main/java/com/cheeeese/album/exception/AlbumException.java new file mode 100644 index 0000000..630fb61 --- /dev/null +++ b/src/main/java/com/cheeeese/album/exception/AlbumException.java @@ -0,0 +1,12 @@ +package com.cheeeese.album.exception; + +import com.cheeeese.album.exception.code.AlbumErrorCode; +import com.cheeeese.global.exception.BusinessException; +import lombok.Getter; + +@Getter +public class AlbumException extends BusinessException { + public AlbumException(AlbumErrorCode errorCode) { + super(errorCode); + } +} diff --git a/src/main/java/com/cheeeese/album/exception/code/AlbumErrorCode.java b/src/main/java/com/cheeeese/album/exception/code/AlbumErrorCode.java new file mode 100644 index 0000000..d28b8f2 --- /dev/null +++ b/src/main/java/com/cheeeese/album/exception/code/AlbumErrorCode.java @@ -0,0 +1,20 @@ +package com.cheeeese.album.exception.code; + +import com.cheeeese.global.common.code.BaseCode; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; + +@Getter +@RequiredArgsConstructor +public enum AlbumErrorCode implements BaseCode { + + ALBUM_NOT_FOUND(HttpStatus.NOT_FOUND, "존재하지 않거나 유효하지 않은 앨범 코드입니다."), + ALBUM_EXPIRED(HttpStatus.BAD_REQUEST, "만료된 앨범입니다."), + ALBUM_MAX_PARTICIPANT_REACHED(HttpStatus.BAD_REQUEST, "앨범의 최대 참가 인원수를 초과했습니다."), + USER_IS_BLACKLISTED(HttpStatus.FORBIDDEN, "앨범 관리자에 의해 접근이 금지된 사용자입니다."), + ; + + private final HttpStatus httpStatus; + private final String message; +} \ No newline at end of file diff --git a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java index cb2cae5..edd1e57 100644 --- a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java +++ b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java @@ -19,6 +19,10 @@ public enum SuccessCode implements BaseCode { // user USER_PROFILE_UPDATE_SUCCESS(HttpStatus.OK, "User Profile Update Success"), USER_AGREEMENT_ACCEPT_SUCCESS(HttpStatus.OK, "User Agreement Accept Success"), + + // album + ALBUM_INVITATION_FETCH_SUCCESS(HttpStatus.OK, "앨범 초대장 정보 조회가 성공적으로 완료되었습니다."), + ALBUM_ENTER_SUCCESS(HttpStatus.OK, "앨범 입장이 성공적으로 완료되었습니다."), ; private final HttpStatus httpStatus; From bef44b52e48ca5f5ca20cd490b51b926a8f8b1b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Tue, 14 Oct 2025 13:43:09 +0900 Subject: [PATCH 086/402] =?UTF-8?q?#12=20feat:=20=EC=95=A8=EB=B2=94=20?= =?UTF-8?q?=EC=B4=88=EB=8C=80=20api=20WHITE=5FLIST=EC=97=90=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/cheeeese/global/config/SecurityConfig.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/cheeeese/global/config/SecurityConfig.java b/src/main/java/com/cheeeese/global/config/SecurityConfig.java index 11c12df..76c799f 100644 --- a/src/main/java/com/cheeeese/global/config/SecurityConfig.java +++ b/src/main/java/com/cheeeese/global/config/SecurityConfig.java @@ -35,7 +35,8 @@ public class SecurityConfig { "/v1/global/health-check", "/login/oauth2/**", "/v1/auth/exchange", - "/v1/auth/reissue" + "/v1/auth/reissue", + "/v1/album/*/invitation" }; @Bean From ea6fb619f65d391ec860882536784890aaaf3a18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Tue, 14 Oct 2025 13:43:44 +0900 Subject: [PATCH 087/402] =?UTF-8?q?#12=20feat:=20photoRepository=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../infrastructure/persistence/PhotoRepository.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java diff --git a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java new file mode 100644 index 0000000..d7bc688 --- /dev/null +++ b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java @@ -0,0 +1,13 @@ +package com.cheeeese.photo.infrastructure.persistence; + +import com.cheeeese.photo.domain.Photo; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +public interface PhotoRepository extends JpaRepository { + + long countByAlbumIdAndIsDeletedFalse(Long albumId); + + List findTop9ByAlbumIdAndIsDeletedFalseOrderByCreatedAtDesc(Long albumId); +} From d7d0a6658c4523f08c3eb925f95a04fb932563b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Tue, 14 Oct 2025 13:43:53 +0900 Subject: [PATCH 088/402] =?UTF-8?q?#12=20feat:=20userAlbumRepository=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../persistence/UserAlbumRepository.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 src/main/java/com/cheeeese/album/infrastructure/persistence/UserAlbumRepository.java diff --git a/src/main/java/com/cheeeese/album/infrastructure/persistence/UserAlbumRepository.java b/src/main/java/com/cheeeese/album/infrastructure/persistence/UserAlbumRepository.java new file mode 100644 index 0000000..91e9c3e --- /dev/null +++ b/src/main/java/com/cheeeese/album/infrastructure/persistence/UserAlbumRepository.java @@ -0,0 +1,16 @@ +package com.cheeeese.album.infrastructure.persistence; + +import com.cheeeese.album.domain.UserAlbum; +import com.cheeeese.album.domain.UserAlbumRole; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; +import java.util.Optional; + +public interface UserAlbumRepository extends JpaRepository { + Optional findByUserIdAndAlbumId(Long userId, Long albumId); + + List findAllByAlbumId(Long albumId); + + Optional findByAlbumIdAndUserIdAndRole(Long albumId, Long userId, UserAlbumRole role); +} From 3c3f45951b192a3836fbea80dacab619e81eb685 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Tue, 14 Oct 2025 13:57:03 +0900 Subject: [PATCH 089/402] =?UTF-8?q?#12=20feat:=20response=EC=97=90=20?= =?UTF-8?q?=EB=88=84=EB=9D=BD=EB=90=9C=20themeImageUrl=20=ED=95=84?= =?UTF-8?q?=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cheeeese/album/infrastructure/mapper/AlbumMapper.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java index c687f17..e1ee4d5 100644 --- a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java +++ b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java @@ -39,6 +39,7 @@ public static AlbumEnterResponse toEnterResponse( ) { return AlbumEnterResponse.builder() .title(album.getTitle()) + .themeImageUrl(album.getThemeImageUrl()) .eventDate(album.getEventDate().toString()) .expiredAt(album.getExpiredAt()) .maxParticipantCount(album.getParticipant()) From 56426943cc20aca6da624f41b86b97dbe9de243b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Tue, 14 Oct 2025 13:57:35 +0900 Subject: [PATCH 090/402] =?UTF-8?q?#12=20fix:=20Photo=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20=EB=A1=9C=EC=A7=81=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../album/application/AlbumService.java | 14 ++++----- .../photo/application/PhotoService.java | 29 +++++++++++++++++++ 2 files changed, 34 insertions(+), 9 deletions(-) create mode 100644 src/main/java/com/cheeeese/photo/application/PhotoService.java diff --git a/src/main/java/com/cheeeese/album/application/AlbumService.java b/src/main/java/com/cheeeese/album/application/AlbumService.java index 7b11b37..d10664b 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumService.java +++ b/src/main/java/com/cheeeese/album/application/AlbumService.java @@ -4,12 +4,11 @@ import com.cheeeese.album.domain.Album; import com.cheeeese.album.dto.response.AlbumInvitationResponse; import com.cheeeese.album.infrastructure.mapper.AlbumMapper; -import com.cheeeese.photo.domain.Photo; +import com.cheeeese.photo.application.PhotoService; import com.cheeeese.album.domain.UserAlbum; import com.cheeeese.album.dto.response.AlbumEnterResponse; import com.cheeeese.album.dto.response.AlbumEnterResponse.AlbumHostInfo; import com.cheeeese.album.dto.response.AlbumEnterResponse.AlbumParticipantResponse; -import com.cheeeese.photo.infrastructure.persistence.PhotoRepository; import com.cheeeese.album.infrastructure.persistence.UserAlbumRepository; import com.cheeeese.user.domain.User; import com.cheeeese.user.exception.UserException; @@ -30,7 +29,7 @@ public class AlbumService { private final AlbumValidator albumValidator; private final UserAlbumRepository userAlbumRepository; private final UserRepository userRepository; - private final PhotoRepository photoRepository; + private final PhotoService photoService; public AlbumInvitationResponse getInvitationInfo(String code) { Album album = albumValidator.validateAlbumCode(code); @@ -80,7 +79,7 @@ private AlbumEnterResponse createAlbumEnterResponse(Album album) { // 2. 총 사진 수 // TODO: softdelete 논의 필요 - long totalPhotoCount = photoRepository.countByAlbumIdAndIsDeletedFalse(albumId); + long totalPhotoCount = photoService.countTotalPhotos(albumId); // 3. 참가자 정보 목록 조회 List participantUserIds = userAlbumRepository.findAllByAlbumId(albumId).stream() @@ -93,11 +92,8 @@ private AlbumEnterResponse createAlbumEnterResponse(Album album) { .collect(Collectors.toList()); // 4. 최신 사진 9장 - // TODO: 썸네일 생성 후 썸네일 이미지 제공 - List recentPhotos = photoRepository.findTop9ByAlbumIdAndIsDeletedFalseOrderByCreatedAtDesc(albumId); - List recentPhotoUrls = recentPhotos.stream() - .map(Photo::getImageUrl) - .collect(Collectors.toList()); + // TODO: 썸네일 생성 후 썸네일 이미지 제공, 아래 코드는 임시 + List recentPhotoUrls = photoService.getRecentPhotoUrls(albumId); return AlbumMapper.toEnterResponse( album, diff --git a/src/main/java/com/cheeeese/photo/application/PhotoService.java b/src/main/java/com/cheeeese/photo/application/PhotoService.java new file mode 100644 index 0000000..2b4d8b0 --- /dev/null +++ b/src/main/java/com/cheeeese/photo/application/PhotoService.java @@ -0,0 +1,29 @@ +package com.cheeeese.photo.application; + +import com.cheeeese.photo.domain.Photo; +import com.cheeeese.photo.infrastructure.persistence.PhotoRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.stream.Collectors; + +@Service +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class PhotoService { + + private final PhotoRepository photoRepository; + + public long countTotalPhotos(Long albumId) { + return photoRepository.countByAlbumIdAndIsDeletedFalse(albumId); + } + + public List getRecentPhotoUrls(Long albumId) { + List recentPhotos = photoRepository.findTop9ByAlbumIdAndIsDeletedFalseOrderByCreatedAtDesc(albumId); + return recentPhotos.stream() + .map(Photo::getImageUrl) + .collect(Collectors.toList()); + } +} From a469ac0420b14a9ae69b3bdc0ece214338c97208 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Tue, 14 Oct 2025 14:00:44 +0900 Subject: [PATCH 091/402] =?UTF-8?q?#12=20refactor:=20=EA=B2=80=EC=A6=9D=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20private=20=EB=A9=94=EC=84=9C=EB=93=9C?= =?UTF-8?q?=EB=A1=9C=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/validator/AlbumValidator.java | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java index 5cc963f..07f614c 100644 --- a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java +++ b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java @@ -33,12 +33,27 @@ public void validateAlbumEntry(Album album, User user) { validateAlbumExpiration(album); // 2. 블랙리스트 확인 (권한 체크) + validateUserBlacklisted(album, user); + + // 3. 정원 초과 확인 (신규 참여자에게만 적용) + validateAlbumCapacity(album, user); + } + + /** + * 사용자가 앨범의 블랙리스트에 등록되어 있는지 확인합니다. + */ + private void validateUserBlacklisted(Album album, User user) { userAlbumRepository.findByAlbumIdAndUserIdAndRole(album.getId(), user.getId(), UserAlbumRole.BLACK) .ifPresent(userAlbum -> { throw new AlbumException(AlbumErrorCode.USER_IS_BLACKLISTED); }); + } - // 3. 정원 초과 확인 (신규 참여자에게만 적용) + /** + * 신규 참여자일 경우, 앨범의 최대 정원 초과 여부를 확인합니다. + */ + private void validateAlbumCapacity(Album album, User user) { + // 이미 참여 중인 사용자는 정원 체크를 건너뜁니다. boolean isAlreadyParticipant = userAlbumRepository.findByUserIdAndAlbumId(user.getId(), album.getId()).isPresent(); if (!isAlreadyParticipant && album.isFull()) { From 0efed9c3c4435adac30eb469932986f7c528629f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Tue, 14 Oct 2025 14:09:45 +0900 Subject: [PATCH 092/402] =?UTF-8?q?#12=20refactor:=20AlbumService=20?= =?UTF-8?q?=ED=95=A8=EC=88=98=EB=93=A4=20private=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=EB=A1=9C=20=EB=B6=84=EB=A6=AC=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../album/application/AlbumService.java | 43 ++++++++++++------- 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/cheeeese/album/application/AlbumService.java b/src/main/java/com/cheeeese/album/application/AlbumService.java index d10664b..b281a53 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumService.java +++ b/src/main/java/com/cheeeese/album/application/AlbumService.java @@ -36,8 +36,7 @@ public AlbumInvitationResponse getInvitationInfo(String code) { albumValidator.validateAlbumExpiration(album); - User host = userRepository.findById(album.getHostId()) - .orElseThrow(() -> new UserException(UserErrorCode.USER_NOT_FOUND)); + User host = getHostUser(album.getHostId()); return AlbumMapper.toInvitationResponse(album, host); } @@ -51,6 +50,13 @@ public AlbumEnterResponse enterAlbum(String code, User currentUser) { albumValidator.validateAlbumEntry(album, currentUser); // 3. 사용자 앨범 참가 로직: 첫 입장 시 GUEST로 등록 및 참가자 수 증가 + handleAlbumParticipation(album, currentUser); + + // 4. 응답 DTO 생성 + return createAlbumEnterResponse(album); + } + + private void handleAlbumParticipation(Album album, User currentUser) { userAlbumRepository.findByUserIdAndAlbumId(currentUser.getId(), album.getId()) .ifPresentOrElse( userAlbum -> { @@ -63,18 +69,13 @@ public AlbumEnterResponse enterAlbum(String code, User currentUser) { album.incrementParticipantCount(); } ); - - // 4. 응답 DTO 생성 - return createAlbumEnterResponse(album); } private AlbumEnterResponse createAlbumEnterResponse(Album album) { Long albumId = album.getId(); // 1. 호스트 정보 조회 - User host = userRepository.findById(album.getHostId()) - .orElseThrow(() -> new UserException(UserErrorCode.USER_NOT_FOUND)); - + User host = getHostUser(album.getHostId()); AlbumHostInfo hostInfo = AlbumMapper.toHostInfo(host); // 2. 총 사진 수 @@ -82,14 +83,7 @@ private AlbumEnterResponse createAlbumEnterResponse(Album album) { long totalPhotoCount = photoService.countTotalPhotos(albumId); // 3. 참가자 정보 목록 조회 - List participantUserIds = userAlbumRepository.findAllByAlbumId(albumId).stream() - .map(UserAlbum::getUserId) - .collect(Collectors.toList()); - List participants = userRepository.findAllById(participantUserIds); - - List participantResponses = participants.stream() - .map(AlbumMapper::toParticipantResponse) - .collect(Collectors.toList()); + List participantResponses = getParticipantResponses(albumId); // 4. 최신 사진 9장 // TODO: 썸네일 생성 후 썸네일 이미지 제공, 아래 코드는 임시 @@ -103,4 +97,21 @@ private AlbumEnterResponse createAlbumEnterResponse(Album album) { recentPhotoUrls ); } + + private User getHostUser(Long hostId) { + return userRepository.findById(hostId) + .orElseThrow(() -> new UserException(UserErrorCode.USER_NOT_FOUND)); + } + + private List getParticipantResponses(Long albumId) { + List participantUserIds = userAlbumRepository.findAllByAlbumId(albumId).stream() + .map(UserAlbum::getUserId) + .collect(Collectors.toList()); + + List participants = userRepository.findAllById(participantUserIds); + + return participants.stream() + .map(AlbumMapper::toParticipantResponse) + .collect(Collectors.toList()); + } } From 08e2df120f46daa19a4d0c6d6012320feb68bbac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Tue, 14 Oct 2025 14:51:09 +0900 Subject: [PATCH 093/402] =?UTF-8?q?#12=20fix:=20coderabbit=20=ED=94=BC?= =?UTF-8?q?=EB=93=9C=EB=B0=B1=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../album/application/AlbumService.java | 36 ++++++++++++------- .../java/com/cheeeese/album/domain/Album.java | 4 +-- .../com/cheeeese/album/domain/UserAlbum.java | 2 +- .../album/exception/code/AlbumErrorCode.java | 1 + 4 files changed, 28 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/cheeeese/album/application/AlbumService.java b/src/main/java/com/cheeeese/album/application/AlbumService.java index b281a53..2798d46 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumService.java +++ b/src/main/java/com/cheeeese/album/application/AlbumService.java @@ -3,6 +3,7 @@ import com.cheeeese.album.application.validator.AlbumValidator; import com.cheeeese.album.domain.Album; import com.cheeeese.album.dto.response.AlbumInvitationResponse; +import com.cheeeese.album.exception.code.AlbumErrorCode; import com.cheeeese.album.infrastructure.mapper.AlbumMapper; import com.cheeeese.photo.application.PhotoService; import com.cheeeese.album.domain.UserAlbum; @@ -15,12 +16,15 @@ import com.cheeeese.user.exception.code.UserErrorCode; import com.cheeeese.user.infrastructure.persistence.UserRepository; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.dao.DataIntegrityViolationException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.util.stream.Collectors; +@Slf4j @Service @RequiredArgsConstructor @Transactional(readOnly = true) @@ -57,18 +61,26 @@ public AlbumEnterResponse enterAlbum(String code, User currentUser) { } private void handleAlbumParticipation(Album album, User currentUser) { - userAlbumRepository.findByUserIdAndAlbumId(currentUser.getId(), album.getId()) - .ifPresentOrElse( - userAlbum -> { - // 이미 참가한 경우: 아무것도 하지 않음 - }, - () -> { - // 첫 입장: UserAlbum에 GUEST로 저장하고, Album 참가자 수 증가 - UserAlbum newUserAlbum = AlbumMapper.toGuestUserAlbum(currentUser, album); - userAlbumRepository.save(newUserAlbum); - album.incrementParticipantCount(); - } - ); + boolean isAlreadyParticipant = userAlbumRepository.findByUserIdAndAlbumId(currentUser.getId(), album.getId()).isPresent(); + + if (isAlreadyParticipant) { + log.info("User {} is already a participant of album {}. Skipping registration.", + currentUser.getId(), album.getId()); + return; // 이미 참가했으므로 바로 종료 + } + + try { + // 첫 입장: UserAlbum에 GUEST로 저장하고, Album 참가자 수 증가 + UserAlbum newUserAlbum = AlbumMapper.toGuestUserAlbum(currentUser, album); + userAlbumRepository.save(newUserAlbum); + album.incrementParticipantCount(); + + } catch (DataIntegrityViolationException e) { + // 경합 상황 발생: 다른 트랜잭션이 먼저 저장했으므로 예외를 무시하고 정상 처리 + AlbumErrorCode errorCode = AlbumErrorCode.USER_ALREADY_JOINED_CONCURRENTLY; + log.warn("{}: User {} already registered for album {} by another transaction. Proceeding.", + errorCode.getMessage(), currentUser.getId(), album.getId()); + } } private AlbumEnterResponse createAlbumEnterResponse(Album album) { diff --git a/src/main/java/com/cheeeese/album/domain/Album.java b/src/main/java/com/cheeeese/album/domain/Album.java index c1e9872..7b065d1 100644 --- a/src/main/java/com/cheeeese/album/domain/Album.java +++ b/src/main/java/com/cheeeese/album/domain/Album.java @@ -48,9 +48,9 @@ public class Album extends BaseEntity { private int maxPhotoCount; @Column(name = "current_photo_count", nullable = false) - private int currentPhotoCount = 0; + private int currentPhotoCount; - @Column(name = "Field", nullable = false) + @Column(name = "is_info_available", nullable = false) private boolean isInfoAvailable; @Column(name = "expired_at", nullable = false) diff --git a/src/main/java/com/cheeeese/album/domain/UserAlbum.java b/src/main/java/com/cheeeese/album/domain/UserAlbum.java index 055a96f..1a49101 100644 --- a/src/main/java/com/cheeeese/album/domain/UserAlbum.java +++ b/src/main/java/com/cheeeese/album/domain/UserAlbum.java @@ -9,7 +9,7 @@ @Entity @Getter -@Table(name = "user_album") +@Table(name = "user_album", uniqueConstraints = @UniqueConstraint(columnNames = {"user_id", "album_id"})) @NoArgsConstructor(access = AccessLevel.PROTECTED) public class UserAlbum extends BaseEntity { diff --git a/src/main/java/com/cheeeese/album/exception/code/AlbumErrorCode.java b/src/main/java/com/cheeeese/album/exception/code/AlbumErrorCode.java index d28b8f2..9e1c1c4 100644 --- a/src/main/java/com/cheeeese/album/exception/code/AlbumErrorCode.java +++ b/src/main/java/com/cheeeese/album/exception/code/AlbumErrorCode.java @@ -13,6 +13,7 @@ public enum AlbumErrorCode implements BaseCode { ALBUM_EXPIRED(HttpStatus.BAD_REQUEST, "만료된 앨범입니다."), ALBUM_MAX_PARTICIPANT_REACHED(HttpStatus.BAD_REQUEST, "앨범의 최대 참가 인원수를 초과했습니다."), USER_IS_BLACKLISTED(HttpStatus.FORBIDDEN, "앨범 관리자에 의해 접근이 금지된 사용자입니다."), + USER_ALREADY_JOINED_CONCURRENTLY(HttpStatus.BAD_REQUEST, "동시성 오류: 이미 앨범에 참여 요청이 완료되었습니다."), ; private final HttpStatus httpStatus; From 5b38d0f5270c9845c0f344b3c1be144f40c21263 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Tue, 14 Oct 2025 16:12:41 +0900 Subject: [PATCH 094/402] =?UTF-8?q?#12=20fix:=20=EC=B5=9C=EB=8C=80=20?= =?UTF-8?q?=EC=B0=B8=EC=97=AC=EC=9E=90=EC=88=98=20=EB=8F=99=EC=8B=9C?= =?UTF-8?q?=EC=84=B1=20=EC=A0=9C=EC=96=B4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../album/application/AlbumService.java | 26 ++++++++++--------- .../application/validator/AlbumValidator.java | 15 ----------- .../java/com/cheeeese/album/domain/Album.java | 9 ++----- .../persistence/AlbumRepository.java | 7 +++++ 4 files changed, 23 insertions(+), 34 deletions(-) diff --git a/src/main/java/com/cheeeese/album/application/AlbumService.java b/src/main/java/com/cheeeese/album/application/AlbumService.java index 2798d46..8096e93 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumService.java +++ b/src/main/java/com/cheeeese/album/application/AlbumService.java @@ -3,8 +3,10 @@ import com.cheeeese.album.application.validator.AlbumValidator; import com.cheeeese.album.domain.Album; import com.cheeeese.album.dto.response.AlbumInvitationResponse; +import com.cheeeese.album.exception.AlbumException; import com.cheeeese.album.exception.code.AlbumErrorCode; import com.cheeeese.album.infrastructure.mapper.AlbumMapper; +import com.cheeeese.album.infrastructure.persistence.AlbumRepository; import com.cheeeese.photo.application.PhotoService; import com.cheeeese.album.domain.UserAlbum; import com.cheeeese.album.dto.response.AlbumEnterResponse; @@ -17,7 +19,6 @@ import com.cheeeese.user.infrastructure.persistence.UserRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.dao.DataIntegrityViolationException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -31,6 +32,7 @@ public class AlbumService { private final AlbumValidator albumValidator; + private final AlbumRepository albumRepository; private final UserAlbumRepository userAlbumRepository; private final UserRepository userRepository; private final PhotoService photoService; @@ -69,18 +71,18 @@ private void handleAlbumParticipation(Album album, User currentUser) { return; // 이미 참가했으므로 바로 종료 } - try { - // 첫 입장: UserAlbum에 GUEST로 저장하고, Album 참가자 수 증가 - UserAlbum newUserAlbum = AlbumMapper.toGuestUserAlbum(currentUser, album); - userAlbumRepository.save(newUserAlbum); - album.incrementParticipantCount(); - - } catch (DataIntegrityViolationException e) { - // 경합 상황 발생: 다른 트랜잭션이 먼저 저장했으므로 예외를 무시하고 정상 처리 - AlbumErrorCode errorCode = AlbumErrorCode.USER_ALREADY_JOINED_CONCURRENTLY; - log.warn("{}: User {} already registered for album {} by another transaction. Proceeding.", - errorCode.getMessage(), currentUser.getId(), album.getId()); + // 첫 입장: UserAlbum에 GUEST로 저장하고, Album 참가자 수 증가 + UserAlbum newUserAlbum = AlbumMapper.toGuestUserAlbum(currentUser, album); + userAlbumRepository.save(newUserAlbum); + + int updatedRows = albumRepository.incrementParticipantCountAtomically(album.getId()); + if (updatedRows == 0) { + // 정원 초과 조건(currentParticipant < participant) 불만족 시 예외 처리 + throw new AlbumException(AlbumErrorCode.ALBUM_MAX_PARTICIPANT_REACHED); } + + // JPQL UPDATE는 영속성 컨텍스트를 무시하므로 수동 동기화 + album.setCurrentParticipant(album.getCurrentParticipant() + 1); } private AlbumEnterResponse createAlbumEnterResponse(Album album) { diff --git a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java index 07f614c..b157aba 100644 --- a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java +++ b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java @@ -34,9 +34,6 @@ public void validateAlbumEntry(Album album, User user) { // 2. 블랙리스트 확인 (권한 체크) validateUserBlacklisted(album, user); - - // 3. 정원 초과 확인 (신규 참여자에게만 적용) - validateAlbumCapacity(album, user); } /** @@ -48,16 +45,4 @@ private void validateUserBlacklisted(Album album, User user) { throw new AlbumException(AlbumErrorCode.USER_IS_BLACKLISTED); }); } - - /** - * 신규 참여자일 경우, 앨범의 최대 정원 초과 여부를 확인합니다. - */ - private void validateAlbumCapacity(Album album, User user) { - // 이미 참여 중인 사용자는 정원 체크를 건너뜁니다. - boolean isAlreadyParticipant = userAlbumRepository.findByUserIdAndAlbumId(user.getId(), album.getId()).isPresent(); - - if (!isAlreadyParticipant && album.isFull()) { - throw new AlbumException(AlbumErrorCode.ALBUM_MAX_PARTICIPANT_REACHED); - } - } } \ No newline at end of file diff --git a/src/main/java/com/cheeeese/album/domain/Album.java b/src/main/java/com/cheeeese/album/domain/Album.java index 7b065d1..c8b5ec3 100644 --- a/src/main/java/com/cheeeese/album/domain/Album.java +++ b/src/main/java/com/cheeeese/album/domain/Album.java @@ -1,7 +1,5 @@ package com.cheeeese.album.domain; -import com.cheeeese.album.exception.AlbumException; -import com.cheeeese.album.exception.code.AlbumErrorCode; import com.cheeeese.global.domain.BaseEntity; import jakarta.persistence.*; import lombok.AccessLevel; @@ -72,11 +70,8 @@ public boolean isFull() { return this.currentParticipant >= this.participant; } - public void incrementParticipantCount() { - if (isFull()) { - throw new AlbumException(AlbumErrorCode.ALBUM_MAX_PARTICIPANT_REACHED); - } - this.currentParticipant++; + public void setCurrentParticipant(int currentParticipant) { + this.currentParticipant = currentParticipant; } @Builder diff --git a/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumRepository.java b/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumRepository.java index 1507a31..6fe8320 100644 --- a/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumRepository.java +++ b/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumRepository.java @@ -2,9 +2,16 @@ import com.cheeeese.album.domain.Album; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import java.util.Optional; public interface AlbumRepository extends JpaRepository { Optional findByCode(String code); + + @Modifying + @Query("UPDATE Album a SET a.currentParticipant = a.currentParticipant + 1 WHERE a.id = :albumId AND a.currentParticipant < a.participant") + int incrementParticipantCountAtomically(@Param("albumId") Long albumId); } From ff4fdacb81589cc68fa56ac2a32797c7af20040f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Tue, 14 Oct 2025 23:12:42 +0900 Subject: [PATCH 095/402] =?UTF-8?q?#12=20fix:=20=EB=8F=99=EC=8B=9C=20?= =?UTF-8?q?=EC=9E=85=EC=9E=A5=20=EC=8B=9C=20=EC=A4=91=EB=B3=B5=20=EC=B0=B8?= =?UTF-8?q?=EA=B0=80=20=EB=B0=8F=20=EC=A0=95=EC=9B=90=20=EC=B4=88=EA=B3=BC?= =?UTF-8?q?=20=EB=AC=B8=EC=A0=9C=20=EB=B0=A9=EC=A7=80=20=EB=A1=9C=EC=A7=81?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../album/application/AlbumService.java | 32 ++++++++++++------- .../album/exception/code/AlbumErrorCode.java | 2 +- .../persistence/AlbumRepository.java | 2 +- 3 files changed, 22 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/cheeeese/album/application/AlbumService.java b/src/main/java/com/cheeeese/album/application/AlbumService.java index 8096e93..53d3094 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumService.java +++ b/src/main/java/com/cheeeese/album/application/AlbumService.java @@ -19,6 +19,7 @@ import com.cheeeese.user.infrastructure.persistence.UserRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.dao.DataIntegrityViolationException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -56,33 +57,40 @@ public AlbumEnterResponse enterAlbum(String code, User currentUser) { albumValidator.validateAlbumEntry(album, currentUser); // 3. 사용자 앨범 참가 로직: 첫 입장 시 GUEST로 등록 및 참가자 수 증가 - handleAlbumParticipation(album, currentUser); + Album freshAlbum = handleAlbumParticipation(album, currentUser); // 4. 응답 DTO 생성 - return createAlbumEnterResponse(album); + return createAlbumEnterResponse(freshAlbum); } - private void handleAlbumParticipation(Album album, User currentUser) { + private Album handleAlbumParticipation(Album album, User currentUser) { boolean isAlreadyParticipant = userAlbumRepository.findByUserIdAndAlbumId(currentUser.getId(), album.getId()).isPresent(); if (isAlreadyParticipant) { log.info("User {} is already a participant of album {}. Skipping registration.", currentUser.getId(), album.getId()); - return; // 이미 참가했으므로 바로 종료 + return album; } // 첫 입장: UserAlbum에 GUEST로 저장하고, Album 참가자 수 증가 UserAlbum newUserAlbum = AlbumMapper.toGuestUserAlbum(currentUser, album); - userAlbumRepository.save(newUserAlbum); - - int updatedRows = albumRepository.incrementParticipantCountAtomically(album.getId()); - if (updatedRows == 0) { - // 정원 초과 조건(currentParticipant < participant) 불만족 시 예외 처리 - throw new AlbumException(AlbumErrorCode.ALBUM_MAX_PARTICIPANT_REACHED); + try { + userAlbumRepository.save(newUserAlbum); + + int updatedRows = albumRepository.incrementParticipantCountAtomically(album.getId()); + if (updatedRows == 0) { + // 정원 초과 조건(currentParticipant < participant) 불만족 시 예외 처리 + throw new AlbumException(AlbumErrorCode.ALBUM_MAX_PARTICIPANT_REACHED); + } + } catch (DataIntegrityViolationException e) { + throw new AlbumException(AlbumErrorCode.USER_ALREADY_JOINED_CONCURRENTLY); } - // JPQL UPDATE는 영속성 컨텍스트를 무시하므로 수동 동기화 - album.setCurrentParticipant(album.getCurrentParticipant() + 1); + return albumRepository.findById(album.getId()) + .orElseThrow(() -> { + log.error("Failed to re-fetch album {} after atomic update.", album.getId()); + return new AlbumException(AlbumErrorCode.ALBUM_NOT_FOUND); + }); } private AlbumEnterResponse createAlbumEnterResponse(Album album) { diff --git a/src/main/java/com/cheeeese/album/exception/code/AlbumErrorCode.java b/src/main/java/com/cheeeese/album/exception/code/AlbumErrorCode.java index 9e1c1c4..c1b167f 100644 --- a/src/main/java/com/cheeeese/album/exception/code/AlbumErrorCode.java +++ b/src/main/java/com/cheeeese/album/exception/code/AlbumErrorCode.java @@ -13,7 +13,7 @@ public enum AlbumErrorCode implements BaseCode { ALBUM_EXPIRED(HttpStatus.BAD_REQUEST, "만료된 앨범입니다."), ALBUM_MAX_PARTICIPANT_REACHED(HttpStatus.BAD_REQUEST, "앨범의 최대 참가 인원수를 초과했습니다."), USER_IS_BLACKLISTED(HttpStatus.FORBIDDEN, "앨범 관리자에 의해 접근이 금지된 사용자입니다."), - USER_ALREADY_JOINED_CONCURRENTLY(HttpStatus.BAD_REQUEST, "동시성 오류: 이미 앨범에 참여 요청이 완료되었습니다."), + USER_ALREADY_JOINED_CONCURRENTLY(HttpStatus.CONFLICT, "동시성 오류: 이미 앨범에 참여 요청이 완료되었습니다."), ; private final HttpStatus httpStatus; diff --git a/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumRepository.java b/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumRepository.java index 6fe8320..d6f19e4 100644 --- a/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumRepository.java +++ b/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumRepository.java @@ -11,7 +11,7 @@ public interface AlbumRepository extends JpaRepository { Optional findByCode(String code); - @Modifying + @Modifying(clearAutomatically = true, flushAutomatically = true) @Query("UPDATE Album a SET a.currentParticipant = a.currentParticipant + 1 WHERE a.id = :albumId AND a.currentParticipant < a.participant") int incrementParticipantCountAtomically(@Param("albumId") Long albumId); } From 15baab772e36c188740d09bfb5a423b6e95cee89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Wed, 15 Oct 2025 00:07:54 +0900 Subject: [PATCH 096/402] =?UTF-8?q?#12=20fix:=20=ED=94=BC=EB=93=9C?= =?UTF-8?q?=EB=B0=B1=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/cheeeese/album/domain/Album.java | 10 +--------- src/main/java/com/cheeeese/album/domain/UserAlbum.java | 2 +- .../cheeeese/album/presentation/AlbumController.java | 7 ++----- src/main/java/com/cheeeese/photo/domain/Photo.java | 2 +- 4 files changed, 5 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/cheeeese/album/domain/Album.java b/src/main/java/com/cheeeese/album/domain/Album.java index c8b5ec3..7851951 100644 --- a/src/main/java/com/cheeeese/album/domain/Album.java +++ b/src/main/java/com/cheeeese/album/domain/Album.java @@ -66,16 +66,8 @@ public boolean isExpired() { return this.expiredAt.isBefore(LocalDateTime.now()) || this.status == AlbumStatus.EXPIRED; } - public boolean isFull() { - return this.currentParticipant >= this.participant; - } - - public void setCurrentParticipant(int currentParticipant) { - this.currentParticipant = currentParticipant; - } - @Builder - public Album( + private Album( Long hostId, String title, String code, diff --git a/src/main/java/com/cheeeese/album/domain/UserAlbum.java b/src/main/java/com/cheeeese/album/domain/UserAlbum.java index 1a49101..2808e92 100644 --- a/src/main/java/com/cheeeese/album/domain/UserAlbum.java +++ b/src/main/java/com/cheeeese/album/domain/UserAlbum.java @@ -31,7 +31,7 @@ public class UserAlbum extends BaseEntity { private UserAlbumRole role; @Builder - public UserAlbum(Long userId, Long albumId, UserAlbumRole role) { + private UserAlbum(Long userId, Long albumId, UserAlbumRole role) { this.userId = userId; this.albumId = albumId; this.role = role; diff --git a/src/main/java/com/cheeeese/album/presentation/AlbumController.java b/src/main/java/com/cheeeese/album/presentation/AlbumController.java index 7597e54..e7fecf9 100644 --- a/src/main/java/com/cheeeese/album/presentation/AlbumController.java +++ b/src/main/java/com/cheeeese/album/presentation/AlbumController.java @@ -8,10 +8,7 @@ import com.cheeeese.global.util.CurrentUser; import com.cheeeese.user.domain.User; import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import static com.cheeeese.global.common.code.SuccessCode.ALBUM_ENTER_SUCCESS; import static com.cheeeese.global.common.code.SuccessCode.ALBUM_INVITATION_FETCH_SUCCESS; @@ -31,7 +28,7 @@ public CommonResponse getInvitationInfo(@PathVariable S } @Override - @GetMapping("/{code}/enter") + @PostMapping("/{code}/enter") public CommonResponse enterAlbum( @CurrentUser User user, @PathVariable String code diff --git a/src/main/java/com/cheeeese/photo/domain/Photo.java b/src/main/java/com/cheeeese/photo/domain/Photo.java index 8adb91a..6d1f385 100644 --- a/src/main/java/com/cheeeese/photo/domain/Photo.java +++ b/src/main/java/com/cheeeese/photo/domain/Photo.java @@ -41,7 +41,7 @@ public class Photo extends BaseEntity { private boolean isDeleted; @Builder - public Photo( + private Photo( Long userId, Long albumId, String imageUrl, From 75ffce55a0448f2737c7cec4997447ee45ebff2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Wed, 15 Oct 2025 11:52:02 +0900 Subject: [PATCH 097/402] =?UTF-8?q?#4=20chore:=20gitignore=20=EA=B2=BD?= =?UTF-8?q?=EB=A1=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 391a66a..9cdbc91 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,8 @@ build/ !**/src/main/**/build/ !**/src/test/**/build/ +src/main/resources/ + ### application.yml ### application.yml application-dev.yml From ed70ba7c2e3fd00c69640b09fcee9faf8129916e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Wed, 15 Oct 2025 13:44:40 +0900 Subject: [PATCH 098/402] =?UTF-8?q?#4=20feat:=20docker-compose.yml=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker-compose.yml | 104 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 docker-compose.yml diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..5dec16c --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,104 @@ +version: "3.9" + +services: + # ------------------------------------------------------------ + # ✅ Redis 서비스 (항상 실행) + # ------------------------------------------------------------ + redis: + image: redis:7.2-alpine + container_name: redis + restart: always + ports: + - "6379:6379" + volumes: + - redis-data:/data + networks: + - cheeeeese-network + + # ------------------------------------------------------------ + # ✅ Backend 서비스 (Blue-Green 전환 대상) + # ------------------------------------------------------------ + backend-green-prod: + image: mozzarella32/backend:prod # deploy.sh에서 docker pull로 최신 이미지 갱신 + container_name: cheeeeese-green-prod + env_file: + - /root/prod.env + depends_on: + - redis + ports: + - "8080:8080" # Green 인스턴스 포트 + restart: always + networks: + - cheeeeese-network + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:8080/actuator/health"] + interval: 5s + timeout: 3s + retries: 5 + + backend-blue-prod: + image: mozzarella32/backend:prod + container_name: cheeeeese-blue-prod + env_file: + - /root/prod.env + depends_on: + - redis + ports: + - "8081:8080" # Blue 인스턴스 포트 + restart: always + networks: + - cheeeeese-network + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:8080/actuator/health"] + interval: 5s + timeout: 3s + retries: 5 + + # ------------------------------------------------------------ + # ✅ 개발 환경용 + # ------------------------------------------------------------ + backend-green-dev: + image: mozzarella32/backend:dev + container_name: cheeeeese-green-dev + env_file: + - /root/dev.env + depends_on: + - redis + ports: + - "8082:8080" + restart: always + networks: + - cheeeeese-network + healthcheck: + test: [ "CMD", "curl", "-f", "http://localhost:8080/actuator/health" ] + interval: 5s + timeout: 3s + retries: 5 + + backend-blue-dev: + image: mozzarella32/backend:dev + container_name: cheeeeese-blue-dev + env_file: + - /root/dev.env + depends_on: + - redis + ports: + - "8083:8080" + restart: always + networks: + - cheeeeese-network + healthcheck: + test: [ "CMD", "curl", "-f", "http://localhost:8080/actuator/health" ] + interval: 5s + timeout: 3s + retries: 5 + +# ------------------------------------------------------------ +# ✅ 네트워크 및 볼륨 정의 +# ------------------------------------------------------------ +networks: + cheeeeese-network: + driver: bridge + +volumes: + redis-data: From 1d75c34f54b5f956639192771b3ba1efd4ddf3b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Wed, 15 Oct 2025 13:47:47 +0900 Subject: [PATCH 099/402] =?UTF-8?q?#4=20chore:=20cicd=20workflow=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/cicd.yml | 126 +++++++++++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 .github/workflows/cicd.yml diff --git a/.github/workflows/cicd.yml b/.github/workflows/cicd.yml new file mode 100644 index 0000000..6244090 --- /dev/null +++ b/.github/workflows/cicd.yml @@ -0,0 +1,126 @@ +name: CI/CD Workflow + +on: + push: + branches: [ "main", "develop", "chore/#4-cicd" ] + +jobs: + CI-CD: + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up JDK 21 + uses: actions/setup-java@v4 + with: + java-version: '21' + distribution: 'corretto' + + - name: Gradle Caching + uses: actions/cache@v4 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} + restore-keys: | + ${{ runner.os }}-gradle- + + - name: Grant execute permission for gradlew + run: chmod +x gradlew + + - name: Build with Gradle + run: ./gradlew clean build -x test + + - name: Create secrets files from GitHub Secrets + run: | + mkdir -p ./src/main/resources/secret + echo "${{ secrets.PROD_ENV_CONTENT }}" > ./src/main/resources/secret/prod.env + echo "${{ secrets.DEV_ENV_CONTENT }}" > ./src/main/resources/secret/dev.env + echo "${{ secrets.DEPLOY_FILE }}" > ./src/main/resources/secret/deploy.sh + chmod 600 ./src/main/resources/secret/*.env + chmod 600 ./src/main/resources/secret/deploy.sh + echo "✅ .env & .sh 파일 생성 완료" + + + # 📌 개선: Docker Login을 별도 Step으로 분리하고 공식 액션 사용 + - name: Docker Login + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + # 📌 개선: prod.env, dev.env, deploy.sh 파일을 하나의 scp-action으로 통합 전송 + - name: Copy deployment files to NCP server (Integrated SCP) + uses: appleboy/scp-action@master + with: + host: ${{ secrets.SERVER_HOST }} + username: ${{ secrets.SERVER_USER }} + key: ${{ secrets.SERVER_SSH_KEY }} + source: | + ./src/main/resources/secret/prod.env + ./src/main/resources/secret/dev.env + ./src/main/resources/secret/deploy.sh + ./docker-compose.yml + target: /root + + # ---------------------- PROD Deployment ---------------------- + - name: Docker build & push (prod) + if: github.ref == 'refs/heads/main' + run: | + SHA=${{ github.sha }} + SHORT_SHA=${SHA:0:7} + IMAGE_NAME=${{ secrets.DOCKER_REPO }}/${{ secrets.DOCKER_IMAGE_NAME }} + + echo "✅ Building $IMAGE_NAME with tags $SHORT_SHA and prod" + + docker build -f Dockerfile -t $IMAGE_NAME:$SHORT_SHA . + docker tag $IMAGE_NAME:$SHORT_SHA $IMAGE_NAME:prod + + docker push $IMAGE_NAME:$SHORT_SHA + docker push $IMAGE_NAME:prod + + echo "✅ Pushed $IMAGE_NAME:$SHORT_SHA and $IMAGE_NAME:prod" + + - name: Deploy to prod + if: github.ref == 'refs/heads/main' + uses: appleboy/ssh-action@master + with: + host: ${{ secrets.SERVER_HOST }} + username: ${{ secrets.SERVER_USER }} + key: ${{ secrets.SERVER_SSH_KEY }} + script: | + echo "🚀 Deploying to PROD server..." + + cd /root + chmod +x deploy.sh + ./deploy.sh prod + + # ---------------------- DEV Deployment ---------------------- + - name: Docker build & push (develop) + if: github.ref == 'refs/heads/develop' || github.ref == 'refs/heads/chore/#4-cicd' + run: | + IMAGE_NAME=${{ secrets.DOCKER_REPO }}/${{ secrets.DOCKER_IMAGE_NAME }} + + echo "✅ Building $IMAGE_NAME with tags dev" + + docker build -f Dockerfile -t $IMAGE_NAME:dev . + docker push $IMAGE_NAME:dev + + echo "✅ Pushed $IMAGE_NAME:dev" + + - name: Deploy to develop + if: github.ref == 'refs/heads/develop' || github.ref == 'refs/heads/chore/#4-cicd' + uses: appleboy/ssh-action@master + with: + host: ${{ secrets.SERVER_HOST }} + username: ${{ secrets.SERVER_USER }} + key: ${{ secrets.SERVER_SSH_KEY }} + script: | + echo "🚀 Deploying to DEV server..." + + cd /root + chmod +x deploy.sh + ./deploy.sh dev \ No newline at end of file From d7db204e241f1647abc7b522bc21cd6408dcda0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Wed, 15 Oct 2025 14:02:45 +0900 Subject: [PATCH 100/402] =?UTF-8?q?#4=20fix:=20=EB=A9=80=ED=8B=B0=EB=9D=BC?= =?UTF-8?q?=EC=9D=B8=20=EC=9E=85=EB=A0=A5=20=EC=A7=80=EC=9B=90=EC=9D=84=20?= =?UTF-8?q?=EC=9C=84=ED=95=B4=20cat=20< ./src/main/resources/secret/prod.env echo "${{ secrets.DEV_ENV_CONTENT }}" > ./src/main/resources/secret/dev.env - echo "${{ secrets.DEPLOY_FILE }}" > ./src/main/resources/secret/deploy.sh + cat <<'EOF' > ./src/main/resources/secret/deploy.sh + ${{ secrets.DEPLOY_FILE }} + EOF chmod 600 ./src/main/resources/secret/*.env chmod 600 ./src/main/resources/secret/deploy.sh echo "✅ .env & .sh 파일 생성 완료" - # 📌 개선: Docker Login을 별도 Step으로 분리하고 공식 액션 사용 - name: Docker Login uses: docker/login-action@v3 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - # 📌 개선: prod.env, dev.env, deploy.sh 파일을 하나의 scp-action으로 통합 전송 - name: Copy deployment files to NCP server (Integrated SCP) uses: appleboy/scp-action@master with: From 8d9231f3c770aac17f3bef1d1399eadce1d5018d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Wed, 15 Oct 2025 14:14:12 +0900 Subject: [PATCH 101/402] =?UTF-8?q?#4=20chore:=20=ED=8C=8C=EC=9D=BC=20?= =?UTF-8?q?=EC=A0=84=EB=8B=AC=20=EC=98=A4=EB=A5=98=20=EB=94=94=EB=B2=84?= =?UTF-8?q?=EA=B9=85=20=EC=9C=84=ED=95=9C=20=EC=BD=94=EB=93=9C=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/cicd.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.github/workflows/cicd.yml b/.github/workflows/cicd.yml index 4a092b3..883f32c 100644 --- a/.github/workflows/cicd.yml +++ b/.github/workflows/cicd.yml @@ -53,6 +53,17 @@ jobs: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: 🧾 Check generated secret files + run: | + echo "=== Checking secret directory ===" + ls -al ./src/main/resources/secret || echo "❌ secret folder not found" + echo "=== Check file content ===" + cat ./src/main/resources/secret/prod.env || echo "❌ prod.env missing" + cat ./src/main/resources/secret/dev.env || echo "❌ dev.env missing" + cat ./src/main/resources/secret/deploy.sh || echo "❌ deploy.sh missing" + echo "=== Check docker-compose existence ===" + ls -al ./docker-compose.yml || echo "❌ docker-compose.yml missing" + - name: Copy deployment files to NCP server (Integrated SCP) uses: appleboy/scp-action@master with: From 81ce9c9c2815cc426eddddb5a287e6a3fb2c459d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Wed, 15 Oct 2025 14:21:04 +0900 Subject: [PATCH 102/402] =?UTF-8?q?#4=20fix:=20=ED=8C=8C=EC=9D=BC=20?= =?UTF-8?q?=EC=A0=84=EB=8B=AC=20=EC=98=A4=EB=A5=98=20=ED=95=B4=EA=B2=B0=20?= =?UTF-8?q?=EC=8B=9C=EB=8F=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/cicd.yml | 22 +++++----------------- 1 file changed, 5 insertions(+), 17 deletions(-) diff --git a/.github/workflows/cicd.yml b/.github/workflows/cicd.yml index 883f32c..461ef81 100644 --- a/.github/workflows/cicd.yml +++ b/.github/workflows/cicd.yml @@ -46,36 +46,24 @@ jobs: chmod 600 ./src/main/resources/secret/deploy.sh echo "✅ .env & .sh 파일 생성 완료" - - name: Docker Login uses: docker/login-action@v3 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - - name: 🧾 Check generated secret files - run: | - echo "=== Checking secret directory ===" - ls -al ./src/main/resources/secret || echo "❌ secret folder not found" - echo "=== Check file content ===" - cat ./src/main/resources/secret/prod.env || echo "❌ prod.env missing" - cat ./src/main/resources/secret/dev.env || echo "❌ dev.env missing" - cat ./src/main/resources/secret/deploy.sh || echo "❌ deploy.sh missing" - echo "=== Check docker-compose existence ===" - ls -al ./docker-compose.yml || echo "❌ docker-compose.yml missing" - - name: Copy deployment files to NCP server (Integrated SCP) uses: appleboy/scp-action@master with: host: ${{ secrets.SERVER_HOST }} username: ${{ secrets.SERVER_USER }} key: ${{ secrets.SERVER_SSH_KEY }} - source: | - ./src/main/resources/secret/prod.env - ./src/main/resources/secret/dev.env - ./src/main/resources/secret/deploy.sh - ./docker-compose.yml target: /root + source: > + src/main/resources/secret/prod.env + src/main/resources/secret/dev.env + src/main/resources/secret/deploy.sh + docker-compose.yml # ---------------------- PROD Deployment ---------------------- - name: Docker build & push (prod) From 18922f341fd67b84328419aa7cd0021728e4722c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Wed, 15 Oct 2025 14:25:35 +0900 Subject: [PATCH 103/402] =?UTF-8?q?#4=20fix:=20=ED=8C=8C=EC=9D=BC=20?= =?UTF-8?q?=EC=A0=84=EB=8B=AC=20=EC=98=A4=EB=A5=98=20=EA=B0=9C=EB=B3=84=20?= =?UTF-8?q?=EC=A0=84=EC=86=A1=20=EC=8B=9C=EB=8F=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/cicd.yml | 38 +++++++++++++++++++++++++++++++------- 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/.github/workflows/cicd.yml b/.github/workflows/cicd.yml index 461ef81..7149fca 100644 --- a/.github/workflows/cicd.yml +++ b/.github/workflows/cicd.yml @@ -45,25 +45,49 @@ jobs: chmod 600 ./src/main/resources/secret/*.env chmod 600 ./src/main/resources/secret/deploy.sh echo "✅ .env & .sh 파일 생성 완료" - + - name: Docker Login uses: docker/login-action@v3 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - - name: Copy deployment files to NCP server (Integrated SCP) + # ------------------ 파일별 개별 전송 ------------------ + - name: Copy prod.env to NCP server + uses: appleboy/scp-action@master + with: + host: ${{ secrets.SERVER_HOST }} + username: ${{ secrets.SERVER_USER }} + key: ${{ secrets.SERVER_SSH_KEY }} + source: ./src/main/resources/secret/prod.env + target: /root + + - name: Copy dev.env to NCP server + uses: appleboy/scp-action@master + with: + host: ${{ secrets.SERVER_HOST }} + username: ${{ secrets.SERVER_USER }} + key: ${{ secrets.SERVER_SSH_KEY }} + source: ./src/main/resources/secret/dev.env + target: /root + + - name: Copy deploy.sh to NCP server + uses: appleboy/scp-action@master + with: + host: ${{ secrets.SERVER_HOST }} + username: ${{ secrets.SERVER_USER }} + key: ${{ secrets.SERVER_SSH_KEY }} + source: ./src/main/resources/secret/deploy.sh + target: /root + + - name: Copy docker-compose.yml to NCP server uses: appleboy/scp-action@master with: host: ${{ secrets.SERVER_HOST }} username: ${{ secrets.SERVER_USER }} key: ${{ secrets.SERVER_SSH_KEY }} + source: ./docker-compose.yml target: /root - source: > - src/main/resources/secret/prod.env - src/main/resources/secret/dev.env - src/main/resources/secret/deploy.sh - docker-compose.yml # ---------------------- PROD Deployment ---------------------- - name: Docker build & push (prod) From 274abbf2cf140bb99b405ade1b18b1607e437cf8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Wed, 15 Oct 2025 14:51:37 +0900 Subject: [PATCH 104/402] =?UTF-8?q?#4=20fix:=20=ED=8C=8C=EC=9D=BC=20?= =?UTF-8?q?=EA=B2=BD=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/cicd.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/cicd.yml b/.github/workflows/cicd.yml index 7149fca..d72de98 100644 --- a/.github/workflows/cicd.yml +++ b/.github/workflows/cicd.yml @@ -61,6 +61,7 @@ jobs: key: ${{ secrets.SERVER_SSH_KEY }} source: ./src/main/resources/secret/prod.env target: /root + strip_components: 4 - name: Copy dev.env to NCP server uses: appleboy/scp-action@master @@ -70,6 +71,7 @@ jobs: key: ${{ secrets.SERVER_SSH_KEY }} source: ./src/main/resources/secret/dev.env target: /root + strip_components: 4 - name: Copy deploy.sh to NCP server uses: appleboy/scp-action@master @@ -79,6 +81,7 @@ jobs: key: ${{ secrets.SERVER_SSH_KEY }} source: ./src/main/resources/secret/deploy.sh target: /root + strip_components: 4 - name: Copy docker-compose.yml to NCP server uses: appleboy/scp-action@master @@ -89,7 +92,7 @@ jobs: source: ./docker-compose.yml target: /root - # ---------------------- PROD Deployment ---------------------- + # ---------------------- PROD Deployment ---------------------- - name: Docker build & push (prod) if: github.ref == 'refs/heads/main' run: | From e3211665dfe484b47123cea351e6e382ac46c03c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Wed, 15 Oct 2025 15:34:27 +0900 Subject: [PATCH 105/402] =?UTF-8?q?#4=20fix:=20=ED=8C=8C=EC=9D=BC=20?= =?UTF-8?q?=EA=B2=BD=EB=A1=9C=20=EC=88=98=EC=A0=952?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/cicd.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/cicd.yml b/.github/workflows/cicd.yml index d72de98..7f0670e 100644 --- a/.github/workflows/cicd.yml +++ b/.github/workflows/cicd.yml @@ -61,7 +61,7 @@ jobs: key: ${{ secrets.SERVER_SSH_KEY }} source: ./src/main/resources/secret/prod.env target: /root - strip_components: 4 + strip_components: 5 - name: Copy dev.env to NCP server uses: appleboy/scp-action@master @@ -71,7 +71,7 @@ jobs: key: ${{ secrets.SERVER_SSH_KEY }} source: ./src/main/resources/secret/dev.env target: /root - strip_components: 4 + strip_components: 5 - name: Copy deploy.sh to NCP server uses: appleboy/scp-action@master @@ -81,7 +81,7 @@ jobs: key: ${{ secrets.SERVER_SSH_KEY }} source: ./src/main/resources/secret/deploy.sh target: /root - strip_components: 4 + strip_components: 5 - name: Copy docker-compose.yml to NCP server uses: appleboy/scp-action@master From f14a55db85ec357c9d4937338f9d1fe5588b8e90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Wed, 15 Oct 2025 17:36:42 +0900 Subject: [PATCH 106/402] =?UTF-8?q?#4=20chore:=20cicd=20=EB=B8=8C=EB=9E=9C?= =?UTF-8?q?=EC=B9=98=20trigger=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/cicd.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/cicd.yml b/.github/workflows/cicd.yml index 7f0670e..33d7dff 100644 --- a/.github/workflows/cicd.yml +++ b/.github/workflows/cicd.yml @@ -2,7 +2,7 @@ name: CI/CD Workflow on: push: - branches: [ "main", "develop", "chore/#4-cicd" ] + branches: [ "main", "develop"] jobs: CI-CD: @@ -126,7 +126,7 @@ jobs: # ---------------------- DEV Deployment ---------------------- - name: Docker build & push (develop) - if: github.ref == 'refs/heads/develop' || github.ref == 'refs/heads/chore/#4-cicd' + if: github.ref == 'refs/heads/develop' run: | IMAGE_NAME=${{ secrets.DOCKER_REPO }}/${{ secrets.DOCKER_IMAGE_NAME }} @@ -138,7 +138,7 @@ jobs: echo "✅ Pushed $IMAGE_NAME:dev" - name: Deploy to develop - if: github.ref == 'refs/heads/develop' || github.ref == 'refs/heads/chore/#4-cicd' + if: github.ref == 'refs/heads/develop' uses: appleboy/ssh-action@master with: host: ${{ secrets.SERVER_HOST }} From 49f982fb415c733ef3dc01fcacd35fd2859ebbaf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Wed, 15 Oct 2025 17:59:49 +0900 Subject: [PATCH 107/402] =?UTF-8?q?#4=20fix:=20=ED=94=BC=EB=93=9C=EB=B0=B1?= =?UTF-8?q?=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 9cdbc91..74e8e8b 100644 --- a/.gitignore +++ b/.gitignore @@ -5,7 +5,7 @@ build/ !**/src/main/**/build/ !**/src/test/**/build/ -src/main/resources/ +src/main/resources/secret/ ### application.yml ### application.yml From cf385da92e8e32883b8e6a14951858182402dc33 Mon Sep 17 00:00:00 2001 From: zyovn Date: Wed, 15 Oct 2025 21:02:23 +0900 Subject: [PATCH 108/402] =?UTF-8?q?#14=20feat:=20=EC=95=A8=EB=B2=94=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20API=201=EC=B0=A8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../album/application/AlbumService.java | 23 ++++++++++ .../album/dto/request/AlbumCreateRequest.java | 14 ++++++ .../dto/response/AlbumCreateResponse.java | 14 ++++++ .../infrastructure/mapper/AlbumMapper.java | 44 +++++++++++++++++++ .../album/presentation/AlbumController.java | 11 +++++ 5 files changed, 106 insertions(+) create mode 100644 src/main/java/com/cheeeese/album/dto/request/AlbumCreateRequest.java create mode 100644 src/main/java/com/cheeeese/album/dto/response/AlbumCreateResponse.java diff --git a/src/main/java/com/cheeeese/album/application/AlbumService.java b/src/main/java/com/cheeeese/album/application/AlbumService.java index 53d3094..d98df40 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumService.java +++ b/src/main/java/com/cheeeese/album/application/AlbumService.java @@ -2,6 +2,8 @@ import com.cheeeese.album.application.validator.AlbumValidator; import com.cheeeese.album.domain.Album; +import com.cheeeese.album.dto.request.AlbumCreateRequest; +import com.cheeeese.album.dto.response.AlbumCreateResponse; import com.cheeeese.album.dto.response.AlbumInvitationResponse; import com.cheeeese.album.exception.AlbumException; import com.cheeeese.album.exception.code.AlbumErrorCode; @@ -23,7 +25,9 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDateTime; import java.util.List; +import java.util.UUID; import java.util.stream.Collectors; @Slf4j @@ -38,6 +42,25 @@ public class AlbumService { private final UserRepository userRepository; private final PhotoService photoService; + @Transactional + public AlbumCreateResponse createAlbum(User user, AlbumCreateRequest request) { + String code = UUID.randomUUID().toString(); + + Album album = AlbumMapper.toEntity( + user.getId(), + request.title(), + code, + request.themeImageUrl(), + request.participant(), + request.eventData(), + true, + LocalDateTime.now().plusDays(7) + ); + albumRepository.save(album); + + return AlbumMapper.toCreateResponse(album); + } + public AlbumInvitationResponse getInvitationInfo(String code) { Album album = albumValidator.validateAlbumCode(code); diff --git a/src/main/java/com/cheeeese/album/dto/request/AlbumCreateRequest.java b/src/main/java/com/cheeeese/album/dto/request/AlbumCreateRequest.java new file mode 100644 index 0000000..b38ef80 --- /dev/null +++ b/src/main/java/com/cheeeese/album/dto/request/AlbumCreateRequest.java @@ -0,0 +1,14 @@ +package com.cheeeese.album.dto.request; + +import lombok.Builder; + +import java.time.LocalDate; + +@Builder +public record AlbumCreateRequest( + String themeImageUrl, + String title, + int participant, + LocalDate eventData +) { +} diff --git a/src/main/java/com/cheeeese/album/dto/response/AlbumCreateResponse.java b/src/main/java/com/cheeeese/album/dto/response/AlbumCreateResponse.java new file mode 100644 index 0000000..a6e2eaa --- /dev/null +++ b/src/main/java/com/cheeeese/album/dto/response/AlbumCreateResponse.java @@ -0,0 +1,14 @@ +package com.cheeeese.album.dto.response; + +import lombok.Builder; + +import java.time.LocalDate; + +@Builder +public record AlbumCreateResponse( + String themeImageUrl, + LocalDate eventDate, + int currentParticipant, + String code +) { +} diff --git a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java index e1ee4d5..c8202a3 100644 --- a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java +++ b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java @@ -3,16 +3,60 @@ import com.cheeeese.album.domain.Album; import com.cheeeese.album.domain.UserAlbum; import com.cheeeese.album.domain.UserAlbumRole; +import com.cheeeese.album.dto.response.AlbumCreateResponse; import com.cheeeese.album.dto.response.AlbumEnterResponse; import com.cheeeese.album.dto.response.AlbumEnterResponse.AlbumHostInfo; import com.cheeeese.album.dto.response.AlbumEnterResponse.AlbumParticipantResponse; import com.cheeeese.album.dto.response.AlbumInvitationResponse; import com.cheeeese.user.domain.User; +import java.time.LocalDate; +import java.time.LocalDateTime; import java.util.List; public class AlbumMapper { + /** + * Album Entity 생성 + */ + public static Album toEntity( + Long hostId, + String title, + String code, + String themeImageUrl, + int participant, + LocalDate eventDate, + boolean isInfoAvailable, + LocalDateTime expiredAt + ) { + return Album.builder() + .hostId(hostId) + .title(title) + .code(code) + .themeImageUrl(themeImageUrl) + .participant(participant) + .currentParticipant(1) + .eventDate(eventDate) + .maxPhotoCount(2000) + .currentPhotoCount(0) + .isInfoAvailable(isInfoAvailable) + .expiredAt(expiredAt) + .status(Album.AlbumStatus.ACTIVE) + .build(); + } + + /** + * Album 생성 후, UUID Code 발급 + */ + public static AlbumCreateResponse toCreateResponse(Album album) { + return AlbumCreateResponse.builder() + .themeImageUrl(album.getThemeImageUrl()) + .eventDate(album.getEventDate()) + .currentParticipant(album.getCurrentParticipant()) + .code(album.getCode()) + .build(); + } + /** * Album 엔티티와 Host User 정보를 초대장 응답 DTO로 변환합니다. */ diff --git a/src/main/java/com/cheeeese/album/presentation/AlbumController.java b/src/main/java/com/cheeeese/album/presentation/AlbumController.java index e7fecf9..93d8574 100644 --- a/src/main/java/com/cheeeese/album/presentation/AlbumController.java +++ b/src/main/java/com/cheeeese/album/presentation/AlbumController.java @@ -1,12 +1,15 @@ package com.cheeeese.album.presentation; import com.cheeeese.album.application.AlbumService; +import com.cheeeese.album.dto.request.AlbumCreateRequest; +import com.cheeeese.album.dto.response.AlbumCreateResponse; import com.cheeeese.album.dto.response.AlbumEnterResponse; import com.cheeeese.album.dto.response.AlbumInvitationResponse; import com.cheeeese.album.presentation.swagger.AlbumSwagger; import com.cheeeese.global.common.CommonResponse; import com.cheeeese.global.util.CurrentUser; import com.cheeeese.user.domain.User; +import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; @@ -21,6 +24,14 @@ public class AlbumController implements AlbumSwagger { private final AlbumService albumService; + @PostMapping + public CommonResponse createAlbum( + @CurrentUser User user, + @RequestBody @Valid AlbumCreateRequest request + ) { + return CommonResponse.success(ALBUM_ENTER_SUCCESS, albumService.createAlbum(user, request)); + } + @Override @GetMapping("/{code}/invitation") public CommonResponse getInvitationInfo(@PathVariable String code) { From 24c4aae4a7e23a5eec116993fad3e8cc0b838874 Mon Sep 17 00:00:00 2001 From: zyovn Date: Wed, 15 Oct 2025 21:07:14 +0900 Subject: [PATCH 109/402] =?UTF-8?q?#14=20feat:=20=EC=95=A8=EB=B2=94=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=EC=9D=B4=EC=9A=A9=20=EC=95=BD=EA=B4=80=20?= =?UTF-8?q?=EB=8F=99=EC=9D=98=20=EC=BB=AC=EB=9F=BC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cheeeese/album/application/AlbumService.java | 3 ++- src/main/java/com/cheeeese/album/domain/Album.java | 7 ++++++- .../com/cheeeese/album/dto/request/AlbumCreateRequest.java | 3 ++- .../cheeeese/album/infrastructure/mapper/AlbumMapper.java | 4 +++- 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/cheeeese/album/application/AlbumService.java b/src/main/java/com/cheeeese/album/application/AlbumService.java index d98df40..826623c 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumService.java +++ b/src/main/java/com/cheeeese/album/application/AlbumService.java @@ -54,7 +54,8 @@ public AlbumCreateResponse createAlbum(User user, AlbumCreateRequest request) { request.participant(), request.eventData(), true, - LocalDateTime.now().plusDays(7) + LocalDateTime.now().plusDays(7), + request.isTermsAgreement() ); albumRepository.save(album); diff --git a/src/main/java/com/cheeeese/album/domain/Album.java b/src/main/java/com/cheeeese/album/domain/Album.java index 7851951..889e7db 100644 --- a/src/main/java/com/cheeeese/album/domain/Album.java +++ b/src/main/java/com/cheeeese/album/domain/Album.java @@ -58,6 +58,9 @@ public class Album extends BaseEntity { @Column(name = "status", nullable = false) private AlbumStatus status; + @Column(name = "is_terms_agreement", nullable = false) + private boolean isTermsAgreement; + public enum AlbumStatus { ACTIVE, EXPIRED, DELETED } @@ -79,7 +82,8 @@ private Album( int currentPhotoCount, boolean isInfoAvailable, LocalDateTime expiredAt, - AlbumStatus status + AlbumStatus status, + boolean isTermsAgreement ) { this.hostId = hostId; this.title = title; @@ -93,5 +97,6 @@ private Album( this.isInfoAvailable = isInfoAvailable; this.expiredAt = expiredAt; this.status = status; + this.isTermsAgreement = isTermsAgreement; } } diff --git a/src/main/java/com/cheeeese/album/dto/request/AlbumCreateRequest.java b/src/main/java/com/cheeeese/album/dto/request/AlbumCreateRequest.java index b38ef80..2491c75 100644 --- a/src/main/java/com/cheeeese/album/dto/request/AlbumCreateRequest.java +++ b/src/main/java/com/cheeeese/album/dto/request/AlbumCreateRequest.java @@ -9,6 +9,7 @@ public record AlbumCreateRequest( String themeImageUrl, String title, int participant, - LocalDate eventData + LocalDate eventData, + boolean isTermsAgreement ) { } diff --git a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java index c8202a3..fe87b4f 100644 --- a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java +++ b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java @@ -27,7 +27,8 @@ public static Album toEntity( int participant, LocalDate eventDate, boolean isInfoAvailable, - LocalDateTime expiredAt + LocalDateTime expiredAt, + boolean isTermsAgreement ) { return Album.builder() .hostId(hostId) @@ -42,6 +43,7 @@ public static Album toEntity( .isInfoAvailable(isInfoAvailable) .expiredAt(expiredAt) .status(Album.AlbumStatus.ACTIVE) + .isTermsAgreement(isTermsAgreement) .build(); } From 9337f70a375271cd8538166fd5651345b3e9e9bc Mon Sep 17 00:00:00 2001 From: zyovn Date: Wed, 15 Oct 2025 21:09:21 +0900 Subject: [PATCH 110/402] =?UTF-8?q?#14=20style:=20albumData=20->=20albumDa?= =?UTF-8?q?te=20=EC=98=A4=ED=83=80=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/cheeeese/album/application/AlbumService.java | 2 +- .../java/com/cheeeese/album/dto/request/AlbumCreateRequest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/cheeeese/album/application/AlbumService.java b/src/main/java/com/cheeeese/album/application/AlbumService.java index 826623c..1324c19 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumService.java +++ b/src/main/java/com/cheeeese/album/application/AlbumService.java @@ -52,7 +52,7 @@ public AlbumCreateResponse createAlbum(User user, AlbumCreateRequest request) { code, request.themeImageUrl(), request.participant(), - request.eventData(), + request.eventDate(), true, LocalDateTime.now().plusDays(7), request.isTermsAgreement() diff --git a/src/main/java/com/cheeeese/album/dto/request/AlbumCreateRequest.java b/src/main/java/com/cheeeese/album/dto/request/AlbumCreateRequest.java index 2491c75..3dd8f37 100644 --- a/src/main/java/com/cheeeese/album/dto/request/AlbumCreateRequest.java +++ b/src/main/java/com/cheeeese/album/dto/request/AlbumCreateRequest.java @@ -9,7 +9,7 @@ public record AlbumCreateRequest( String themeImageUrl, String title, int participant, - LocalDate eventData, + LocalDate eventDate, boolean isTermsAgreement ) { } From 3cc12b8279eae7377b5c804cf1df2421e79c8c8e Mon Sep 17 00:00:00 2001 From: zyovn Date: Wed, 15 Oct 2025 21:31:06 +0900 Subject: [PATCH 111/402] =?UTF-8?q?#14=20feat:=20=EC=95=A8=EB=B2=94=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=EC=98=88=EC=99=B8=20=EC=B2=98=EB=A6=AC=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cheeeese/album/application/AlbumService.java | 2 ++ .../application/validator/AlbumValidator.java | 15 +++++++++++++++ .../album/exception/code/AlbumErrorCode.java | 3 +++ 3 files changed, 20 insertions(+) diff --git a/src/main/java/com/cheeeese/album/application/AlbumService.java b/src/main/java/com/cheeeese/album/application/AlbumService.java index 1324c19..897e884 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumService.java +++ b/src/main/java/com/cheeeese/album/application/AlbumService.java @@ -46,6 +46,8 @@ public class AlbumService { public AlbumCreateResponse createAlbum(User user, AlbumCreateRequest request) { String code = UUID.randomUUID().toString(); + albumValidator.validateAlbumCreation(user, request); + Album album = AlbumMapper.toEntity( user.getId(), request.title(), diff --git a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java index b157aba..c996469 100644 --- a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java +++ b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java @@ -2,6 +2,7 @@ import com.cheeeese.album.domain.Album; import com.cheeeese.album.domain.UserAlbumRole; +import com.cheeeese.album.dto.request.AlbumCreateRequest; import com.cheeeese.album.exception.AlbumException; import com.cheeeese.album.exception.code.AlbumErrorCode; import com.cheeeese.album.infrastructure.persistence.AlbumRepository; @@ -17,6 +18,20 @@ public class AlbumValidator { private final AlbumRepository albumRepository; private final UserAlbumRepository userAlbumRepository; + public void validateAlbumCreation(User user, AlbumCreateRequest request) { + if (!request.isTermsAgreement()) { + throw new AlbumException(AlbumErrorCode.ALBUM_REQUIRED_TERMS_NOT_AGREED); + } + + if (request.participant() < 1 || request.participant() > 64) { + throw new AlbumException(AlbumErrorCode.ALBUM_INVALID_CAPACITY); + } + + if (user.getAlbumCnt() > 3) { + throw new AlbumException(AlbumErrorCode.ALBUM_CREATION_LIMIT_EXCEEDED); + } + } + public Album validateAlbumCode(String code) { return albumRepository.findByCode(code) .orElseThrow(() -> new AlbumException(AlbumErrorCode.ALBUM_NOT_FOUND)); diff --git a/src/main/java/com/cheeeese/album/exception/code/AlbumErrorCode.java b/src/main/java/com/cheeeese/album/exception/code/AlbumErrorCode.java index c1b167f..e129584 100644 --- a/src/main/java/com/cheeeese/album/exception/code/AlbumErrorCode.java +++ b/src/main/java/com/cheeeese/album/exception/code/AlbumErrorCode.java @@ -14,6 +14,9 @@ public enum AlbumErrorCode implements BaseCode { ALBUM_MAX_PARTICIPANT_REACHED(HttpStatus.BAD_REQUEST, "앨범의 최대 참가 인원수를 초과했습니다."), USER_IS_BLACKLISTED(HttpStatus.FORBIDDEN, "앨범 관리자에 의해 접근이 금지된 사용자입니다."), USER_ALREADY_JOINED_CONCURRENTLY(HttpStatus.CONFLICT, "동시성 오류: 이미 앨범에 참여 요청이 완료되었습니다."), + ALBUM_REQUIRED_TERMS_NOT_AGREED(HttpStatus.BAD_REQUEST, "앨범 생성 필수 약관에 동의하지 않았습니다."), + ALBUM_INVALID_CAPACITY(HttpStatus.BAD_REQUEST, "앨범 인원은 최소 1명 이상 최대 64명 이하여야 합니다."), + ALBUM_CREATION_LIMIT_EXCEEDED(HttpStatus.CONFLICT, "사용자는 최대 3개의 앨범만 생성할 수 있습니다."), ; private final HttpStatus httpStatus; From 10f6651e39347e7760ef1dea28e0052c508bbf8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Wed, 15 Oct 2025 22:11:52 +0900 Subject: [PATCH 112/402] =?UTF-8?q?#4=20feat:=20redis=20=EB=B9=84=EB=B0=80?= =?UTF-8?q?=EB=B2=88=ED=98=B8=20=EC=84=A4=EC=A0=95=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?=EB=B0=8F=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20trigger=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/cicd.yml | 6 +++--- docker-compose.yml | 3 +++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/.github/workflows/cicd.yml b/.github/workflows/cicd.yml index 33d7dff..a0816fa 100644 --- a/.github/workflows/cicd.yml +++ b/.github/workflows/cicd.yml @@ -2,7 +2,7 @@ name: CI/CD Workflow on: push: - branches: [ "main", "develop"] + branches: [ "main", "develop", "chore/#4-cicd"] jobs: CI-CD: @@ -126,7 +126,7 @@ jobs: # ---------------------- DEV Deployment ---------------------- - name: Docker build & push (develop) - if: github.ref == 'refs/heads/develop' + if: github.ref == 'refs/heads/develop' || github.ref == 'refs/heads/chore/#4-cicd' run: | IMAGE_NAME=${{ secrets.DOCKER_REPO }}/${{ secrets.DOCKER_IMAGE_NAME }} @@ -138,7 +138,7 @@ jobs: echo "✅ Pushed $IMAGE_NAME:dev" - name: Deploy to develop - if: github.ref == 'refs/heads/develop' + if: github.ref == 'refs/heads/develop' || github.ref == 'refs/heads/chore/#4-cicd' uses: appleboy/ssh-action@master with: host: ${{ secrets.SERVER_HOST }} diff --git a/docker-compose.yml b/docker-compose.yml index 5dec16c..d204ce7 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -8,8 +8,11 @@ services: image: redis:7.2-alpine container_name: redis restart: always + command: [ "redis-server", "--requirepass", "${SPRING_DATA_REDIS_PASSWORD}" ] ports: - "6379:6379" + environment: + - REDIS_PASSWORD=${SPRING_DATA_REDIS_PASSWORD} volumes: - redis-data:/data networks: From 0bd18f38a1cea717e4542c925652d6d8688885d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Wed, 15 Oct 2025 22:28:38 +0900 Subject: [PATCH 113/402] =?UTF-8?q?#4=20fix:=20health=20Check=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0=20=EB=B0=8F=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20trigger?= =?UTF-8?q?=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - deploy.sh에서 health check 진행 --- .github/workflows/cicd.yml | 6 +++--- docker-compose.yml | 26 +++----------------------- 2 files changed, 6 insertions(+), 26 deletions(-) diff --git a/.github/workflows/cicd.yml b/.github/workflows/cicd.yml index a0816fa..33d7dff 100644 --- a/.github/workflows/cicd.yml +++ b/.github/workflows/cicd.yml @@ -2,7 +2,7 @@ name: CI/CD Workflow on: push: - branches: [ "main", "develop", "chore/#4-cicd"] + branches: [ "main", "develop"] jobs: CI-CD: @@ -126,7 +126,7 @@ jobs: # ---------------------- DEV Deployment ---------------------- - name: Docker build & push (develop) - if: github.ref == 'refs/heads/develop' || github.ref == 'refs/heads/chore/#4-cicd' + if: github.ref == 'refs/heads/develop' run: | IMAGE_NAME=${{ secrets.DOCKER_REPO }}/${{ secrets.DOCKER_IMAGE_NAME }} @@ -138,7 +138,7 @@ jobs: echo "✅ Pushed $IMAGE_NAME:dev" - name: Deploy to develop - if: github.ref == 'refs/heads/develop' || github.ref == 'refs/heads/chore/#4-cicd' + if: github.ref == 'refs/heads/develop' uses: appleboy/ssh-action@master with: host: ${{ secrets.SERVER_HOST }} diff --git a/docker-compose.yml b/docker-compose.yml index d204ce7..595798f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -11,8 +11,8 @@ services: command: [ "redis-server", "--requirepass", "${SPRING_DATA_REDIS_PASSWORD}" ] ports: - "6379:6379" - environment: - - REDIS_PASSWORD=${SPRING_DATA_REDIS_PASSWORD} + env_file: + - /root/.env volumes: - redis-data:/data networks: @@ -33,11 +33,6 @@ services: restart: always networks: - cheeeeese-network - healthcheck: - test: ["CMD", "curl", "-f", "http://localhost:8080/actuator/health"] - interval: 5s - timeout: 3s - retries: 5 backend-blue-prod: image: mozzarella32/backend:prod @@ -51,11 +46,6 @@ services: restart: always networks: - cheeeeese-network - healthcheck: - test: ["CMD", "curl", "-f", "http://localhost:8080/actuator/health"] - interval: 5s - timeout: 3s - retries: 5 # ------------------------------------------------------------ # ✅ 개발 환경용 @@ -72,11 +62,6 @@ services: restart: always networks: - cheeeeese-network - healthcheck: - test: [ "CMD", "curl", "-f", "http://localhost:8080/actuator/health" ] - interval: 5s - timeout: 3s - retries: 5 backend-blue-dev: image: mozzarella32/backend:dev @@ -90,11 +75,6 @@ services: restart: always networks: - cheeeeese-network - healthcheck: - test: [ "CMD", "curl", "-f", "http://localhost:8080/actuator/health" ] - interval: 5s - timeout: 3s - retries: 5 # ------------------------------------------------------------ # ✅ 네트워크 및 볼륨 정의 @@ -104,4 +84,4 @@ networks: driver: bridge volumes: - redis-data: + redis-data: \ No newline at end of file From 3caf3083a8cf963e153ad38cc6bb9548d331d1e3 Mon Sep 17 00:00:00 2001 From: zyovn Date: Thu, 16 Oct 2025 10:48:13 +0900 Subject: [PATCH 114/402] =?UTF-8?q?#14=20rename:=20userAlbum=20->=20albumP?= =?UTF-8?q?articipant=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../album/application/AlbumService.java | 20 +++++++++---------- .../application/validator/AlbumValidator.java | 10 +++++----- .../{UserAlbum.java => AlbumParticipant.java} | 11 +++++----- .../infrastructure/mapper/AlbumMapper.java | 10 +++++----- .../AlbumParticipantRepository.java | 16 +++++++++++++++ .../persistence/UserAlbumRepository.java | 16 --------------- 6 files changed, 41 insertions(+), 42 deletions(-) rename src/main/java/com/cheeeese/album/domain/{UserAlbum.java => AlbumParticipant.java} (77%) create mode 100644 src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumParticipantRepository.java delete mode 100644 src/main/java/com/cheeeese/album/infrastructure/persistence/UserAlbumRepository.java diff --git a/src/main/java/com/cheeeese/album/application/AlbumService.java b/src/main/java/com/cheeeese/album/application/AlbumService.java index 897e884..19bdd49 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumService.java +++ b/src/main/java/com/cheeeese/album/application/AlbumService.java @@ -10,11 +10,11 @@ import com.cheeeese.album.infrastructure.mapper.AlbumMapper; import com.cheeeese.album.infrastructure.persistence.AlbumRepository; import com.cheeeese.photo.application.PhotoService; -import com.cheeeese.album.domain.UserAlbum; +import com.cheeeese.album.domain.AlbumParticipant; import com.cheeeese.album.dto.response.AlbumEnterResponse; import com.cheeeese.album.dto.response.AlbumEnterResponse.AlbumHostInfo; import com.cheeeese.album.dto.response.AlbumEnterResponse.AlbumParticipantResponse; -import com.cheeeese.album.infrastructure.persistence.UserAlbumRepository; +import com.cheeeese.album.infrastructure.persistence.AlbumParticipantRepository; import com.cheeeese.user.domain.User; import com.cheeeese.user.exception.UserException; import com.cheeeese.user.exception.code.UserErrorCode; @@ -38,7 +38,7 @@ public class AlbumService { private final AlbumValidator albumValidator; private final AlbumRepository albumRepository; - private final UserAlbumRepository userAlbumRepository; + private final AlbumParticipantRepository albumParticipantRepository; private final UserRepository userRepository; private final PhotoService photoService; @@ -82,7 +82,7 @@ public AlbumEnterResponse enterAlbum(String code, User currentUser) { // 2. 앨범 입장 인가 검증 (만료, 블랙리스트, 정원 초과) albumValidator.validateAlbumEntry(album, currentUser); - // 3. 사용자 앨범 참가 로직: 첫 입장 시 GUEST로 등록 및 참가자 수 증가 + // 3. 사용자 앨범 참가 로직: 첫 입장 시 isBlacklisted = false로 등록 및 참가자 수 증가 Album freshAlbum = handleAlbumParticipation(album, currentUser); // 4. 응답 DTO 생성 @@ -90,7 +90,7 @@ public AlbumEnterResponse enterAlbum(String code, User currentUser) { } private Album handleAlbumParticipation(Album album, User currentUser) { - boolean isAlreadyParticipant = userAlbumRepository.findByUserIdAndAlbumId(currentUser.getId(), album.getId()).isPresent(); + boolean isAlreadyParticipant = albumParticipantRepository.findByUserIdAndAlbumId(currentUser.getId(), album.getId()).isPresent(); if (isAlreadyParticipant) { log.info("User {} is already a participant of album {}. Skipping registration.", @@ -98,10 +98,10 @@ private Album handleAlbumParticipation(Album album, User currentUser) { return album; } - // 첫 입장: UserAlbum에 GUEST로 저장하고, Album 참가자 수 증가 - UserAlbum newUserAlbum = AlbumMapper.toGuestUserAlbum(currentUser, album); + // 첫 입장: AlbumParticipant에 isBlacklisted = false로 저장하고, Album 참가자 수 증가 + AlbumParticipant newAlbumParticipant = AlbumMapper.toGuestUserAlbum(currentUser, album); try { - userAlbumRepository.save(newUserAlbum); + albumParticipantRepository.save(newAlbumParticipant); int updatedRows = albumRepository.incrementParticipantCountAtomically(album.getId()); if (updatedRows == 0) { @@ -152,8 +152,8 @@ private User getHostUser(Long hostId) { } private List getParticipantResponses(Long albumId) { - List participantUserIds = userAlbumRepository.findAllByAlbumId(albumId).stream() - .map(UserAlbum::getUserId) + List participantUserIds = albumParticipantRepository.findAllByAlbumId(albumId).stream() + .map(AlbumParticipant::getUserId) .collect(Collectors.toList()); List participants = userRepository.findAllById(participantUserIds); diff --git a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java index c996469..c08cb0d 100644 --- a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java +++ b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java @@ -1,12 +1,12 @@ package com.cheeeese.album.application.validator; import com.cheeeese.album.domain.Album; -import com.cheeeese.album.domain.UserAlbumRole; +import com.cheeeese.album.domain.AlbumParticipant; import com.cheeeese.album.dto.request.AlbumCreateRequest; import com.cheeeese.album.exception.AlbumException; import com.cheeeese.album.exception.code.AlbumErrorCode; import com.cheeeese.album.infrastructure.persistence.AlbumRepository; -import com.cheeeese.album.infrastructure.persistence.UserAlbumRepository; +import com.cheeeese.album.infrastructure.persistence.AlbumParticipantRepository; import com.cheeeese.user.domain.User; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; @@ -16,7 +16,7 @@ public class AlbumValidator { private final AlbumRepository albumRepository; - private final UserAlbumRepository userAlbumRepository; + private final AlbumParticipantRepository albumParticipantRepository; public void validateAlbumCreation(User user, AlbumCreateRequest request) { if (!request.isTermsAgreement()) { @@ -55,8 +55,8 @@ public void validateAlbumEntry(Album album, User user) { * 사용자가 앨범의 블랙리스트에 등록되어 있는지 확인합니다. */ private void validateUserBlacklisted(Album album, User user) { - userAlbumRepository.findByAlbumIdAndUserIdAndRole(album.getId(), user.getId(), UserAlbumRole.BLACK) - .ifPresent(userAlbum -> { + albumParticipantRepository.findByAlbumIdAndUserIdAndBlacklistedTrue(album.getId(), user.getId()) + .ifPresent(blacklisted -> { throw new AlbumException(AlbumErrorCode.USER_IS_BLACKLISTED); }); } diff --git a/src/main/java/com/cheeeese/album/domain/UserAlbum.java b/src/main/java/com/cheeeese/album/domain/AlbumParticipant.java similarity index 77% rename from src/main/java/com/cheeeese/album/domain/UserAlbum.java rename to src/main/java/com/cheeeese/album/domain/AlbumParticipant.java index 2808e92..a8bf2d3 100644 --- a/src/main/java/com/cheeeese/album/domain/UserAlbum.java +++ b/src/main/java/com/cheeeese/album/domain/AlbumParticipant.java @@ -11,7 +11,7 @@ @Getter @Table(name = "user_album", uniqueConstraints = @UniqueConstraint(columnNames = {"user_id", "album_id"})) @NoArgsConstructor(access = AccessLevel.PROTECTED) -public class UserAlbum extends BaseEntity { +public class AlbumParticipant extends BaseEntity { @Id @Column(name = "user_album_id", nullable = false) @@ -26,14 +26,13 @@ public class UserAlbum extends BaseEntity { @Column(name = "album_id", nullable = false) private Long albumId; - @Enumerated(EnumType.STRING) - @Column(name = "role", nullable = false) - private UserAlbumRole role; + @Column(name = "is_blacklisted", nullable = false) + private boolean isBlacklisted; @Builder - private UserAlbum(Long userId, Long albumId, UserAlbumRole role) { + private AlbumParticipant(Long userId, Long albumId, boolean isBlacklisted) { this.userId = userId; this.albumId = albumId; - this.role = role; + this.isBlacklisted = isBlacklisted; } } \ No newline at end of file diff --git a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java index fe87b4f..af3c581 100644 --- a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java +++ b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java @@ -1,7 +1,7 @@ package com.cheeeese.album.infrastructure.mapper; import com.cheeeese.album.domain.Album; -import com.cheeeese.album.domain.UserAlbum; +import com.cheeeese.album.domain.AlbumParticipant; import com.cheeeese.album.domain.UserAlbumRole; import com.cheeeese.album.dto.response.AlbumCreateResponse; import com.cheeeese.album.dto.response.AlbumEnterResponse; @@ -109,13 +109,13 @@ public static AlbumHostInfo toHostInfo(User host) { } /** - * User와 Album 엔티티를 기반으로 GUEST 역할의 UserAlbum 엔티티를 생성합니다. + * User와 Album 엔티티를 기반으로 isBlacklisted = false 역할의 AlbumParticipant 엔티티를 생성합니다. */ - public static UserAlbum toGuestUserAlbum(User user, Album album) { - return UserAlbum.builder() + public static AlbumParticipant toGuestUserAlbum(User user, Album album) { + return AlbumParticipant.builder() .userId(user.getId()) .albumId(album.getId()) - .role(UserAlbumRole.GUEST) + .isBlacklisted(false) .build(); } diff --git a/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumParticipantRepository.java b/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumParticipantRepository.java new file mode 100644 index 0000000..bb485c8 --- /dev/null +++ b/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumParticipantRepository.java @@ -0,0 +1,16 @@ +package com.cheeeese.album.infrastructure.persistence; + +import com.cheeeese.album.domain.AlbumParticipant; +import com.cheeeese.album.domain.UserAlbumRole; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; +import java.util.Optional; + +public interface AlbumParticipantRepository extends JpaRepository { + Optional findByUserIdAndAlbumId(Long userId, Long albumId); + + List findAllByAlbumId(Long albumId); + + Optional findByAlbumIdAndUserIdAndBlacklistedTrue(Long albumId, Long userId); +} diff --git a/src/main/java/com/cheeeese/album/infrastructure/persistence/UserAlbumRepository.java b/src/main/java/com/cheeeese/album/infrastructure/persistence/UserAlbumRepository.java deleted file mode 100644 index 91e9c3e..0000000 --- a/src/main/java/com/cheeeese/album/infrastructure/persistence/UserAlbumRepository.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.cheeeese.album.infrastructure.persistence; - -import com.cheeeese.album.domain.UserAlbum; -import com.cheeeese.album.domain.UserAlbumRole; -import org.springframework.data.jpa.repository.JpaRepository; - -import java.util.List; -import java.util.Optional; - -public interface UserAlbumRepository extends JpaRepository { - Optional findByUserIdAndAlbumId(Long userId, Long albumId); - - List findAllByAlbumId(Long albumId); - - Optional findByAlbumIdAndUserIdAndRole(Long albumId, Long userId, UserAlbumRole role); -} From ceb25dcd7d542fd6177fb97cd3b0242e846a0d0b Mon Sep 17 00:00:00 2001 From: zyovn Date: Thu, 16 Oct 2025 10:49:24 +0900 Subject: [PATCH 115/402] =?UTF-8?q?#14=20remove:=20userAlbumRole=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/cheeeese/album/domain/UserAlbumRole.java | 7 ------- .../cheeeese/album/infrastructure/mapper/AlbumMapper.java | 1 - .../persistence/AlbumParticipantRepository.java | 1 - 3 files changed, 9 deletions(-) delete mode 100644 src/main/java/com/cheeeese/album/domain/UserAlbumRole.java diff --git a/src/main/java/com/cheeeese/album/domain/UserAlbumRole.java b/src/main/java/com/cheeeese/album/domain/UserAlbumRole.java deleted file mode 100644 index acbda07..0000000 --- a/src/main/java/com/cheeeese/album/domain/UserAlbumRole.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.cheeeese.album.domain; - -public enum UserAlbumRole { - HOST, - GUEST, - BLACK -} diff --git a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java index af3c581..55c2b96 100644 --- a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java +++ b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java @@ -2,7 +2,6 @@ import com.cheeeese.album.domain.Album; import com.cheeeese.album.domain.AlbumParticipant; -import com.cheeeese.album.domain.UserAlbumRole; import com.cheeeese.album.dto.response.AlbumCreateResponse; import com.cheeeese.album.dto.response.AlbumEnterResponse; import com.cheeeese.album.dto.response.AlbumEnterResponse.AlbumHostInfo; diff --git a/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumParticipantRepository.java b/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumParticipantRepository.java index bb485c8..ecf53ee 100644 --- a/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumParticipantRepository.java +++ b/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumParticipantRepository.java @@ -1,7 +1,6 @@ package com.cheeeese.album.infrastructure.persistence; import com.cheeeese.album.domain.AlbumParticipant; -import com.cheeeese.album.domain.UserAlbumRole; import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; From 778aa00d5fb39f3abc3aa9fd51b5538e84d24981 Mon Sep 17 00:00:00 2001 From: zyovn Date: Thu, 16 Oct 2025 11:18:59 +0900 Subject: [PATCH 116/402] =?UTF-8?q?#14=20fix:=20=EC=84=B1=EA=B3=B5=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cheeeese/album/presentation/AlbumController.java | 5 ++--- .../java/com/cheeeese/global/common/code/SuccessCode.java | 1 + 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/cheeeese/album/presentation/AlbumController.java b/src/main/java/com/cheeeese/album/presentation/AlbumController.java index 93d8574..c0eac5e 100644 --- a/src/main/java/com/cheeeese/album/presentation/AlbumController.java +++ b/src/main/java/com/cheeeese/album/presentation/AlbumController.java @@ -13,8 +13,7 @@ import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; -import static com.cheeeese.global.common.code.SuccessCode.ALBUM_ENTER_SUCCESS; -import static com.cheeeese.global.common.code.SuccessCode.ALBUM_INVITATION_FETCH_SUCCESS; +import static com.cheeeese.global.common.code.SuccessCode.*; @RestController @@ -29,7 +28,7 @@ public CommonResponse createAlbum( @CurrentUser User user, @RequestBody @Valid AlbumCreateRequest request ) { - return CommonResponse.success(ALBUM_ENTER_SUCCESS, albumService.createAlbum(user, request)); + return CommonResponse.success(ALBUM_CREATE_SUCCESS, albumService.createAlbum(user, request)); } @Override diff --git a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java index edd1e57..1d7cca7 100644 --- a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java +++ b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java @@ -23,6 +23,7 @@ public enum SuccessCode implements BaseCode { // album ALBUM_INVITATION_FETCH_SUCCESS(HttpStatus.OK, "앨범 초대장 정보 조회가 성공적으로 완료되었습니다."), ALBUM_ENTER_SUCCESS(HttpStatus.OK, "앨범 입장이 성공적으로 완료되었습니다."), + ALBUM_CREATE_SUCCESS(HttpStatus.OK, "Album Create Success"), ; private final HttpStatus httpStatus; From 36cc5e9db604c64088d25e1fdbff571602122e62 Mon Sep 17 00:00:00 2001 From: zyovn Date: Thu, 16 Oct 2025 18:34:47 +0900 Subject: [PATCH 117/402] =?UTF-8?q?#14=20docs:=20swagger=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1=20=EB=B0=8F=20dto=20=EC=9D=B4=EB=A6=84=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../album/application/AlbumService.java | 6 ++--- .../application/validator/AlbumValidator.java | 5 ++-- .../album/dto/request/AlbumCreateRequest.java | 15 ----------- .../dto/request/AlbumCreationRequest.java | 26 ++++++++++++++++++ .../dto/response/AlbumCreateResponse.java | 14 ---------- .../dto/response/AlbumCreationResponse.java | 23 ++++++++++++++++ .../infrastructure/mapper/AlbumMapper.java | 6 ++--- .../album/presentation/AlbumController.java | 9 ++++--- .../presentation/swagger/AlbumSwagger.java | 27 +++++++++++++++++++ 9 files changed, 89 insertions(+), 42 deletions(-) delete mode 100644 src/main/java/com/cheeeese/album/dto/request/AlbumCreateRequest.java create mode 100644 src/main/java/com/cheeeese/album/dto/request/AlbumCreationRequest.java delete mode 100644 src/main/java/com/cheeeese/album/dto/response/AlbumCreateResponse.java create mode 100644 src/main/java/com/cheeeese/album/dto/response/AlbumCreationResponse.java diff --git a/src/main/java/com/cheeeese/album/application/AlbumService.java b/src/main/java/com/cheeeese/album/application/AlbumService.java index 19bdd49..2620256 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumService.java +++ b/src/main/java/com/cheeeese/album/application/AlbumService.java @@ -2,8 +2,8 @@ import com.cheeeese.album.application.validator.AlbumValidator; import com.cheeeese.album.domain.Album; -import com.cheeeese.album.dto.request.AlbumCreateRequest; -import com.cheeeese.album.dto.response.AlbumCreateResponse; +import com.cheeeese.album.dto.request.AlbumCreationRequest; +import com.cheeeese.album.dto.response.AlbumCreationResponse; import com.cheeeese.album.dto.response.AlbumInvitationResponse; import com.cheeeese.album.exception.AlbumException; import com.cheeeese.album.exception.code.AlbumErrorCode; @@ -43,7 +43,7 @@ public class AlbumService { private final PhotoService photoService; @Transactional - public AlbumCreateResponse createAlbum(User user, AlbumCreateRequest request) { + public AlbumCreationResponse createAlbum(User user, AlbumCreationRequest request) { String code = UUID.randomUUID().toString(); albumValidator.validateAlbumCreation(user, request); diff --git a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java index c08cb0d..ddc00d1 100644 --- a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java +++ b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java @@ -1,8 +1,7 @@ package com.cheeeese.album.application.validator; import com.cheeeese.album.domain.Album; -import com.cheeeese.album.domain.AlbumParticipant; -import com.cheeeese.album.dto.request.AlbumCreateRequest; +import com.cheeeese.album.dto.request.AlbumCreationRequest; import com.cheeeese.album.exception.AlbumException; import com.cheeeese.album.exception.code.AlbumErrorCode; import com.cheeeese.album.infrastructure.persistence.AlbumRepository; @@ -18,7 +17,7 @@ public class AlbumValidator { private final AlbumRepository albumRepository; private final AlbumParticipantRepository albumParticipantRepository; - public void validateAlbumCreation(User user, AlbumCreateRequest request) { + public void validateAlbumCreation(User user, AlbumCreationRequest request) { if (!request.isTermsAgreement()) { throw new AlbumException(AlbumErrorCode.ALBUM_REQUIRED_TERMS_NOT_AGREED); } diff --git a/src/main/java/com/cheeeese/album/dto/request/AlbumCreateRequest.java b/src/main/java/com/cheeeese/album/dto/request/AlbumCreateRequest.java deleted file mode 100644 index 3dd8f37..0000000 --- a/src/main/java/com/cheeeese/album/dto/request/AlbumCreateRequest.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.cheeeese.album.dto.request; - -import lombok.Builder; - -import java.time.LocalDate; - -@Builder -public record AlbumCreateRequest( - String themeImageUrl, - String title, - int participant, - LocalDate eventDate, - boolean isTermsAgreement -) { -} diff --git a/src/main/java/com/cheeeese/album/dto/request/AlbumCreationRequest.java b/src/main/java/com/cheeeese/album/dto/request/AlbumCreationRequest.java new file mode 100644 index 0000000..febef81 --- /dev/null +++ b/src/main/java/com/cheeeese/album/dto/request/AlbumCreationRequest.java @@ -0,0 +1,26 @@ +package com.cheeeese.album.dto.request; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Builder; + +import java.time.LocalDate; + +@Builder +@Schema(description = "앨범 생성 API") +public record AlbumCreationRequest( + @Schema(description = "썸네일 이미지", example = "https://theme.jpg") + String themeImageUrl, + + @Schema(description = "앨범 이름", example = "졸업식") + String title, + + @Schema(description = "참여자 수", example = "64") + int participant, + + @Schema(description = "행사 날짜", example = "2025.02.01") + LocalDate eventDate, + + @Schema(description = "앨범 생성 필수 약관 동의", example = "true") + boolean isTermsAgreement +) { +} diff --git a/src/main/java/com/cheeeese/album/dto/response/AlbumCreateResponse.java b/src/main/java/com/cheeeese/album/dto/response/AlbumCreateResponse.java deleted file mode 100644 index a6e2eaa..0000000 --- a/src/main/java/com/cheeeese/album/dto/response/AlbumCreateResponse.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.cheeeese.album.dto.response; - -import lombok.Builder; - -import java.time.LocalDate; - -@Builder -public record AlbumCreateResponse( - String themeImageUrl, - LocalDate eventDate, - int currentParticipant, - String code -) { -} diff --git a/src/main/java/com/cheeeese/album/dto/response/AlbumCreationResponse.java b/src/main/java/com/cheeeese/album/dto/response/AlbumCreationResponse.java new file mode 100644 index 0000000..dbb18de --- /dev/null +++ b/src/main/java/com/cheeeese/album/dto/response/AlbumCreationResponse.java @@ -0,0 +1,23 @@ +package com.cheeeese.album.dto.response; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Builder; + +import java.time.LocalDate; + +@Builder +@Schema(description = "앨범 생성 API") +public record AlbumCreationResponse( + @Schema(description = "썸네일 이미지", example = "https://theme.jpg") + String themeImageUrl, + + @Schema(description = "행사 날짜", example = "2025.02.01") + LocalDate eventDate, + + @Schema(description = "현재 참여자 수", example = "1") + int currentParticipant, + + @Schema(description = "앨범 코드", example = "786ccd09-5f22-4aa9-a32b-f62dd2e94cc8") + String code +) { +} diff --git a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java index 55c2b96..07d72d3 100644 --- a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java +++ b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java @@ -2,7 +2,7 @@ import com.cheeeese.album.domain.Album; import com.cheeeese.album.domain.AlbumParticipant; -import com.cheeeese.album.dto.response.AlbumCreateResponse; +import com.cheeeese.album.dto.response.AlbumCreationResponse; import com.cheeeese.album.dto.response.AlbumEnterResponse; import com.cheeeese.album.dto.response.AlbumEnterResponse.AlbumHostInfo; import com.cheeeese.album.dto.response.AlbumEnterResponse.AlbumParticipantResponse; @@ -49,8 +49,8 @@ public static Album toEntity( /** * Album 생성 후, UUID Code 발급 */ - public static AlbumCreateResponse toCreateResponse(Album album) { - return AlbumCreateResponse.builder() + public static AlbumCreationResponse toCreateResponse(Album album) { + return AlbumCreationResponse.builder() .themeImageUrl(album.getThemeImageUrl()) .eventDate(album.getEventDate()) .currentParticipant(album.getCurrentParticipant()) diff --git a/src/main/java/com/cheeeese/album/presentation/AlbumController.java b/src/main/java/com/cheeeese/album/presentation/AlbumController.java index c0eac5e..baea36e 100644 --- a/src/main/java/com/cheeeese/album/presentation/AlbumController.java +++ b/src/main/java/com/cheeeese/album/presentation/AlbumController.java @@ -1,8 +1,8 @@ package com.cheeeese.album.presentation; import com.cheeeese.album.application.AlbumService; -import com.cheeeese.album.dto.request.AlbumCreateRequest; -import com.cheeeese.album.dto.response.AlbumCreateResponse; +import com.cheeeese.album.dto.request.AlbumCreationRequest; +import com.cheeeese.album.dto.response.AlbumCreationResponse; import com.cheeeese.album.dto.response.AlbumEnterResponse; import com.cheeeese.album.dto.response.AlbumInvitationResponse; import com.cheeeese.album.presentation.swagger.AlbumSwagger; @@ -23,10 +23,11 @@ public class AlbumController implements AlbumSwagger { private final AlbumService albumService; + @Override @PostMapping - public CommonResponse createAlbum( + public CommonResponse createAlbum( @CurrentUser User user, - @RequestBody @Valid AlbumCreateRequest request + @RequestBody @Valid AlbumCreationRequest request ) { return CommonResponse.success(ALBUM_CREATE_SUCCESS, albumService.createAlbum(user, request)); } diff --git a/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java b/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java index 6d98904..1d5b21b 100644 --- a/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java +++ b/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java @@ -1,5 +1,7 @@ package com.cheeeese.album.presentation.swagger; +import com.cheeeese.album.dto.request.AlbumCreationRequest; +import com.cheeeese.album.dto.response.AlbumCreationResponse; import com.cheeeese.album.dto.response.AlbumEnterResponse; import com.cheeeese.album.dto.response.AlbumInvitationResponse; import com.cheeeese.global.common.CommonResponse; @@ -11,10 +13,35 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; @Tag(name = "[앨범]", description = "앨범 관련 API") public interface AlbumSwagger { + @Operation( + summary = "앨범 생성 API", + description = """ + ### RequestBody + --- + `themeImageUrl`: 앨범 썸네일 이미지 (String) \n + `title`: 앨범 이름 (String) \n + `participant`: 참여자 수 (int) \n + `eventDate`: 행사 날짜 (LocalDate) \n + `isTermsAgreement`: 앨범 생성 필수 약관 동의 (boolean) + """ + ) + @ApiResponses(value = { + @ApiResponse( + responseCode = "200", + description = "앨범 생성이 성공적으로 실행되었습니다." + ) + }) + CommonResponse createAlbum( + @CurrentUser User user, + @RequestBody @Valid AlbumCreationRequest request + ); + @Operation( summary = "앨범 초대장 기본 정보 확인 API (로그인 불필요)", description = """ From 5a5378f690f025b9410033a5d33ce89d7e062c88 Mon Sep 17 00:00:00 2001 From: zyovn Date: Sat, 18 Oct 2025 15:43:49 +0900 Subject: [PATCH 118/402] =?UTF-8?q?#14=20test:=20=EC=95=A8=EB=B2=94=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20uuid=20v4,=20uuid=20v7=20=EB=B9=84?= =?UTF-8?q?=EA=B5=90=20=EB=B2=A4=EC=B9=98=EB=A7=88=ED=81=AC=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + build.gradle | 7 +- .../application/validator/AlbumValidator.java | 2 +- .../AlbumParticipantRepository.java | 2 +- .../benchmark/AlbumServiceBenchmarkTest.java | 96 +++++++++++++++++++ .../com/cheeeese/fixture/FixtureFactory.java | 57 +++++++++++ 6 files changed, 162 insertions(+), 3 deletions(-) create mode 100644 src/test/java/com/cheeeese/album/benchmark/AlbumServiceBenchmarkTest.java create mode 100644 src/test/java/com/cheeeese/fixture/FixtureFactory.java diff --git a/.gitignore b/.gitignore index 391a66a..1ed957a 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,7 @@ build/ application.yml application-dev.yml application-prod.yml +application-test.yml ### STS ### .apt_generated diff --git a/build.gradle b/build.gradle index 373b36a..df90e75 100644 --- a/build.gradle +++ b/build.gradle @@ -50,8 +50,13 @@ dependencies { // redis implementation 'org.springframework.boot:spring-boot-starter-data-redis' + + // uuid v7 + implementation 'com.github.f4b6a3:uuid-creator:5.2.0' } tasks.named('test') { - useJUnitPlatform() + useJUnitPlatform { + excludeTags 'benchmark' + } } diff --git a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java index ddc00d1..c4685f5 100644 --- a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java +++ b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java @@ -54,7 +54,7 @@ public void validateAlbumEntry(Album album, User user) { * 사용자가 앨범의 블랙리스트에 등록되어 있는지 확인합니다. */ private void validateUserBlacklisted(Album album, User user) { - albumParticipantRepository.findByAlbumIdAndUserIdAndBlacklistedTrue(album.getId(), user.getId()) + albumParticipantRepository.findByAlbumIdAndUserIdAndIsBlacklistedTrue(album.getId(), user.getId()) .ifPresent(blacklisted -> { throw new AlbumException(AlbumErrorCode.USER_IS_BLACKLISTED); }); diff --git a/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumParticipantRepository.java b/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumParticipantRepository.java index ecf53ee..8ba6d4c 100644 --- a/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumParticipantRepository.java +++ b/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumParticipantRepository.java @@ -11,5 +11,5 @@ public interface AlbumParticipantRepository extends JpaRepository findAllByAlbumId(Long albumId); - Optional findByAlbumIdAndUserIdAndBlacklistedTrue(Long albumId, Long userId); + Optional findByAlbumIdAndUserIdAndIsBlacklistedTrue(Long albumId, Long userId); } diff --git a/src/test/java/com/cheeeese/album/benchmark/AlbumServiceBenchmarkTest.java b/src/test/java/com/cheeeese/album/benchmark/AlbumServiceBenchmarkTest.java new file mode 100644 index 0000000..737e8f4 --- /dev/null +++ b/src/test/java/com/cheeeese/album/benchmark/AlbumServiceBenchmarkTest.java @@ -0,0 +1,96 @@ +package com.cheeeese.album.benchmark; + +import com.cheeeese.album.domain.Album; +import com.cheeeese.album.infrastructure.persistence.AlbumRepository; +import com.cheeeese.fixture.FixtureFactory; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.data.domain.Sort; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +@SpringBootTest +@Transactional +@Tag("benchmark") +public class AlbumServiceBenchmarkTest { + + @Autowired + private AlbumRepository albumRepository; + + private static final int DATA_SIZE = 20000; + private final Random random = new Random(); + + @BeforeEach + void setUp() { + System.out.println("UUID v4Codes VS UUID v7Codes 성능 테스트를 위한 데이터 삽입 시작"); + + List v4Albums = new ArrayList<>(); + List v7Albums = new ArrayList<>(); + + for (int i = 0; i < DATA_SIZE; i++) { + v4Albums.add(FixtureFactory.createAlbumV4(i)); + v7Albums.add(FixtureFactory.createAlbumV7(i)); + } + + long startV4 = System.currentTimeMillis(); + albumRepository.saveAll(v4Albums); + albumRepository.flush(); + long v4InsertTime = System.currentTimeMillis() - startV4; + + long startV7 = System.currentTimeMillis(); + albumRepository.saveAll(v7Albums); + albumRepository.flush(); + long v7InsertTime = System.currentTimeMillis() - startV7; + + System.out.printf("Insert 완료 (v4: %d ms, v7: %d ms)%n", v4InsertTime, v7InsertTime); + } + + @Test + @DisplayName("UUID v4 vs v7 전체 DB 성능 테스트") + void compareFullPerformance() { + List allAlbums = albumRepository.findAll(); + + List v4Codes = allAlbums.stream() + .filter(a -> a.getTitle().startsWith("v4")) + .map(Album::getCode) + .toList(); + + List v7Codes = allAlbums.stream() + .filter(a -> a.getTitle().startsWith("v7")) + .map(Album::getCode) + .toList(); + + // 평균 조회 속도 테스트 + measureSelectingTest("v4", v4Codes); + measureSelectingTest("v7", v7Codes); + + // 전체 정렬 시간 테스트 + measureSortingTest("v4"); + measureSortingTest("v7"); + } + + private void measureSelectingTest(String label, List codes) { + long total = 0; + for (int i = 0; i < 100; i++) { + String code = codes.get(random.nextInt(codes.size())); + long start = System.nanoTime(); + albumRepository.findByCode(code); + total += System.nanoTime() - start; + } + System.out.printf("[%s] 평균 조회 시간: %.2f ms%n", label, total / 1000000.0); + } + + private void measureSortingTest(String label) { + long start = System.currentTimeMillis(); + albumRepository.findAll(Sort.by(Sort.Direction.DESC, "code")); + long elapsed = System.currentTimeMillis() - start; + System.out.printf("[%s] Order By 정렬 시간: %d ms%n", label, elapsed); + } +} diff --git a/src/test/java/com/cheeeese/fixture/FixtureFactory.java b/src/test/java/com/cheeeese/fixture/FixtureFactory.java new file mode 100644 index 0000000..4e3a299 --- /dev/null +++ b/src/test/java/com/cheeeese/fixture/FixtureFactory.java @@ -0,0 +1,57 @@ +package com.cheeeese.fixture; + +import com.cheeeese.album.domain.Album; +import com.cheeeese.album.infrastructure.mapper.AlbumMapper; +import com.github.f4b6a3.uuid.UuidCreator; +import org.springframework.test.util.ReflectionTestUtils; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.UUID; + +public class FixtureFactory { + + public static Album createAlbum(Long id) { + Album album = AlbumMapper.toEntity( + 1L, + "테스트 앨범", + "테스트 코드", + "테스트 이미지", + 4, + LocalDate.of(2025, 1, 1), + true, + LocalDateTime.now().plusDays(7), + true + ); + ReflectionTestUtils.setField(album, "id", id); + return album; + } + + public static Album createAlbumV4(int i) { + return AlbumMapper.toEntity( + 1L, + "v4-" + i, + UUID.randomUUID().toString(), + "테스트 이미지", + 4, + LocalDate.of(2025, 1, 1), + true, + LocalDateTime.now().plusDays(7), + true + ); + } + + public static Album createAlbumV7(int i) { + return AlbumMapper.toEntity( + 1L, + "v7-" + i, + UuidCreator.getTimeOrdered().toString(), + "테스트 이미지", + 4, + LocalDate.of(2025, 1, 1), + true, + LocalDateTime.now().plusDays(7), + true + ); + } +} From 992c2cc795cc60a18b558b958037e130555abe10 Mon Sep 17 00:00:00 2001 From: zyovn Date: Mon, 20 Oct 2025 19:49:19 +0900 Subject: [PATCH 119/402] =?UTF-8?q?#14=20feat:=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=9E=90=20=EC=95=A8=EB=B2=94=20=EC=83=9D=EC=84=B1=20=EC=A3=BC?= =?UTF-8?q?=203=EA=B0=9C=20=EC=A0=9C=ED=95=9C=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cheeeese/album/application/AlbumService.java | 14 +++++++++++++- .../application/validator/AlbumValidator.java | 4 ++-- .../persistence/AlbumRepository.java | 8 ++++++++ 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/cheeeese/album/application/AlbumService.java b/src/main/java/com/cheeeese/album/application/AlbumService.java index 2620256..40e266b 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumService.java +++ b/src/main/java/com/cheeeese/album/application/AlbumService.java @@ -25,6 +25,8 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.time.DayOfWeek; +import java.time.LocalDate; import java.time.LocalDateTime; import java.util.List; import java.util.UUID; @@ -46,7 +48,9 @@ public class AlbumService { public AlbumCreationResponse createAlbum(User user, AlbumCreationRequest request) { String code = UUID.randomUUID().toString(); - albumValidator.validateAlbumCreation(user, request); + long createdThisWeek = countUserAlbumsCreatedThisWeek(user); + + albumValidator.validateAlbumCreation(createdThisWeek, request); Album album = AlbumMapper.toEntity( user.getId(), @@ -89,6 +93,14 @@ public AlbumEnterResponse enterAlbum(String code, User currentUser) { return createAlbumEnterResponse(freshAlbum); } + private long countUserAlbumsCreatedThisWeek(User user) { + return albumRepository.countByUserAndCreatedAtBetween( + user.getId(), + LocalDate.now().with(DayOfWeek.MONDAY).atStartOfDay(), + LocalDate.now().with(DayOfWeek.SUNDAY).plusDays(1).atStartOfDay() + ); + } + private Album handleAlbumParticipation(Album album, User currentUser) { boolean isAlreadyParticipant = albumParticipantRepository.findByUserIdAndAlbumId(currentUser.getId(), album.getId()).isPresent(); diff --git a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java index c4685f5..b3027d9 100644 --- a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java +++ b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java @@ -17,7 +17,7 @@ public class AlbumValidator { private final AlbumRepository albumRepository; private final AlbumParticipantRepository albumParticipantRepository; - public void validateAlbumCreation(User user, AlbumCreationRequest request) { + public void validateAlbumCreation(long createdThisWeek, AlbumCreationRequest request) { if (!request.isTermsAgreement()) { throw new AlbumException(AlbumErrorCode.ALBUM_REQUIRED_TERMS_NOT_AGREED); } @@ -26,7 +26,7 @@ public void validateAlbumCreation(User user, AlbumCreationRequest request) { throw new AlbumException(AlbumErrorCode.ALBUM_INVALID_CAPACITY); } - if (user.getAlbumCnt() > 3) { + if (createdThisWeek > 3) { throw new AlbumException(AlbumErrorCode.ALBUM_CREATION_LIMIT_EXCEEDED); } } diff --git a/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumRepository.java b/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumRepository.java index d6f19e4..60049e6 100644 --- a/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumRepository.java +++ b/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumRepository.java @@ -6,6 +6,7 @@ import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; +import java.time.LocalDateTime; import java.util.Optional; public interface AlbumRepository extends JpaRepository { @@ -14,4 +15,11 @@ public interface AlbumRepository extends JpaRepository { @Modifying(clearAutomatically = true, flushAutomatically = true) @Query("UPDATE Album a SET a.currentParticipant = a.currentParticipant + 1 WHERE a.id = :albumId AND a.currentParticipant < a.participant") int incrementParticipantCountAtomically(@Param("albumId") Long albumId); + + @Query("SELECT COUNT(a) FROM Album a WHERE a.hostId = :userId AND a.createdAt BETWEEN :start AND :end") + long countByUserAndCreatedAtBetween( + @Param("userId") Long userId, + @Param("start") LocalDateTime start, + @Param("end") LocalDateTime end + ); } From 877bf518ed2c409e939442e2c0269d574b16f4ab Mon Sep 17 00:00:00 2001 From: zyovn Date: Mon, 20 Oct 2025 19:57:33 +0900 Subject: [PATCH 120/402] =?UTF-8?q?#14=20fix:=20uuid=20v4=20->=20v7?= =?UTF-8?q?=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cheeeese/album/application/AlbumService.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/cheeeese/album/application/AlbumService.java b/src/main/java/com/cheeeese/album/application/AlbumService.java index 40e266b..8abda29 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumService.java +++ b/src/main/java/com/cheeeese/album/application/AlbumService.java @@ -19,6 +19,7 @@ import com.cheeeese.user.exception.UserException; import com.cheeeese.user.exception.code.UserErrorCode; import com.cheeeese.user.infrastructure.persistence.UserRepository; +import com.github.f4b6a3.uuid.UuidCreator; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.dao.DataIntegrityViolationException; @@ -29,7 +30,6 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.util.List; -import java.util.UUID; import java.util.stream.Collectors; @Slf4j @@ -46,7 +46,7 @@ public class AlbumService { @Transactional public AlbumCreationResponse createAlbum(User user, AlbumCreationRequest request) { - String code = UUID.randomUUID().toString(); + String code = UuidCreator.getTimeOrdered().toString(); long createdThisWeek = countUserAlbumsCreatedThisWeek(user); From 70f909dae9deb686ba28be225152a254aadbfa16 Mon Sep 17 00:00:00 2001 From: zyovn Date: Mon, 20 Oct 2025 20:06:28 +0900 Subject: [PATCH 121/402] =?UTF-8?q?#14=20fix:=20=EB=B9=84=EA=B5=90?= =?UTF-8?q?=EC=97=B0=EC=82=B0=EC=9E=90=20=EB=B0=8F=20=EC=95=A8=EB=B2=94=20?= =?UTF-8?q?=EC=97=90=EB=9F=AC=20=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cheeeese/album/application/validator/AlbumValidator.java | 2 +- .../java/com/cheeeese/album/exception/code/AlbumErrorCode.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java index b3027d9..706377a 100644 --- a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java +++ b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java @@ -26,7 +26,7 @@ public void validateAlbumCreation(long createdThisWeek, AlbumCreationRequest req throw new AlbumException(AlbumErrorCode.ALBUM_INVALID_CAPACITY); } - if (createdThisWeek > 3) { + if (createdThisWeek >= 3) { throw new AlbumException(AlbumErrorCode.ALBUM_CREATION_LIMIT_EXCEEDED); } } diff --git a/src/main/java/com/cheeeese/album/exception/code/AlbumErrorCode.java b/src/main/java/com/cheeeese/album/exception/code/AlbumErrorCode.java index e129584..707b389 100644 --- a/src/main/java/com/cheeeese/album/exception/code/AlbumErrorCode.java +++ b/src/main/java/com/cheeeese/album/exception/code/AlbumErrorCode.java @@ -16,7 +16,7 @@ public enum AlbumErrorCode implements BaseCode { USER_ALREADY_JOINED_CONCURRENTLY(HttpStatus.CONFLICT, "동시성 오류: 이미 앨범에 참여 요청이 완료되었습니다."), ALBUM_REQUIRED_TERMS_NOT_AGREED(HttpStatus.BAD_REQUEST, "앨범 생성 필수 약관에 동의하지 않았습니다."), ALBUM_INVALID_CAPACITY(HttpStatus.BAD_REQUEST, "앨범 인원은 최소 1명 이상 최대 64명 이하여야 합니다."), - ALBUM_CREATION_LIMIT_EXCEEDED(HttpStatus.CONFLICT, "사용자는 최대 3개의 앨범만 생성할 수 있습니다."), + ALBUM_CREATION_LIMIT_EXCEEDED(HttpStatus.CONFLICT, "사용자는 일주일에 최대 3개의 앨범만 생성할 수 있습니다."), ; private final HttpStatus httpStatus; From c1e267a8dfd028b5893cba5bc1648815a2df00b6 Mon Sep 17 00:00:00 2001 From: zyovn Date: Mon, 20 Oct 2025 20:40:34 +0900 Subject: [PATCH 122/402] =?UTF-8?q?#14=20fix:=20=EC=95=A8=EB=B2=94=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20response=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cheeeese/album/application/AlbumService.java | 2 +- .../cheeeese/album/dto/response/AlbumCreationResponse.java | 7 +++++-- .../cheeeese/album/infrastructure/mapper/AlbumMapper.java | 5 +++-- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/cheeeese/album/application/AlbumService.java b/src/main/java/com/cheeeese/album/application/AlbumService.java index 8abda29..25e3e94 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumService.java +++ b/src/main/java/com/cheeeese/album/application/AlbumService.java @@ -65,7 +65,7 @@ public AlbumCreationResponse createAlbum(User user, AlbumCreationRequest request ); albumRepository.save(album); - return AlbumMapper.toCreateResponse(album); + return AlbumMapper.toCreationResponse(album); } public AlbumInvitationResponse getInvitationInfo(String code) { diff --git a/src/main/java/com/cheeeese/album/dto/response/AlbumCreationResponse.java b/src/main/java/com/cheeeese/album/dto/response/AlbumCreationResponse.java index dbb18de..4a3fafd 100644 --- a/src/main/java/com/cheeeese/album/dto/response/AlbumCreationResponse.java +++ b/src/main/java/com/cheeeese/album/dto/response/AlbumCreationResponse.java @@ -11,11 +11,14 @@ public record AlbumCreationResponse( @Schema(description = "썸네일 이미지", example = "https://theme.jpg") String themeImageUrl, + @Schema(description = "행사 이름", example = "큐시즘 MT") + String title, + @Schema(description = "행사 날짜", example = "2025.02.01") LocalDate eventDate, - @Schema(description = "현재 참여자 수", example = "1") - int currentParticipant, + @Schema(description = "현재까지 업로드된 사진 수", example = "1") + int currentPhotoCnt, @Schema(description = "앨범 코드", example = "786ccd09-5f22-4aa9-a32b-f62dd2e94cc8") String code diff --git a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java index 07d72d3..261f2f8 100644 --- a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java +++ b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java @@ -49,11 +49,12 @@ public static Album toEntity( /** * Album 생성 후, UUID Code 발급 */ - public static AlbumCreationResponse toCreateResponse(Album album) { + public static AlbumCreationResponse toCreationResponse(Album album) { return AlbumCreationResponse.builder() .themeImageUrl(album.getThemeImageUrl()) + .title(album.getTitle()) .eventDate(album.getEventDate()) - .currentParticipant(album.getCurrentParticipant()) + .currentPhotoCnt(album.getCurrentPhotoCount()) .code(album.getCode()) .build(); } From e8c87993acbd52a7b4fa45c4ee228bfb0671476e Mon Sep 17 00:00:00 2001 From: zyovn Date: Mon, 20 Oct 2025 21:08:46 +0900 Subject: [PATCH 123/402] =?UTF-8?q?#14=20docs:=20swagger=20server=20url=20?= =?UTF-8?q?=EC=84=B8=EB=B6=84=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cheeeese/global/config/SwaggerConfig.java | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/cheeeese/global/config/SwaggerConfig.java b/src/main/java/com/cheeeese/global/config/SwaggerConfig.java index 9fb9653..3854817 100644 --- a/src/main/java/com/cheeeese/global/config/SwaggerConfig.java +++ b/src/main/java/com/cheeeese/global/config/SwaggerConfig.java @@ -17,12 +17,22 @@ info = @Info( title = "Cheeeese API 명세서", description = "Cheeeese API 명세서", - version = "v1" + version = "v1.0.0" ), - servers = @Server( - url = "/", - description = "Default Server URL" - ) + servers = { + @Server( + url = "${springdoc.local-server-url}", + description = "Local Server URL" + ), + @Server( + url = "${springdoc.dev-server-url}", + description = "Develop Server URL" + ), + @Server( + url = "${springdoc.prod-server-url}", + description = "Production Server URL" + ) + } ) public class SwaggerConfig { @Bean From d38407080d55f267f7516eb6cff9d0c379b13680 Mon Sep 17 00:00:00 2001 From: zyovn Date: Mon, 20 Oct 2025 21:16:55 +0900 Subject: [PATCH 124/402] =?UTF-8?q?#14=20feat:=20=EC=95=A8=EB=B2=94=20?= =?UTF-8?q?=EC=8D=B8=EB=84=A4=EC=9D=BC=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20?= =?UTF-8?q?=EC=98=88=EC=99=B8=20=EC=BC=80=EC=9D=B4=EC=8A=A4=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cheeeese/album/application/validator/AlbumValidator.java | 4 ++++ .../com/cheeeese/album/exception/code/AlbumErrorCode.java | 1 + 2 files changed, 5 insertions(+) diff --git a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java index 706377a..f222e5b 100644 --- a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java +++ b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java @@ -22,6 +22,10 @@ public void validateAlbumCreation(long createdThisWeek, AlbumCreationRequest req throw new AlbumException(AlbumErrorCode.ALBUM_REQUIRED_TERMS_NOT_AGREED); } + if (request.themeImageUrl() == null || request.themeImageUrl().isBlank()) { + throw new AlbumException(AlbumErrorCode.ALBUM_THEME_IMAGE_NOT_SELECTED); + } + if (request.participant() < 1 || request.participant() > 64) { throw new AlbumException(AlbumErrorCode.ALBUM_INVALID_CAPACITY); } diff --git a/src/main/java/com/cheeeese/album/exception/code/AlbumErrorCode.java b/src/main/java/com/cheeeese/album/exception/code/AlbumErrorCode.java index 707b389..c7fc37c 100644 --- a/src/main/java/com/cheeeese/album/exception/code/AlbumErrorCode.java +++ b/src/main/java/com/cheeeese/album/exception/code/AlbumErrorCode.java @@ -15,6 +15,7 @@ public enum AlbumErrorCode implements BaseCode { USER_IS_BLACKLISTED(HttpStatus.FORBIDDEN, "앨범 관리자에 의해 접근이 금지된 사용자입니다."), USER_ALREADY_JOINED_CONCURRENTLY(HttpStatus.CONFLICT, "동시성 오류: 이미 앨범에 참여 요청이 완료되었습니다."), ALBUM_REQUIRED_TERMS_NOT_AGREED(HttpStatus.BAD_REQUEST, "앨범 생성 필수 약관에 동의하지 않았습니다."), + ALBUM_THEME_IMAGE_NOT_SELECTED(HttpStatus.BAD_REQUEST, "앨범 썸네일 이미지가 선택되지 않았습니다."), ALBUM_INVALID_CAPACITY(HttpStatus.BAD_REQUEST, "앨범 인원은 최소 1명 이상 최대 64명 이하여야 합니다."), ALBUM_CREATION_LIMIT_EXCEEDED(HttpStatus.CONFLICT, "사용자는 일주일에 최대 3개의 앨범만 생성할 수 있습니다."), ; From 47c5f00252529b0cd7b13872abbd225c33c4ad63 Mon Sep 17 00:00:00 2001 From: zyovn Date: Mon, 20 Oct 2025 21:17:31 +0900 Subject: [PATCH 125/402] =?UTF-8?q?#14=20docs:=20=EC=95=A8=EB=B2=94=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20request=20=ED=96=89=EC=82=AC=20=EB=82=A0?= =?UTF-8?q?=EC=A7=9C=20=EC=98=88=EC=8B=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cheeeese/album/dto/request/AlbumCreationRequest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/cheeeese/album/dto/request/AlbumCreationRequest.java b/src/main/java/com/cheeeese/album/dto/request/AlbumCreationRequest.java index febef81..ea05eac 100644 --- a/src/main/java/com/cheeeese/album/dto/request/AlbumCreationRequest.java +++ b/src/main/java/com/cheeeese/album/dto/request/AlbumCreationRequest.java @@ -17,7 +17,7 @@ public record AlbumCreationRequest( @Schema(description = "참여자 수", example = "64") int participant, - @Schema(description = "행사 날짜", example = "2025.02.01") + @Schema(description = "행사 날짜", example = "2025-02-01") LocalDate eventDate, @Schema(description = "앨범 생성 필수 약관 동의", example = "true") From f26899c5dd84d56f11425425b4fe3e265af5247d Mon Sep 17 00:00:00 2001 From: zyovn Date: Mon, 20 Oct 2025 21:35:11 +0900 Subject: [PATCH 126/402] =?UTF-8?q?#14=20feat:=20=EC=95=A8=EB=B2=94=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=ED=96=89=EC=82=AC=20=EB=82=A0=EC=A7=9C=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20=EC=98=88=EC=99=B8=20=EC=BC=80=EC=9D=B4?= =?UTF-8?q?=EC=8A=A4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../album/application/validator/AlbumValidator.java | 10 ++++++++++ .../cheeeese/album/exception/code/AlbumErrorCode.java | 2 ++ 2 files changed, 12 insertions(+) diff --git a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java index f222e5b..33b4ec8 100644 --- a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java +++ b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java @@ -10,6 +10,8 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; +import java.time.LocalDate; + @Component @RequiredArgsConstructor public class AlbumValidator { @@ -26,6 +28,14 @@ public void validateAlbumCreation(long createdThisWeek, AlbumCreationRequest req throw new AlbumException(AlbumErrorCode.ALBUM_THEME_IMAGE_NOT_SELECTED); } + if (request.eventDate() == null) { + throw new AlbumException(AlbumErrorCode.ALBUM_EVENT_DATE_REQUIRED); + } + + if (request.eventDate().isAfter(LocalDate.now())) { + throw new AlbumException(AlbumErrorCode.ALBUM_EVENT_DATE_INVALID); + } + if (request.participant() < 1 || request.participant() > 64) { throw new AlbumException(AlbumErrorCode.ALBUM_INVALID_CAPACITY); } diff --git a/src/main/java/com/cheeeese/album/exception/code/AlbumErrorCode.java b/src/main/java/com/cheeeese/album/exception/code/AlbumErrorCode.java index c7fc37c..360568b 100644 --- a/src/main/java/com/cheeeese/album/exception/code/AlbumErrorCode.java +++ b/src/main/java/com/cheeeese/album/exception/code/AlbumErrorCode.java @@ -16,6 +16,8 @@ public enum AlbumErrorCode implements BaseCode { USER_ALREADY_JOINED_CONCURRENTLY(HttpStatus.CONFLICT, "동시성 오류: 이미 앨범에 참여 요청이 완료되었습니다."), ALBUM_REQUIRED_TERMS_NOT_AGREED(HttpStatus.BAD_REQUEST, "앨범 생성 필수 약관에 동의하지 않았습니다."), ALBUM_THEME_IMAGE_NOT_SELECTED(HttpStatus.BAD_REQUEST, "앨범 썸네일 이미지가 선택되지 않았습니다."), + ALBUM_EVENT_DATE_REQUIRED(HttpStatus.BAD_REQUEST, "행사 날짜가 입력되지 않았습니다."), + ALBUM_EVENT_DATE_INVALID(HttpStatus.BAD_REQUEST, "행사 날짜는 오늘 또는 과거만 선택 가능합니다."), ALBUM_INVALID_CAPACITY(HttpStatus.BAD_REQUEST, "앨범 인원은 최소 1명 이상 최대 64명 이하여야 합니다."), ALBUM_CREATION_LIMIT_EXCEEDED(HttpStatus.CONFLICT, "사용자는 일주일에 최대 3개의 앨범만 생성할 수 있습니다."), ; From 2881b47c0a40b4a1299ed336b18a990ba38855ad Mon Sep 17 00:00:00 2001 From: zyovn Date: Tue, 21 Oct 2025 03:37:53 +0900 Subject: [PATCH 127/402] =?UTF-8?q?#14=20fix:=20=ED=94=BC=EB=93=9C?= =?UTF-8?q?=EB=B0=B1=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../album/application/AlbumService.java | 5 +++-- .../application/validator/AlbumValidator.java | 4 ++++ .../album/exception/code/AlbumErrorCode.java | 1 + .../persistence/AlbumRepository.java | 8 +++++++- .../benchmark/AlbumServiceBenchmarkTest.java | 19 +++++++++++++++---- .../com/cheeeese/fixture/FixtureFactory.java | 2 +- 6 files changed, 31 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/cheeeese/album/application/AlbumService.java b/src/main/java/com/cheeeese/album/application/AlbumService.java index 25e3e94..68a2392 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumService.java +++ b/src/main/java/com/cheeeese/album/application/AlbumService.java @@ -29,6 +29,7 @@ import java.time.DayOfWeek; import java.time.LocalDate; import java.time.LocalDateTime; +import java.time.LocalTime; import java.util.List; import java.util.stream.Collectors; @@ -96,8 +97,8 @@ public AlbumEnterResponse enterAlbum(String code, User currentUser) { private long countUserAlbumsCreatedThisWeek(User user) { return albumRepository.countByUserAndCreatedAtBetween( user.getId(), - LocalDate.now().with(DayOfWeek.MONDAY).atStartOfDay(), - LocalDate.now().with(DayOfWeek.SUNDAY).plusDays(1).atStartOfDay() + LocalDate.now().with(DayOfWeek.MONDAY).atTime(LocalTime.MIN), + LocalDate.now().with(DayOfWeek.MONDAY).plusWeeks(1).atTime(LocalTime.now()) ); } diff --git a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java index 33b4ec8..4b22d18 100644 --- a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java +++ b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java @@ -28,6 +28,10 @@ public void validateAlbumCreation(long createdThisWeek, AlbumCreationRequest req throw new AlbumException(AlbumErrorCode.ALBUM_THEME_IMAGE_NOT_SELECTED); } + if (request.title() == null || request.title().isBlank()) { + throw new AlbumException(AlbumErrorCode.ALBUM_TITLE_REQUIRED); + } + if (request.eventDate() == null) { throw new AlbumException(AlbumErrorCode.ALBUM_EVENT_DATE_REQUIRED); } diff --git a/src/main/java/com/cheeeese/album/exception/code/AlbumErrorCode.java b/src/main/java/com/cheeeese/album/exception/code/AlbumErrorCode.java index 360568b..6e82316 100644 --- a/src/main/java/com/cheeeese/album/exception/code/AlbumErrorCode.java +++ b/src/main/java/com/cheeeese/album/exception/code/AlbumErrorCode.java @@ -16,6 +16,7 @@ public enum AlbumErrorCode implements BaseCode { USER_ALREADY_JOINED_CONCURRENTLY(HttpStatus.CONFLICT, "동시성 오류: 이미 앨범에 참여 요청이 완료되었습니다."), ALBUM_REQUIRED_TERMS_NOT_AGREED(HttpStatus.BAD_REQUEST, "앨범 생성 필수 약관에 동의하지 않았습니다."), ALBUM_THEME_IMAGE_NOT_SELECTED(HttpStatus.BAD_REQUEST, "앨범 썸네일 이미지가 선택되지 않았습니다."), + ALBUM_TITLE_REQUIRED(HttpStatus.BAD_REQUEST, "행사 이름이 입력되지 않았습니다."), ALBUM_EVENT_DATE_REQUIRED(HttpStatus.BAD_REQUEST, "행사 날짜가 입력되지 않았습니다."), ALBUM_EVENT_DATE_INVALID(HttpStatus.BAD_REQUEST, "행사 날짜는 오늘 또는 과거만 선택 가능합니다."), ALBUM_INVALID_CAPACITY(HttpStatus.BAD_REQUEST, "앨범 인원은 최소 1명 이상 최대 64명 이하여야 합니다."), diff --git a/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumRepository.java b/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumRepository.java index 60049e6..5ed25ae 100644 --- a/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumRepository.java +++ b/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumRepository.java @@ -16,7 +16,13 @@ public interface AlbumRepository extends JpaRepository { @Query("UPDATE Album a SET a.currentParticipant = a.currentParticipant + 1 WHERE a.id = :albumId AND a.currentParticipant < a.participant") int incrementParticipantCountAtomically(@Param("albumId") Long albumId); - @Query("SELECT COUNT(a) FROM Album a WHERE a.hostId = :userId AND a.createdAt BETWEEN :start AND :end") + @Query(""" + SELECT COUNT(a) + FROM Album a + WHERE a.hostId = :userId + AND a.createdAt >= :start + AND a.createdAt < :end + """) long countByUserAndCreatedAtBetween( @Param("userId") Long userId, @Param("start") LocalDateTime start, diff --git a/src/test/java/com/cheeeese/album/benchmark/AlbumServiceBenchmarkTest.java b/src/test/java/com/cheeeese/album/benchmark/AlbumServiceBenchmarkTest.java index 737e8f4..6894473 100644 --- a/src/test/java/com/cheeeese/album/benchmark/AlbumServiceBenchmarkTest.java +++ b/src/test/java/com/cheeeese/album/benchmark/AlbumServiceBenchmarkTest.java @@ -3,13 +3,14 @@ import com.cheeeese.album.domain.Album; import com.cheeeese.album.infrastructure.persistence.AlbumRepository; import com.cheeeese.fixture.FixtureFactory; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.data.domain.Sort; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; @@ -24,6 +25,9 @@ public class AlbumServiceBenchmarkTest { @Autowired private AlbumRepository albumRepository; + @PersistenceContext + private EntityManager em; + private static final int DATA_SIZE = 20000; private final Random random = new Random(); @@ -67,7 +71,7 @@ void compareFullPerformance() { .map(Album::getCode) .toList(); - // 평균 조회 속도 테스트 + // 전체 조회 속도 테스트 measureSelectingTest("v4", v4Codes); measureSelectingTest("v7", v7Codes); @@ -84,12 +88,19 @@ private void measureSelectingTest(String label, List codes) { albumRepository.findByCode(code); total += System.nanoTime() - start; } - System.out.printf("[%s] 평균 조회 시간: %.2f ms%n", label, total / 1000000.0); + System.out.printf("[%s] 전체 조회 시간: %.2f ms%n", label, total / 1000000.0); } private void measureSortingTest(String label) { long start = System.currentTimeMillis(); - albumRepository.findAll(Sort.by(Sort.Direction.DESC, "code")); + em.createQuery(""" + SELECT a + FROM Album a + WHERE a.title LIKE :prefix + ORDER BY a.code DESC + """, Album.class) + .setParameter("prefix", label + "%") + .getResultList(); long elapsed = System.currentTimeMillis() - start; System.out.printf("[%s] Order By 정렬 시간: %d ms%n", label, elapsed); } diff --git a/src/test/java/com/cheeeese/fixture/FixtureFactory.java b/src/test/java/com/cheeeese/fixture/FixtureFactory.java index 4e3a299..8982770 100644 --- a/src/test/java/com/cheeeese/fixture/FixtureFactory.java +++ b/src/test/java/com/cheeeese/fixture/FixtureFactory.java @@ -45,7 +45,7 @@ public static Album createAlbumV7(int i) { return AlbumMapper.toEntity( 1L, "v7-" + i, - UuidCreator.getTimeOrdered().toString(), + UuidCreator.getTimeOrderedEpoch().toString(), "테스트 이미지", 4, LocalDate.of(2025, 1, 1), From 0760c57ea4a81f3a600ea6aaf89ae9b961499f0f Mon Sep 17 00:00:00 2001 From: zyovn Date: Tue, 21 Oct 2025 04:35:45 +0900 Subject: [PATCH 128/402] =?UTF-8?q?#14=20feat:=20=EC=95=A8=EB=B2=94=20?= =?UTF-8?q?=EC=8D=B8=EB=84=A4=EC=9D=BC=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20->?= =?UTF-8?q?=20=EC=9D=B4=EB=AA=A8=EC=A7=80=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cheeeese/album/application/AlbumService.java | 2 +- .../album/application/validator/AlbumValidator.java | 4 ++-- src/main/java/com/cheeeese/album/domain/Album.java | 8 ++++---- .../album/dto/request/AlbumCreationRequest.java | 4 ++-- .../album/dto/response/AlbumCreationResponse.java | 4 ++-- .../cheeeese/album/exception/code/AlbumErrorCode.java | 2 +- .../album/infrastructure/mapper/AlbumMapper.java | 10 +++++----- 7 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/cheeeese/album/application/AlbumService.java b/src/main/java/com/cheeeese/album/application/AlbumService.java index 68a2392..865d5fd 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumService.java +++ b/src/main/java/com/cheeeese/album/application/AlbumService.java @@ -57,7 +57,7 @@ public AlbumCreationResponse createAlbum(User user, AlbumCreationRequest request user.getId(), request.title(), code, - request.themeImageUrl(), + request.emoji(), request.participant(), request.eventDate(), true, diff --git a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java index 4b22d18..4cb1579 100644 --- a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java +++ b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java @@ -24,8 +24,8 @@ public void validateAlbumCreation(long createdThisWeek, AlbumCreationRequest req throw new AlbumException(AlbumErrorCode.ALBUM_REQUIRED_TERMS_NOT_AGREED); } - if (request.themeImageUrl() == null || request.themeImageUrl().isBlank()) { - throw new AlbumException(AlbumErrorCode.ALBUM_THEME_IMAGE_NOT_SELECTED); + if (request.emoji() == null || request.emoji().isBlank()) { + throw new AlbumException(AlbumErrorCode.ALBUM_THEME_EMOJI_NOT_SELECTED); } if (request.title() == null || request.title().isBlank()) { diff --git a/src/main/java/com/cheeeese/album/domain/Album.java b/src/main/java/com/cheeeese/album/domain/Album.java index 889e7db..c419f2f 100644 --- a/src/main/java/com/cheeeese/album/domain/Album.java +++ b/src/main/java/com/cheeeese/album/domain/Album.java @@ -30,8 +30,8 @@ public class Album extends BaseEntity { @Column(name = "code", nullable = false, unique = true) private String code; - @Column(name = "theme_image_url") - private String themeImageUrl; + @Column(name = "emoji") + private String emoji; @Column(name = "participant", nullable = false) private int participant; @@ -74,7 +74,7 @@ private Album( Long hostId, String title, String code, - String themeImageUrl, + String emoji, int participant, int currentParticipant, LocalDate eventDate, @@ -88,7 +88,7 @@ private Album( this.hostId = hostId; this.title = title; this.code = code; - this.themeImageUrl = themeImageUrl; + this.emoji = emoji; this.participant = participant; this.currentParticipant = currentParticipant; this.eventDate = eventDate; diff --git a/src/main/java/com/cheeeese/album/dto/request/AlbumCreationRequest.java b/src/main/java/com/cheeeese/album/dto/request/AlbumCreationRequest.java index ea05eac..5c163d2 100644 --- a/src/main/java/com/cheeeese/album/dto/request/AlbumCreationRequest.java +++ b/src/main/java/com/cheeeese/album/dto/request/AlbumCreationRequest.java @@ -8,8 +8,8 @@ @Builder @Schema(description = "앨범 생성 API") public record AlbumCreationRequest( - @Schema(description = "썸네일 이미지", example = "https://theme.jpg") - String themeImageUrl, + @Schema(description = "썸네일 이모지", example = "U+1F9C0") + String emoji, @Schema(description = "앨범 이름", example = "졸업식") String title, diff --git a/src/main/java/com/cheeeese/album/dto/response/AlbumCreationResponse.java b/src/main/java/com/cheeeese/album/dto/response/AlbumCreationResponse.java index 4a3fafd..633f264 100644 --- a/src/main/java/com/cheeeese/album/dto/response/AlbumCreationResponse.java +++ b/src/main/java/com/cheeeese/album/dto/response/AlbumCreationResponse.java @@ -8,8 +8,8 @@ @Builder @Schema(description = "앨범 생성 API") public record AlbumCreationResponse( - @Schema(description = "썸네일 이미지", example = "https://theme.jpg") - String themeImageUrl, + @Schema(description = "썸네일 이모지", example = "U+1F9C0") + String emoji, @Schema(description = "행사 이름", example = "큐시즘 MT") String title, diff --git a/src/main/java/com/cheeeese/album/exception/code/AlbumErrorCode.java b/src/main/java/com/cheeeese/album/exception/code/AlbumErrorCode.java index 6e82316..1d1286b 100644 --- a/src/main/java/com/cheeeese/album/exception/code/AlbumErrorCode.java +++ b/src/main/java/com/cheeeese/album/exception/code/AlbumErrorCode.java @@ -15,7 +15,7 @@ public enum AlbumErrorCode implements BaseCode { USER_IS_BLACKLISTED(HttpStatus.FORBIDDEN, "앨범 관리자에 의해 접근이 금지된 사용자입니다."), USER_ALREADY_JOINED_CONCURRENTLY(HttpStatus.CONFLICT, "동시성 오류: 이미 앨범에 참여 요청이 완료되었습니다."), ALBUM_REQUIRED_TERMS_NOT_AGREED(HttpStatus.BAD_REQUEST, "앨범 생성 필수 약관에 동의하지 않았습니다."), - ALBUM_THEME_IMAGE_NOT_SELECTED(HttpStatus.BAD_REQUEST, "앨범 썸네일 이미지가 선택되지 않았습니다."), + ALBUM_THEME_EMOJI_NOT_SELECTED(HttpStatus.BAD_REQUEST, "앨범 썸네일 이모지가 선택되지 않았습니다."), ALBUM_TITLE_REQUIRED(HttpStatus.BAD_REQUEST, "행사 이름이 입력되지 않았습니다."), ALBUM_EVENT_DATE_REQUIRED(HttpStatus.BAD_REQUEST, "행사 날짜가 입력되지 않았습니다."), ALBUM_EVENT_DATE_INVALID(HttpStatus.BAD_REQUEST, "행사 날짜는 오늘 또는 과거만 선택 가능합니다."), diff --git a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java index 261f2f8..e0a33c8 100644 --- a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java +++ b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java @@ -22,7 +22,7 @@ public static Album toEntity( Long hostId, String title, String code, - String themeImageUrl, + String emoji, int participant, LocalDate eventDate, boolean isInfoAvailable, @@ -33,7 +33,7 @@ public static Album toEntity( .hostId(hostId) .title(title) .code(code) - .themeImageUrl(themeImageUrl) + .emoji(emoji) .participant(participant) .currentParticipant(1) .eventDate(eventDate) @@ -51,7 +51,7 @@ public static Album toEntity( */ public static AlbumCreationResponse toCreationResponse(Album album) { return AlbumCreationResponse.builder() - .themeImageUrl(album.getThemeImageUrl()) + .emoji(album.getEmoji()) .title(album.getTitle()) .eventDate(album.getEventDate()) .currentPhotoCnt(album.getCurrentPhotoCount()) @@ -65,7 +65,7 @@ public static AlbumCreationResponse toCreationResponse(Album album) { public static AlbumInvitationResponse toInvitationResponse(Album album, User host) { return AlbumInvitationResponse.builder() .title(album.getTitle()) - .themeImageUrl(album.getThemeImageUrl()) + .themeImageUrl(album.getEmoji()) .eventDate(album.getEventDate().toString()) .expiredAt(album.getExpiredAt()) .hostName(host.getName()) @@ -85,7 +85,7 @@ public static AlbumEnterResponse toEnterResponse( ) { return AlbumEnterResponse.builder() .title(album.getTitle()) - .themeImageUrl(album.getThemeImageUrl()) + .themeImageUrl(album.getEmoji()) .eventDate(album.getEventDate().toString()) .expiredAt(album.getExpiredAt()) .maxParticipantCount(album.getParticipant()) From 3281c2d90de0236cb67a65f409002a2787f383c2 Mon Sep 17 00:00:00 2001 From: zyovn Date: Tue, 21 Oct 2025 04:48:16 +0900 Subject: [PATCH 129/402] =?UTF-8?q?#14=20refactor:=20emoji=20->=20themeEmo?= =?UTF-8?q?ji=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cheeeese/album/application/AlbumService.java | 2 +- .../album/application/validator/AlbumValidator.java | 2 +- src/main/java/com/cheeeese/album/domain/Album.java | 8 ++++---- .../album/dto/request/AlbumCreationRequest.java | 4 ++-- .../album/dto/response/AlbumCreationResponse.java | 4 ++-- .../album/dto/response/AlbumInvitationResponse.java | 4 ++-- .../album/infrastructure/mapper/AlbumMapper.java | 10 +++++----- 7 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/cheeeese/album/application/AlbumService.java b/src/main/java/com/cheeeese/album/application/AlbumService.java index 865d5fd..9cad247 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumService.java +++ b/src/main/java/com/cheeeese/album/application/AlbumService.java @@ -57,7 +57,7 @@ public AlbumCreationResponse createAlbum(User user, AlbumCreationRequest request user.getId(), request.title(), code, - request.emoji(), + request.themeEmoji(), request.participant(), request.eventDate(), true, diff --git a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java index 4cb1579..c5ed1ad 100644 --- a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java +++ b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java @@ -24,7 +24,7 @@ public void validateAlbumCreation(long createdThisWeek, AlbumCreationRequest req throw new AlbumException(AlbumErrorCode.ALBUM_REQUIRED_TERMS_NOT_AGREED); } - if (request.emoji() == null || request.emoji().isBlank()) { + if (request.themeEmoji() == null || request.themeEmoji().isBlank()) { throw new AlbumException(AlbumErrorCode.ALBUM_THEME_EMOJI_NOT_SELECTED); } diff --git a/src/main/java/com/cheeeese/album/domain/Album.java b/src/main/java/com/cheeeese/album/domain/Album.java index c419f2f..4d2a09c 100644 --- a/src/main/java/com/cheeeese/album/domain/Album.java +++ b/src/main/java/com/cheeeese/album/domain/Album.java @@ -30,8 +30,8 @@ public class Album extends BaseEntity { @Column(name = "code", nullable = false, unique = true) private String code; - @Column(name = "emoji") - private String emoji; + @Column(name = "theme_emoji") + private String themeEmoji; @Column(name = "participant", nullable = false) private int participant; @@ -74,7 +74,7 @@ private Album( Long hostId, String title, String code, - String emoji, + String themeEmoji, int participant, int currentParticipant, LocalDate eventDate, @@ -88,7 +88,7 @@ private Album( this.hostId = hostId; this.title = title; this.code = code; - this.emoji = emoji; + this.themeEmoji = themeEmoji; this.participant = participant; this.currentParticipant = currentParticipant; this.eventDate = eventDate; diff --git a/src/main/java/com/cheeeese/album/dto/request/AlbumCreationRequest.java b/src/main/java/com/cheeeese/album/dto/request/AlbumCreationRequest.java index 5c163d2..5063712 100644 --- a/src/main/java/com/cheeeese/album/dto/request/AlbumCreationRequest.java +++ b/src/main/java/com/cheeeese/album/dto/request/AlbumCreationRequest.java @@ -8,8 +8,8 @@ @Builder @Schema(description = "앨범 생성 API") public record AlbumCreationRequest( - @Schema(description = "썸네일 이모지", example = "U+1F9C0") - String emoji, + @Schema(description = "앨범 테마 이모지", example = "U+1F9C0") + String themeEmoji, @Schema(description = "앨범 이름", example = "졸업식") String title, diff --git a/src/main/java/com/cheeeese/album/dto/response/AlbumCreationResponse.java b/src/main/java/com/cheeeese/album/dto/response/AlbumCreationResponse.java index 633f264..5edbe7c 100644 --- a/src/main/java/com/cheeeese/album/dto/response/AlbumCreationResponse.java +++ b/src/main/java/com/cheeeese/album/dto/response/AlbumCreationResponse.java @@ -8,8 +8,8 @@ @Builder @Schema(description = "앨범 생성 API") public record AlbumCreationResponse( - @Schema(description = "썸네일 이모지", example = "U+1F9C0") - String emoji, + @Schema(description = "앨범 테마 이모지", example = "U+1F9C0") + String themeEmoji, @Schema(description = "행사 이름", example = "큐시즘 MT") String title, diff --git a/src/main/java/com/cheeeese/album/dto/response/AlbumInvitationResponse.java b/src/main/java/com/cheeeese/album/dto/response/AlbumInvitationResponse.java index 799f972..b4d0e14 100644 --- a/src/main/java/com/cheeeese/album/dto/response/AlbumInvitationResponse.java +++ b/src/main/java/com/cheeeese/album/dto/response/AlbumInvitationResponse.java @@ -11,8 +11,8 @@ public record AlbumInvitationResponse( @Schema(description = "앨범 제목", example = "경영학부 졸업식") String title, - @Schema(description = "앨범 테마 이미지 URL", example = "http://example.com/theme.jpg") - String themeImageUrl, + @Schema(description = "앨범 테마 이모지", example = "U+1F9C0") + String themeEmoji, @Schema(description = "이벤트 날짜", example = "2025-02-26") String eventDate, diff --git a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java index e0a33c8..639755f 100644 --- a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java +++ b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java @@ -22,7 +22,7 @@ public static Album toEntity( Long hostId, String title, String code, - String emoji, + String themeEmoji, int participant, LocalDate eventDate, boolean isInfoAvailable, @@ -33,7 +33,7 @@ public static Album toEntity( .hostId(hostId) .title(title) .code(code) - .emoji(emoji) + .themeEmoji(themeEmoji) .participant(participant) .currentParticipant(1) .eventDate(eventDate) @@ -51,7 +51,7 @@ public static Album toEntity( */ public static AlbumCreationResponse toCreationResponse(Album album) { return AlbumCreationResponse.builder() - .emoji(album.getEmoji()) + .themeEmoji(album.getThemeEmoji()) .title(album.getTitle()) .eventDate(album.getEventDate()) .currentPhotoCnt(album.getCurrentPhotoCount()) @@ -65,7 +65,7 @@ public static AlbumCreationResponse toCreationResponse(Album album) { public static AlbumInvitationResponse toInvitationResponse(Album album, User host) { return AlbumInvitationResponse.builder() .title(album.getTitle()) - .themeImageUrl(album.getEmoji()) + .themeEmoji(album.getThemeEmoji()) .eventDate(album.getEventDate().toString()) .expiredAt(album.getExpiredAt()) .hostName(host.getName()) @@ -85,7 +85,7 @@ public static AlbumEnterResponse toEnterResponse( ) { return AlbumEnterResponse.builder() .title(album.getTitle()) - .themeImageUrl(album.getEmoji()) + .themeImageUrl(album.getThemeEmoji()) .eventDate(album.getEventDate().toString()) .expiredAt(album.getExpiredAt()) .maxParticipantCount(album.getParticipant()) From 08c241dd92f7b05ad356690558af78016674f220 Mon Sep 17 00:00:00 2001 From: zyovn Date: Tue, 21 Oct 2025 04:54:03 +0900 Subject: [PATCH 130/402] =?UTF-8?q?#14=20fix:=20=ED=94=BC=EB=93=9C?= =?UTF-8?q?=EB=B0=B1=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cheeeese/album/dto/response/AlbumEnterResponse.java | 4 ++-- .../com/cheeeese/album/infrastructure/mapper/AlbumMapper.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/cheeeese/album/dto/response/AlbumEnterResponse.java b/src/main/java/com/cheeeese/album/dto/response/AlbumEnterResponse.java index 07a6ee3..a4c4263 100644 --- a/src/main/java/com/cheeeese/album/dto/response/AlbumEnterResponse.java +++ b/src/main/java/com/cheeeese/album/dto/response/AlbumEnterResponse.java @@ -12,8 +12,8 @@ public record AlbumEnterResponse( @Schema(description = "앨범 제목", example = "졸업 여행 폴라로이드") String title, - @Schema(description = "앨범 테마 이미지 URL", example = "http://example.com/theme.jpg") - String themeImageUrl, + @Schema(description = "앨범 테마 이모지", example = "U+1F9C0") + String themeEmoji, @Schema(description = "이벤트 날짜", example = "2025-02-26") String eventDate, diff --git a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java index 639755f..bf25b00 100644 --- a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java +++ b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java @@ -85,7 +85,7 @@ public static AlbumEnterResponse toEnterResponse( ) { return AlbumEnterResponse.builder() .title(album.getTitle()) - .themeImageUrl(album.getThemeEmoji()) + .themeEmoji(album.getThemeEmoji()) .eventDate(album.getEventDate().toString()) .expiredAt(album.getExpiredAt()) .maxParticipantCount(album.getParticipant()) From e76469f445552fc74fce3765c80d932e46571533 Mon Sep 17 00:00:00 2001 From: zyovn Date: Tue, 21 Oct 2025 05:00:02 +0900 Subject: [PATCH 131/402] =?UTF-8?q?#14=20docs:=20swagger=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cheeeese/album/presentation/swagger/AlbumSwagger.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java b/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java index 1d5b21b..fdd70e9 100644 --- a/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java +++ b/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java @@ -24,7 +24,7 @@ public interface AlbumSwagger { description = """ ### RequestBody --- - `themeImageUrl`: 앨범 썸네일 이미지 (String) \n + `themeEmoji`: 앨범 썸네일 이모지 (String) \n `title`: 앨범 이름 (String) \n `participant`: 참여자 수 (int) \n `eventDate`: 행사 날짜 (LocalDate) \n From 2b3f229e153c911637384b17a4fbf46de038bf74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Tue, 21 Oct 2025 21:52:51 +0900 Subject: [PATCH 132/402] =?UTF-8?q?#16=20chore:=20s3=20=EC=9D=98=EC=A1=B4?= =?UTF-8?q?=EC=84=B1=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/build.gradle b/build.gradle index df90e75..3463b0a 100644 --- a/build.gradle +++ b/build.gradle @@ -53,6 +53,11 @@ dependencies { // uuid v7 implementation 'com.github.f4b6a3:uuid-creator:5.2.0' + + // AWS SDK for S3 + implementation 'software.amazon.awssdk:s3:2.25.46' + implementation 'software.amazon.awssdk:auth:2.25.46' + implementation 'software.amazon.awssdk:regions:2.25.46' } tasks.named('test') { From b199c4f290a8ed85e7b5ade1c8c1d3fc2f3a50c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Tue, 21 Oct 2025 21:57:15 +0900 Subject: [PATCH 133/402] =?UTF-8?q?#16=20feat:=20s3Config=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cheeeese/global/config/S3Config.java | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 src/main/java/com/cheeeese/global/config/S3Config.java diff --git a/src/main/java/com/cheeeese/global/config/S3Config.java b/src/main/java/com/cheeeese/global/config/S3Config.java new file mode 100644 index 0000000..fdcc54a --- /dev/null +++ b/src/main/java/com/cheeeese/global/config/S3Config.java @@ -0,0 +1,54 @@ +package com.cheeeese.global.config; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import software.amazon.awssdk.auth.credentials.AwsBasicCredentials; +import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider; +import software.amazon.awssdk.regions.Region; +import software.amazon.awssdk.services.s3.S3Client; +import software.amazon.awssdk.services.s3.presigner.S3Presigner; + +import java.net.URI; + +@Configuration +public class S3Config { + + @Value("${ncp.object-storage.access-key}") + private String accessKey; + + @Value("${ncp.object-storage.secret-key}") + private String secretKey; + + @Value("${ncp.object-storage.endpoint}") + private String endpoint; + + @Value("${ncp.object-storage.region}") + private String region; + + @Bean + public S3Client s3Client() { + return S3Client.builder() + .region(Region.of(region)) + .endpointOverride(URI.create(endpoint)) + .credentialsProvider( + StaticCredentialsProvider.create( + AwsBasicCredentials.create(accessKey, secretKey) + ) + ) + .build(); + } + + @Bean + public S3Presigner s3Presigner() { + return S3Presigner.builder() + .region(Region.of(region)) + .endpointOverride(URI.create(endpoint)) + .credentialsProvider( + StaticCredentialsProvider.create( + AwsBasicCredentials.create(accessKey, secretKey) + ) + ) + .build(); + } +} From 364eae8d2166e41576636eb0c986da0e03addf0b Mon Sep 17 00:00:00 2001 From: zyovn Date: Wed, 22 Oct 2025 22:16:08 +0900 Subject: [PATCH 134/402] =?UTF-8?q?#18=20feat:=20corsConfig=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/ConfigurationPropertiesConfig.java | 6 ++- .../cheeeese/global/config/CorsConfig.java | 43 +++++++++++++++++++ .../config/properties/CorsProperties.java | 11 +++++ 3 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/cheeeese/global/config/CorsConfig.java create mode 100644 src/main/java/com/cheeeese/global/config/properties/CorsProperties.java diff --git a/src/main/java/com/cheeeese/global/config/ConfigurationPropertiesConfig.java b/src/main/java/com/cheeeese/global/config/ConfigurationPropertiesConfig.java index 5ff0a71..1b50f96 100644 --- a/src/main/java/com/cheeeese/global/config/ConfigurationPropertiesConfig.java +++ b/src/main/java/com/cheeeese/global/config/ConfigurationPropertiesConfig.java @@ -1,10 +1,14 @@ package com.cheeeese.global.config; +import com.cheeeese.global.config.properties.CorsProperties; import com.cheeeese.global.security.jwt.JwtProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Configuration; @Configuration -@EnableConfigurationProperties(value = JwtProperties.class) +@EnableConfigurationProperties(value = { + JwtProperties.class, + CorsProperties.class +}) public class ConfigurationPropertiesConfig { } diff --git a/src/main/java/com/cheeeese/global/config/CorsConfig.java b/src/main/java/com/cheeeese/global/config/CorsConfig.java new file mode 100644 index 0000000..78604a1 --- /dev/null +++ b/src/main/java/com/cheeeese/global/config/CorsConfig.java @@ -0,0 +1,43 @@ +package com.cheeeese.global.config; + +import com.cheeeese.global.config.properties.CorsProperties; +import lombok.RequiredArgsConstructor; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.HttpMethod; +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.cors.CorsConfigurationSource; +import org.springframework.web.cors.UrlBasedCorsConfigurationSource; + +import java.util.List; + +@Configuration +@EnableConfigurationProperties(CorsProperties.class) +@RequiredArgsConstructor +public class CorsConfig { + + private final CorsProperties corsProperties; + + @Bean + public CorsConfigurationSource corsConfigurationSource() { + CorsConfiguration config = new CorsConfiguration(); + + config.setAllowedOrigins(corsProperties.allowedOrigins()); + config.setAllowedMethods(List.of( + HttpMethod.POST.name(), + HttpMethod.GET.name(), + HttpMethod.PUT.name(), + HttpMethod.DELETE.name(), + HttpMethod.PATCH.name(), + HttpMethod.OPTIONS.name() + )); + config.setAllowedHeaders(List.of("*")); + config.setAllowCredentials(true); + + UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); + source.registerCorsConfiguration("/**", config); + + return source; + } +} diff --git a/src/main/java/com/cheeeese/global/config/properties/CorsProperties.java b/src/main/java/com/cheeeese/global/config/properties/CorsProperties.java new file mode 100644 index 0000000..dd8b6f0 --- /dev/null +++ b/src/main/java/com/cheeeese/global/config/properties/CorsProperties.java @@ -0,0 +1,11 @@ +package com.cheeeese.global.config.properties; + +import org.springframework.boot.context.properties.ConfigurationProperties; + +import java.util.List; + +@ConfigurationProperties(prefix = "cors") +public record CorsProperties( + List allowedOrigins +) { +} From 33930b21783cff7c7a935611a73d58fd9f6b93ff Mon Sep 17 00:00:00 2001 From: zyovn Date: Wed, 22 Oct 2025 22:16:38 +0900 Subject: [PATCH 135/402] =?UTF-8?q?#18=20chore:=20gitignore=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 0abfbb7..8b675af 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,7 @@ src/main/resources/secret/ ### application.yml ### application.yml +application-local.yml application-dev.yml application-prod.yml application-test.yml From 8fe7c125a5cc0487c388ca686a16d314508c92f2 Mon Sep 17 00:00:00 2001 From: zyovn Date: Wed, 22 Oct 2025 23:37:16 +0900 Subject: [PATCH 136/402] =?UTF-8?q?#18=20remove:=20=EC=9D=B4=EC=A0=84=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=EB=A1=9C=20=EB=A1=A4=EB=B0=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/ConfigurationPropertiesConfig.java | 6 +-- .../cheeeese/global/config/CorsConfig.java | 43 ------------------- .../config/properties/CorsProperties.java | 11 ----- 3 files changed, 1 insertion(+), 59 deletions(-) delete mode 100644 src/main/java/com/cheeeese/global/config/CorsConfig.java delete mode 100644 src/main/java/com/cheeeese/global/config/properties/CorsProperties.java diff --git a/src/main/java/com/cheeeese/global/config/ConfigurationPropertiesConfig.java b/src/main/java/com/cheeeese/global/config/ConfigurationPropertiesConfig.java index 1b50f96..5ff0a71 100644 --- a/src/main/java/com/cheeeese/global/config/ConfigurationPropertiesConfig.java +++ b/src/main/java/com/cheeeese/global/config/ConfigurationPropertiesConfig.java @@ -1,14 +1,10 @@ package com.cheeeese.global.config; -import com.cheeeese.global.config.properties.CorsProperties; import com.cheeeese.global.security.jwt.JwtProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Configuration; @Configuration -@EnableConfigurationProperties(value = { - JwtProperties.class, - CorsProperties.class -}) +@EnableConfigurationProperties(value = JwtProperties.class) public class ConfigurationPropertiesConfig { } diff --git a/src/main/java/com/cheeeese/global/config/CorsConfig.java b/src/main/java/com/cheeeese/global/config/CorsConfig.java deleted file mode 100644 index 78604a1..0000000 --- a/src/main/java/com/cheeeese/global/config/CorsConfig.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.cheeeese.global.config; - -import com.cheeeese.global.config.properties.CorsProperties; -import lombok.RequiredArgsConstructor; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.http.HttpMethod; -import org.springframework.web.cors.CorsConfiguration; -import org.springframework.web.cors.CorsConfigurationSource; -import org.springframework.web.cors.UrlBasedCorsConfigurationSource; - -import java.util.List; - -@Configuration -@EnableConfigurationProperties(CorsProperties.class) -@RequiredArgsConstructor -public class CorsConfig { - - private final CorsProperties corsProperties; - - @Bean - public CorsConfigurationSource corsConfigurationSource() { - CorsConfiguration config = new CorsConfiguration(); - - config.setAllowedOrigins(corsProperties.allowedOrigins()); - config.setAllowedMethods(List.of( - HttpMethod.POST.name(), - HttpMethod.GET.name(), - HttpMethod.PUT.name(), - HttpMethod.DELETE.name(), - HttpMethod.PATCH.name(), - HttpMethod.OPTIONS.name() - )); - config.setAllowedHeaders(List.of("*")); - config.setAllowCredentials(true); - - UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); - source.registerCorsConfiguration("/**", config); - - return source; - } -} diff --git a/src/main/java/com/cheeeese/global/config/properties/CorsProperties.java b/src/main/java/com/cheeeese/global/config/properties/CorsProperties.java deleted file mode 100644 index dd8b6f0..0000000 --- a/src/main/java/com/cheeeese/global/config/properties/CorsProperties.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.cheeeese.global.config.properties; - -import org.springframework.boot.context.properties.ConfigurationProperties; - -import java.util.List; - -@ConfigurationProperties(prefix = "cors") -public record CorsProperties( - List allowedOrigins -) { -} From d2056fd313c2f062100d844b75fce214e72a2351 Mon Sep 17 00:00:00 2001 From: zyovn Date: Thu, 23 Oct 2025 15:45:14 +0900 Subject: [PATCH 137/402] =?UTF-8?q?#22=20feat:=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=9E=90=20=ED=86=A0=ED=81=B0=20=EA=B5=90=ED=99=98=20=EB=95=8C?= =?UTF-8?q?,=20=EC=98=A8=EB=B3=B4=EB=94=A9=20=EC=97=AC=EB=B6=80=20response?= =?UTF-8?q?=EC=97=90=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cheeeese/auth/dto/response/AuthExchangeResponse.java | 6 ++++++ .../cheeeese/auth/infrastructure/mapper/AuthMapper.java | 1 + .../java/com/cheeeese/user/application/UserService.java | 1 + src/main/java/com/cheeeese/user/domain/User.java | 7 +++++++ 4 files changed, 15 insertions(+) diff --git a/src/main/java/com/cheeeese/auth/dto/response/AuthExchangeResponse.java b/src/main/java/com/cheeeese/auth/dto/response/AuthExchangeResponse.java index 822a6c4..ac25ea9 100644 --- a/src/main/java/com/cheeeese/auth/dto/response/AuthExchangeResponse.java +++ b/src/main/java/com/cheeeese/auth/dto/response/AuthExchangeResponse.java @@ -17,6 +17,12 @@ public record AuthExchangeResponse( ) String refreshToken, + @Schema( + description = "온보딩 여부", + example = "true" + ) + boolean isOnboarded, + @Schema( description = "사용자 고유 식별 ID", example = "1" diff --git a/src/main/java/com/cheeeese/auth/infrastructure/mapper/AuthMapper.java b/src/main/java/com/cheeeese/auth/infrastructure/mapper/AuthMapper.java index 7a75265..77ecd28 100644 --- a/src/main/java/com/cheeeese/auth/infrastructure/mapper/AuthMapper.java +++ b/src/main/java/com/cheeeese/auth/infrastructure/mapper/AuthMapper.java @@ -10,6 +10,7 @@ public static AuthExchangeResponse toExchangeResponse(String accessToken, String return AuthExchangeResponse.builder() .accessToken(accessToken) .refreshToken(refreshToken) + .isOnboarded(user.isOnboarded()) .userId(user.getId()) .name(user.getName()) .email(user.getEmail()) diff --git a/src/main/java/com/cheeeese/user/application/UserService.java b/src/main/java/com/cheeeese/user/application/UserService.java index 9041c66..8de480a 100644 --- a/src/main/java/com/cheeeese/user/application/UserService.java +++ b/src/main/java/com/cheeeese/user/application/UserService.java @@ -26,6 +26,7 @@ public void saveUserAgreement(User user, UserAgreementRequest request) { userValidator.validateUserAgreement(request); user.saveUserAgreement( + true, request.isServiceAgreement(), request.isUserInfoAgreement(), request.isMarketingAgreement(), diff --git a/src/main/java/com/cheeeese/user/domain/User.java b/src/main/java/com/cheeeese/user/domain/User.java index e02139b..316d5ee 100644 --- a/src/main/java/com/cheeeese/user/domain/User.java +++ b/src/main/java/com/cheeeese/user/domain/User.java @@ -41,6 +41,9 @@ public class User extends BaseEntity { @Column(name = "is_third_party_agreement", nullable = false) private boolean isThirdPartyAgreement; + @Column(name = "is_onboarded", nullable = false) + private boolean isOnboarded; + @Column(name = "album_cnt", nullable = false) private int albumCnt; @@ -60,6 +63,7 @@ private User( boolean isUserInfoAgreement, boolean isMarketingAgreement, boolean isThirdPartyAgreement, + boolean isOnboarded, int albumCnt, int photoCnt, int likesCnt @@ -72,6 +76,7 @@ private User( this.isUserInfoAgreement = isUserInfoAgreement; this.isMarketingAgreement = isMarketingAgreement; this.isThirdPartyAgreement = isThirdPartyAgreement; + this.isOnboarded = isOnboarded; this.albumCnt = albumCnt; this.photoCnt = photoCnt; this.likesCnt = likesCnt; @@ -82,11 +87,13 @@ public void updateUserProfile(String name) { } public void saveUserAgreement( + boolean isOnboarded, boolean isServiceAgreement, boolean isUserInfoAgreement, boolean isMarketingAgreement, boolean isThirdPartyAgreement ) { + this.isOnboarded = isOnboarded; this.isServiceAgreement = isServiceAgreement; this.isUserInfoAgreement = isUserInfoAgreement; this.isMarketingAgreement = isMarketingAgreement; From 72cf16183aee99ed793e34e7d46f6991a3d00d9d Mon Sep 17 00:00:00 2001 From: zyovn Date: Thu, 23 Oct 2025 15:49:14 +0900 Subject: [PATCH 138/402] =?UTF-8?q?#22=20docs:=20=EC=84=B1=EA=B3=B5=20?= =?UTF-8?q?=EB=A9=94=EC=8B=9C=EC=A7=80=20=ED=95=9C=EA=B5=AD=EC=96=B4?= =?UTF-8?q?=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cheeeese/global/common/code/SuccessCode.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java index 1d7cca7..c7e64e8 100644 --- a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java +++ b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java @@ -9,21 +9,21 @@ public enum SuccessCode implements BaseCode { // health_check - HEALTH_CHECK_SUCCESS(HttpStatus.OK, "Health Check Success"), + HEALTH_CHECK_SUCCESS(HttpStatus.OK, "🧀 치이이즈 서버가 정상적으로 작동 중입니다."), // auth - TOKEN_EXCHANGE_SUCCESS(HttpStatus.OK, "Token Exchange Success"), - TOKEN_REISSUE_SUCCESS(HttpStatus.OK, "Token Reissue Success"), - LOGOUT_SUCCESS(HttpStatus.OK, "Logout Success"), + TOKEN_EXCHANGE_SUCCESS(HttpStatus.OK, "토큰 교환이 성공적으로 완료되었습니다."), + TOKEN_REISSUE_SUCCESS(HttpStatus.OK, "토큰 재발급이 성공적으로 완료되었습니다."), + LOGOUT_SUCCESS(HttpStatus.OK, "로그아웃이 성공적으로 완료되었습니다."), // user - USER_PROFILE_UPDATE_SUCCESS(HttpStatus.OK, "User Profile Update Success"), - USER_AGREEMENT_ACCEPT_SUCCESS(HttpStatus.OK, "User Agreement Accept Success"), + USER_PROFILE_UPDATE_SUCCESS(HttpStatus.OK, "사용자 프로필 업데이트가 성공적으로 완료되었습니다."), + USER_AGREEMENT_ACCEPT_SUCCESS(HttpStatus.OK, "사용자 이용 약관 동의가 성공적으로 완료되었습니다."), // album ALBUM_INVITATION_FETCH_SUCCESS(HttpStatus.OK, "앨범 초대장 정보 조회가 성공적으로 완료되었습니다."), ALBUM_ENTER_SUCCESS(HttpStatus.OK, "앨범 입장이 성공적으로 완료되었습니다."), - ALBUM_CREATE_SUCCESS(HttpStatus.OK, "Album Create Success"), + ALBUM_CREATE_SUCCESS(HttpStatus.OK, "앨범 생성이 성공적으로 완료되었습니다."), ; private final HttpStatus httpStatus; From a352eebbb905bc2e760da031140940393193337c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Fri, 24 Oct 2025 13:36:49 +0900 Subject: [PATCH 139/402] =?UTF-8?q?#16=20feat:=20photoStatus=20enum=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cheeeese/photo/domain/Photo.java | 18 ++++++++++++++++-- .../com/cheeeese/photo/domain/PhotoStatus.java | 8 ++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/cheeeese/photo/domain/PhotoStatus.java diff --git a/src/main/java/com/cheeeese/photo/domain/Photo.java b/src/main/java/com/cheeeese/photo/domain/Photo.java index 6d1f385..3032339 100644 --- a/src/main/java/com/cheeeese/photo/domain/Photo.java +++ b/src/main/java/com/cheeeese/photo/domain/Photo.java @@ -28,7 +28,7 @@ public class Photo extends BaseEntity { @Column(name = "album_id", nullable = false) private Long albumId; - @Column(name = "image_url", nullable = false, columnDefinition = "TEXT") + @Column(name = "image_url", nullable = true, columnDefinition = "TEXT") private String imageUrl; @Column(name = "likes_cnt", nullable = false) @@ -40,12 +40,17 @@ public class Photo extends BaseEntity { @Column(name = "is_deleted", nullable = false) private boolean isDeleted; + @Enumerated(EnumType.STRING) + @Column(name = "status", nullable = false) + private PhotoStatus status; + @Builder private Photo( Long userId, Long albumId, String imageUrl, - LocalDateTime captureTime + LocalDateTime captureTime, + PhotoStatus status ) { this.userId = userId; this.albumId = albumId; @@ -53,5 +58,14 @@ private Photo( this.captureTime = captureTime; this.likesCnt = 0; this.isDeleted = false; + this.status = status; + } + + public void updateStatus(PhotoStatus newStatus) { + this.status = newStatus; + } + + public void updateImageUrl(String imageUrl) { + this.imageUrl = imageUrl; } } diff --git a/src/main/java/com/cheeeese/photo/domain/PhotoStatus.java b/src/main/java/com/cheeeese/photo/domain/PhotoStatus.java new file mode 100644 index 0000000..a1351a9 --- /dev/null +++ b/src/main/java/com/cheeeese/photo/domain/PhotoStatus.java @@ -0,0 +1,8 @@ +package com.cheeeese.photo.domain; + +public enum PhotoStatus { + UPLOADING, + PROCESSING, + COMPLETED, + FAILED +} From 36aa662e8cbfdb24973242ab6b647a253846e2c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Fri, 24 Oct 2025 13:39:06 +0900 Subject: [PATCH 140/402] =?UTF-8?q?#16=20feat:=20=EC=97=90=EB=9F=AC=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../photo/exception/PhotoException.java | 13 ++++++++++ .../photo/exception/code/PhotoErrorCode.java | 25 +++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 src/main/java/com/cheeeese/photo/exception/PhotoException.java create mode 100644 src/main/java/com/cheeeese/photo/exception/code/PhotoErrorCode.java diff --git a/src/main/java/com/cheeeese/photo/exception/PhotoException.java b/src/main/java/com/cheeeese/photo/exception/PhotoException.java new file mode 100644 index 0000000..3b7ec96 --- /dev/null +++ b/src/main/java/com/cheeeese/photo/exception/PhotoException.java @@ -0,0 +1,13 @@ +package com.cheeeese.photo.exception; + +import com.cheeeese.global.exception.BusinessException; +import com.cheeeese.photo.exception.code.PhotoErrorCode; +import lombok.Getter; + +@Getter +public class PhotoException extends BusinessException { + public PhotoException(PhotoErrorCode errorCode) { + super(errorCode); + } +} + diff --git a/src/main/java/com/cheeeese/photo/exception/code/PhotoErrorCode.java b/src/main/java/com/cheeeese/photo/exception/code/PhotoErrorCode.java new file mode 100644 index 0000000..990e2a7 --- /dev/null +++ b/src/main/java/com/cheeeese/photo/exception/code/PhotoErrorCode.java @@ -0,0 +1,25 @@ +package com.cheeeese.photo.exception.code; + +import com.cheeeese.global.common.code.BaseCode; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; + +@Getter +@RequiredArgsConstructor +public enum PhotoErrorCode implements BaseCode { + + PHOTO_NOT_FOUND(HttpStatus.NOT_FOUND, "존재하지 않거나 유효하지 않은 사진 정보입니다."), + + PHOTO_MAX_COUNT_EXCEEDED(HttpStatus.BAD_REQUEST, "앨범의 최대 사진 개수를 초과합니다."), + PHOTO_FILE_SIZE_EXCEEDED(HttpStatus.BAD_REQUEST, "파일 크기는 6MB를 초과할 수 없습니다."), + PHOTO_INVALID_CONTENT_TYPE(HttpStatus.BAD_REQUEST, "유효한 이미지 파일 형식이 아닙니다."), + PHOTO_FILE_LIST_EMPTY(HttpStatus.BAD_REQUEST, "업로드할 파일 목록이 비어 있습니다."), + PHOTO_FILE_NAME_REQUIRED(HttpStatus.BAD_REQUEST, "파일명이 누락되었습니다."), + ; + ; + + private final HttpStatus httpStatus; + private final String message; +} + From 2acfc949b03af40c8dd76dfede117d3b570131f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Fri, 24 Oct 2025 13:45:50 +0900 Subject: [PATCH 141/402] =?UTF-8?q?#16=20remove:=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=ED=95=98=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EC=97=90=EB=9F=AC=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cheeeese/photo/exception/code/PhotoErrorCode.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/com/cheeeese/photo/exception/code/PhotoErrorCode.java b/src/main/java/com/cheeeese/photo/exception/code/PhotoErrorCode.java index 990e2a7..8842023 100644 --- a/src/main/java/com/cheeeese/photo/exception/code/PhotoErrorCode.java +++ b/src/main/java/com/cheeeese/photo/exception/code/PhotoErrorCode.java @@ -9,8 +9,6 @@ @RequiredArgsConstructor public enum PhotoErrorCode implements BaseCode { - PHOTO_NOT_FOUND(HttpStatus.NOT_FOUND, "존재하지 않거나 유효하지 않은 사진 정보입니다."), - PHOTO_MAX_COUNT_EXCEEDED(HttpStatus.BAD_REQUEST, "앨범의 최대 사진 개수를 초과합니다."), PHOTO_FILE_SIZE_EXCEEDED(HttpStatus.BAD_REQUEST, "파일 크기는 6MB를 초과할 수 없습니다."), PHOTO_INVALID_CONTENT_TYPE(HttpStatus.BAD_REQUEST, "유효한 이미지 파일 형식이 아닙니다."), From 9ded6199b0bc827a4f713f1861f3add3fe823551 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Fri, 24 Oct 2025 13:49:01 +0900 Subject: [PATCH 142/402] =?UTF-8?q?#16=20feat:=20AlbumRepository=20?= =?UTF-8?q?=EC=82=AC=EC=A7=84=20=EA=B0=9C=EC=88=98=20=EC=A6=9D=EA=B0=80=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../album/infrastructure/persistence/AlbumRepository.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumRepository.java b/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumRepository.java index 5ed25ae..c07f9f9 100644 --- a/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumRepository.java +++ b/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumRepository.java @@ -28,4 +28,8 @@ long countByUserAndCreatedAtBetween( @Param("start") LocalDateTime start, @Param("end") LocalDateTime end ); + + @Modifying(clearAutomatically = true, flushAutomatically = true) + @Query("UPDATE Album a SET a.currentPhotoCount = a.currentPhotoCount + :count WHERE a.id = :albumId") + int incrementPhotoCount(@Param("albumId") Long albumId, @Param("count") int count); } From 492becea6b8e4d21a7a5a72a6747a2a8c8967178 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Fri, 24 Oct 2025 13:49:38 +0900 Subject: [PATCH 143/402] =?UTF-8?q?#16=20feat:=20presigned-url=20=EB=B0=9C?= =?UTF-8?q?=EA=B8=89=20=EB=A1=9C=EC=A7=81=201=EC=B0=A8=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../global/common/code/SuccessCode.java | 4 ++ .../photo/application/PhotoService.java | 60 +++++++++++++++++++ .../application/PresignedUrlService.java | 36 +++++++++++ .../application/validator/PhotoValidator.java | 49 +++++++++++++++ .../dto/request/PhotoPresignedUrlRequest.java | 35 +++++++++++ .../response/PhotoPresignedUrlResponse.java | 23 +++++++ .../infrastructure/mapper/PhotoMapper.java | 40 +++++++++++++ .../photo/presentation/PhotoController.java | 32 ++++++++++ .../presentation/swagger/PhotoSwagger.java | 60 +++++++++++++++++++ 9 files changed, 339 insertions(+) create mode 100644 src/main/java/com/cheeeese/photo/application/PresignedUrlService.java create mode 100644 src/main/java/com/cheeeese/photo/application/validator/PhotoValidator.java create mode 100644 src/main/java/com/cheeeese/photo/dto/request/PhotoPresignedUrlRequest.java create mode 100644 src/main/java/com/cheeeese/photo/dto/response/PhotoPresignedUrlResponse.java create mode 100644 src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java create mode 100644 src/main/java/com/cheeeese/photo/presentation/PhotoController.java create mode 100644 src/main/java/com/cheeeese/photo/presentation/swagger/PhotoSwagger.java diff --git a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java index 1d7cca7..6e5dbda 100644 --- a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java +++ b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java @@ -24,6 +24,10 @@ public enum SuccessCode implements BaseCode { ALBUM_INVITATION_FETCH_SUCCESS(HttpStatus.OK, "앨범 초대장 정보 조회가 성공적으로 완료되었습니다."), ALBUM_ENTER_SUCCESS(HttpStatus.OK, "앨범 입장이 성공적으로 완료되었습니다."), ALBUM_CREATE_SUCCESS(HttpStatus.OK, "Album Create Success"), + + + // photo + PRESIGNED_URL_ISSUE_SUCCESS(HttpStatus.OK, "Presigned URL 발급이 성공적으로 완료되었습니다."), ; private final HttpStatus httpStatus; diff --git a/src/main/java/com/cheeeese/photo/application/PhotoService.java b/src/main/java/com/cheeeese/photo/application/PhotoService.java index 2b4d8b0..f2716f1 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoService.java @@ -1,7 +1,15 @@ package com.cheeeese.photo.application; +import com.cheeeese.album.application.validator.AlbumValidator; +import com.cheeeese.album.domain.Album; +import com.cheeeese.album.infrastructure.persistence.AlbumRepository; +import com.cheeeese.photo.application.validator.PhotoValidator; import com.cheeeese.photo.domain.Photo; +import com.cheeeese.photo.dto.request.PhotoPresignedUrlRequest; +import com.cheeeese.photo.dto.response.PhotoPresignedUrlResponse; +import com.cheeeese.photo.infrastructure.mapper.PhotoMapper; import com.cheeeese.photo.infrastructure.persistence.PhotoRepository; +import com.cheeeese.user.domain.User; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -15,6 +23,10 @@ public class PhotoService { private final PhotoRepository photoRepository; + private final PhotoValidator photoValidator; + private final AlbumValidator albumValidator; + private final AlbumRepository albumRepository; + private final PresignedUrlService presignedUrlService; public long countTotalPhotos(Long albumId) { return photoRepository.countByAlbumIdAndIsDeletedFalse(albumId); @@ -26,4 +38,52 @@ public List getRecentPhotoUrls(Long albumId) { .map(Photo::getImageUrl) .collect(Collectors.toList()); } + + @Transactional + public PhotoPresignedUrlResponse createPresignedUrls( + User user, + PhotoPresignedUrlRequest request + ) { + Album album = albumValidator.validateAlbumCode(request.albumCode()); + albumValidator.validateAlbumExpiration(album); + + int currentCount = album.getCurrentPhotoCount(); + int maxCount = album.getMaxPhotoCount(); + int requestedCount = request.fileInfos().size(); + + photoValidator.validatePhotoCount(currentCount, requestedCount, maxCount); + photoValidator.validateFileInfos(request.fileInfos()); + + List presignedUrls = + request.fileInfos().stream() + .map(file -> { + Photo photo = PhotoMapper.toEntity( + user.getId(), + album.getId() + ); + photoRepository.save(photo); + + String objectKey = String.format( + "album/%d/original/%d_%s", + album.getId(), + photo.getId(), + file.fileName() + ); + + String uploadUrl = presignedUrlService.generatePresignedPutUrl( + objectKey, + file.contentType() + ); + + photo.updateImageUrl(objectKey); + + return PhotoMapper.toPresignedUrlInfo(photo.getId(), uploadUrl); + }) + .collect(Collectors.toList()); + + albumRepository.incrementPhotoCount(album.getId(), requestedCount); + + return PhotoMapper.toPresignedUrlResponse(presignedUrls); + } + } diff --git a/src/main/java/com/cheeeese/photo/application/PresignedUrlService.java b/src/main/java/com/cheeeese/photo/application/PresignedUrlService.java new file mode 100644 index 0000000..77db1d2 --- /dev/null +++ b/src/main/java/com/cheeeese/photo/application/PresignedUrlService.java @@ -0,0 +1,36 @@ +package com.cheeeese.photo.application; + +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; +import software.amazon.awssdk.services.s3.model.PutObjectRequest; +import software.amazon.awssdk.services.s3.presigner.S3Presigner; +import software.amazon.awssdk.services.s3.presigner.model.PresignedPutObjectRequest; + +import java.time.Duration; + +@Component +@RequiredArgsConstructor +public class PresignedUrlService { + + private final S3Presigner s3Presigner; + + @Value("${ncp.object-storage.bucket}") + private String bucket; + + public String generatePresignedPutUrl(String uniqueKey, String contentType) { + PutObjectRequest putObjectRequest = PutObjectRequest.builder() + .bucket(bucket) + .key(uniqueKey) + .contentType(contentType) + .build(); + + PresignedPutObjectRequest presignedRequest = + s3Presigner.presignPutObject(p -> p + .signatureDuration(Duration.ofMinutes(10)) + .putObjectRequest(putObjectRequest) + ); + + return presignedRequest.url().toString(); + } +} diff --git a/src/main/java/com/cheeeese/photo/application/validator/PhotoValidator.java b/src/main/java/com/cheeeese/photo/application/validator/PhotoValidator.java new file mode 100644 index 0000000..e770562 --- /dev/null +++ b/src/main/java/com/cheeeese/photo/application/validator/PhotoValidator.java @@ -0,0 +1,49 @@ +package com.cheeeese.photo.application.validator; + +import com.cheeeese.photo.dto.request.PhotoPresignedUrlRequest; +import com.cheeeese.photo.exception.PhotoException; +import com.cheeeese.photo.exception.code.PhotoErrorCode; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component +@RequiredArgsConstructor +public class PhotoValidator { + + private static final long MAX_FILE_SIZE = 6 * 1024 * 1024; // 6MB + private static final List ALLOWED_TYPES = List.of("image/jpeg", "image/png", "image/jpg"); + + /** + * presigned URL 발급 전, 파일 정보 형식/용량 검증 + */ + public void validateFileInfos(List fileInfos) { + if (fileInfos == null || fileInfos.isEmpty()) { + throw new PhotoException(PhotoErrorCode.PHOTO_FILE_LIST_EMPTY); + } + + for (PhotoPresignedUrlRequest.FileInfo file : fileInfos) { + if (file.fileName() == null || file.fileName().isBlank()) { + throw new PhotoException(PhotoErrorCode.PHOTO_FILE_NAME_REQUIRED); + } + + if (file.fileSize() > MAX_FILE_SIZE) { + throw new PhotoException(PhotoErrorCode.PHOTO_FILE_SIZE_EXCEEDED); + } + + if (!ALLOWED_TYPES.contains(file.contentType())) { + throw new PhotoException(PhotoErrorCode.PHOTO_INVALID_CONTENT_TYPE); + } + } + } + + /** + * 앨범 내 업로드 제한 검증 + */ + public void validatePhotoCount(int currentCount, int uploadCount, int maxPhotoCount) { + if (currentCount + uploadCount > maxPhotoCount) { + throw new PhotoException(PhotoErrorCode.PHOTO_MAX_COUNT_EXCEEDED); + } + } +} diff --git a/src/main/java/com/cheeeese/photo/dto/request/PhotoPresignedUrlRequest.java b/src/main/java/com/cheeeese/photo/dto/request/PhotoPresignedUrlRequest.java new file mode 100644 index 0000000..bbe6609 --- /dev/null +++ b/src/main/java/com/cheeeese/photo/dto/request/PhotoPresignedUrlRequest.java @@ -0,0 +1,35 @@ +package com.cheeeese.photo.dto.request; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Builder; + +import java.util.List; + +@Builder +@Schema(description = "Presigned URL 발급 요청") +public record PhotoPresignedUrlRequest( + @NotNull + @Schema(description = "앨범 코드", example = "786ccd09-5f22-4aa9-a32b-f62dd2e94cc8") + String albumCode, + + @NotNull + @Schema(description = "업로드할 파일 정보 목록") + List fileInfos +) { + @Builder + @Schema(description = "개별 파일 정보") + public record FileInfo( + @NotBlank + @Schema(description = "원본 파일명", example = "my_holiday_pic.jpg") + String fileName, + + @Schema(description = "파일 크기 (Byte)", example = "3000000") + long fileSize, + + @NotBlank + @Schema(description = "파일 Content-Type", example = "image/jpeg") + String contentType + ) {} +} \ No newline at end of file diff --git a/src/main/java/com/cheeeese/photo/dto/response/PhotoPresignedUrlResponse.java b/src/main/java/com/cheeeese/photo/dto/response/PhotoPresignedUrlResponse.java new file mode 100644 index 0000000..f3e28a0 --- /dev/null +++ b/src/main/java/com/cheeeese/photo/dto/response/PhotoPresignedUrlResponse.java @@ -0,0 +1,23 @@ +package com.cheeeese.photo.dto.response; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Builder; + +import java.util.List; + +@Builder +@Schema(description = "Presigned URL 발급 응답") +public record PhotoPresignedUrlResponse( + @Schema(description = "발급된 Presigned URL 목록") + List presignedUrlInfos +) { + @Builder + @Schema(description = "Presigned URL 정보") + public record PresignedUrlInfo( + @Schema(description = "저장된 사진 ID", example = "100") + Long photoId, + + @Schema(description = "클라우드 스토리지에 업로드할 URL", example = "https://bucket.s3.ap-northeast-2.amazonaws.com/...") + String uploadUrl + ) {} +} \ No newline at end of file diff --git a/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java b/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java new file mode 100644 index 0000000..a9ba694 --- /dev/null +++ b/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java @@ -0,0 +1,40 @@ +package com.cheeeese.photo.infrastructure.mapper; + +import com.cheeeese.photo.domain.Photo; +import com.cheeeese.photo.domain.PhotoStatus; +import com.cheeeese.photo.dto.request.PhotoPresignedUrlRequest; +import com.cheeeese.photo.dto.response.PhotoPresignedUrlResponse; + +import java.time.LocalDateTime; +import java.util.List; + +public class PhotoMapper { + + public static Photo toEntity(Long userId, Long albumId) { + return Photo.builder() + .userId(userId) + .albumId(albumId) + .imageUrl(null) // presigned URL 생성 후 updateImageUrl()로 세팅됨 + .captureTime(LocalDateTime.now()) + .status(PhotoStatus.UPLOADING) + .build(); + } + + public static PhotoPresignedUrlResponse.PresignedUrlInfo toPresignedUrlInfo( + Long photoId, + String uploadUrl + ) { + return PhotoPresignedUrlResponse.PresignedUrlInfo.builder() + .photoId(photoId) + .uploadUrl(uploadUrl) + .build(); + } + + public static PhotoPresignedUrlResponse toPresignedUrlResponse( + List presignedUrlInfos + ) { + return PhotoPresignedUrlResponse.builder() + .presignedUrlInfos(presignedUrlInfos) + .build(); + } +} diff --git a/src/main/java/com/cheeeese/photo/presentation/PhotoController.java b/src/main/java/com/cheeeese/photo/presentation/PhotoController.java new file mode 100644 index 0000000..a6b11fe --- /dev/null +++ b/src/main/java/com/cheeeese/photo/presentation/PhotoController.java @@ -0,0 +1,32 @@ +package com.cheeeese.photo.presentation; + +import com.cheeeese.global.common.CommonResponse; +import com.cheeeese.global.util.CurrentUser; +import com.cheeeese.photo.application.PhotoService; +import com.cheeeese.photo.dto.request.PhotoPresignedUrlRequest; +import com.cheeeese.photo.dto.response.PhotoPresignedUrlResponse; +import com.cheeeese.photo.presentation.swagger.PhotoSwagger; +import com.cheeeese.user.domain.User; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +import static com.cheeeese.global.common.code.SuccessCode.PRESIGNED_URL_ISSUE_SUCCESS; + + +@RestController +@RequiredArgsConstructor +@RequestMapping("/v1/photo") +public class PhotoController implements PhotoSwagger { + + private final PhotoService photoService; + + @Override + @PostMapping("/presigned-url") + public CommonResponse createPresignedUrls( + @CurrentUser User user, + @RequestBody @Valid PhotoPresignedUrlRequest request + ) { + return CommonResponse.success(PRESIGNED_URL_ISSUE_SUCCESS, photoService.createPresignedUrls(user, request)); + } +} \ No newline at end of file diff --git a/src/main/java/com/cheeeese/photo/presentation/swagger/PhotoSwagger.java b/src/main/java/com/cheeeese/photo/presentation/swagger/PhotoSwagger.java new file mode 100644 index 0000000..c4ca9ce --- /dev/null +++ b/src/main/java/com/cheeeese/photo/presentation/swagger/PhotoSwagger.java @@ -0,0 +1,60 @@ +package com.cheeeese.photo.presentation.swagger; + +import com.cheeeese.global.common.CommonResponse; +import com.cheeeese.global.util.CurrentUser; +import com.cheeeese.photo.dto.request.PhotoPresignedUrlRequest; +import com.cheeeese.photo.dto.response.PhotoPresignedUrlResponse; +import com.cheeeese.user.domain.User; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.web.bind.annotation.RequestBody; + +@Tag(name = "[사진]", description = "사진 업로드 및 관리에 대한 API") +public interface PhotoSwagger { + @Operation( + summary = "Presigned URL 발급 API", + description = """ + ### RequestBody + --- + `albumCode`: 사진을 업로드할 앨범의 코드 \n + `fileInfos`: 업로드할 파일 정보 목록 (파일명, 크기, Content-Type) \n + + ### 로직 상세 + --- + 1. 앨범의 존재 및 만료 여부 확인 + 2. 앨범의 최대 사진 개수 (`maxPhotoCount`) 초과 여부 확인 + 3. 파일별 크기(6MB), Content-Type(image/*) 유효성 검증 + 4. 검증 통과 시, DB에 `Photo` 레코드를 `UPLOADING` 상태로 생성 + 5. 클라우드 스토리지 Presigned URL을 발급하여 반환 + """ + ) + @ApiResponses(value = { + @ApiResponse( + responseCode = "200", + description = "Presigned URL 발급이 성공적으로 완료되었습니다." + ), + @ApiResponse( + responseCode = "400", + description = "유효성 검증 실패 (최대 개수 초과, 파일 크기/형식 불일치 등)", + content = @Content( + mediaType = "application/json", + schema = @Schema(example = """ + { + "isSuccess": false, + "code": 400, + "message": "앨범의 최대 사진 개수를 초과합니다." + } + """) + ) + ) + }) + CommonResponse createPresignedUrls( + @CurrentUser User user, + @RequestBody @Valid PhotoPresignedUrlRequest request + ); +} From cd99241bffcc4b23aca4cf00cf9cb007d5fe4fbf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Fri, 24 Oct 2025 13:58:27 +0900 Subject: [PATCH 144/402] =?UTF-8?q?#16=20feat:=20=EC=95=A8=EB=B2=94?= =?UTF-8?q?=EC=97=90=20=EC=B0=B8=EC=97=AC=ED=95=9C=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=9E=90=EC=9D=B8=EC=A7=80=20=EA=B2=80=EC=A6=9D=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../album/application/validator/AlbumValidator.java | 9 +++++++++ .../cheeeese/album/exception/code/AlbumErrorCode.java | 1 + .../com/cheeeese/photo/application/PhotoService.java | 2 +- 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java index c5ed1ad..7cd90ea 100644 --- a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java +++ b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java @@ -68,6 +68,15 @@ public void validateAlbumEntry(Album album, User user) { validateUserBlacklisted(album, user); } + public void validateUploadPermission(Album album, User user) { // [NEW] + validateAlbumExpiration(album); + + validateUserBlacklisted(album, user); + + albumParticipantRepository.findByUserIdAndAlbumId(user.getId(), album.getId()) + .orElseThrow(() -> new AlbumException(AlbumErrorCode.USER_NOT_PARTICIPANT)); + } + /** * 사용자가 앨범의 블랙리스트에 등록되어 있는지 확인합니다. */ diff --git a/src/main/java/com/cheeeese/album/exception/code/AlbumErrorCode.java b/src/main/java/com/cheeeese/album/exception/code/AlbumErrorCode.java index 1d1286b..f4a0cd4 100644 --- a/src/main/java/com/cheeeese/album/exception/code/AlbumErrorCode.java +++ b/src/main/java/com/cheeeese/album/exception/code/AlbumErrorCode.java @@ -21,6 +21,7 @@ public enum AlbumErrorCode implements BaseCode { ALBUM_EVENT_DATE_INVALID(HttpStatus.BAD_REQUEST, "행사 날짜는 오늘 또는 과거만 선택 가능합니다."), ALBUM_INVALID_CAPACITY(HttpStatus.BAD_REQUEST, "앨범 인원은 최소 1명 이상 최대 64명 이하여야 합니다."), ALBUM_CREATION_LIMIT_EXCEEDED(HttpStatus.CONFLICT, "사용자는 일주일에 최대 3개의 앨범만 생성할 수 있습니다."), + USER_NOT_PARTICIPANT(HttpStatus.FORBIDDEN, "사용자는 해당 앨범의 참가자가 아닙니다."), ; private final HttpStatus httpStatus; diff --git a/src/main/java/com/cheeeese/photo/application/PhotoService.java b/src/main/java/com/cheeeese/photo/application/PhotoService.java index f2716f1..2390fac 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoService.java @@ -45,7 +45,7 @@ public PhotoPresignedUrlResponse createPresignedUrls( PhotoPresignedUrlRequest request ) { Album album = albumValidator.validateAlbumCode(request.albumCode()); - albumValidator.validateAlbumExpiration(album); + albumValidator.validateUploadPermission(album, user); int currentCount = album.getCurrentPhotoCount(); int maxCount = album.getMaxPhotoCount(); From 7393a0a7f9ef6b120ef77dd8061b0832e7f25827 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Fri, 24 Oct 2025 14:59:31 +0900 Subject: [PATCH 145/402] =?UTF-8?q?#16=20fix:=20incrementPhotoCount=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=EC=97=90=20=EC=A1=B0=EA=B1=B4=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../album/infrastructure/persistence/AlbumRepository.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumRepository.java b/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumRepository.java index c07f9f9..ec58365 100644 --- a/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumRepository.java +++ b/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumRepository.java @@ -30,6 +30,6 @@ long countByUserAndCreatedAtBetween( ); @Modifying(clearAutomatically = true, flushAutomatically = true) - @Query("UPDATE Album a SET a.currentPhotoCount = a.currentPhotoCount + :count WHERE a.id = :albumId") + @Query("UPDATE Album a SET a.currentPhotoCount = a.currentPhotoCount + :count WHERE a.id = :albumId AND a.currentPhotoCount + :count <= a.maxPhotoCount") int incrementPhotoCount(@Param("albumId") Long albumId, @Param("count") int count); } From 407bac1b523cc62b73057b4adc9843c43fd75784 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Fri, 24 Oct 2025 16:55:33 +0900 Subject: [PATCH 146/402] =?UTF-8?q?#16=20remove:=20updateStatus=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/cheeeese/photo/domain/Photo.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main/java/com/cheeeese/photo/domain/Photo.java b/src/main/java/com/cheeeese/photo/domain/Photo.java index 3032339..9c4deeb 100644 --- a/src/main/java/com/cheeeese/photo/domain/Photo.java +++ b/src/main/java/com/cheeeese/photo/domain/Photo.java @@ -61,10 +61,6 @@ private Photo( this.status = status; } - public void updateStatus(PhotoStatus newStatus) { - this.status = newStatus; - } - public void updateImageUrl(String imageUrl) { this.imageUrl = imageUrl; } From c951df8e6c9c10e98ac81910bbac59a8b66163ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Fri, 24 Oct 2025 16:56:44 +0900 Subject: [PATCH 147/402] =?UTF-8?q?#16=20feat:=20=EC=82=AC=EC=A7=84=20?= =?UTF-8?q?=EC=97=85=EB=A1=9C=EB=93=9C=20=EC=99=84=EB=A3=8C/=EC=8B=A4?= =?UTF-8?q?=ED=8C=A8=20=EB=B3=B4=EA=B3=A0=20api=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../persistence/AlbumRepository.java | 4 + .../global/common/code/SuccessCode.java | 1 + .../photo/application/PhotoService.java | 34 ++++++++ .../application/validator/PhotoValidator.java | 82 +++++++++++++++++++ .../dto/request/PhotoUploadReportRequest.java | 20 +++++ .../photo/exception/code/PhotoErrorCode.java | 5 +- .../persistence/PhotoRepository.java | 19 +++++ .../photo/presentation/PhotoController.java | 13 ++- .../presentation/swagger/PhotoSwagger.java | 26 ++++++ 9 files changed, 202 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/cheeeese/photo/dto/request/PhotoUploadReportRequest.java diff --git a/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumRepository.java b/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumRepository.java index ec58365..d43643f 100644 --- a/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumRepository.java +++ b/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumRepository.java @@ -32,4 +32,8 @@ long countByUserAndCreatedAtBetween( @Modifying(clearAutomatically = true, flushAutomatically = true) @Query("UPDATE Album a SET a.currentPhotoCount = a.currentPhotoCount + :count WHERE a.id = :albumId AND a.currentPhotoCount + :count <= a.maxPhotoCount") int incrementPhotoCount(@Param("albumId") Long albumId, @Param("count") int count); + + @Modifying(clearAutomatically = true, flushAutomatically = true) + @Query("UPDATE Album a SET a.currentPhotoCount = a.currentPhotoCount - :count WHERE a.id = :albumId AND a.currentPhotoCount >= :count") + int decrementPhotoCount(@Param("albumId") Long albumId, @Param("count") int count); } diff --git a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java index 6e5dbda..e84ca08 100644 --- a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java +++ b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java @@ -28,6 +28,7 @@ public enum SuccessCode implements BaseCode { // photo PRESIGNED_URL_ISSUE_SUCCESS(HttpStatus.OK, "Presigned URL 발급이 성공적으로 완료되었습니다."), + PHOTO_UPLOAD_REPORT_SUCCESS(HttpStatus.OK, "사진 업로드 결과 보고가 성공적으로 처리되었습니다."), ; private final HttpStatus httpStatus; diff --git a/src/main/java/com/cheeeese/photo/application/PhotoService.java b/src/main/java/com/cheeeese/photo/application/PhotoService.java index 2390fac..64c737d 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoService.java @@ -5,7 +5,9 @@ import com.cheeeese.album.infrastructure.persistence.AlbumRepository; import com.cheeeese.photo.application.validator.PhotoValidator; import com.cheeeese.photo.domain.Photo; +import com.cheeeese.photo.domain.PhotoStatus; import com.cheeeese.photo.dto.request.PhotoPresignedUrlRequest; +import com.cheeeese.photo.dto.request.PhotoUploadReportRequest; import com.cheeeese.photo.dto.response.PhotoPresignedUrlResponse; import com.cheeeese.photo.infrastructure.mapper.PhotoMapper; import com.cheeeese.photo.infrastructure.persistence.PhotoRepository; @@ -16,6 +18,7 @@ import java.util.List; import java.util.stream.Collectors; +import java.util.stream.Stream; @Service @RequiredArgsConstructor @@ -86,4 +89,35 @@ public PhotoPresignedUrlResponse createPresignedUrls( return PhotoMapper.toPresignedUrlResponse(presignedUrls); } + @Transactional + public void reportUploadResult(User user, PhotoUploadReportRequest request) { + List allPhotoIds = Stream.concat( + request.successPhotoIds().stream(), + request.failurePhotoIds().stream() + ).toList(); + + PhotoValidator.ValidatedPhotos validated = photoValidator.validatePhotos(user.getId(), allPhotoIds); + Long albumId = validated.albumId(); + + + if (!request.successPhotoIds().isEmpty()) { + photoRepository.updateStatusByIdsAndUserIdAndExpectedStatus( + request.successPhotoIds(), + user.getId(), + PhotoStatus.PROCESSING, + PhotoStatus.UPLOADING + ); + } + + if (!request.failurePhotoIds().isEmpty()) { + photoRepository.updateStatusByIdsAndUserIdAndExpectedStatus( + request.failurePhotoIds(), + user.getId(), + PhotoStatus.FAILED, + PhotoStatus.UPLOADING + ); + albumRepository.decrementPhotoCount(albumId, request.failurePhotoIds().size()); + } + } + } diff --git a/src/main/java/com/cheeeese/photo/application/validator/PhotoValidator.java b/src/main/java/com/cheeeese/photo/application/validator/PhotoValidator.java index e770562..e3310ae 100644 --- a/src/main/java/com/cheeeese/photo/application/validator/PhotoValidator.java +++ b/src/main/java/com/cheeeese/photo/application/validator/PhotoValidator.java @@ -1,17 +1,25 @@ package com.cheeeese.photo.application.validator; +import com.cheeeese.photo.domain.Photo; import com.cheeeese.photo.dto.request.PhotoPresignedUrlRequest; import com.cheeeese.photo.exception.PhotoException; import com.cheeeese.photo.exception.code.PhotoErrorCode; +import com.cheeeese.photo.infrastructure.persistence.PhotoRepository; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; +@Slf4j @Component @RequiredArgsConstructor public class PhotoValidator { + private final PhotoRepository photoRepository; + private static final long MAX_FILE_SIZE = 6 * 1024 * 1024; // 6MB private static final List ALLOWED_TYPES = List.of("image/jpeg", "image/png", "image/jpg"); @@ -46,4 +54,78 @@ public void validatePhotoCount(int currentCount, int uploadCount, int maxPhotoCo throw new PhotoException(PhotoErrorCode.PHOTO_MAX_COUNT_EXCEEDED); } } + + /** + * 존재, 소유, 동일 앨범 검증을 통합 수행 + */ + public ValidatedPhotos validatePhotos(Long userId, List photoIds) { + validatePhotoIdsNotEmpty(photoIds); + List photos = findAndValidateExistence(photoIds); + validateOwnership(photos, userId); + Long albumId = validateSingleAlbum(photos); + return new ValidatedPhotos(photos, albumId); + } + + /** + * photoIds가 비어있지 않은지 검증 + */ + private void validatePhotoIdsNotEmpty(List photoIds) { + if (photoIds == null || photoIds.isEmpty()) { + throw new PhotoException(PhotoErrorCode.PHOTO_ID_LIST_EMPTY); + } + } + + /** + * photoId 리스트 기반으로 존재하는 사진 조회 및 존재 검증 + */ + private List findAndValidateExistence(List photoIds) { + List photos = photoRepository.findAllById(photoIds); + + if (photos.size() != photoIds.size()) { + Set foundIds = photos.stream() + .map(Photo::getId) + .collect(Collectors.toSet()); + + List missingIds = photoIds.stream() + .filter(id -> !foundIds.contains(id)) + .toList(); + + log.error("존재하지 않는 photoIds: {}", missingIds); + throw new PhotoException(PhotoErrorCode.PHOTO_ID_NOT_FOUND); + } + + return photos; + } + + /** + * 소유자 일치 검증 + */ + private void validateOwnership(List photos, Long userId) { + boolean invalidOwner = photos.stream() + .anyMatch(photo -> !photo.getUserId().equals(userId)); + + if (invalidOwner) { + throw new PhotoException(PhotoErrorCode.PHOTO_OWNER_MISMATCH); + } + } + + /** + * 동일 앨범 검증 + */ + private Long validateSingleAlbum(List photos) { + Set albumIds = photos.stream() + .map(Photo::getAlbumId) + .collect(Collectors.toSet()); + + if (albumIds.size() != 1) { + throw new PhotoException(PhotoErrorCode.PHOTO_REPORT_INVALID_ALBUM); + } + + return albumIds.iterator().next(); + } + + /** + * 검증 결과 객체: 앨범 ID + 사진 리스트 보관 + */ + public record ValidatedPhotos(List photos, Long albumId) {} } diff --git a/src/main/java/com/cheeeese/photo/dto/request/PhotoUploadReportRequest.java b/src/main/java/com/cheeeese/photo/dto/request/PhotoUploadReportRequest.java new file mode 100644 index 0000000..c983c9c --- /dev/null +++ b/src/main/java/com/cheeeese/photo/dto/request/PhotoUploadReportRequest.java @@ -0,0 +1,20 @@ +package com.cheeeese.photo.dto.request; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.Builder; + +import java.util.List; + +@Builder +@Schema(description = "사진 업로드 결과 보고 요청 (부분 성공/실패 처리)") +public record PhotoUploadReportRequest( + @NotNull + @Schema(description = "업로드가 성공적으로 완료된 사진 ID 목록 (UPLOADING -> PROCESSING)", example = "[100, 102]") + List successPhotoIds, + + @NotNull + @Schema(description = "업로드 중 실패하거나 취소된 사진 ID 목록 (UPLOADING -> FAILED & 롤백)", example = "[101, 103]") + List failurePhotoIds +) { +} \ No newline at end of file diff --git a/src/main/java/com/cheeeese/photo/exception/code/PhotoErrorCode.java b/src/main/java/com/cheeeese/photo/exception/code/PhotoErrorCode.java index 8842023..9801d43 100644 --- a/src/main/java/com/cheeeese/photo/exception/code/PhotoErrorCode.java +++ b/src/main/java/com/cheeeese/photo/exception/code/PhotoErrorCode.java @@ -14,7 +14,10 @@ public enum PhotoErrorCode implements BaseCode { PHOTO_INVALID_CONTENT_TYPE(HttpStatus.BAD_REQUEST, "유효한 이미지 파일 형식이 아닙니다."), PHOTO_FILE_LIST_EMPTY(HttpStatus.BAD_REQUEST, "업로드할 파일 목록이 비어 있습니다."), PHOTO_FILE_NAME_REQUIRED(HttpStatus.BAD_REQUEST, "파일명이 누락되었습니다."), - ; + PHOTO_ID_LIST_EMPTY(HttpStatus.BAD_REQUEST, "요청에 photoId 리스트가 비어 있습니다."), + PHOTO_REPORT_INVALID_ALBUM(HttpStatus.BAD_REQUEST, "보고된 사진들은 반드시 동일한 앨범에 속해야 합니다."), + PHOTO_OWNER_MISMATCH(HttpStatus.FORBIDDEN, "사용자와 사진의 소유자가 일치하지 않습니다."), + PHOTO_ID_NOT_FOUND(HttpStatus.NOT_FOUND, "보고된 사진 ID 중 존재하지 않는 ID가 포함되어 있습니다."), ; private final HttpStatus httpStatus; diff --git a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java index d7bc688..c509dcb 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java @@ -1,7 +1,11 @@ package com.cheeeese.photo.infrastructure.persistence; import com.cheeeese.photo.domain.Photo; +import com.cheeeese.photo.domain.PhotoStatus; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import java.util.List; @@ -10,4 +14,19 @@ public interface PhotoRepository extends JpaRepository { long countByAlbumIdAndIsDeletedFalse(Long albumId); List findTop9ByAlbumIdAndIsDeletedFalseOrderByCreatedAtDesc(Long albumId); + + @Modifying(clearAutomatically = true, flushAutomatically = true) + @Query(""" + UPDATE Photo p + SET p.status = :newStatus + WHERE p.id IN :photoIds + AND p.userId = :userId + AND p.status = :expectedStatus + """) + int updateStatusByIdsAndUserIdAndExpectedStatus( + @Param("photoIds") List photoIds, + @Param("userId") Long userId, + @Param("newStatus") PhotoStatus newStatus, + @Param("expectedStatus") PhotoStatus expectedStatus + ); } diff --git a/src/main/java/com/cheeeese/photo/presentation/PhotoController.java b/src/main/java/com/cheeeese/photo/presentation/PhotoController.java index a6b11fe..bf78310 100644 --- a/src/main/java/com/cheeeese/photo/presentation/PhotoController.java +++ b/src/main/java/com/cheeeese/photo/presentation/PhotoController.java @@ -4,6 +4,7 @@ import com.cheeeese.global.util.CurrentUser; import com.cheeeese.photo.application.PhotoService; import com.cheeeese.photo.dto.request.PhotoPresignedUrlRequest; +import com.cheeeese.photo.dto.request.PhotoUploadReportRequest; import com.cheeeese.photo.dto.response.PhotoPresignedUrlResponse; import com.cheeeese.photo.presentation.swagger.PhotoSwagger; import com.cheeeese.user.domain.User; @@ -11,7 +12,7 @@ import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; -import static com.cheeeese.global.common.code.SuccessCode.PRESIGNED_URL_ISSUE_SUCCESS; +import static com.cheeeese.global.common.code.SuccessCode.*; @RestController @@ -29,4 +30,14 @@ public CommonResponse createPresignedUrls( ) { return CommonResponse.success(PRESIGNED_URL_ISSUE_SUCCESS, photoService.createPresignedUrls(user, request)); } + + @Override + @PostMapping("/report") + public CommonResponse reportUploadResult( + @CurrentUser User user, + @RequestBody @Valid PhotoUploadReportRequest request + ) { + photoService.reportUploadResult(user, request); + return CommonResponse.success(PHOTO_UPLOAD_REPORT_SUCCESS); + } } \ No newline at end of file diff --git a/src/main/java/com/cheeeese/photo/presentation/swagger/PhotoSwagger.java b/src/main/java/com/cheeeese/photo/presentation/swagger/PhotoSwagger.java index c4ca9ce..925fa54 100644 --- a/src/main/java/com/cheeeese/photo/presentation/swagger/PhotoSwagger.java +++ b/src/main/java/com/cheeeese/photo/presentation/swagger/PhotoSwagger.java @@ -3,6 +3,7 @@ import com.cheeeese.global.common.CommonResponse; import com.cheeeese.global.util.CurrentUser; import com.cheeeese.photo.dto.request.PhotoPresignedUrlRequest; +import com.cheeeese.photo.dto.request.PhotoUploadReportRequest; import com.cheeeese.photo.dto.response.PhotoPresignedUrlResponse; import com.cheeeese.user.domain.User; import io.swagger.v3.oas.annotations.Operation; @@ -57,4 +58,29 @@ CommonResponse createPresignedUrls( @CurrentUser User user, @RequestBody @Valid PhotoPresignedUrlRequest request ); + + @Operation( + summary = "사진 업로드 결과 보고 API (부분 성공/실패 처리)", // [추가] + description = """ + ### RequestBody + --- + `successPhotoIds`: Object Storage 업로드 성공 ID 목록 \n + `failurePhotoIds`: Object Storage 업로드 실패 ID 목록 \n + + ### 로직 상세 + --- + 1. **Success IDs 처리**: `Photo` 상태를 `UPLOADING`에서 `PROCESSING`으로 변경 (후처리 대기). + 2. **Failure IDs 처리**: `Photo` 상태를 `UPLOADING`에서 `FAILED`으로 변경, 앨범의 `currentPhotoCount`를 **롤백** (감소)합니다. + """ + ) + @ApiResponses(value = { + @ApiResponse( + responseCode = "200", + description = "사진 업로드 결과 보고가 성공적으로 처리되었습니다." + ) + }) + CommonResponse reportUploadResult( + @CurrentUser User user, + @RequestBody @Valid PhotoUploadReportRequest request + ); } From 42712524ac9f4c35a1862bc39f275f7166025f8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Fri, 24 Oct 2025 17:08:24 +0900 Subject: [PATCH 148/402] =?UTF-8?q?#16=20feat:=20swagger=EC=97=90=20?= =?UTF-8?q?=EC=98=A4=EB=A5=98=20=EB=AC=B8=EA=B5=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/swagger/PhotoSwagger.java | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/src/main/java/com/cheeeese/photo/presentation/swagger/PhotoSwagger.java b/src/main/java/com/cheeeese/photo/presentation/swagger/PhotoSwagger.java index 925fa54..f6d2bef 100644 --- a/src/main/java/com/cheeeese/photo/presentation/swagger/PhotoSwagger.java +++ b/src/main/java/com/cheeeese/photo/presentation/swagger/PhotoSwagger.java @@ -52,6 +52,20 @@ public interface PhotoSwagger { } """) ) + ), + @ApiResponse( + responseCode = "403", + description = "사용자는 해당 앨범의 참가자가 아닙니다.", + content = @Content( + mediaType = "application/json", + schema = @Schema(example = """ + { + "isSuccess": false, + "code": 403, + "message": "사용자는 해당 앨범의 참가자가 아닙니다." + } + """) + ) ) }) CommonResponse createPresignedUrls( @@ -77,6 +91,48 @@ CommonResponse createPresignedUrls( @ApiResponse( responseCode = "200", description = "사진 업로드 결과 보고가 성공적으로 처리되었습니다." + ), + @ApiResponse( + responseCode = "400", + description = "보고된 사진들은 반드시 동일한 앨범에 속해야 합니다.", + content = @Content( + mediaType = "application/json", + schema = @Schema(example = """ + { + "isSuccess": false, + "code": 400, + "message": "보고된 사진들은 반드시 동일한 앨범에 속해야 합니다." + } + """) + ) + ), + @ApiResponse( + responseCode = "403", + description = "사용자와 사진의 소유자가 일치하지 않습니다.", + content = @Content( + mediaType = "application/json", + schema = @Schema(example = """ + { + "isSuccess": false, + "code": 403, + "message": "사용자와 사진의 소유자가 일치하지 않습니다." + } + """) + ) + ), + @ApiResponse( + responseCode = "404", + description = "보고된 사진 ID 중 존재하지 않는 ID가 포함되어 있습니다.", + content = @Content( + mediaType = "application/json", + schema = @Schema(example = """ + { + "isSuccess": false, + "code": 404, + "message": "보고된 사진 ID 중 존재하지 않는 ID가 포함되어 있습니다." + } + """) + ) ) }) CommonResponse reportUploadResult( From a82074188ef631ad45fa4370fca89da6087282f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Fri, 24 Oct 2025 17:21:27 +0900 Subject: [PATCH 149/402] =?UTF-8?q?#16=20refactor:=20PhotoService=20?= =?UTF-8?q?=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../photo/application/PhotoService.java | 131 +++++++++++------- 1 file changed, 80 insertions(+), 51 deletions(-) diff --git a/src/main/java/com/cheeeese/photo/application/PhotoService.java b/src/main/java/com/cheeeese/photo/application/PhotoService.java index 64c737d..50851b8 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoService.java @@ -31,6 +31,8 @@ public class PhotoService { private final AlbumRepository albumRepository; private final PresignedUrlService presignedUrlService; + private static final String ORIGINAL_PHOTO_PATH_FORMAT = "album/%d/original/%d_%s"; + public long countTotalPhotos(Long albumId) { return photoRepository.countByAlbumIdAndIsDeletedFalse(albumId); } @@ -43,81 +45,108 @@ public List getRecentPhotoUrls(Long albumId) { } @Transactional - public PhotoPresignedUrlResponse createPresignedUrls( - User user, - PhotoPresignedUrlRequest request - ) { - Album album = albumValidator.validateAlbumCode(request.albumCode()); + public PhotoPresignedUrlResponse createPresignedUrls(User user, PhotoPresignedUrlRequest request) { + Album album = validateAlbumAndPermission(user, request.albumCode()); + validateUploadRequest(album, request); + + List presignedUrls = generatePresignedUrls(user, album, request.fileInfos()); + albumRepository.incrementPhotoCount(album.getId(), request.fileInfos().size()); + + return PhotoMapper.toPresignedUrlResponse(presignedUrls); + } + + @Transactional + public void reportUploadResult(User user, PhotoUploadReportRequest request) { + PhotoValidator.ValidatedPhotos validated = validateRequestAndPhotos(user, request); + Long albumId = validated.albumId(); + + handleSuccessfulUploads(user.getId(), request.successPhotoIds()); + + handleFailedUploads(user.getId(), albumId, request.failurePhotoIds()); + } + + private Album validateAlbumAndPermission(User user, String albumCode) { + Album album = albumValidator.validateAlbumCode(albumCode); albumValidator.validateUploadPermission(album, user); + return album; + } + private void validateUploadRequest(Album album, PhotoPresignedUrlRequest request) { int currentCount = album.getCurrentPhotoCount(); int maxCount = album.getMaxPhotoCount(); int requestedCount = request.fileInfos().size(); photoValidator.validatePhotoCount(currentCount, requestedCount, maxCount); photoValidator.validateFileInfos(request.fileInfos()); + } - List presignedUrls = - request.fileInfos().stream() - .map(file -> { - Photo photo = PhotoMapper.toEntity( - user.getId(), - album.getId() - ); - photoRepository.save(photo); - - String objectKey = String.format( - "album/%d/original/%d_%s", - album.getId(), - photo.getId(), - file.fileName() - ); - - String uploadUrl = presignedUrlService.generatePresignedPutUrl( - objectKey, - file.contentType() - ); + private List generatePresignedUrls( + User user, + Album album, + List fileInfos + ) { + return fileInfos.stream() + .map(file -> createPresignedUrlForFile(user, album, file)) + .collect(Collectors.toList()); + } - photo.updateImageUrl(objectKey); + private PhotoPresignedUrlResponse.PresignedUrlInfo createPresignedUrlForFile( + User user, + Album album, + PhotoPresignedUrlRequest.FileInfo file + ) { + Photo photo = PhotoMapper.toEntity(user.getId(), album.getId()); + photoRepository.save(photo); - return PhotoMapper.toPresignedUrlInfo(photo.getId(), uploadUrl); - }) - .collect(Collectors.toList()); + String objectKey = String.format( + ORIGINAL_PHOTO_PATH_FORMAT, + album.getId(), + photo.getId(), + file.fileName() + ); - albumRepository.incrementPhotoCount(album.getId(), requestedCount); + String uploadUrl = presignedUrlService.generatePresignedPutUrl(objectKey, file.contentType()); + photo.updateImageUrl(objectKey); - return PhotoMapper.toPresignedUrlResponse(presignedUrls); + return PhotoMapper.toPresignedUrlInfo(photo.getId(), uploadUrl); } - @Transactional - public void reportUploadResult(User user, PhotoUploadReportRequest request) { + private PhotoValidator.ValidatedPhotos validateRequestAndPhotos(User user, PhotoUploadReportRequest request) { List allPhotoIds = Stream.concat( request.successPhotoIds().stream(), request.failurePhotoIds().stream() ).toList(); - PhotoValidator.ValidatedPhotos validated = photoValidator.validatePhotos(user.getId(), allPhotoIds); - Long albumId = validated.albumId(); - + return photoValidator.validatePhotos(user.getId(), allPhotoIds); + } - if (!request.successPhotoIds().isEmpty()) { - photoRepository.updateStatusByIdsAndUserIdAndExpectedStatus( - request.successPhotoIds(), - user.getId(), - PhotoStatus.PROCESSING, - PhotoStatus.UPLOADING - ); + private void handleSuccessfulUploads(Long userId, List successPhotoIds) { + if (successPhotoIds == null || successPhotoIds.isEmpty()) { + return; } - if (!request.failurePhotoIds().isEmpty()) { - photoRepository.updateStatusByIdsAndUserIdAndExpectedStatus( - request.failurePhotoIds(), - user.getId(), - PhotoStatus.FAILED, - PhotoStatus.UPLOADING - ); - albumRepository.decrementPhotoCount(albumId, request.failurePhotoIds().size()); + photoRepository.updateStatusByIdsAndUserIdAndExpectedStatus( + successPhotoIds, + userId, + PhotoStatus.PROCESSING, + PhotoStatus.UPLOADING + ); + } + + private void handleFailedUploads(Long userId, Long albumId, List failurePhotoIds) { + if (failurePhotoIds == null || failurePhotoIds.isEmpty()) { + return; } + + photoRepository.updateStatusByIdsAndUserIdAndExpectedStatus( + failurePhotoIds, + userId, + PhotoStatus.FAILED, + PhotoStatus.UPLOADING + ); + + albumRepository.decrementPhotoCount(albumId, failurePhotoIds.size()); } + } From c7ebaa35c4838f8e1f1febf7344afda2edc26394 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Fri, 24 Oct 2025 18:29:16 +0900 Subject: [PATCH 150/402] =?UTF-8?q?#16=20fix:=20=ED=94=BC=EB=93=9C?= =?UTF-8?q?=EB=B0=B1=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../photo/application/PhotoService.java | 52 ++++++++++++++++--- .../application/validator/PhotoValidator.java | 19 +++---- .../photo/exception/code/PhotoErrorCode.java | 7 +++ .../presentation/swagger/PhotoSwagger.java | 28 ++++++++++ 4 files changed, 89 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/cheeeese/photo/application/PhotoService.java b/src/main/java/com/cheeeese/photo/application/PhotoService.java index 50851b8..97e0882 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoService.java @@ -9,9 +9,12 @@ import com.cheeeese.photo.dto.request.PhotoPresignedUrlRequest; import com.cheeeese.photo.dto.request.PhotoUploadReportRequest; import com.cheeeese.photo.dto.response.PhotoPresignedUrlResponse; +import com.cheeeese.photo.exception.PhotoException; +import com.cheeeese.photo.exception.code.PhotoErrorCode; import com.cheeeese.photo.infrastructure.mapper.PhotoMapper; import com.cheeeese.photo.infrastructure.persistence.PhotoRepository; import com.cheeeese.user.domain.User; +import jakarta.validation.constraints.NotBlank; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -31,7 +34,7 @@ public class PhotoService { private final AlbumRepository albumRepository; private final PresignedUrlService presignedUrlService; - private static final String ORIGINAL_PHOTO_PATH_FORMAT = "album/%d/original/%d_%s"; + private static final String ORIGINAL_PHOTO_PATH_FORMAT = "album/%s/original/%d_%s"; public long countTotalPhotos(Long albumId) { return photoRepository.countByAlbumIdAndIsDeletedFalse(albumId); @@ -49,9 +52,12 @@ public PhotoPresignedUrlResponse createPresignedUrls(User user, PhotoPresignedUr Album album = validateAlbumAndPermission(user, request.albumCode()); validateUploadRequest(album, request); - List presignedUrls = generatePresignedUrls(user, album, request.fileInfos()); - albumRepository.incrementPhotoCount(album.getId(), request.fileInfos().size()); + int updatedRows = albumRepository.incrementPhotoCount(album.getId(), request.fileInfos().size()); + if (updatedRows != 1) { + throw new PhotoException(PhotoErrorCode.PHOTO_COUNT_INCREMENT_FAILED); + } + List presignedUrls = generatePresignedUrls(user, album, request.fileInfos()); return PhotoMapper.toPresignedUrlResponse(presignedUrls); } @@ -98,11 +104,12 @@ private PhotoPresignedUrlResponse.PresignedUrlInfo createPresignedUrlForFile( Photo photo = PhotoMapper.toEntity(user.getId(), album.getId()); photoRepository.save(photo); + String safeFileName = sanitizeFileName(file.fileName()); String objectKey = String.format( ORIGINAL_PHOTO_PATH_FORMAT, - album.getId(), + album.getCode(), photo.getId(), - file.fileName() + safeFileName ); String uploadUrl = presignedUrlService.generatePresignedPutUrl(objectKey, file.contentType()); @@ -111,7 +118,25 @@ private PhotoPresignedUrlResponse.PresignedUrlInfo createPresignedUrlForFile( return PhotoMapper.toPresignedUrlInfo(photo.getId(), uploadUrl); } + private String sanitizeFileName(String raw) { + String name = raw == null ? "unnamed" : raw; + name = name.replace('\\', '/'); // 구분자 통일 + int idx = name.lastIndexOf('/'); + if (idx >= 0) name = name.substring(idx + 1); // 경로 제거 + name = name.replaceAll("[^a-zA-Z0-9._-]", "_"); // 허용 문자 화이트리스트 + if (name.isBlank()) name = "unnamed"; + return name; + } + private PhotoValidator.ValidatedPhotos validateRequestAndPhotos(User user, PhotoUploadReportRequest request) { + var success = new java.util.HashSet<>(request.successPhotoIds()); + var failure = new java.util.HashSet<>(request.failurePhotoIds()); + success.retainAll(failure); + + if (!success.isEmpty()) { + throw new PhotoException(PhotoErrorCode.PHOTO_REPORT_CONFLICTING_IDS); + } + List allPhotoIds = Stream.concat( request.successPhotoIds().stream(), request.failurePhotoIds().stream() @@ -125,12 +150,16 @@ private void handleSuccessfulUploads(Long userId, List successPhotoIds) { return; } - photoRepository.updateStatusByIdsAndUserIdAndExpectedStatus( + int updatedRows = photoRepository.updateStatusByIdsAndUserIdAndExpectedStatus( successPhotoIds, userId, PhotoStatus.PROCESSING, PhotoStatus.UPLOADING ); + + if (updatedRows != successPhotoIds.size()) { + throw new PhotoException(PhotoErrorCode.PHOTO_STATUS_UPDATE_FAILED); + } } private void handleFailedUploads(Long userId, Long albumId, List failurePhotoIds) { @@ -138,14 +167,21 @@ private void handleFailedUploads(Long userId, Long albumId, List failurePh return; } - photoRepository.updateStatusByIdsAndUserIdAndExpectedStatus( + int updatedRows = photoRepository.updateStatusByIdsAndUserIdAndExpectedStatus( failurePhotoIds, userId, PhotoStatus.FAILED, PhotoStatus.UPLOADING ); - albumRepository.decrementPhotoCount(albumId, failurePhotoIds.size()); + if (updatedRows != failurePhotoIds.size()) { + throw new PhotoException(PhotoErrorCode.PHOTO_STATUS_UPDATE_FAILED); + } + + int decremented = albumRepository.decrementPhotoCount(albumId, failurePhotoIds.size()); + if (decremented == 0) { + throw new PhotoException(PhotoErrorCode.PHOTO_COUNT_DECREMENT_FAILED); + } } diff --git a/src/main/java/com/cheeeese/photo/application/validator/PhotoValidator.java b/src/main/java/com/cheeeese/photo/application/validator/PhotoValidator.java index e3310ae..6677a4a 100644 --- a/src/main/java/com/cheeeese/photo/application/validator/PhotoValidator.java +++ b/src/main/java/com/cheeeese/photo/application/validator/PhotoValidator.java @@ -9,6 +9,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; +import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.stream.Collectors; @@ -79,21 +80,21 @@ private void validatePhotoIdsNotEmpty(List photoIds) { * photoId 리스트 기반으로 존재하는 사진 조회 및 존재 검증 */ private List findAndValidateExistence(List photoIds) { - List photos = photoRepository.findAllById(photoIds); + Set requestedIds = new HashSet<>(photoIds); + List photos = photoRepository.findAllById(requestedIds); - if (photos.size() != photoIds.size()) { - Set foundIds = photos.stream() - .map(Photo::getId) - .collect(Collectors.toSet()); + Set foundIds = photos.stream() + .map(Photo::getId) + .collect(Collectors.toSet()); - List missingIds = photoIds.stream() - .filter(id -> !foundIds.contains(id)) - .toList(); + Set missingIds = requestedIds.stream() + .filter(id -> !foundIds.contains(id)) + .collect(Collectors.toSet()); + if (!missingIds.isEmpty()) { log.error("존재하지 않는 photoIds: {}", missingIds); throw new PhotoException(PhotoErrorCode.PHOTO_ID_NOT_FOUND); } - return photos; } diff --git a/src/main/java/com/cheeeese/photo/exception/code/PhotoErrorCode.java b/src/main/java/com/cheeeese/photo/exception/code/PhotoErrorCode.java index 9801d43..4ad771a 100644 --- a/src/main/java/com/cheeeese/photo/exception/code/PhotoErrorCode.java +++ b/src/main/java/com/cheeeese/photo/exception/code/PhotoErrorCode.java @@ -9,15 +9,22 @@ @RequiredArgsConstructor public enum PhotoErrorCode implements BaseCode { + // Presigned URL 발급 관련 오류 PHOTO_MAX_COUNT_EXCEEDED(HttpStatus.BAD_REQUEST, "앨범의 최대 사진 개수를 초과합니다."), PHOTO_FILE_SIZE_EXCEEDED(HttpStatus.BAD_REQUEST, "파일 크기는 6MB를 초과할 수 없습니다."), PHOTO_INVALID_CONTENT_TYPE(HttpStatus.BAD_REQUEST, "유효한 이미지 파일 형식이 아닙니다."), PHOTO_FILE_LIST_EMPTY(HttpStatus.BAD_REQUEST, "업로드할 파일 목록이 비어 있습니다."), PHOTO_FILE_NAME_REQUIRED(HttpStatus.BAD_REQUEST, "파일명이 누락되었습니다."), + PHOTO_COUNT_INCREMENT_FAILED(HttpStatus.CONFLICT, "앨범 사진 개수 증가에 실패했습니다."), + + // 업로드 보고 관련 오류 PHOTO_ID_LIST_EMPTY(HttpStatus.BAD_REQUEST, "요청에 photoId 리스트가 비어 있습니다."), PHOTO_REPORT_INVALID_ALBUM(HttpStatus.BAD_REQUEST, "보고된 사진들은 반드시 동일한 앨범에 속해야 합니다."), PHOTO_OWNER_MISMATCH(HttpStatus.FORBIDDEN, "사용자와 사진의 소유자가 일치하지 않습니다."), PHOTO_ID_NOT_FOUND(HttpStatus.NOT_FOUND, "보고된 사진 ID 중 존재하지 않는 ID가 포함되어 있습니다."), + PHOTO_REPORT_CONFLICTING_IDS(HttpStatus.BAD_REQUEST, "업로드 결과(success/failure) 목록에 중복된 사진 ID가 포함되어 있습니다."), + PHOTO_STATUS_UPDATE_FAILED(HttpStatus.CONFLICT, "사진 상태 업데이트에 실패했습니다."), + PHOTO_COUNT_DECREMENT_FAILED(HttpStatus.CONFLICT, "앨범 사진 개수 감소에 실패했습니다."), ; private final HttpStatus httpStatus; diff --git a/src/main/java/com/cheeeese/photo/presentation/swagger/PhotoSwagger.java b/src/main/java/com/cheeeese/photo/presentation/swagger/PhotoSwagger.java index f6d2bef..a95c097 100644 --- a/src/main/java/com/cheeeese/photo/presentation/swagger/PhotoSwagger.java +++ b/src/main/java/com/cheeeese/photo/presentation/swagger/PhotoSwagger.java @@ -106,6 +106,20 @@ CommonResponse createPresignedUrls( """) ) ), + @ApiResponse( + responseCode = "400", + description = "업로드 결과(success/failure) 목록에 중복된 사진 ID가 포함되어 있습니다.", + content = @Content( + mediaType = "application/json", + schema = @Schema(example = """ + { + "isSuccess": false, + "code": 400, + "message": "업로드 결과(success/failure) 목록에 중복된 사진 ID가 포함되어 있습니다." + } + """) + ) + ), @ApiResponse( responseCode = "403", description = "사용자와 사진의 소유자가 일치하지 않습니다.", @@ -133,6 +147,20 @@ CommonResponse createPresignedUrls( } """) ) + ), + @ApiResponse( + responseCode = "409", + description = "사진 상태 업데이트에 실패했습니다.", + content = @Content( + mediaType = "application/json", + schema = @Schema(example = """ + { + "isSuccess": false, + "code": 409, + "message": "사진 상태 업데이트에 실패했습니다." + } + """) + ) ) }) CommonResponse reportUploadResult( From 1b44d71e1adec397a752f3994e93f278a9fed3a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Fri, 24 Oct 2025 18:46:33 +0900 Subject: [PATCH 151/402] =?UTF-8?q?#16=20fix:=20MIME=20=ED=83=80=EC=9E=85?= =?UTF-8?q?=20=EB=AA=85=EC=8B=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cheeeese/photo/presentation/swagger/PhotoSwagger.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/cheeeese/photo/presentation/swagger/PhotoSwagger.java b/src/main/java/com/cheeeese/photo/presentation/swagger/PhotoSwagger.java index a95c097..634ad64 100644 --- a/src/main/java/com/cheeeese/photo/presentation/swagger/PhotoSwagger.java +++ b/src/main/java/com/cheeeese/photo/presentation/swagger/PhotoSwagger.java @@ -29,7 +29,7 @@ public interface PhotoSwagger { --- 1. 앨범의 존재 및 만료 여부 확인 2. 앨범의 최대 사진 개수 (`maxPhotoCount`) 초과 여부 확인 - 3. 파일별 크기(6MB), Content-Type(image/*) 유효성 검증 + 3. 파일별 크기(6MB), Content-Type(image/jpeg · image/png · image/jpg) 유효성 검증 4. 검증 통과 시, DB에 `Photo` 레코드를 `UPLOADING` 상태로 생성 5. 클라우드 스토리지 Presigned URL을 발급하여 반환 """ From a6c510b817713b79f4e30d96c5b319125c7ad4c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Fri, 24 Oct 2025 18:46:49 +0900 Subject: [PATCH 152/402] =?UTF-8?q?#16=20fix:=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20import=EB=AC=B8=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/cheeeese/photo/application/PhotoService.java | 1 - .../com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java | 1 - 2 files changed, 2 deletions(-) diff --git a/src/main/java/com/cheeeese/photo/application/PhotoService.java b/src/main/java/com/cheeeese/photo/application/PhotoService.java index 97e0882..e316b38 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoService.java @@ -14,7 +14,6 @@ import com.cheeeese.photo.infrastructure.mapper.PhotoMapper; import com.cheeeese.photo.infrastructure.persistence.PhotoRepository; import com.cheeeese.user.domain.User; -import jakarta.validation.constraints.NotBlank; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java b/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java index a9ba694..89a50bf 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java @@ -2,7 +2,6 @@ import com.cheeeese.photo.domain.Photo; import com.cheeeese.photo.domain.PhotoStatus; -import com.cheeeese.photo.dto.request.PhotoPresignedUrlRequest; import com.cheeeese.photo.dto.response.PhotoPresignedUrlResponse; import java.time.LocalDateTime; From 7c8f33db704ae8b302556e83a7226418bb93732b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Fri, 24 Oct 2025 19:34:03 +0900 Subject: [PATCH 153/402] =?UTF-8?q?#16=20fix:=20updatedRows=20=ED=94=BC?= =?UTF-8?q?=EB=93=9C=EB=B0=B1=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cheeeese/photo/application/PhotoService.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/cheeeese/photo/application/PhotoService.java b/src/main/java/com/cheeeese/photo/application/PhotoService.java index e316b38..198286a 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoService.java @@ -177,9 +177,11 @@ private void handleFailedUploads(Long userId, Long albumId, List failurePh throw new PhotoException(PhotoErrorCode.PHOTO_STATUS_UPDATE_FAILED); } - int decremented = albumRepository.decrementPhotoCount(albumId, failurePhotoIds.size()); - if (decremented == 0) { - throw new PhotoException(PhotoErrorCode.PHOTO_COUNT_DECREMENT_FAILED); + if (updatedRows > 0) { + int decremented = albumRepository.decrementPhotoCount(albumId, updatedRows); + if (decremented == 0) { + throw new PhotoException(PhotoErrorCode.PHOTO_COUNT_DECREMENT_FAILED); + } } } From cf9b8fbac876c1f7554a2924758f50fa3db6be18 Mon Sep 17 00:00:00 2001 From: zyovn Date: Sun, 26 Oct 2025 16:27:22 +0900 Subject: [PATCH 154/402] =?UTF-8?q?#25=20feat:=20albumParticipant=20->=20u?= =?UTF-8?q?serAlbum=EC=9C=BC=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cheeeese/album/application/AlbumService.java | 16 ++++++++-------- .../application/validator/AlbumValidator.java | 11 ++++++----- .../{AlbumParticipant.java => UserAlbum.java} | 12 +++++++----- .../com/cheeeese/album/domain/type/Role.java | 7 +++++++ .../album/infrastructure/mapper/AlbumMapper.java | 11 ++++++----- .../persistence/AlbumParticipantRepository.java | 15 --------------- .../persistence/UserAlbumRepository.java | 16 ++++++++++++++++ 7 files changed, 50 insertions(+), 38 deletions(-) rename src/main/java/com/cheeeese/album/domain/{AlbumParticipant.java => UserAlbum.java} (76%) create mode 100644 src/main/java/com/cheeeese/album/domain/type/Role.java delete mode 100644 src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumParticipantRepository.java create mode 100644 src/main/java/com/cheeeese/album/infrastructure/persistence/UserAlbumRepository.java diff --git a/src/main/java/com/cheeeese/album/application/AlbumService.java b/src/main/java/com/cheeeese/album/application/AlbumService.java index 9cad247..1767e4e 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumService.java +++ b/src/main/java/com/cheeeese/album/application/AlbumService.java @@ -10,11 +10,11 @@ import com.cheeeese.album.infrastructure.mapper.AlbumMapper; import com.cheeeese.album.infrastructure.persistence.AlbumRepository; import com.cheeeese.photo.application.PhotoService; -import com.cheeeese.album.domain.AlbumParticipant; +import com.cheeeese.album.domain.UserAlbum; import com.cheeeese.album.dto.response.AlbumEnterResponse; import com.cheeeese.album.dto.response.AlbumEnterResponse.AlbumHostInfo; import com.cheeeese.album.dto.response.AlbumEnterResponse.AlbumParticipantResponse; -import com.cheeeese.album.infrastructure.persistence.AlbumParticipantRepository; +import com.cheeeese.album.infrastructure.persistence.UserAlbumRepository; import com.cheeeese.user.domain.User; import com.cheeeese.user.exception.UserException; import com.cheeeese.user.exception.code.UserErrorCode; @@ -41,7 +41,7 @@ public class AlbumService { private final AlbumValidator albumValidator; private final AlbumRepository albumRepository; - private final AlbumParticipantRepository albumParticipantRepository; + private final UserAlbumRepository userAlbumRepository; private final UserRepository userRepository; private final PhotoService photoService; @@ -103,7 +103,7 @@ private long countUserAlbumsCreatedThisWeek(User user) { } private Album handleAlbumParticipation(Album album, User currentUser) { - boolean isAlreadyParticipant = albumParticipantRepository.findByUserIdAndAlbumId(currentUser.getId(), album.getId()).isPresent(); + boolean isAlreadyParticipant = userAlbumRepository.findByUserIdAndAlbumId(currentUser.getId(), album.getId()).isPresent(); if (isAlreadyParticipant) { log.info("User {} is already a participant of album {}. Skipping registration.", @@ -112,9 +112,9 @@ private Album handleAlbumParticipation(Album album, User currentUser) { } // 첫 입장: AlbumParticipant에 isBlacklisted = false로 저장하고, Album 참가자 수 증가 - AlbumParticipant newAlbumParticipant = AlbumMapper.toGuestUserAlbum(currentUser, album); + UserAlbum newAlbumParticipant = AlbumMapper.toGuestUserAlbum(currentUser, album); try { - albumParticipantRepository.save(newAlbumParticipant); + userAlbumRepository.save(newAlbumParticipant); int updatedRows = albumRepository.incrementParticipantCountAtomically(album.getId()); if (updatedRows == 0) { @@ -165,8 +165,8 @@ private User getHostUser(Long hostId) { } private List getParticipantResponses(Long albumId) { - List participantUserIds = albumParticipantRepository.findAllByAlbumId(albumId).stream() - .map(AlbumParticipant::getUserId) + List participantUserIds = userAlbumRepository.findAllByAlbumId(albumId).stream() + .map(UserAlbum::getUserId) .collect(Collectors.toList()); List participants = userRepository.findAllById(participantUserIds); diff --git a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java index 7cd90ea..a5664c5 100644 --- a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java +++ b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java @@ -1,11 +1,12 @@ package com.cheeeese.album.application.validator; import com.cheeeese.album.domain.Album; +import com.cheeeese.album.domain.type.Role; import com.cheeeese.album.dto.request.AlbumCreationRequest; import com.cheeeese.album.exception.AlbumException; import com.cheeeese.album.exception.code.AlbumErrorCode; import com.cheeeese.album.infrastructure.persistence.AlbumRepository; -import com.cheeeese.album.infrastructure.persistence.AlbumParticipantRepository; +import com.cheeeese.album.infrastructure.persistence.UserAlbumRepository; import com.cheeeese.user.domain.User; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; @@ -17,7 +18,7 @@ public class AlbumValidator { private final AlbumRepository albumRepository; - private final AlbumParticipantRepository albumParticipantRepository; + private final UserAlbumRepository userAlbumRepository; public void validateAlbumCreation(long createdThisWeek, AlbumCreationRequest request) { if (!request.isTermsAgreement()) { @@ -73,7 +74,7 @@ public void validateUploadPermission(Album album, User user) { // [NEW] validateUserBlacklisted(album, user); - albumParticipantRepository.findByUserIdAndAlbumId(user.getId(), album.getId()) + userAlbumRepository.findByUserIdAndAlbumId(user.getId(), album.getId()) .orElseThrow(() -> new AlbumException(AlbumErrorCode.USER_NOT_PARTICIPANT)); } @@ -81,8 +82,8 @@ public void validateUploadPermission(Album album, User user) { // [NEW] * 사용자가 앨범의 블랙리스트에 등록되어 있는지 확인합니다. */ private void validateUserBlacklisted(Album album, User user) { - albumParticipantRepository.findByAlbumIdAndUserIdAndIsBlacklistedTrue(album.getId(), user.getId()) - .ifPresent(blacklisted -> { + userAlbumRepository.findByAlbumIdAndUserIdAndRole(album.getId(), user.getId(), Role.BLACK) + .ifPresent(userAlbum -> { throw new AlbumException(AlbumErrorCode.USER_IS_BLACKLISTED); }); } diff --git a/src/main/java/com/cheeeese/album/domain/AlbumParticipant.java b/src/main/java/com/cheeeese/album/domain/UserAlbum.java similarity index 76% rename from src/main/java/com/cheeeese/album/domain/AlbumParticipant.java rename to src/main/java/com/cheeeese/album/domain/UserAlbum.java index a8bf2d3..7cd9881 100644 --- a/src/main/java/com/cheeeese/album/domain/AlbumParticipant.java +++ b/src/main/java/com/cheeeese/album/domain/UserAlbum.java @@ -1,5 +1,6 @@ package com.cheeeese.album.domain; +import com.cheeeese.album.domain.type.Role; import com.cheeeese.global.domain.BaseEntity; import jakarta.persistence.*; import lombok.AccessLevel; @@ -11,7 +12,7 @@ @Getter @Table(name = "user_album", uniqueConstraints = @UniqueConstraint(columnNames = {"user_id", "album_id"})) @NoArgsConstructor(access = AccessLevel.PROTECTED) -public class AlbumParticipant extends BaseEntity { +public class UserAlbum extends BaseEntity { @Id @Column(name = "user_album_id", nullable = false) @@ -26,13 +27,14 @@ public class AlbumParticipant extends BaseEntity { @Column(name = "album_id", nullable = false) private Long albumId; - @Column(name = "is_blacklisted", nullable = false) - private boolean isBlacklisted; + @Enumerated(EnumType.STRING) + @Column(name = "role", nullable = false) + private Role role; @Builder - private AlbumParticipant(Long userId, Long albumId, boolean isBlacklisted) { + private UserAlbum(Long userId, Long albumId, Role role) { this.userId = userId; this.albumId = albumId; - this.isBlacklisted = isBlacklisted; + this.role = role; } } \ No newline at end of file diff --git a/src/main/java/com/cheeeese/album/domain/type/Role.java b/src/main/java/com/cheeeese/album/domain/type/Role.java new file mode 100644 index 0000000..4a33766 --- /dev/null +++ b/src/main/java/com/cheeeese/album/domain/type/Role.java @@ -0,0 +1,7 @@ +package com.cheeeese.album.domain.type; + +public enum Role { + HOST, + GUEST, + BLACK +} diff --git a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java index bf25b00..b8184cb 100644 --- a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java +++ b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java @@ -1,7 +1,8 @@ package com.cheeeese.album.infrastructure.mapper; import com.cheeeese.album.domain.Album; -import com.cheeeese.album.domain.AlbumParticipant; +import com.cheeeese.album.domain.UserAlbum; +import com.cheeeese.album.domain.type.Role; import com.cheeeese.album.dto.response.AlbumCreationResponse; import com.cheeeese.album.dto.response.AlbumEnterResponse; import com.cheeeese.album.dto.response.AlbumEnterResponse.AlbumHostInfo; @@ -109,13 +110,13 @@ public static AlbumHostInfo toHostInfo(User host) { } /** - * User와 Album 엔티티를 기반으로 isBlacklisted = false 역할의 AlbumParticipant 엔티티를 생성합니다. + * User와 Album 엔티티를 기반으로 GUEST 역할의 UserAlbum 엔티티를 생성합니다. */ - public static AlbumParticipant toGuestUserAlbum(User user, Album album) { - return AlbumParticipant.builder() + public static UserAlbum toGuestUserAlbum(User user, Album album) { + return UserAlbum.builder() .userId(user.getId()) .albumId(album.getId()) - .isBlacklisted(false) + .role(Role.GUEST) .build(); } diff --git a/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumParticipantRepository.java b/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumParticipantRepository.java deleted file mode 100644 index 8ba6d4c..0000000 --- a/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumParticipantRepository.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.cheeeese.album.infrastructure.persistence; - -import com.cheeeese.album.domain.AlbumParticipant; -import org.springframework.data.jpa.repository.JpaRepository; - -import java.util.List; -import java.util.Optional; - -public interface AlbumParticipantRepository extends JpaRepository { - Optional findByUserIdAndAlbumId(Long userId, Long albumId); - - List findAllByAlbumId(Long albumId); - - Optional findByAlbumIdAndUserIdAndIsBlacklistedTrue(Long albumId, Long userId); -} diff --git a/src/main/java/com/cheeeese/album/infrastructure/persistence/UserAlbumRepository.java b/src/main/java/com/cheeeese/album/infrastructure/persistence/UserAlbumRepository.java new file mode 100644 index 0000000..f03c935 --- /dev/null +++ b/src/main/java/com/cheeeese/album/infrastructure/persistence/UserAlbumRepository.java @@ -0,0 +1,16 @@ +package com.cheeeese.album.infrastructure.persistence; + +import com.cheeeese.album.domain.UserAlbum; +import com.cheeeese.album.domain.type.Role; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; +import java.util.Optional; + +public interface UserAlbumRepository extends JpaRepository { + Optional findByUserIdAndAlbumId(Long userId, Long albumId); + + List findAllByAlbumId(Long albumId); + + Optional findByAlbumIdAndUserIdAndRole(Long albumId, Long userId, Role role); +} From dcecdc6f02875f17787efb88274262b245ff448c Mon Sep 17 00:00:00 2001 From: zyovn Date: Sun, 26 Oct 2025 21:02:54 +0900 Subject: [PATCH 155/402] =?UTF-8?q?#25=20test:=20album=20=EC=A0=95?= =?UTF-8?q?=EA=B7=9C=ED=99=94=20=EA=B4=80=EB=A0=A8=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mapper/UserAlbumMapper.java | 15 ++++ .../persistence/AlbumRepository.java | 2 + .../UserAlbumServiceIntegrationTest.java | 68 +++++++++++++++++++ .../com/cheeeese/fixture/FixtureFactory.java | 13 ++++ 4 files changed, 98 insertions(+) create mode 100644 src/main/java/com/cheeeese/album/infrastructure/mapper/UserAlbumMapper.java create mode 100644 src/test/java/com/cheeeese/album/integration/UserAlbumServiceIntegrationTest.java diff --git a/src/main/java/com/cheeeese/album/infrastructure/mapper/UserAlbumMapper.java b/src/main/java/com/cheeeese/album/infrastructure/mapper/UserAlbumMapper.java new file mode 100644 index 0000000..e1b7b82 --- /dev/null +++ b/src/main/java/com/cheeeese/album/infrastructure/mapper/UserAlbumMapper.java @@ -0,0 +1,15 @@ +package com.cheeeese.album.infrastructure.mapper; + +import com.cheeeese.album.domain.UserAlbum; +import com.cheeeese.album.domain.type.Role; + +public class UserAlbumMapper { + + public static UserAlbum toEntity(Long userId, Long albumId, Role role) { + return UserAlbum.builder() + .userId(userId) + .albumId(albumId) + .role(role) + .build(); + } +} diff --git a/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumRepository.java b/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumRepository.java index d43643f..4511f3f 100644 --- a/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumRepository.java +++ b/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumRepository.java @@ -12,6 +12,8 @@ public interface AlbumRepository extends JpaRepository { Optional findByCode(String code); + Optional findByHostId(Long hostId); + @Modifying(clearAutomatically = true, flushAutomatically = true) @Query("UPDATE Album a SET a.currentParticipant = a.currentParticipant + 1 WHERE a.id = :albumId AND a.currentParticipant < a.participant") int incrementParticipantCountAtomically(@Param("albumId") Long albumId); diff --git a/src/test/java/com/cheeeese/album/integration/UserAlbumServiceIntegrationTest.java b/src/test/java/com/cheeeese/album/integration/UserAlbumServiceIntegrationTest.java new file mode 100644 index 0000000..eccc649 --- /dev/null +++ b/src/test/java/com/cheeeese/album/integration/UserAlbumServiceIntegrationTest.java @@ -0,0 +1,68 @@ +package com.cheeeese.album.integration; + +import com.cheeeese.album.domain.Album; +import com.cheeeese.album.domain.UserAlbum; +import com.cheeeese.album.domain.type.Role; +import com.cheeeese.album.infrastructure.persistence.AlbumRepository; +import com.cheeeese.album.infrastructure.persistence.UserAlbumRepository; +import com.cheeeese.fixture.FixtureFactory; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +public class UserAlbumServiceIntegrationTest { + + @Autowired + private AlbumRepository albumRepository; + + @Autowired + private UserAlbumRepository userAlbumRepository; + + private static final int ITERATIONS = 1000; + + private static final Long TEST_USER = 1L; + private static Long testAlbumId; + + @BeforeAll + static void setUp( + @Autowired AlbumRepository albumRepository, + @Autowired UserAlbumRepository userAlbumRepository + ) { + Album album = FixtureFactory.createAlbum(null); + albumRepository.save(album); + testAlbumId = album.getId(); + + UserAlbum userAlbum = FixtureFactory.createHostUserAlbum(null); + userAlbumRepository.save(userAlbum); + + System.out.println("[테스트 데이터 생성 완료]"); + } + + @Test + @DisplayName("JOIN 조회 vs 직접 조회 성능 테스트") + void compareJoinQueryAndDirectQueryPerformance() { + for (int i = 0; i < 5; i++) { + albumRepository.findByHostId(TEST_USER); + userAlbumRepository.findByAlbumIdAndUserIdAndRole(testAlbumId, TEST_USER, Role.HOST); + } + + long total1 = 0; + long total2 = 0; + + for (int i = 0; i < ITERATIONS; i++) { + long start = System.nanoTime(); + albumRepository.findByHostId(TEST_USER); + total1 += System.nanoTime() - start; + + start = System.nanoTime(); + userAlbumRepository.findByAlbumIdAndUserIdAndRole(testAlbumId, TEST_USER, Role.HOST); + total2 += System.nanoTime() - start; + } + + System.out.printf("[1] Album.hostId 직접 조회 평균: %.2f ms%n", (total1 / 1_000_000.0 / ITERATIONS)); + System.out.printf("[2] Participant JOIN 조회 평균: %.2f ms%n", (total2 / 1_000_000.0 / ITERATIONS)); + } +} diff --git a/src/test/java/com/cheeeese/fixture/FixtureFactory.java b/src/test/java/com/cheeeese/fixture/FixtureFactory.java index 8982770..0e4a8ba 100644 --- a/src/test/java/com/cheeeese/fixture/FixtureFactory.java +++ b/src/test/java/com/cheeeese/fixture/FixtureFactory.java @@ -1,7 +1,10 @@ package com.cheeeese.fixture; import com.cheeeese.album.domain.Album; +import com.cheeeese.album.domain.UserAlbum; +import com.cheeeese.album.domain.type.Role; import com.cheeeese.album.infrastructure.mapper.AlbumMapper; +import com.cheeeese.album.infrastructure.mapper.UserAlbumMapper; import com.github.f4b6a3.uuid.UuidCreator; import org.springframework.test.util.ReflectionTestUtils; @@ -54,4 +57,14 @@ public static Album createAlbumV7(int i) { true ); } + + public static UserAlbum createHostUserAlbum(Long id) { + UserAlbum userAlbum = UserAlbumMapper.toEntity( + 1L, + 1L, + Role.HOST + ); + ReflectionTestUtils.setField(userAlbum, "id", id); + return userAlbum; + } } From bbe572637ca6132e3fbc5b2b1c05edb95eadd8fd Mon Sep 17 00:00:00 2001 From: zyovn Date: Sun, 26 Oct 2025 21:12:28 +0900 Subject: [PATCH 156/402] =?UTF-8?q?#25=20feat:=20guestUserAlbum=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=20userAlbumMapper=EB=A1=9C=20?= =?UTF-8?q?=EC=9D=B4=EB=8F=99=20=EB=B0=8F=20=EC=95=A8=EB=B2=94=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20=EC=8B=9C=20hostUserAlbum=EB=8F=84=20=EC=A0=80?= =?UTF-8?q?=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cheeeese/album/application/AlbumService.java | 10 +++++++++- .../album/infrastructure/mapper/AlbumMapper.java | 13 ------------- .../infrastructure/mapper/UserAlbumMapper.java | 13 +++++++++++++ 3 files changed, 22 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/cheeeese/album/application/AlbumService.java b/src/main/java/com/cheeeese/album/application/AlbumService.java index 1767e4e..3e876cc 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumService.java +++ b/src/main/java/com/cheeeese/album/application/AlbumService.java @@ -2,12 +2,14 @@ import com.cheeeese.album.application.validator.AlbumValidator; import com.cheeeese.album.domain.Album; +import com.cheeeese.album.domain.type.Role; import com.cheeeese.album.dto.request.AlbumCreationRequest; import com.cheeeese.album.dto.response.AlbumCreationResponse; import com.cheeeese.album.dto.response.AlbumInvitationResponse; import com.cheeeese.album.exception.AlbumException; import com.cheeeese.album.exception.code.AlbumErrorCode; import com.cheeeese.album.infrastructure.mapper.AlbumMapper; +import com.cheeeese.album.infrastructure.mapper.UserAlbumMapper; import com.cheeeese.album.infrastructure.persistence.AlbumRepository; import com.cheeeese.photo.application.PhotoService; import com.cheeeese.album.domain.UserAlbum; @@ -66,6 +68,12 @@ public AlbumCreationResponse createAlbum(User user, AlbumCreationRequest request ); albumRepository.save(album); + userAlbumRepository.save(UserAlbumMapper.toEntity( + user.getId(), + album.getId(), + Role.HOST + )); + return AlbumMapper.toCreationResponse(album); } @@ -112,7 +120,7 @@ private Album handleAlbumParticipation(Album album, User currentUser) { } // 첫 입장: AlbumParticipant에 isBlacklisted = false로 저장하고, Album 참가자 수 증가 - UserAlbum newAlbumParticipant = AlbumMapper.toGuestUserAlbum(currentUser, album); + UserAlbum newAlbumParticipant = UserAlbumMapper.toGuestUserAlbum(currentUser, album); try { userAlbumRepository.save(newAlbumParticipant); diff --git a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java index b8184cb..543701b 100644 --- a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java +++ b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java @@ -1,8 +1,6 @@ package com.cheeeese.album.infrastructure.mapper; import com.cheeeese.album.domain.Album; -import com.cheeeese.album.domain.UserAlbum; -import com.cheeeese.album.domain.type.Role; import com.cheeeese.album.dto.response.AlbumCreationResponse; import com.cheeeese.album.dto.response.AlbumEnterResponse; import com.cheeeese.album.dto.response.AlbumEnterResponse.AlbumHostInfo; @@ -109,17 +107,6 @@ public static AlbumHostInfo toHostInfo(User host) { .build(); } - /** - * User와 Album 엔티티를 기반으로 GUEST 역할의 UserAlbum 엔티티를 생성합니다. - */ - public static UserAlbum toGuestUserAlbum(User user, Album album) { - return UserAlbum.builder() - .userId(user.getId()) - .albumId(album.getId()) - .role(Role.GUEST) - .build(); - } - /** * 참가자 User 엔티티 리스트를 응답 DTO 리스트로 변환합니다. */ diff --git a/src/main/java/com/cheeeese/album/infrastructure/mapper/UserAlbumMapper.java b/src/main/java/com/cheeeese/album/infrastructure/mapper/UserAlbumMapper.java index e1b7b82..280a92f 100644 --- a/src/main/java/com/cheeeese/album/infrastructure/mapper/UserAlbumMapper.java +++ b/src/main/java/com/cheeeese/album/infrastructure/mapper/UserAlbumMapper.java @@ -1,7 +1,9 @@ package com.cheeeese.album.infrastructure.mapper; +import com.cheeeese.album.domain.Album; import com.cheeeese.album.domain.UserAlbum; import com.cheeeese.album.domain.type.Role; +import com.cheeeese.user.domain.User; public class UserAlbumMapper { @@ -12,4 +14,15 @@ public static UserAlbum toEntity(Long userId, Long albumId, Role role) { .role(role) .build(); } + + /** + * User와 Album 엔티티를 기반으로 GUEST 역할의 UserAlbum 엔티티를 생성합니다. + */ + public static UserAlbum toGuestUserAlbum(User user, Album album) { + return UserAlbum.builder() + .userId(user.getId()) + .albumId(album.getId()) + .role(Role.GUEST) + .build(); + } } From cf44623b09817f2353b8a9abc5c4498dafb2af22 Mon Sep 17 00:00:00 2001 From: zyovn Date: Sun, 26 Oct 2025 23:40:38 +0900 Subject: [PATCH 157/402] =?UTF-8?q?#25=20fix:=20=ED=94=BC=EB=93=9C?= =?UTF-8?q?=EB=B0=B1=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../UserAlbumServiceIntegrationTest.java | 4 ++-- .../com/cheeeese/fixture/FixtureFactory.java | 19 +++++++------------ 2 files changed, 9 insertions(+), 14 deletions(-) diff --git a/src/test/java/com/cheeeese/album/integration/UserAlbumServiceIntegrationTest.java b/src/test/java/com/cheeeese/album/integration/UserAlbumServiceIntegrationTest.java index eccc649..63ca2de 100644 --- a/src/test/java/com/cheeeese/album/integration/UserAlbumServiceIntegrationTest.java +++ b/src/test/java/com/cheeeese/album/integration/UserAlbumServiceIntegrationTest.java @@ -31,11 +31,11 @@ static void setUp( @Autowired AlbumRepository albumRepository, @Autowired UserAlbumRepository userAlbumRepository ) { - Album album = FixtureFactory.createAlbum(null); + Album album = FixtureFactory.createAlbum(TEST_USER); albumRepository.save(album); testAlbumId = album.getId(); - UserAlbum userAlbum = FixtureFactory.createHostUserAlbum(null); + UserAlbum userAlbum = FixtureFactory.createHostUserAlbum(testAlbumId, TEST_USER); userAlbumRepository.save(userAlbum); System.out.println("[테스트 데이터 생성 완료]"); diff --git a/src/test/java/com/cheeeese/fixture/FixtureFactory.java b/src/test/java/com/cheeeese/fixture/FixtureFactory.java index 0e4a8ba..59e7608 100644 --- a/src/test/java/com/cheeeese/fixture/FixtureFactory.java +++ b/src/test/java/com/cheeeese/fixture/FixtureFactory.java @@ -6,7 +6,6 @@ import com.cheeeese.album.infrastructure.mapper.AlbumMapper; import com.cheeeese.album.infrastructure.mapper.UserAlbumMapper; import com.github.f4b6a3.uuid.UuidCreator; -import org.springframework.test.util.ReflectionTestUtils; import java.time.LocalDate; import java.time.LocalDateTime; @@ -14,9 +13,9 @@ public class FixtureFactory { - public static Album createAlbum(Long id) { - Album album = AlbumMapper.toEntity( - 1L, + public static Album createAlbum(Long userId) { + return AlbumMapper.toEntity( + userId, "테스트 앨범", "테스트 코드", "테스트 이미지", @@ -26,8 +25,6 @@ public static Album createAlbum(Long id) { LocalDateTime.now().plusDays(7), true ); - ReflectionTestUtils.setField(album, "id", id); - return album; } public static Album createAlbumV4(int i) { @@ -58,13 +55,11 @@ public static Album createAlbumV7(int i) { ); } - public static UserAlbum createHostUserAlbum(Long id) { - UserAlbum userAlbum = UserAlbumMapper.toEntity( - 1L, - 1L, + public static UserAlbum createHostUserAlbum(Long albumId, Long userId) { + return UserAlbumMapper.toEntity( + albumId, + userId, Role.HOST ); - ReflectionTestUtils.setField(userAlbum, "id", id); - return userAlbum; } } From aab72c4b118a979d96d89fce8919b8b0e4ecdbe2 Mon Sep 17 00:00:00 2001 From: zyovn Date: Mon, 27 Oct 2025 00:43:12 +0900 Subject: [PATCH 158/402] =?UTF-8?q?#25=20fix:=20=ED=94=BC=EB=93=9C?= =?UTF-8?q?=EB=B0=B1=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cheeeese/album/application/AlbumService.java | 2 +- src/main/java/com/cheeeese/album/domain/type/Role.java | 2 +- .../album/integration/UserAlbumServiceIntegrationTest.java | 6 +++--- src/test/java/com/cheeeese/fixture/FixtureFactory.java | 6 +++--- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/cheeeese/album/application/AlbumService.java b/src/main/java/com/cheeeese/album/application/AlbumService.java index 3e876cc..c766152 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumService.java +++ b/src/main/java/com/cheeeese/album/application/AlbumService.java @@ -71,7 +71,7 @@ public AlbumCreationResponse createAlbum(User user, AlbumCreationRequest request userAlbumRepository.save(UserAlbumMapper.toEntity( user.getId(), album.getId(), - Role.HOST + Role.MAKER )); return AlbumMapper.toCreationResponse(album); diff --git a/src/main/java/com/cheeeese/album/domain/type/Role.java b/src/main/java/com/cheeeese/album/domain/type/Role.java index 4a33766..3ba0eeb 100644 --- a/src/main/java/com/cheeeese/album/domain/type/Role.java +++ b/src/main/java/com/cheeeese/album/domain/type/Role.java @@ -1,7 +1,7 @@ package com.cheeeese.album.domain.type; public enum Role { - HOST, + MAKER, GUEST, BLACK } diff --git a/src/test/java/com/cheeeese/album/integration/UserAlbumServiceIntegrationTest.java b/src/test/java/com/cheeeese/album/integration/UserAlbumServiceIntegrationTest.java index 63ca2de..4be959d 100644 --- a/src/test/java/com/cheeeese/album/integration/UserAlbumServiceIntegrationTest.java +++ b/src/test/java/com/cheeeese/album/integration/UserAlbumServiceIntegrationTest.java @@ -35,7 +35,7 @@ static void setUp( albumRepository.save(album); testAlbumId = album.getId(); - UserAlbum userAlbum = FixtureFactory.createHostUserAlbum(testAlbumId, TEST_USER); + UserAlbum userAlbum = FixtureFactory.createHostUserAlbum(TEST_USER, testAlbumId); userAlbumRepository.save(userAlbum); System.out.println("[테스트 데이터 생성 완료]"); @@ -46,7 +46,7 @@ static void setUp( void compareJoinQueryAndDirectQueryPerformance() { for (int i = 0; i < 5; i++) { albumRepository.findByHostId(TEST_USER); - userAlbumRepository.findByAlbumIdAndUserIdAndRole(testAlbumId, TEST_USER, Role.HOST); + userAlbumRepository.findByAlbumIdAndUserIdAndRole(testAlbumId, TEST_USER, Role.MAKER); } long total1 = 0; @@ -58,7 +58,7 @@ void compareJoinQueryAndDirectQueryPerformance() { total1 += System.nanoTime() - start; start = System.nanoTime(); - userAlbumRepository.findByAlbumIdAndUserIdAndRole(testAlbumId, TEST_USER, Role.HOST); + userAlbumRepository.findByAlbumIdAndUserIdAndRole(testAlbumId, TEST_USER, Role.MAKER); total2 += System.nanoTime() - start; } diff --git a/src/test/java/com/cheeeese/fixture/FixtureFactory.java b/src/test/java/com/cheeeese/fixture/FixtureFactory.java index 59e7608..3190b0e 100644 --- a/src/test/java/com/cheeeese/fixture/FixtureFactory.java +++ b/src/test/java/com/cheeeese/fixture/FixtureFactory.java @@ -55,11 +55,11 @@ public static Album createAlbumV7(int i) { ); } - public static UserAlbum createHostUserAlbum(Long albumId, Long userId) { + public static UserAlbum createHostUserAlbum(Long userId, Long albumId) { return UserAlbumMapper.toEntity( - albumId, userId, - Role.HOST + albumId, + Role.MAKER ); } } From 83b8b5db814a76d6d1ce1f504e810d887906cfd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Tue, 28 Oct 2025 22:11:54 +0900 Subject: [PATCH 159/402] =?UTF-8?q?#27=20feat:=20=EC=97=85=EB=A1=9C?= =?UTF-8?q?=EB=93=9C=20=EA=B0=80=EB=8A=A5=20=EC=82=AC=EC=A7=84=20=EC=88=98?= =?UTF-8?q?=20=EC=A1=B0=ED=9A=8C=20api=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../album/application/AlbumService.java | 13 +++++ .../UploadAvailableCountResponse.java | 18 +++++++ .../infrastructure/mapper/AlbumMapper.java | 13 +++++ .../album/presentation/AlbumController.java | 13 +++++ .../presentation/swagger/AlbumSwagger.java | 53 +++++++++++++++++++ .../global/common/code/SuccessCode.java | 1 + 6 files changed, 111 insertions(+) create mode 100644 src/main/java/com/cheeeese/album/dto/response/UploadAvailableCountResponse.java diff --git a/src/main/java/com/cheeeese/album/application/AlbumService.java b/src/main/java/com/cheeeese/album/application/AlbumService.java index 9cad247..12a4a51 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumService.java +++ b/src/main/java/com/cheeeese/album/application/AlbumService.java @@ -15,6 +15,7 @@ import com.cheeeese.album.dto.response.AlbumEnterResponse.AlbumHostInfo; import com.cheeeese.album.dto.response.AlbumEnterResponse.AlbumParticipantResponse; import com.cheeeese.album.infrastructure.persistence.AlbumParticipantRepository; +import com.cheeeese.album.dto.response.UploadAvailableCountResponse; import com.cheeeese.user.domain.User; import com.cheeeese.user.exception.UserException; import com.cheeeese.user.exception.code.UserErrorCode; @@ -94,6 +95,18 @@ public AlbumEnterResponse enterAlbum(String code, User currentUser) { return createAlbumEnterResponse(freshAlbum); } + public UploadAvailableCountResponse getAvailablePhotoCount(User user, String code) { + Album album = albumValidator.validateAlbumCode(code); + albumValidator.validateUploadPermission(album, user); + + int currentCount = album.getCurrentPhotoCount(); + int maxCount = album.getMaxPhotoCount(); + + int availableCount = Math.max(0, maxCount - currentCount); + + return AlbumMapper.toAvailableCountResponse(availableCount,maxCount,currentCount); + } + private long countUserAlbumsCreatedThisWeek(User user) { return albumRepository.countByUserAndCreatedAtBetween( user.getId(), diff --git a/src/main/java/com/cheeeese/album/dto/response/UploadAvailableCountResponse.java b/src/main/java/com/cheeeese/album/dto/response/UploadAvailableCountResponse.java new file mode 100644 index 0000000..f6296e9 --- /dev/null +++ b/src/main/java/com/cheeeese/album/dto/response/UploadAvailableCountResponse.java @@ -0,0 +1,18 @@ +package com.cheeeese.album.dto.response; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Builder; + +@Builder +@Schema(description = "앨범 업로드 가능 사진 수 응답 DTO") +public record UploadAvailableCountResponse( + @Schema(description = "현재 앨범에 업로드 가능한 최대 사진 수", example = "850") + int availableCount, + + @Schema(description = "앨범의 최대 사진 개수", example = "1000") + int maxPhotoCount, + + @Schema(description = "현재 업로드된 사진 수 (UPLOADING, PROCESSING, COMPLETED 포함)", example = "150") + int currentPhotoCount +) { +} diff --git a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java index bf25b00..1cea6fc 100644 --- a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java +++ b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java @@ -7,6 +7,7 @@ import com.cheeeese.album.dto.response.AlbumEnterResponse.AlbumHostInfo; import com.cheeeese.album.dto.response.AlbumEnterResponse.AlbumParticipantResponse; import com.cheeeese.album.dto.response.AlbumInvitationResponse; +import com.cheeeese.album.dto.response.UploadAvailableCountResponse; import com.cheeeese.user.domain.User; import java.time.LocalDate; @@ -128,4 +129,16 @@ public static AlbumParticipantResponse toParticipantResponse(User user) { .profileImage(user.getProfileImage()) .build(); } + + public static UploadAvailableCountResponse toAvailableCountResponse( + int availableCount, + int maxCount, + int currentCount + ){ + return UploadAvailableCountResponse.builder() + .availableCount(availableCount) + .maxPhotoCount(maxCount) + .currentPhotoCount(currentCount) + .build(); + } } \ No newline at end of file diff --git a/src/main/java/com/cheeeese/album/presentation/AlbumController.java b/src/main/java/com/cheeeese/album/presentation/AlbumController.java index baea36e..67e59a2 100644 --- a/src/main/java/com/cheeeese/album/presentation/AlbumController.java +++ b/src/main/java/com/cheeeese/album/presentation/AlbumController.java @@ -8,6 +8,7 @@ import com.cheeeese.album.presentation.swagger.AlbumSwagger; import com.cheeeese.global.common.CommonResponse; import com.cheeeese.global.util.CurrentUser; +import com.cheeeese.album.dto.response.UploadAvailableCountResponse; import com.cheeeese.user.domain.User; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; @@ -47,4 +48,16 @@ public CommonResponse enterAlbum( AlbumEnterResponse response = albumService.enterAlbum(code, user); return CommonResponse.success(ALBUM_ENTER_SUCCESS, response); } + + @Override + @GetMapping("/{code}/available-count") + public CommonResponse getAvailableUploadCount( + @CurrentUser User user, + @PathVariable String code + ) { + return CommonResponse.success( + PHOTO_AVAILABLE_COUNT_FETCH_SUCCESS, + albumService.getAvailablePhotoCount(user, code) + ); + } } \ No newline at end of file diff --git a/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java b/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java index fdd70e9..1808b62 100644 --- a/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java +++ b/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java @@ -6,6 +6,7 @@ import com.cheeeese.album.dto.response.AlbumInvitationResponse; import com.cheeeese.global.common.CommonResponse; import com.cheeeese.global.util.CurrentUser; +import com.cheeeese.album.dto.response.UploadAvailableCountResponse; import com.cheeeese.user.domain.User; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.media.Content; @@ -165,4 +166,56 @@ CommonResponse enterAlbum( @CurrentUser User user, @PathVariable String code ); + + @Operation( + summary = "업로드 가능 사진 수 조회 API", + description = """ + ### PathVariable + --- + `code`: 앨범 코드 + + ### 로직 상세 + --- + 1. 앨범의 존재, 만료 여부 및 사용자 참가 권한 확인 + 2. `maxPhotoCount` - `currentPhotoCount`를 계산하여 반환 + """ + ) + @ApiResponses(value = { + @ApiResponse( + responseCode = "200", + description = "업로드 가능 사진 수 조회가 성공적으로 완료되었습니다." + ), + @ApiResponse( + responseCode = "403", + description = "참여자가 아닌 사용자의 경우", + content = @Content( + mediaType = "application/json", + schema = @Schema(example = """ + { + "isSuccess": false, + "code": 404, + "message": "사용자가 해당 앨범의 참가자가 아닙니다." + } + """) + ) + ), + @ApiResponse( + responseCode = "404", + description = "존재하지 않거나 유효하지 않은 앨범 코드", + content = @Content( + mediaType = "application/json", + schema = @Schema(example = """ + { + "isSuccess": false, + "code": 404, + "message": "존재하지 않거나 유효하지 않은 앨범 코드입니다." + } + """) + ) + ) + }) + CommonResponse getAvailableUploadCount( + @CurrentUser User user, + @PathVariable String code + ); } \ No newline at end of file diff --git a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java index 25dffc4..a2018f9 100644 --- a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java +++ b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java @@ -26,6 +26,7 @@ public enum SuccessCode implements BaseCode { ALBUM_CREATE_SUCCESS(HttpStatus.OK, "앨범 생성이 성공적으로 완료되었습니다."), // photo + PHOTO_AVAILABLE_COUNT_FETCH_SUCCESS(HttpStatus.OK, "업로드 가능 사진 수 조회가 성공적으로 완료되었습니다."), PRESIGNED_URL_ISSUE_SUCCESS(HttpStatus.OK, "Presigned URL 발급이 성공적으로 완료되었습니다."), PHOTO_UPLOAD_REPORT_SUCCESS(HttpStatus.OK, "사진 업로드 결과 보고가 성공적으로 처리되었습니다."), ; From a15233fa0e18772e112e29d123d24193904a51c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Tue, 28 Oct 2025 22:20:49 +0900 Subject: [PATCH 160/402] =?UTF-8?q?#27=20fix:=20=ED=94=BC=EB=93=9C?= =?UTF-8?q?=EB=B0=B1=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cheeeese/album/presentation/swagger/AlbumSwagger.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java b/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java index 1808b62..7ff1be1 100644 --- a/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java +++ b/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java @@ -193,7 +193,7 @@ CommonResponse enterAlbum( schema = @Schema(example = """ { "isSuccess": false, - "code": 404, + "code": 403, "message": "사용자가 해당 앨범의 참가자가 아닙니다." } """) From b6778b8d9290ccb64a5ea8540b8adb0f08f542ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Tue, 28 Oct 2025 23:24:46 +0900 Subject: [PATCH 161/402] =?UTF-8?q?#27=20fix:=20=ED=94=BC=EB=93=9C?= =?UTF-8?q?=EB=B0=B1=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/cheeeese/album/application/AlbumService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/cheeeese/album/application/AlbumService.java b/src/main/java/com/cheeeese/album/application/AlbumService.java index a5619c5..ae22211 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumService.java +++ b/src/main/java/com/cheeeese/album/application/AlbumService.java @@ -112,7 +112,7 @@ public UploadAvailableCountResponse getAvailablePhotoCount(User user, String cod int availableCount = Math.max(0, maxCount - currentCount); - return AlbumMapper.toAvailableCountResponse(availableCount,maxCount,currentCount); + return AlbumMapper.toAvailableCountResponse(availableCount, maxCount, currentCount); } private long countUserAlbumsCreatedThisWeek(User user) { From 29498c4d1e3a542c106bc01aca4a983aaae4e0b8 Mon Sep 17 00:00:00 2001 From: zyovn Date: Wed, 29 Oct 2025 12:41:55 +0900 Subject: [PATCH 162/402] =?UTF-8?q?#21=20style:=20=EA=B0=9C=ED=96=89=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/cheeeese/photo/application/PhotoService.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/com/cheeeese/photo/application/PhotoService.java b/src/main/java/com/cheeeese/photo/application/PhotoService.java index 198286a..ff4d04a 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoService.java @@ -184,6 +184,4 @@ private void handleFailedUploads(Long userId, Long albumId, List failurePh } } } - - } From 1475273dbae663103b43f5e5399c00d2c2aebf22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Wed, 29 Oct 2025 23:39:48 +0900 Subject: [PATCH 163/402] =?UTF-8?q?#26=20feat:=20securityconfig=EC=97=90?= =?UTF-8?q?=20=EC=8D=B8=EB=84=A4=EC=9D=BC=20=EC=99=84=EB=A3=8C=20api=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/cheeeese/global/config/SecurityConfig.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/cheeeese/global/config/SecurityConfig.java b/src/main/java/com/cheeeese/global/config/SecurityConfig.java index 76c799f..b2cccba 100644 --- a/src/main/java/com/cheeeese/global/config/SecurityConfig.java +++ b/src/main/java/com/cheeeese/global/config/SecurityConfig.java @@ -36,7 +36,8 @@ public class SecurityConfig { "/login/oauth2/**", "/v1/auth/exchange", "/v1/auth/reissue", - "/v1/album/*/invitation" + "/v1/album/*/invitation", + "/internal/thumbnail/complete" }; @Bean From 67cfb44f9e38b2002cb5a560df782246f91ddc9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Thu, 30 Oct 2025 14:08:07 +0900 Subject: [PATCH 164/402] =?UTF-8?q?#26=20feat:=20=EC=8D=B8=EB=84=A4?= =?UTF-8?q?=EC=9D=BC=20=EC=83=9D=EC=84=B1=20callback=20api=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../global/common/code/SuccessCode.java | 1 + .../application/PhotoCallbackService.java | 24 +++++++++++++++++++ .../dto/request/PhotoCompleteRequest.java | 5 ++++ .../persistence/PhotoRepository.java | 4 ++++ .../presentation/PhotoCallbackController.java | 24 +++++++++++++++++++ 5 files changed, 58 insertions(+) create mode 100644 src/main/java/com/cheeeese/photo/application/PhotoCallbackService.java create mode 100644 src/main/java/com/cheeeese/photo/dto/request/PhotoCompleteRequest.java create mode 100644 src/main/java/com/cheeeese/photo/presentation/PhotoCallbackController.java diff --git a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java index a2018f9..3aa409c 100644 --- a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java +++ b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java @@ -29,6 +29,7 @@ public enum SuccessCode implements BaseCode { PHOTO_AVAILABLE_COUNT_FETCH_SUCCESS(HttpStatus.OK, "업로드 가능 사진 수 조회가 성공적으로 완료되었습니다."), PRESIGNED_URL_ISSUE_SUCCESS(HttpStatus.OK, "Presigned URL 발급이 성공적으로 완료되었습니다."), PHOTO_UPLOAD_REPORT_SUCCESS(HttpStatus.OK, "사진 업로드 결과 보고가 성공적으로 처리되었습니다."), + THUMBNAIL_PRODUCE_COMPLETE(HttpStatus.OK, "썸네일 생성이 성공적으로 완료되었습니다."), ; private final HttpStatus httpStatus; diff --git a/src/main/java/com/cheeeese/photo/application/PhotoCallbackService.java b/src/main/java/com/cheeeese/photo/application/PhotoCallbackService.java new file mode 100644 index 0000000..1a66ef5 --- /dev/null +++ b/src/main/java/com/cheeeese/photo/application/PhotoCallbackService.java @@ -0,0 +1,24 @@ +package com.cheeeese.photo.application; + +import com.cheeeese.photo.domain.PhotoStatus; +import com.cheeeese.photo.exception.PhotoException; +import com.cheeeese.photo.exception.code.PhotoErrorCode; +import com.cheeeese.photo.infrastructure.persistence.PhotoRepository; +import jakarta.transaction.Transactional; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@Transactional +@RequiredArgsConstructor +public class PhotoCallbackService { + + private final PhotoRepository photoRepository; + + public void markUploadCompleted(Long photoId) { + int updated = photoRepository.updateStatus(photoId, PhotoStatus.COMPLETED); + if (updated == 0) { + throw new PhotoException(PhotoErrorCode.PHOTO_ID_NOT_FOUND); + } + } +} diff --git a/src/main/java/com/cheeeese/photo/dto/request/PhotoCompleteRequest.java b/src/main/java/com/cheeeese/photo/dto/request/PhotoCompleteRequest.java new file mode 100644 index 0000000..434f469 --- /dev/null +++ b/src/main/java/com/cheeeese/photo/dto/request/PhotoCompleteRequest.java @@ -0,0 +1,5 @@ +package com.cheeeese.photo.dto.request; + +public record PhotoCompleteRequest( + Long photoId +) {} diff --git a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java index c509dcb..ca3d62d 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java @@ -29,4 +29,8 @@ int updateStatusByIdsAndUserIdAndExpectedStatus( @Param("newStatus") PhotoStatus newStatus, @Param("expectedStatus") PhotoStatus expectedStatus ); + + @Modifying + @Query("UPDATE Photo p SET p.status = :status WHERE p.id = :photoId") + int updateStatus(Long photoId, PhotoStatus status); } diff --git a/src/main/java/com/cheeeese/photo/presentation/PhotoCallbackController.java b/src/main/java/com/cheeeese/photo/presentation/PhotoCallbackController.java new file mode 100644 index 0000000..86f7770 --- /dev/null +++ b/src/main/java/com/cheeeese/photo/presentation/PhotoCallbackController.java @@ -0,0 +1,24 @@ +package com.cheeeese.photo.presentation; + +import com.cheeeese.global.common.CommonResponse; +import com.cheeeese.photo.dto.request.PhotoCompleteRequest; +import com.cheeeese.photo.application.PhotoCallbackService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import static com.cheeeese.global.common.code.SuccessCode.THUMBNAIL_PRODUCE_COMPLETE; + +@RestController +@RequestMapping("/internal/thumbnail") +@RequiredArgsConstructor +public class PhotoCallbackController { + + private final PhotoCallbackService photoCallbackService; + + @PostMapping("/complete") + public CommonResponse completeUpload(@RequestBody PhotoCompleteRequest request) { + photoCallbackService.markUploadCompleted(request.photoId()); + return CommonResponse.success(THUMBNAIL_PRODUCE_COMPLETE); + } +} From 9e3dea61bb6cae0876b7d6b2981fbe68bf03deb5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Fri, 31 Oct 2025 02:32:23 +0900 Subject: [PATCH 165/402] =?UTF-8?q?#26=20feat:=20photo=20=EC=97=94?= =?UTF-8?q?=ED=8B=B0=ED=8B=B0=EC=97=90=20=EC=8D=B8=EB=84=A4=EC=9D=BC=20url?= =?UTF-8?q?=20=EC=BB=AC=EB=9F=BC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/cheeeese/photo/domain/Photo.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/com/cheeeese/photo/domain/Photo.java b/src/main/java/com/cheeeese/photo/domain/Photo.java index 9c4deeb..43ee6db 100644 --- a/src/main/java/com/cheeeese/photo/domain/Photo.java +++ b/src/main/java/com/cheeeese/photo/domain/Photo.java @@ -31,6 +31,9 @@ public class Photo extends BaseEntity { @Column(name = "image_url", nullable = true, columnDefinition = "TEXT") private String imageUrl; + @Column(name = "thumbnail_url", columnDefinition = "TEXT") + private String thumbnailUrl; + @Column(name = "likes_cnt", nullable = false) private int likesCnt; @@ -49,12 +52,14 @@ private Photo( Long userId, Long albumId, String imageUrl, + String thumbnailUrl, LocalDateTime captureTime, PhotoStatus status ) { this.userId = userId; this.albumId = albumId; this.imageUrl = imageUrl; + this.thumbnailUrl = thumbnailUrl; this.captureTime = captureTime; this.likesCnt = 0; this.isDeleted = false; From 6bdb1fc439e908023319a641a4d5b8575db43c6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Fri, 31 Oct 2025 02:33:46 +0900 Subject: [PATCH 166/402] =?UTF-8?q?#26=20feat:=20mapper=EC=97=90=20?= =?UTF-8?q?=EC=8D=B8=EB=84=A4=EC=9D=BC=20url=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java b/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java index 89a50bf..e6a4d6a 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java @@ -14,6 +14,7 @@ public static Photo toEntity(Long userId, Long albumId) { .userId(userId) .albumId(albumId) .imageUrl(null) // presigned URL 생성 후 updateImageUrl()로 세팅됨 + .thumbnailUrl(null) .captureTime(LocalDateTime.now()) .status(PhotoStatus.UPLOADING) .build(); From 9d0d74b26b6f0cbab5dcb1bf8f7c6f970dd704f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Fri, 31 Oct 2025 02:34:07 +0900 Subject: [PATCH 167/402] =?UTF-8?q?#26=20fix:=20=ED=94=BC=EB=93=9C?= =?UTF-8?q?=EB=B0=B1=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cheeeese/photo/dto/request/PhotoCompleteRequest.java | 9 ++++++++- .../infrastructure/persistence/PhotoRepository.java | 7 ++++--- .../photo/presentation/PhotoCallbackController.java | 6 +++--- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/cheeeese/photo/dto/request/PhotoCompleteRequest.java b/src/main/java/com/cheeeese/photo/dto/request/PhotoCompleteRequest.java index 434f469..e2c1e9c 100644 --- a/src/main/java/com/cheeeese/photo/dto/request/PhotoCompleteRequest.java +++ b/src/main/java/com/cheeeese/photo/dto/request/PhotoCompleteRequest.java @@ -1,5 +1,12 @@ package com.cheeeese.photo.dto.request; + +import jakarta.validation.constraints.NotNull; + public record PhotoCompleteRequest( - Long photoId + @NotNull(message = "photoId는 필수입니다") + Long photoId, + + @NotNull(message = "thumbnailUrl은 필수입니다") + String thumbnailUrl ) {} diff --git a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java index ca3d62d..fb21c3f 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java @@ -30,7 +30,8 @@ int updateStatusByIdsAndUserIdAndExpectedStatus( @Param("expectedStatus") PhotoStatus expectedStatus ); - @Modifying - @Query("UPDATE Photo p SET p.status = :status WHERE p.id = :photoId") - int updateStatus(Long photoId, PhotoStatus status); + @Modifying(clearAutomatically = true, flushAutomatically = true) + @Query("update Photo p set p.status = :newStatus, p.thumbnailUrl = :thumbnailUrl " + + "where p.id = :photoId and p.status = :expectedStatus") + int updateStatusAndUrl(Long photoId, PhotoStatus expectedStatus, PhotoStatus newStatus, String thumbnailUrl); } diff --git a/src/main/java/com/cheeeese/photo/presentation/PhotoCallbackController.java b/src/main/java/com/cheeeese/photo/presentation/PhotoCallbackController.java index 86f7770..01d7186 100644 --- a/src/main/java/com/cheeeese/photo/presentation/PhotoCallbackController.java +++ b/src/main/java/com/cheeeese/photo/presentation/PhotoCallbackController.java @@ -3,8 +3,8 @@ import com.cheeeese.global.common.CommonResponse; import com.cheeeese.photo.dto.request.PhotoCompleteRequest; import com.cheeeese.photo.application.PhotoCallbackService; +import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; -import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import static com.cheeeese.global.common.code.SuccessCode.THUMBNAIL_PRODUCE_COMPLETE; @@ -17,8 +17,8 @@ public class PhotoCallbackController { private final PhotoCallbackService photoCallbackService; @PostMapping("/complete") - public CommonResponse completeUpload(@RequestBody PhotoCompleteRequest request) { - photoCallbackService.markUploadCompleted(request.photoId()); + public CommonResponse completeUpload(@Valid @RequestBody PhotoCompleteRequest request) { + photoCallbackService.markUploadCompleted(request); return CommonResponse.success(THUMBNAIL_PRODUCE_COMPLETE); } } From 2acd4aa9a4bc7d11bfd37adcf11125fd919da78c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Fri, 31 Oct 2025 02:34:57 +0900 Subject: [PATCH 168/402] =?UTF-8?q?#26=20fix:=20thumbnail=20image=20url=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=EC=97=90=20=EB=94=B0=EB=A5=B8=20=EC=84=9C?= =?UTF-8?q?=EB=B9=84=EC=8A=A4=20=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../photo/application/PhotoCallbackService.java | 13 ++++++++++--- .../photo/exception/code/PhotoErrorCode.java | 1 + 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/cheeeese/photo/application/PhotoCallbackService.java b/src/main/java/com/cheeeese/photo/application/PhotoCallbackService.java index 1a66ef5..b0ecd7e 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoCallbackService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoCallbackService.java @@ -1,6 +1,7 @@ package com.cheeeese.photo.application; import com.cheeeese.photo.domain.PhotoStatus; +import com.cheeeese.photo.dto.request.PhotoCompleteRequest; import com.cheeeese.photo.exception.PhotoException; import com.cheeeese.photo.exception.code.PhotoErrorCode; import com.cheeeese.photo.infrastructure.persistence.PhotoRepository; @@ -15,10 +16,16 @@ public class PhotoCallbackService { private final PhotoRepository photoRepository; - public void markUploadCompleted(Long photoId) { - int updated = photoRepository.updateStatus(photoId, PhotoStatus.COMPLETED); + public void markUploadCompleted(PhotoCompleteRequest request) { + int updated = photoRepository.updateStatusAndUrl( + request.photoId(), + PhotoStatus.UPLOADING, + PhotoStatus.COMPLETED, + request.thumbnailUrl() + ); + if (updated == 0) { - throw new PhotoException(PhotoErrorCode.PHOTO_ID_NOT_FOUND); + throw new PhotoException(PhotoErrorCode.THUMBNAIL_UPDATE_FAILED); } } } diff --git a/src/main/java/com/cheeeese/photo/exception/code/PhotoErrorCode.java b/src/main/java/com/cheeeese/photo/exception/code/PhotoErrorCode.java index 4ad771a..97edf90 100644 --- a/src/main/java/com/cheeeese/photo/exception/code/PhotoErrorCode.java +++ b/src/main/java/com/cheeeese/photo/exception/code/PhotoErrorCode.java @@ -25,6 +25,7 @@ public enum PhotoErrorCode implements BaseCode { PHOTO_REPORT_CONFLICTING_IDS(HttpStatus.BAD_REQUEST, "업로드 결과(success/failure) 목록에 중복된 사진 ID가 포함되어 있습니다."), PHOTO_STATUS_UPDATE_FAILED(HttpStatus.CONFLICT, "사진 상태 업데이트에 실패했습니다."), PHOTO_COUNT_DECREMENT_FAILED(HttpStatus.CONFLICT, "앨범 사진 개수 감소에 실패했습니다."), + THUMBNAIL_UPDATE_FAILED(HttpStatus.CONFLICT, "썸네일 상태 업데이트에 실패했습니다."), ; private final HttpStatus httpStatus; From bc30cf3e7f06430cce9d9aa4b36b858bdc87995e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Fri, 31 Oct 2025 15:11:17 +0900 Subject: [PATCH 169/402] =?UTF-8?q?#26=20fix:=20PhotoStatus=EA=B0=80=20PRO?= =?UTF-8?q?CESSING=20=EC=9D=BC=EB=95=8C=20COMPLETED=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=EB=90=98=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cheeeese/photo/application/PhotoCallbackService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/cheeeese/photo/application/PhotoCallbackService.java b/src/main/java/com/cheeeese/photo/application/PhotoCallbackService.java index b0ecd7e..a238b2c 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoCallbackService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoCallbackService.java @@ -19,7 +19,7 @@ public class PhotoCallbackService { public void markUploadCompleted(PhotoCompleteRequest request) { int updated = photoRepository.updateStatusAndUrl( request.photoId(), - PhotoStatus.UPLOADING, + PhotoStatus.PROCESSING, PhotoStatus.COMPLETED, request.thumbnailUrl() ); From 6d27f05d3fc5c75188685e8b85e6459cc37a6957 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Fri, 31 Oct 2025 17:35:51 +0900 Subject: [PATCH 170/402] =?UTF-8?q?#29=20fix:=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20private=20=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../album/application/validator/AlbumValidator.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java index a5664c5..e58b7ee 100644 --- a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java +++ b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java @@ -55,12 +55,6 @@ public Album validateAlbumCode(String code) { .orElseThrow(() -> new AlbumException(AlbumErrorCode.ALBUM_NOT_FOUND)); } - public void validateAlbumExpiration(Album album) { - if (album.isExpired()) { - throw new AlbumException(AlbumErrorCode.ALBUM_EXPIRED); - } - } - public void validateAlbumEntry(Album album, User user) { // 1. 앨범 만료 확인 validateAlbumExpiration(album); @@ -78,6 +72,12 @@ public void validateUploadPermission(Album album, User user) { // [NEW] .orElseThrow(() -> new AlbumException(AlbumErrorCode.USER_NOT_PARTICIPANT)); } + private void validateAlbumExpiration(Album album) { + if (album.isExpired()) { + throw new AlbumException(AlbumErrorCode.ALBUM_EXPIRED); + } + } + /** * 사용자가 앨범의 블랙리스트에 등록되어 있는지 확인합니다. */ From db216c5a5b23cde0dbf0051c0cf02ce8756c38fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Fri, 31 Oct 2025 17:36:42 +0900 Subject: [PATCH 171/402] =?UTF-8?q?#29=20feat:=20=EC=B4=88=EB=8C=80?= =?UTF-8?q?=EC=9E=A5=20response=EC=97=90=20=EC=95=A8=EB=B2=94=20=EB=A7=8C?= =?UTF-8?q?=EB=A3=8C=20=EC=97=AC=EB=B6=80=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cheeeese/album/application/AlbumService.java | 5 +++-- .../dto/response/AlbumInvitationResponse.java | 5 ++++- .../album/infrastructure/mapper/AlbumMapper.java | 16 ++++++++++++++++ 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/cheeeese/album/application/AlbumService.java b/src/main/java/com/cheeeese/album/application/AlbumService.java index ae22211..d835337 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumService.java +++ b/src/main/java/com/cheeeese/album/application/AlbumService.java @@ -81,8 +81,9 @@ public AlbumCreationResponse createAlbum(User user, AlbumCreationRequest request public AlbumInvitationResponse getInvitationInfo(String code) { Album album = albumValidator.validateAlbumCode(code); - albumValidator.validateAlbumExpiration(album); - + if (album.isExpired()) { + return AlbumMapper.toExpiredInvitationResponse(album); + } User host = getHostUser(album.getHostId()); return AlbumMapper.toInvitationResponse(album, host); diff --git a/src/main/java/com/cheeeese/album/dto/response/AlbumInvitationResponse.java b/src/main/java/com/cheeeese/album/dto/response/AlbumInvitationResponse.java index b4d0e14..4a30cb7 100644 --- a/src/main/java/com/cheeeese/album/dto/response/AlbumInvitationResponse.java +++ b/src/main/java/com/cheeeese/album/dto/response/AlbumInvitationResponse.java @@ -24,6 +24,9 @@ public record AlbumInvitationResponse( String hostName, @Schema(description = "호스트 프로필 이미지 URL", example = "http://example.com/host_profile.png") - String hostProfileImage + String hostProfileImage, + + @Schema(description = "앨범 만료 여부", example = "false") + boolean isExpired ) { } \ No newline at end of file diff --git a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java index 45b2d55..b8568e4 100644 --- a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java +++ b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java @@ -70,6 +70,22 @@ public static AlbumInvitationResponse toInvitationResponse(Album album, User hos .expiredAt(album.getExpiredAt()) .hostName(host.getName()) .hostProfileImage(host.getProfileImage()) + .isExpired(false) + .build(); + } + + /** + * 앨범 만료 시, 최소 정보만 담아 응답 DTO로 변환합니다. + */ + public static AlbumInvitationResponse toExpiredInvitationResponse(Album album) { + return AlbumInvitationResponse.builder() + .title(album.getTitle()) + .themeEmoji(album.getThemeEmoji()) + .eventDate(album.getEventDate().toString()) + .expiredAt(album.getExpiredAt()) + .hostName(null) + .hostProfileImage(null) + .isExpired(true) .build(); } From 80d18a38a163ed8a1dd6c201db3db84fa3c6a85d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Fri, 31 Oct 2025 19:56:36 +0900 Subject: [PATCH 172/402] =?UTF-8?q?#29=20feat:=20UserAlbum=EC=97=90=20isVi?= =?UTF-8?q?sible=20=ED=95=84=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cheeeese/album/domain/UserAlbum.java | 14 +++++++++++++- .../infrastructure/mapper/UserAlbumMapper.java | 2 ++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/cheeeese/album/domain/UserAlbum.java b/src/main/java/com/cheeeese/album/domain/UserAlbum.java index 7cd9881..0d41102 100644 --- a/src/main/java/com/cheeeese/album/domain/UserAlbum.java +++ b/src/main/java/com/cheeeese/album/domain/UserAlbum.java @@ -31,10 +31,22 @@ public class UserAlbum extends BaseEntity { @Column(name = "role", nullable = false) private Role role; + @Column(name = "is_visible", nullable = false) + private boolean isVisible; + @Builder - private UserAlbum(Long userId, Long albumId, Role role) { + private UserAlbum(Long userId, Long albumId, Role role, boolean isVisible) { this.userId = userId; this.albumId = albumId; this.role = role; + this.isVisible = isVisible; + } + + public void hide() { + this.isVisible = false; + } + + public void show() { + this.isVisible = true; } } \ No newline at end of file diff --git a/src/main/java/com/cheeeese/album/infrastructure/mapper/UserAlbumMapper.java b/src/main/java/com/cheeeese/album/infrastructure/mapper/UserAlbumMapper.java index 280a92f..b92be27 100644 --- a/src/main/java/com/cheeeese/album/infrastructure/mapper/UserAlbumMapper.java +++ b/src/main/java/com/cheeeese/album/infrastructure/mapper/UserAlbumMapper.java @@ -12,6 +12,7 @@ public static UserAlbum toEntity(Long userId, Long albumId, Role role) { .userId(userId) .albumId(albumId) .role(role) + .isVisible(true) .build(); } @@ -23,6 +24,7 @@ public static UserAlbum toGuestUserAlbum(User user, Album album) { .userId(user.getId()) .albumId(album.getId()) .role(Role.GUEST) + .isVisible(true) .build(); } } From ffe2c7c4f620819d2e4a36ec2e8bdb5dc5c4a80c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Fri, 31 Oct 2025 19:58:32 +0900 Subject: [PATCH 173/402] =?UTF-8?q?#29=20feat:=20=EB=A9=94=EC=9D=B4?= =?UTF-8?q?=EC=BB=A4=EA=B0=80=20=EC=84=A4=EC=A0=95=ED=95=9C=20=EC=9D=B8?= =?UTF-8?q?=EC=9B=90=20=EC=B4=88=EA=B3=BC=20=EC=97=AC=EB=B6=80=EB=A5=BC=20?= =?UTF-8?q?=EA=B2=80=EC=A6=9D=ED=95=98=EB=8A=94=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../album/application/validator/AlbumValidator.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java index e58b7ee..8ee05a7 100644 --- a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java +++ b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java @@ -63,6 +63,15 @@ public void validateAlbumEntry(Album album, User user) { validateUserBlacklisted(album, user); } + public void validateAlbumCapacity(Album album) { + int current = album.getCurrentParticipant(); + int max = album.getParticipant(); + + if (current >= max) { + throw new AlbumException(AlbumErrorCode.ALBUM_MAX_PARTICIPANT_REACHED); + } + } + public void validateUploadPermission(Album album, User user) { // [NEW] validateAlbumExpiration(album); From f4da62f203ccf5c8b4b2db0b90e0ae3983a868d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Fri, 31 Oct 2025 21:09:53 +0900 Subject: [PATCH 174/402] =?UTF-8?q?#29=20fix:=20swagger=20=EC=84=A4?= =?UTF-8?q?=EB=AA=85=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/swagger/AlbumSwagger.java | 31 ++++++++++--------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java b/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java index 7ff1be1..4927239 100644 --- a/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java +++ b/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java @@ -84,21 +84,22 @@ CommonResponse getInvitationInfo( @Operation( summary = "앨범 입장 및 정보 확인 API", description = """ - ### PathVariable - --- - `code`: 앨범 접근 코드 (URL의 일부) - -
- - ### 로직 상세 - --- - 1. **인증 확인**: 로그인 여부 확인 (Spring Security) - 2. **앨범 유효성 확인**: 코드 존재, 만료 여부 확인 - 3. **인가 확인**: 블랙리스트 여부 확인 - 4. **정원 확인**: 앨범 참여자 max 초과 확인 (신규 참여자만 해당) - 5. **참가 처리**: 첫 입장 시 GUEST로 등록 및 참가 인원 수 증가 - 6. **앨범 정보 반환** - """ + ### Path Variable + --- + - `code` : 앨범 접근 코드 (초대 URL의 일부) + +
+ + ### 처리 로직 + --- + 1. **인증 검증** : 로그인 여부 확인 + 2. **앨범 검증** : 전달된 코드로 앨범 존재 여부 및 만료 상태 확인 + 3. **접근 권한 검증** : 블랙리스트 사용자 여부 확인 + 4. **정원 확인** : 신규 참여자일 경우, 최대 인원 초과 여부 검사 + 5. **참여 등록** : 첫 입장 시 `GUEST` 역할로 등록하고, 현재 참여 인원 수 증가 + 6. **응답 반환** : 참여 상태(`NEW`, `EXISTING`, `RESTORED`) 및 앨범 정보를 포함한 응답 반환 + """ + ) @ApiResponses(value = { @ApiResponse( From 81c5aaebffca5b7d8ea282032ecec577fedd32b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Fri, 31 Oct 2025 21:11:03 +0900 Subject: [PATCH 175/402] =?UTF-8?q?#29=20fix:=20host=EB=A5=BC=20maker?= =?UTF-8?q?=EB=A1=9C=20=EC=9B=8C=EB=94=A9=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/cheeeese/album/domain/Album.java | 8 ++++---- .../album/infrastructure/persistence/AlbumRepository.java | 4 ++-- .../integration/UserAlbumServiceIntegrationTest.java | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/cheeeese/album/domain/Album.java b/src/main/java/com/cheeeese/album/domain/Album.java index 4d2a09c..cb3d2f9 100644 --- a/src/main/java/com/cheeeese/album/domain/Album.java +++ b/src/main/java/com/cheeeese/album/domain/Album.java @@ -21,8 +21,8 @@ public class Album extends BaseEntity { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - @Column(name = "host_id", nullable = false) - private Long hostId; + @Column(name = "maker_id", nullable = false) + private Long makerId; @Column(name = "title", nullable = false) private String title; @@ -71,7 +71,7 @@ public boolean isExpired() { @Builder private Album( - Long hostId, + Long makerId, String title, String code, String themeEmoji, @@ -85,7 +85,7 @@ private Album( AlbumStatus status, boolean isTermsAgreement ) { - this.hostId = hostId; + this.makerId = makerId; this.title = title; this.code = code; this.themeEmoji = themeEmoji; diff --git a/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumRepository.java b/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumRepository.java index 4511f3f..631c589 100644 --- a/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumRepository.java +++ b/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumRepository.java @@ -12,7 +12,7 @@ public interface AlbumRepository extends JpaRepository { Optional findByCode(String code); - Optional findByHostId(Long hostId); + Optional findByMakerId(Long makerId); @Modifying(clearAutomatically = true, flushAutomatically = true) @Query("UPDATE Album a SET a.currentParticipant = a.currentParticipant + 1 WHERE a.id = :albumId AND a.currentParticipant < a.participant") @@ -21,7 +21,7 @@ public interface AlbumRepository extends JpaRepository { @Query(""" SELECT COUNT(a) FROM Album a - WHERE a.hostId = :userId + WHERE a.makerId = :userId AND a.createdAt >= :start AND a.createdAt < :end """) diff --git a/src/test/java/com/cheeeese/album/integration/UserAlbumServiceIntegrationTest.java b/src/test/java/com/cheeeese/album/integration/UserAlbumServiceIntegrationTest.java index 4be959d..478cbf8 100644 --- a/src/test/java/com/cheeeese/album/integration/UserAlbumServiceIntegrationTest.java +++ b/src/test/java/com/cheeeese/album/integration/UserAlbumServiceIntegrationTest.java @@ -45,7 +45,7 @@ static void setUp( @DisplayName("JOIN 조회 vs 직접 조회 성능 테스트") void compareJoinQueryAndDirectQueryPerformance() { for (int i = 0; i < 5; i++) { - albumRepository.findByHostId(TEST_USER); + albumRepository.findByMakerId(TEST_USER); userAlbumRepository.findByAlbumIdAndUserIdAndRole(testAlbumId, TEST_USER, Role.MAKER); } @@ -54,7 +54,7 @@ void compareJoinQueryAndDirectQueryPerformance() { for (int i = 0; i < ITERATIONS; i++) { long start = System.nanoTime(); - albumRepository.findByHostId(TEST_USER); + albumRepository.findByMakerId(TEST_USER); total1 += System.nanoTime() - start; start = System.nanoTime(); From d2d8fe11bf05745f1c00eb1022e478d17a8a260e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Fri, 31 Oct 2025 21:26:40 +0900 Subject: [PATCH 176/402] =?UTF-8?q?#29=20fix:=20=EC=95=A8=EB=B2=94=20?= =?UTF-8?q?=EC=B0=B8=EC=97=AC=20=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95=20?= =?UTF-8?q?1=EC=B0=A8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 최근 5장의 썸네일 이미지와 함께 response 되어야하는 업로드 사용자 닉네임, image url 을 제외한 구현 - joinStatus에 따른 3가지 response 분리 --- .../album/application/AlbumService.java | 133 ++++++------------ .../album/domain/type/AlbumJoinStatus.java | 7 + .../dto/response/AlbumEnterResponse.java | 66 +-------- .../album/dto/response/AlbumMakerInfo.java | 14 ++ .../dto/response/ExistingEnterResponse.java | 16 +++ .../album/dto/response/NewEnterResponse.java | 19 +++ .../infrastructure/mapper/AlbumMapper.java | 62 ++++---- .../photo/application/PhotoService.java | 20 ++- .../persistence/PhotoRepository.java | 8 +- 9 files changed, 150 insertions(+), 195 deletions(-) create mode 100644 src/main/java/com/cheeeese/album/domain/type/AlbumJoinStatus.java create mode 100644 src/main/java/com/cheeeese/album/dto/response/AlbumMakerInfo.java create mode 100644 src/main/java/com/cheeeese/album/dto/response/ExistingEnterResponse.java create mode 100644 src/main/java/com/cheeeese/album/dto/response/NewEnterResponse.java diff --git a/src/main/java/com/cheeeese/album/application/AlbumService.java b/src/main/java/com/cheeeese/album/application/AlbumService.java index d835337..7eb9be4 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumService.java +++ b/src/main/java/com/cheeeese/album/application/AlbumService.java @@ -2,6 +2,7 @@ import com.cheeeese.album.application.validator.AlbumValidator; import com.cheeeese.album.domain.Album; +import com.cheeeese.album.domain.type.AlbumJoinStatus; import com.cheeeese.album.domain.type.Role; import com.cheeeese.album.dto.request.AlbumCreationRequest; import com.cheeeese.album.dto.response.AlbumCreationResponse; @@ -14,8 +15,7 @@ import com.cheeeese.photo.application.PhotoService; import com.cheeeese.album.domain.UserAlbum; import com.cheeeese.album.dto.response.AlbumEnterResponse; -import com.cheeeese.album.dto.response.AlbumEnterResponse.AlbumHostInfo; -import com.cheeeese.album.dto.response.AlbumEnterResponse.AlbumParticipantResponse; +import com.cheeeese.album.dto.response.AlbumMakerInfo; import com.cheeeese.album.dto.response.UploadAvailableCountResponse; import com.cheeeese.album.infrastructure.persistence.UserAlbumRepository; import com.cheeeese.user.domain.User; @@ -25,7 +25,6 @@ import com.github.f4b6a3.uuid.UuidCreator; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.dao.DataIntegrityViolationException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -34,7 +33,7 @@ import java.time.LocalDateTime; import java.time.LocalTime; import java.util.List; -import java.util.stream.Collectors; +import java.util.Optional; @Slf4j @Service @@ -84,36 +83,65 @@ public AlbumInvitationResponse getInvitationInfo(String code) { if (album.isExpired()) { return AlbumMapper.toExpiredInvitationResponse(album); } - User host = getHostUser(album.getHostId()); + User host = getMaker(album.getMakerId()); return AlbumMapper.toInvitationResponse(album, host); } @Transactional public AlbumEnterResponse enterAlbum(String code, User currentUser) { - // 1. 앨범 유효성 검증 (존재 여부) Album album = albumValidator.validateAlbumCode(code); - - // 2. 앨범 입장 인가 검증 (만료, 블랙리스트, 정원 초과) albumValidator.validateAlbumEntry(album, currentUser); - // 3. 사용자 앨범 참가 로직: 첫 입장 시 isBlacklisted = false로 등록 및 참가자 수 증가 - Album freshAlbum = handleAlbumParticipation(album, currentUser); + Optional existing = userAlbumRepository.findByUserIdAndAlbumId(currentUser.getId(), album.getId()); + AlbumMakerInfo makerInfo = AlbumMapper.toMakerInfo(getMaker(album.getMakerId())); + + // Case 1: 기존 참여 이력 존재 + if (existing.isPresent()) { + UserAlbum userAlbum = existing.get(); + + if (!userAlbum.isVisible()) { + userAlbum.show(); + return AlbumMapper.toExistingResponse(album, AlbumJoinStatus.RESTORED, makerInfo); + } + + return AlbumMapper.toExistingResponse(album, AlbumJoinStatus.EXISTING, makerInfo); + } + + // Case 2: 신규 참여 + albumValidator.validateAlbumCapacity(album); + UserAlbum newUserAlbum = UserAlbumMapper.toGuestUserAlbum(currentUser, album); + userAlbumRepository.save(newUserAlbum); + + int updated = albumRepository.incrementParticipantCountAtomically(album.getId()); + if (updated == 0) { + throw new AlbumException(AlbumErrorCode.ALBUM_MAX_PARTICIPANT_REACHED); + } - // 4. 응답 DTO 생성 - return createAlbumEnterResponse(freshAlbum); + List recentThumbnails = photoService.getRecentThumbnailUrls(album.getId()); + + int remainingUploadSlots = calculateRemainingUploadSlots(album); + + return AlbumMapper.toNewResponse(album, makerInfo, remainingUploadSlots, recentThumbnails); } public UploadAvailableCountResponse getAvailablePhotoCount(User user, String code) { Album album = albumValidator.validateAlbumCode(code); albumValidator.validateUploadPermission(album, user); - int currentCount = album.getCurrentPhotoCount(); - int maxCount = album.getMaxPhotoCount(); + int availableCount = calculateRemainingUploadSlots(album); - int availableCount = Math.max(0, maxCount - currentCount); + return AlbumMapper.toAvailableCountResponse( + availableCount, + album.getMaxPhotoCount(), + album.getCurrentPhotoCount() + ); + } - return AlbumMapper.toAvailableCountResponse(availableCount, maxCount, currentCount); + private int calculateRemainingUploadSlots(Album album) { + int current = album.getCurrentPhotoCount(); + int max = album.getMaxPhotoCount(); + return Math.max(0, max - current); } private long countUserAlbumsCreatedThisWeek(User user) { @@ -124,77 +152,8 @@ private long countUserAlbumsCreatedThisWeek(User user) { ); } - private Album handleAlbumParticipation(Album album, User currentUser) { - boolean isAlreadyParticipant = userAlbumRepository.findByUserIdAndAlbumId(currentUser.getId(), album.getId()).isPresent(); - - if (isAlreadyParticipant) { - log.info("User {} is already a participant of album {}. Skipping registration.", - currentUser.getId(), album.getId()); - return album; - } - - // 첫 입장: AlbumParticipant에 isBlacklisted = false로 저장하고, Album 참가자 수 증가 - UserAlbum newAlbumParticipant = UserAlbumMapper.toGuestUserAlbum(currentUser, album); - try { - userAlbumRepository.save(newAlbumParticipant); - - int updatedRows = albumRepository.incrementParticipantCountAtomically(album.getId()); - if (updatedRows == 0) { - // 정원 초과 조건(currentParticipant < participant) 불만족 시 예외 처리 - throw new AlbumException(AlbumErrorCode.ALBUM_MAX_PARTICIPANT_REACHED); - } - } catch (DataIntegrityViolationException e) { - throw new AlbumException(AlbumErrorCode.USER_ALREADY_JOINED_CONCURRENTLY); - } - - return albumRepository.findById(album.getId()) - .orElseThrow(() -> { - log.error("Failed to re-fetch album {} after atomic update.", album.getId()); - return new AlbumException(AlbumErrorCode.ALBUM_NOT_FOUND); - }); - } - - private AlbumEnterResponse createAlbumEnterResponse(Album album) { - Long albumId = album.getId(); - - // 1. 호스트 정보 조회 - User host = getHostUser(album.getHostId()); - AlbumHostInfo hostInfo = AlbumMapper.toHostInfo(host); - - // 2. 총 사진 수 - // TODO: softdelete 논의 필요 - long totalPhotoCount = photoService.countTotalPhotos(albumId); - - // 3. 참가자 정보 목록 조회 - List participantResponses = getParticipantResponses(albumId); - - // 4. 최신 사진 9장 - // TODO: 썸네일 생성 후 썸네일 이미지 제공, 아래 코드는 임시 - List recentPhotoUrls = photoService.getRecentPhotoUrls(albumId); - - return AlbumMapper.toEnterResponse( - album, - hostInfo, - totalPhotoCount, - participantResponses, - recentPhotoUrls - ); - } - - private User getHostUser(Long hostId) { - return userRepository.findById(hostId) + private User getMaker(Long makerId) { + return userRepository.findById(makerId) .orElseThrow(() -> new UserException(UserErrorCode.USER_NOT_FOUND)); } - - private List getParticipantResponses(Long albumId) { - List participantUserIds = userAlbumRepository.findAllByAlbumId(albumId).stream() - .map(UserAlbum::getUserId) - .collect(Collectors.toList()); - - List participants = userRepository.findAllById(participantUserIds); - - return participants.stream() - .map(AlbumMapper::toParticipantResponse) - .collect(Collectors.toList()); - } } diff --git a/src/main/java/com/cheeeese/album/domain/type/AlbumJoinStatus.java b/src/main/java/com/cheeeese/album/domain/type/AlbumJoinStatus.java new file mode 100644 index 0000000..06680fc --- /dev/null +++ b/src/main/java/com/cheeeese/album/domain/type/AlbumJoinStatus.java @@ -0,0 +1,7 @@ +package com.cheeeese.album.domain.type; + +public enum AlbumJoinStatus { + NEW, + EXISTING, + RESTORED +} \ No newline at end of file diff --git a/src/main/java/com/cheeeese/album/dto/response/AlbumEnterResponse.java b/src/main/java/com/cheeeese/album/dto/response/AlbumEnterResponse.java index a4c4263..2126298 100644 --- a/src/main/java/com/cheeeese/album/dto/response/AlbumEnterResponse.java +++ b/src/main/java/com/cheeeese/album/dto/response/AlbumEnterResponse.java @@ -1,66 +1,10 @@ package com.cheeeese.album.dto.response; +import com.cheeeese.album.domain.type.AlbumJoinStatus; import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Builder; -import java.time.LocalDateTime; -import java.util.List; - -@Builder -@Schema(description = "앨범 입장 응답 DTO") -public record AlbumEnterResponse( - @Schema(description = "앨범 제목", example = "졸업 여행 폴라로이드") - String title, - - @Schema(description = "앨범 테마 이모지", example = "U+1F9C0") - String themeEmoji, - - @Schema(description = "이벤트 날짜", example = "2025-02-26") - String eventDate, - - @Schema(description = "열람 종료 시각 (만료일)", example = "2025-03-05T00:00:00") - LocalDateTime expiredAt, - - @Schema(description = "총 참여 가능 인원", example = "64") - Integer maxParticipantCount, - - @Schema(description = "현재 앨범 참가 인원", example = "58") - Integer currentParticipantCount, - - @Schema(description = "앨범 내 총 사진 개수", example = "150") - Long totalPhotoCount, - - @Schema(description = "앨범 최대 사진 개수", example = "1000") - Integer maxPhotoCount, - - @Schema(description = "호스트 정보") - AlbumHostInfo hostInfo, - - @Schema(description = "참가자 목록 (호스트 포함)") - List participants, - - @Schema(description = "최근 사진 미리보기 URL 목록 (최대 9개 등)") - List recentPhotoUrls -) { - @Builder - @Schema(description = "앨범 호스트 정보") - public record AlbumHostInfo( - @Schema(description = "호스트 이름", example = "주정빈") - String hostName, - - @Schema(description = "호스트 프로필 이미지 URL (이모지 포함)", example = "http://example.com/profile.png") - String hostProfileImage - ) { - } - - @Builder - @Schema(description = "앨범 참가자 정보") - public record AlbumParticipantResponse( - @Schema(description = "사용자 이름", example = "주정빈") - String name, - - @Schema(description = "사용자 프로필 이미지 URL (이모지 포함)", example = "http://example.com/profile.png") - String profileImage - ) { - } +@Schema(description = "앨범 입장 응답 (다형 구조)") +public sealed interface AlbumEnterResponse + permits NewEnterResponse, ExistingEnterResponse { + AlbumJoinStatus joinStatus(); } \ No newline at end of file diff --git a/src/main/java/com/cheeeese/album/dto/response/AlbumMakerInfo.java b/src/main/java/com/cheeeese/album/dto/response/AlbumMakerInfo.java new file mode 100644 index 0000000..18ba579 --- /dev/null +++ b/src/main/java/com/cheeeese/album/dto/response/AlbumMakerInfo.java @@ -0,0 +1,14 @@ +package com.cheeeese.album.dto.response; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Builder; + +@Schema(description = "앨범 메이커 정보 응답 DTO") +@Builder +public record AlbumMakerInfo( + @Schema(description = "메이커 이름", example = "우다현") + String makerName, + + @Schema(description = "메이커 프로필 이미지 URL", example = "https://cdn.cheeeese.com/users/1/profile.jpg") + String makerProfileImage +) {} diff --git a/src/main/java/com/cheeeese/album/dto/response/ExistingEnterResponse.java b/src/main/java/com/cheeeese/album/dto/response/ExistingEnterResponse.java new file mode 100644 index 0000000..f981b4b --- /dev/null +++ b/src/main/java/com/cheeeese/album/dto/response/ExistingEnterResponse.java @@ -0,0 +1,16 @@ +package com.cheeeese.album.dto.response; + +import com.cheeeese.album.domain.type.AlbumJoinStatus; +import lombok.Builder; + +import java.time.LocalDateTime; + +@Builder +public record ExistingEnterResponse( + AlbumJoinStatus joinStatus, + String title, + String themeEmoji, + String eventDate, + LocalDateTime expiredAt, + AlbumMakerInfo makerInfo +) implements AlbumEnterResponse {} diff --git a/src/main/java/com/cheeeese/album/dto/response/NewEnterResponse.java b/src/main/java/com/cheeeese/album/dto/response/NewEnterResponse.java new file mode 100644 index 0000000..fac52ae --- /dev/null +++ b/src/main/java/com/cheeeese/album/dto/response/NewEnterResponse.java @@ -0,0 +1,19 @@ +package com.cheeeese.album.dto.response; + +import com.cheeeese.album.domain.type.AlbumJoinStatus; +import lombok.Builder; + +import java.time.LocalDateTime; +import java.util.List; + +@Builder +public record NewEnterResponse( + AlbumJoinStatus joinStatus, + String title, + String themeEmoji, + String eventDate, + LocalDateTime expiredAt, + AlbumMakerInfo makerInfo, + Integer remainingUploadSlots, + List recentPhotoUrls +) implements AlbumEnterResponse {} diff --git a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java index b8568e4..0ea057e 100644 --- a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java +++ b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java @@ -1,12 +1,8 @@ package com.cheeeese.album.infrastructure.mapper; import com.cheeeese.album.domain.Album; -import com.cheeeese.album.dto.response.AlbumCreationResponse; -import com.cheeeese.album.dto.response.AlbumEnterResponse; -import com.cheeeese.album.dto.response.AlbumEnterResponse.AlbumHostInfo; -import com.cheeeese.album.dto.response.AlbumEnterResponse.AlbumParticipantResponse; -import com.cheeeese.album.dto.response.AlbumInvitationResponse; -import com.cheeeese.album.dto.response.UploadAvailableCountResponse; +import com.cheeeese.album.domain.type.AlbumJoinStatus; +import com.cheeeese.album.dto.response.*; import com.cheeeese.user.domain.User; import java.time.LocalDate; @@ -19,7 +15,7 @@ public class AlbumMapper { * Album Entity 생성 */ public static Album toEntity( - Long hostId, + Long makerId, String title, String code, String themeEmoji, @@ -30,7 +26,7 @@ public static Album toEntity( boolean isTermsAgreement ) { return Album.builder() - .hostId(hostId) + .makerId(makerId) .title(title) .code(code) .themeEmoji(themeEmoji) @@ -89,27 +85,31 @@ public static AlbumInvitationResponse toExpiredInvitationResponse(Album album) { .build(); } - /** - * 앨범 입장 시 필요한 모든 정보들을 통합하여 응답 DTO로 변환합니다. - */ - public static AlbumEnterResponse toEnterResponse( + public static ExistingEnterResponse toExistingResponse(Album album, AlbumJoinStatus status, AlbumMakerInfo makerInfo) { + return ExistingEnterResponse.builder() + .joinStatus(status) + .title(album.getTitle()) + .themeEmoji(album.getThemeEmoji()) + .eventDate(album.getEventDate().toString()) + .expiredAt(album.getExpiredAt()) + .makerInfo(makerInfo) + .build(); + } + + public static NewEnterResponse toNewResponse( Album album, - AlbumHostInfo hostInfo, - long totalPhotoCount, - List participants, + AlbumMakerInfo makerInfo, + int remainingUploadSlots, List recentPhotoUrls ) { - return AlbumEnterResponse.builder() + return NewEnterResponse.builder() + .joinStatus(AlbumJoinStatus.NEW) .title(album.getTitle()) .themeEmoji(album.getThemeEmoji()) .eventDate(album.getEventDate().toString()) .expiredAt(album.getExpiredAt()) - .maxParticipantCount(album.getParticipant()) - .currentParticipantCount(album.getCurrentParticipant()) - .hostInfo(hostInfo) - .totalPhotoCount(totalPhotoCount) - .maxPhotoCount(album.getMaxPhotoCount()) - .participants(participants) + .makerInfo(makerInfo) + .remainingUploadSlots(remainingUploadSlots) .recentPhotoUrls(recentPhotoUrls) .build(); } @@ -117,20 +117,10 @@ public static AlbumEnterResponse toEnterResponse( /** * 호스트 User 엔티티를 호스트 정보 응답 DTO로 변환합니다. */ - public static AlbumHostInfo toHostInfo(User host) { - return AlbumHostInfo.builder() - .hostName(host.getName()) - .hostProfileImage(host.getProfileImage()) - .build(); - } - - /** - * 참가자 User 엔티티 리스트를 응답 DTO 리스트로 변환합니다. - */ - public static AlbumParticipantResponse toParticipantResponse(User user) { - return AlbumParticipantResponse.builder() - .name(user.getName()) - .profileImage(user.getProfileImage()) + public static AlbumMakerInfo toMakerInfo(User user) { + return AlbumMakerInfo.builder() + .makerName(user.getName()) + .makerProfileImage(user.getProfileImage()) .build(); } diff --git a/src/main/java/com/cheeeese/photo/application/PhotoService.java b/src/main/java/com/cheeeese/photo/application/PhotoService.java index 198286a..c7064b0 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoService.java @@ -35,14 +35,20 @@ public class PhotoService { private static final String ORIGINAL_PHOTO_PATH_FORMAT = "album/%s/original/%d_%s"; - public long countTotalPhotos(Long albumId) { - return photoRepository.countByAlbumIdAndIsDeletedFalse(albumId); - } + public List getRecentThumbnailUrls(Long albumId) { + List photos = photoRepository + .findTop5ByAlbumIdAndIsDeletedFalseAndStatusOrderByCreatedAtDesc(albumId, PhotoStatus.COMPLETED); + + if (photos.isEmpty()) { + return List.of(); + } + + if (photos.size() < 5) { + return List.of(photos.get(0).getThumbnailUrl()); + } - public List getRecentPhotoUrls(Long albumId) { - List recentPhotos = photoRepository.findTop9ByAlbumIdAndIsDeletedFalseOrderByCreatedAtDesc(albumId); - return recentPhotos.stream() - .map(Photo::getImageUrl) + return photos.stream() + .map(Photo::getThumbnailUrl) .collect(Collectors.toList()); } diff --git a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java index fb21c3f..1a796f9 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java @@ -11,10 +11,10 @@ public interface PhotoRepository extends JpaRepository { - long countByAlbumIdAndIsDeletedFalse(Long albumId); - - List findTop9ByAlbumIdAndIsDeletedFalseOrderByCreatedAtDesc(Long albumId); - + List findTop5ByAlbumIdAndIsDeletedFalseAndStatusOrderByCreatedAtDesc( + Long albumId, + PhotoStatus status + ); @Modifying(clearAutomatically = true, flushAutomatically = true) @Query(""" UPDATE Photo p From 6edfbf94539da4b252da1539aaa46b736c153782 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Fri, 31 Oct 2025 23:43:42 +0900 Subject: [PATCH 177/402] =?UTF-8?q?#29=20fix:=20=ED=94=BC=EB=93=9C?= =?UTF-8?q?=EB=B0=B1=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cheeeese/album/infrastructure/mapper/AlbumMapper.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java index 0ea057e..7d06c04 100644 --- a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java +++ b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java @@ -56,7 +56,7 @@ public static AlbumCreationResponse toCreationResponse(Album album) { } /** - * Album 엔티티와 Host User 정보를 초대장 응답 DTO로 변환합니다. + * Album 엔티티와 Maker User 정보를 초대장 응답 DTO로 변환합니다. */ public static AlbumInvitationResponse toInvitationResponse(Album album, User host) { return AlbumInvitationResponse.builder() @@ -115,7 +115,7 @@ public static NewEnterResponse toNewResponse( } /** - * 호스트 User 엔티티를 호스트 정보 응답 DTO로 변환합니다. + * 메이커 User 엔티티를 호스트 정보 응답 DTO로 변환합니다. */ public static AlbumMakerInfo toMakerInfo(User user) { return AlbumMakerInfo.builder() From f6098da1b6b671139dd693c6565b6f35f0756baf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Fri, 31 Oct 2025 23:44:33 +0900 Subject: [PATCH 178/402] =?UTF-8?q?#29=20fix:=20RESTORED=20=EC=9B=8C?= =?UTF-8?q?=EB=94=A9=20REJOINED=20=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/cheeeese/album/application/AlbumService.java | 2 +- .../java/com/cheeeese/album/domain/type/AlbumJoinStatus.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/cheeeese/album/application/AlbumService.java b/src/main/java/com/cheeeese/album/application/AlbumService.java index 7eb9be4..a64aa6c 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumService.java +++ b/src/main/java/com/cheeeese/album/application/AlbumService.java @@ -102,7 +102,7 @@ public AlbumEnterResponse enterAlbum(String code, User currentUser) { if (!userAlbum.isVisible()) { userAlbum.show(); - return AlbumMapper.toExistingResponse(album, AlbumJoinStatus.RESTORED, makerInfo); + return AlbumMapper.toExistingResponse(album, AlbumJoinStatus.REJOINED, makerInfo); } return AlbumMapper.toExistingResponse(album, AlbumJoinStatus.EXISTING, makerInfo); diff --git a/src/main/java/com/cheeeese/album/domain/type/AlbumJoinStatus.java b/src/main/java/com/cheeeese/album/domain/type/AlbumJoinStatus.java index 06680fc..62da612 100644 --- a/src/main/java/com/cheeeese/album/domain/type/AlbumJoinStatus.java +++ b/src/main/java/com/cheeeese/album/domain/type/AlbumJoinStatus.java @@ -3,5 +3,5 @@ public enum AlbumJoinStatus { NEW, EXISTING, - RESTORED + REJOINED } \ No newline at end of file From df27e468c487c437daffe95ccf7a994d78151a22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Fri, 31 Oct 2025 23:44:55 +0900 Subject: [PATCH 179/402] =?UTF-8?q?#29=20feat:=20schema=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/response/ExistingEnterResponse.java | 14 ++++++++++++++ .../album/dto/response/NewEnterResponse.java | 17 +++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/src/main/java/com/cheeeese/album/dto/response/ExistingEnterResponse.java b/src/main/java/com/cheeeese/album/dto/response/ExistingEnterResponse.java index f981b4b..15d78f0 100644 --- a/src/main/java/com/cheeeese/album/dto/response/ExistingEnterResponse.java +++ b/src/main/java/com/cheeeese/album/dto/response/ExistingEnterResponse.java @@ -1,16 +1,30 @@ package com.cheeeese.album.dto.response; import com.cheeeese.album.domain.type.AlbumJoinStatus; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Builder; import java.time.LocalDateTime; +@Schema(description = "앨범 재입장 또는 기존 참여자 응답 DTO") @Builder public record ExistingEnterResponse( + @Schema(description = "참여 상태 (EXISTING | REJOINED)", example = "EXISTING") AlbumJoinStatus joinStatus, + + @Schema(description = "앨범 제목", example = "우리 여행 앨범") String title, + + @Schema(description = "앨범 테마 이모지", example = "📸") String themeEmoji, + + @Schema(description = "이벤트 날짜 (YYYY-MM-DD 형식 문자열)", example = "2025-10-31") String eventDate, + + @Schema(description = "앨범 만료 시각", example = "2025-11-30T23:59:59") LocalDateTime expiredAt, + + @Schema(description = "앨범 생성자(호스트) 정보") AlbumMakerInfo makerInfo + ) implements AlbumEnterResponse {} diff --git a/src/main/java/com/cheeeese/album/dto/response/NewEnterResponse.java b/src/main/java/com/cheeeese/album/dto/response/NewEnterResponse.java index fac52ae..f98fb5b 100644 --- a/src/main/java/com/cheeeese/album/dto/response/NewEnterResponse.java +++ b/src/main/java/com/cheeeese/album/dto/response/NewEnterResponse.java @@ -1,19 +1,36 @@ package com.cheeeese.album.dto.response; import com.cheeeese.album.domain.type.AlbumJoinStatus; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Builder; import java.time.LocalDateTime; import java.util.List; +@Schema(description = "앨범 첫 입장(신규 참여자) 응답 DTO") @Builder public record NewEnterResponse( + @Schema(description = "참여 상태 (항상 NEW)", example = "NEW") AlbumJoinStatus joinStatus, + + @Schema(description = "앨범 제목", example = "여름 바캉스") String title, + + @Schema(description = "앨범 테마 이모지", example = "🌴") String themeEmoji, + + @Schema(description = "이벤트 날짜 (YYYY-MM-DD 형식 문자열)", example = "2025-08-14") String eventDate, + + @Schema(description = "앨범 만료 시각", example = "2025-09-01T00:00:00") LocalDateTime expiredAt, + + @Schema(description = "앨범 생성자 정보") AlbumMakerInfo makerInfo, + + @Schema(description = "남은 업로드 가능 사진 수", example = "5") Integer remainingUploadSlots, + + @Schema(description = "최근 업로드된 사진 썸네일 URL 목록 (최대 5개)", example = "[\"https://cdn.cheeeese.com/album/1/thumb1.jpg\"]") List recentPhotoUrls ) implements AlbumEnterResponse {} From 3b32d49200b453278496018f31fc242bce94c3cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Sat, 1 Nov 2025 01:03:56 +0900 Subject: [PATCH 180/402] =?UTF-8?q?#34=20feat:=20UserAlbum,=20Photo=20?= =?UTF-8?q?=EC=97=94=ED=8B=B0=ED=8B=B0=EC=97=90=20JoinColumn=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cheeeese/album/domain/UserAlbum.java | 19 ++++++++------- .../java/com/cheeeese/photo/domain/Photo.java | 24 ++++++++++--------- 2 files changed, 23 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/cheeeese/album/domain/UserAlbum.java b/src/main/java/com/cheeeese/album/domain/UserAlbum.java index 0d41102..cf0955d 100644 --- a/src/main/java/com/cheeeese/album/domain/UserAlbum.java +++ b/src/main/java/com/cheeeese/album/domain/UserAlbum.java @@ -2,6 +2,7 @@ import com.cheeeese.album.domain.type.Role; import com.cheeeese.global.domain.BaseEntity; +import com.cheeeese.user.domain.User; import jakarta.persistence.*; import lombok.AccessLevel; import lombok.Builder; @@ -19,13 +20,13 @@ public class UserAlbum extends BaseEntity { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - // TODO: 추후 필요시 ManyToOne, JoinColumn 넣을 예정 - @Column(name = "user_id", nullable = false) - private Long userId; + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id", nullable = false) + private User user; - // TODO: 추후 필요시 ManyToOne, JoinColumn 넣을 예정 - @Column(name = "album_id", nullable = false) - private Long albumId; + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "album_id", nullable = false) + private Album album; @Enumerated(EnumType.STRING) @Column(name = "role", nullable = false) @@ -35,9 +36,9 @@ public class UserAlbum extends BaseEntity { private boolean isVisible; @Builder - private UserAlbum(Long userId, Long albumId, Role role, boolean isVisible) { - this.userId = userId; - this.albumId = albumId; + private UserAlbum(User user, Album album, Role role, boolean isVisible) { + this.user = user; + this.album = album; this.role = role; this.isVisible = isVisible; } diff --git a/src/main/java/com/cheeeese/photo/domain/Photo.java b/src/main/java/com/cheeeese/photo/domain/Photo.java index 43ee6db..89c2d10 100644 --- a/src/main/java/com/cheeeese/photo/domain/Photo.java +++ b/src/main/java/com/cheeeese/photo/domain/Photo.java @@ -1,6 +1,8 @@ package com.cheeeese.photo.domain; +import com.cheeeese.album.domain.Album; import com.cheeeese.global.domain.BaseEntity; +import com.cheeeese.user.domain.User; import jakarta.persistence.*; import lombok.AccessLevel; import lombok.Builder; @@ -20,15 +22,15 @@ public class Photo extends BaseEntity { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - // TODO: 추후 필요시 ManyToOne, JoinColumn 넣을 예정 - @Column(name = "user_id", nullable = false) - private Long userId; + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id", nullable = false) + private User user; - // TODO: 추후 필요시 ManyToOne, JoinColumn 넣을 예정 - @Column(name = "album_id", nullable = false) - private Long albumId; + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "album_id", nullable = false) + private Album album; - @Column(name = "image_url", nullable = true, columnDefinition = "TEXT") + @Column(name = "image_url", columnDefinition = "TEXT") private String imageUrl; @Column(name = "thumbnail_url", columnDefinition = "TEXT") @@ -49,15 +51,15 @@ public class Photo extends BaseEntity { @Builder private Photo( - Long userId, - Long albumId, + User user, + Album album, String imageUrl, String thumbnailUrl, LocalDateTime captureTime, PhotoStatus status ) { - this.userId = userId; - this.albumId = albumId; + this.user = user; + this.album = album; this.imageUrl = imageUrl; this.thumbnailUrl = thumbnailUrl; this.captureTime = captureTime; From bbeb03be19a456021a0262661ae757418d0c7073 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Sat, 1 Nov 2025 01:06:32 +0900 Subject: [PATCH 181/402] =?UTF-8?q?#34=20fix:=20=EC=97=85=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=8A=B8=EB=90=9C=20=EC=97=94=ED=8B=B0=ED=8B=B0=20?= =?UTF-8?q?=ED=95=84=EB=93=9C=EC=97=90=20=EB=A7=9E=EC=B6=B0=20User=20?= =?UTF-8?q?=EB=B0=8F=20Album=20=EA=B0=9D=EC=B2=B4=EB=A5=BC=20=EC=9D=B8?= =?UTF-8?q?=EC=88=98=EB=A1=9C=20=EB=B0=9B=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../album/application/AlbumService.java | 11 +++++++---- .../mapper/UserAlbumMapper.java | 18 +++--------------- .../persistence/UserAlbumRepository.java | 11 ++++++++--- .../photo/application/PhotoService.java | 10 +++++++--- .../application/validator/PhotoValidator.java | 4 ++-- .../infrastructure/mapper/PhotoMapper.java | 8 +++++--- .../persistence/PhotoRepository.java | 19 +++++++++++++++---- 7 files changed, 47 insertions(+), 34 deletions(-) diff --git a/src/main/java/com/cheeeese/album/application/AlbumService.java b/src/main/java/com/cheeeese/album/application/AlbumService.java index a64aa6c..eac5805 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumService.java +++ b/src/main/java/com/cheeeese/album/application/AlbumService.java @@ -69,8 +69,8 @@ public AlbumCreationResponse createAlbum(User user, AlbumCreationRequest request albumRepository.save(album); userAlbumRepository.save(UserAlbumMapper.toEntity( - user.getId(), - album.getId(), + user, + album, Role.MAKER )); @@ -110,8 +110,11 @@ public AlbumEnterResponse enterAlbum(String code, User currentUser) { // Case 2: 신규 참여 albumValidator.validateAlbumCapacity(album); - UserAlbum newUserAlbum = UserAlbumMapper.toGuestUserAlbum(currentUser, album); - userAlbumRepository.save(newUserAlbum); + userAlbumRepository.save(UserAlbumMapper.toEntity( + currentUser, + album, + Role.MAKER + )); int updated = albumRepository.incrementParticipantCountAtomically(album.getId()); if (updated == 0) { diff --git a/src/main/java/com/cheeeese/album/infrastructure/mapper/UserAlbumMapper.java b/src/main/java/com/cheeeese/album/infrastructure/mapper/UserAlbumMapper.java index b92be27..ce00558 100644 --- a/src/main/java/com/cheeeese/album/infrastructure/mapper/UserAlbumMapper.java +++ b/src/main/java/com/cheeeese/album/infrastructure/mapper/UserAlbumMapper.java @@ -7,24 +7,12 @@ public class UserAlbumMapper { - public static UserAlbum toEntity(Long userId, Long albumId, Role role) { + public static UserAlbum toEntity(User user, Album album, Role role) { return UserAlbum.builder() - .userId(userId) - .albumId(albumId) + .user(user) + .album(album) .role(role) .isVisible(true) .build(); } - - /** - * User와 Album 엔티티를 기반으로 GUEST 역할의 UserAlbum 엔티티를 생성합니다. - */ - public static UserAlbum toGuestUserAlbum(User user, Album album) { - return UserAlbum.builder() - .userId(user.getId()) - .albumId(album.getId()) - .role(Role.GUEST) - .isVisible(true) - .build(); - } } diff --git a/src/main/java/com/cheeeese/album/infrastructure/persistence/UserAlbumRepository.java b/src/main/java/com/cheeeese/album/infrastructure/persistence/UserAlbumRepository.java index f03c935..acfa82e 100644 --- a/src/main/java/com/cheeeese/album/infrastructure/persistence/UserAlbumRepository.java +++ b/src/main/java/com/cheeeese/album/infrastructure/persistence/UserAlbumRepository.java @@ -3,14 +3,19 @@ import com.cheeeese.album.domain.UserAlbum; import com.cheeeese.album.domain.type.Role; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import java.util.List; import java.util.Optional; public interface UserAlbumRepository extends JpaRepository { - Optional findByUserIdAndAlbumId(Long userId, Long albumId); + @Query("SELECT ua FROM UserAlbum ua WHERE ua.user.id = :userId AND ua.album.id = :albumId") + Optional findByUserIdAndAlbumId(@Param("userId") Long userId, @Param("albumId") Long albumId); - List findAllByAlbumId(Long albumId); + @Query("SELECT ua FROM UserAlbum ua WHERE ua.album.id = :albumId") + List findAllByAlbumId(@Param("albumId") Long albumId); - Optional findByAlbumIdAndUserIdAndRole(Long albumId, Long userId, Role role); + @Query("SELECT ua FROM UserAlbum ua WHERE ua.album.id = :albumId AND ua.user.id = :userId AND ua.role = :role") + Optional findByAlbumIdAndUserIdAndRole(@Param("albumId") Long albumId, @Param("userId") Long userId, @Param("role") Role role); } diff --git a/src/main/java/com/cheeeese/photo/application/PhotoService.java b/src/main/java/com/cheeeese/photo/application/PhotoService.java index c7064b0..a42f5a7 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoService.java @@ -15,6 +15,7 @@ import com.cheeeese.photo.infrastructure.persistence.PhotoRepository; import com.cheeeese.user.domain.User; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.PageRequest; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -36,8 +37,11 @@ public class PhotoService { private static final String ORIGINAL_PHOTO_PATH_FORMAT = "album/%s/original/%d_%s"; public List getRecentThumbnailUrls(Long albumId) { - List photos = photoRepository - .findTop5ByAlbumIdAndIsDeletedFalseAndStatusOrderByCreatedAtDesc(albumId, PhotoStatus.COMPLETED); + List photos = photoRepository.findRecentPhotosByAlbumIdAndStatus( + albumId, + PhotoStatus.COMPLETED, + PageRequest.of(0, 5) + ); if (photos.isEmpty()) { return List.of(); @@ -106,7 +110,7 @@ private PhotoPresignedUrlResponse.PresignedUrlInfo createPresignedUrlForFile( Album album, PhotoPresignedUrlRequest.FileInfo file ) { - Photo photo = PhotoMapper.toEntity(user.getId(), album.getId()); + Photo photo = PhotoMapper.toEntity(user, album); photoRepository.save(photo); String safeFileName = sanitizeFileName(file.fileName()); diff --git a/src/main/java/com/cheeeese/photo/application/validator/PhotoValidator.java b/src/main/java/com/cheeeese/photo/application/validator/PhotoValidator.java index 6677a4a..502bdb9 100644 --- a/src/main/java/com/cheeeese/photo/application/validator/PhotoValidator.java +++ b/src/main/java/com/cheeeese/photo/application/validator/PhotoValidator.java @@ -103,7 +103,7 @@ private List findAndValidateExistence(List photoIds) { */ private void validateOwnership(List photos, Long userId) { boolean invalidOwner = photos.stream() - .anyMatch(photo -> !photo.getUserId().equals(userId)); + .anyMatch(photo -> !photo.getUser().getId().equals(userId)); if (invalidOwner) { throw new PhotoException(PhotoErrorCode.PHOTO_OWNER_MISMATCH); @@ -115,7 +115,7 @@ private void validateOwnership(List photos, Long userId) { */ private Long validateSingleAlbum(List photos) { Set albumIds = photos.stream() - .map(Photo::getAlbumId) + .map(photo -> photo.getAlbum().getId()) .collect(Collectors.toSet()); if (albumIds.size() != 1) { diff --git a/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java b/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java index e6a4d6a..d5caad9 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java @@ -1,18 +1,20 @@ package com.cheeeese.photo.infrastructure.mapper; +import com.cheeeese.album.domain.Album; import com.cheeeese.photo.domain.Photo; import com.cheeeese.photo.domain.PhotoStatus; import com.cheeeese.photo.dto.response.PhotoPresignedUrlResponse; +import com.cheeeese.user.domain.User; import java.time.LocalDateTime; import java.util.List; public class PhotoMapper { - public static Photo toEntity(Long userId, Long albumId) { + public static Photo toEntity(User user, Album album) { return Photo.builder() - .userId(userId) - .albumId(albumId) + .user(user) + .album(album) .imageUrl(null) // presigned URL 생성 후 updateImageUrl()로 세팅됨 .thumbnailUrl(null) .captureTime(LocalDateTime.now()) diff --git a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java index 1a796f9..ce95690 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java @@ -2,6 +2,7 @@ import com.cheeeese.photo.domain.Photo; import com.cheeeese.photo.domain.PhotoStatus; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; @@ -11,16 +12,26 @@ public interface PhotoRepository extends JpaRepository { - List findTop5ByAlbumIdAndIsDeletedFalseAndStatusOrderByCreatedAtDesc( - Long albumId, - PhotoStatus status + @Query(""" + SELECT p + FROM Photo p + WHERE p.album.id = :albumId + AND p.isDeleted = FALSE + AND p.status = :status + ORDER BY p.createdAt DESC + """) + List findRecentPhotosByAlbumIdAndStatus( + @Param("albumId") Long albumId, + @Param("status") PhotoStatus status, + Pageable pageable ); + @Modifying(clearAutomatically = true, flushAutomatically = true) @Query(""" UPDATE Photo p SET p.status = :newStatus WHERE p.id IN :photoIds - AND p.userId = :userId + AND p.user.id = :userId AND p.status = :expectedStatus """) int updateStatusByIdsAndUserIdAndExpectedStatus( From c27d05d9d6c1e00ce5e0b846f57a15b45aaeaab1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Sat, 1 Nov 2025 01:31:18 +0900 Subject: [PATCH 182/402] =?UTF-8?q?#34=20feat:=20NewEnterResponse=EC=9D=98?= =?UTF-8?q?=20recentPhotoUrls=20=ED=95=84=EB=93=9C=EC=97=90=20=EC=97=85?= =?UTF-8?q?=EB=A1=9C=EB=93=9C=20=EC=82=AC=EC=9A=A9=EC=9E=90=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84,=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20URL=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../album/application/AlbumService.java | 31 ++++++++++++++----- .../album/dto/response/NewEnterResponse.java | 23 ++++++++++++-- .../infrastructure/mapper/AlbumMapper.java | 15 +++++++-- .../photo/application/PhotoService.java | 16 ++-------- 4 files changed, 59 insertions(+), 26 deletions(-) diff --git a/src/main/java/com/cheeeese/album/application/AlbumService.java b/src/main/java/com/cheeeese/album/application/AlbumService.java index eac5805..a6e1e3e 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumService.java +++ b/src/main/java/com/cheeeese/album/application/AlbumService.java @@ -5,8 +5,7 @@ import com.cheeeese.album.domain.type.AlbumJoinStatus; import com.cheeeese.album.domain.type.Role; import com.cheeeese.album.dto.request.AlbumCreationRequest; -import com.cheeeese.album.dto.response.AlbumCreationResponse; -import com.cheeeese.album.dto.response.AlbumInvitationResponse; +import com.cheeeese.album.dto.response.*; import com.cheeeese.album.exception.AlbumException; import com.cheeeese.album.exception.code.AlbumErrorCode; import com.cheeeese.album.infrastructure.mapper.AlbumMapper; @@ -14,10 +13,8 @@ import com.cheeeese.album.infrastructure.persistence.AlbumRepository; import com.cheeeese.photo.application.PhotoService; import com.cheeeese.album.domain.UserAlbum; -import com.cheeeese.album.dto.response.AlbumEnterResponse; -import com.cheeeese.album.dto.response.AlbumMakerInfo; -import com.cheeeese.album.dto.response.UploadAvailableCountResponse; import com.cheeeese.album.infrastructure.persistence.UserAlbumRepository; +import com.cheeeese.photo.domain.Photo; import com.cheeeese.user.domain.User; import com.cheeeese.user.exception.UserException; import com.cheeeese.user.exception.code.UserErrorCode; @@ -34,6 +31,7 @@ import java.time.LocalTime; import java.util.List; import java.util.Optional; +import java.util.stream.Collectors; @Slf4j @Service @@ -121,11 +119,11 @@ public AlbumEnterResponse enterAlbum(String code, User currentUser) { throw new AlbumException(AlbumErrorCode.ALBUM_MAX_PARTICIPANT_REACHED); } - List recentThumbnails = photoService.getRecentThumbnailUrls(album.getId()); + List recentPhotos = getRecentPhotosWithUploaderInfo(album.getId()); int remainingUploadSlots = calculateRemainingUploadSlots(album); - return AlbumMapper.toNewResponse(album, makerInfo, remainingUploadSlots, recentThumbnails); + return AlbumMapper.toNewResponse(album, makerInfo, remainingUploadSlots, recentPhotos); } public UploadAvailableCountResponse getAvailablePhotoCount(User user, String code) { @@ -159,4 +157,23 @@ private User getMaker(Long makerId) { return userRepository.findById(makerId) .orElseThrow(() -> new UserException(UserErrorCode.USER_NOT_FOUND)); } + + private List getRecentPhotosWithUploaderInfo(Long albumId) { + List photos = photoService.getRecentPhotosForNewEnter(albumId); + + if (photos.isEmpty()) { + return List.of(); + } + + // 1~4개인 경우, 1개만 반환하는 비즈니스 로직 적용 + if (photos.size() < 5) { + Photo photo = photos.get(0); + return List.of(AlbumMapper.toRecentPhotoResponse(photo)); + } + + // 5개인 경우, 5개 모두 반환 + return photos.stream() + .map(AlbumMapper::toRecentPhotoResponse) + .collect(Collectors.toList()); + } } diff --git a/src/main/java/com/cheeeese/album/dto/response/NewEnterResponse.java b/src/main/java/com/cheeeese/album/dto/response/NewEnterResponse.java index f98fb5b..faae53e 100644 --- a/src/main/java/com/cheeeese/album/dto/response/NewEnterResponse.java +++ b/src/main/java/com/cheeeese/album/dto/response/NewEnterResponse.java @@ -2,6 +2,7 @@ import com.cheeeese.album.domain.type.AlbumJoinStatus; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; import lombok.Builder; import java.time.LocalDateTime; @@ -31,6 +32,22 @@ public record NewEnterResponse( @Schema(description = "남은 업로드 가능 사진 수", example = "5") Integer remainingUploadSlots, - @Schema(description = "최근 업로드된 사진 썸네일 URL 목록 (최대 5개)", example = "[\"https://cdn.cheeeese.com/album/1/thumb1.jpg\"]") - List recentPhotoUrls -) implements AlbumEnterResponse {} + @Schema(description = "최근 업로드된 사진 목록 (최대 5개)", implementation = RecentPhotoResponse.class) + List recentPhotos +) implements AlbumEnterResponse { + @Builder + @Schema(description = "최근 업로드 사진 정보 DTO") + public record RecentPhotoResponse( + @NotNull + @Schema(description = "사진 썸네일 URL", example = "https://cdn.cheeeese.com/album/1/thumb1.jpg") + String thumbnailUrl, + + @NotNull + @Schema(description = "업로드 사용자 이름", example = "김치즈") + String uploaderName, + + @NotNull + @Schema(description = "업로드 사용자 프로필 이미지 URL", example = "https://cdn.cheeeese.com/user/1/profile.jpg") + String uploaderProfileImage + ) {} +} diff --git a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java index 7d06c04..6ab21b0 100644 --- a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java +++ b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java @@ -3,6 +3,7 @@ import com.cheeeese.album.domain.Album; import com.cheeeese.album.domain.type.AlbumJoinStatus; import com.cheeeese.album.dto.response.*; +import com.cheeeese.photo.domain.Photo; import com.cheeeese.user.domain.User; import java.time.LocalDate; @@ -100,7 +101,7 @@ public static NewEnterResponse toNewResponse( Album album, AlbumMakerInfo makerInfo, int remainingUploadSlots, - List recentPhotoUrls + List recentPhotos ) { return NewEnterResponse.builder() .joinStatus(AlbumJoinStatus.NEW) @@ -110,7 +111,17 @@ public static NewEnterResponse toNewResponse( .expiredAt(album.getExpiredAt()) .makerInfo(makerInfo) .remainingUploadSlots(remainingUploadSlots) - .recentPhotoUrls(recentPhotoUrls) + .recentPhotos(recentPhotos) + .build(); + } + + public static NewEnterResponse.RecentPhotoResponse toRecentPhotoResponse(Photo photo) { + User uploader = photo.getUser(); + + return NewEnterResponse.RecentPhotoResponse.builder() + .thumbnailUrl(photo.getThumbnailUrl()) + .uploaderName(uploader.getName()) + .uploaderProfileImage(uploader.getProfileImage()) .build(); } diff --git a/src/main/java/com/cheeeese/photo/application/PhotoService.java b/src/main/java/com/cheeeese/photo/application/PhotoService.java index a42f5a7..4d4d0fd 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoService.java @@ -36,24 +36,12 @@ public class PhotoService { private static final String ORIGINAL_PHOTO_PATH_FORMAT = "album/%s/original/%d_%s"; - public List getRecentThumbnailUrls(Long albumId) { - List photos = photoRepository.findRecentPhotosByAlbumIdAndStatus( + public List getRecentPhotosForNewEnter(Long albumId) { + return photoRepository.findRecentPhotosByAlbumIdAndStatus( albumId, PhotoStatus.COMPLETED, PageRequest.of(0, 5) ); - - if (photos.isEmpty()) { - return List.of(); - } - - if (photos.size() < 5) { - return List.of(photos.get(0).getThumbnailUrl()); - } - - return photos.stream() - .map(Photo::getThumbnailUrl) - .collect(Collectors.toList()); } @Transactional From 36fd13d2fcf54ec8bbf315427310adc8fc1f6d75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Sat, 1 Nov 2025 02:02:33 +0900 Subject: [PATCH 183/402] =?UTF-8?q?#34=20fix:=20=ED=94=BC=EB=93=9C?= =?UTF-8?q?=EB=B0=B1=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/cheeeese/album/application/AlbumService.java | 2 +- .../photo/infrastructure/persistence/PhotoRepository.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/cheeeese/album/application/AlbumService.java b/src/main/java/com/cheeeese/album/application/AlbumService.java index a6e1e3e..d85bd0c 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumService.java +++ b/src/main/java/com/cheeeese/album/application/AlbumService.java @@ -111,7 +111,7 @@ public AlbumEnterResponse enterAlbum(String code, User currentUser) { userAlbumRepository.save(UserAlbumMapper.toEntity( currentUser, album, - Role.MAKER + Role.GUEST )); int updated = albumRepository.incrementParticipantCountAtomically(album.getId()); diff --git a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java index ce95690..ec04eee 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java @@ -15,6 +15,7 @@ public interface PhotoRepository extends JpaRepository { @Query(""" SELECT p FROM Photo p + JOIN FETCH p.user WHERE p.album.id = :albumId AND p.isDeleted = FALSE AND p.status = :status From 47ad21c47b81bb3e34cf13f9e81679a162184bd4 Mon Sep 17 00:00:00 2001 From: zyovn Date: Sat, 1 Nov 2025 14:52:23 +0900 Subject: [PATCH 184/402] =?UTF-8?q?#21=20feat:=20redis=20=EC=BA=90?= =?UTF-8?q?=EC=8B=9C=20=EA=B4=80=EB=A0=A8=20=EB=A1=9C=EC=A7=81=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cheeeese/global/config/RedisConfig.java | 17 +++++- .../cheeeese/global/util/RedisCacheUtil.java | 55 +++++++++++++++++++ .../com/cheeeese/global/util/RedisUtil.java | 2 + 3 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/cheeeese/global/util/RedisCacheUtil.java diff --git a/src/main/java/com/cheeeese/global/config/RedisConfig.java b/src/main/java/com/cheeeese/global/config/RedisConfig.java index a2023d2..b5ab24a 100644 --- a/src/main/java/com/cheeeese/global/config/RedisConfig.java +++ b/src/main/java/com/cheeeese/global/config/RedisConfig.java @@ -7,6 +7,7 @@ import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.repository.configuration.EnableRedisRepositories; +import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; @Configuration @@ -30,7 +31,7 @@ public LettuceConnectionFactory redisConnectionFactory() { return new LettuceConnectionFactory(config); } - @Bean + @Bean(name = "tokenRedisTemplate") public RedisTemplate redisTemplate() { RedisTemplate redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(redisConnectionFactory()); @@ -40,4 +41,18 @@ public RedisTemplate redisTemplate() { return redisTemplate; } + + @Bean(name = "cacheRedisTemplate") + public RedisTemplate cahceRedisTemplate() { + RedisTemplate redisTemplate = new RedisTemplate<>(); + redisTemplate.setConnectionFactory(redisConnectionFactory()); + + GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer(); + redisTemplate.setKeySerializer(new StringRedisSerializer()); + redisTemplate.setKeySerializer(serializer); + redisTemplate.setHashKeySerializer(new StringRedisSerializer()); + redisTemplate.setValueSerializer(serializer); + + return redisTemplate; + } } diff --git a/src/main/java/com/cheeeese/global/util/RedisCacheUtil.java b/src/main/java/com/cheeeese/global/util/RedisCacheUtil.java new file mode 100644 index 0000000..b51e2ac --- /dev/null +++ b/src/main/java/com/cheeeese/global/util/RedisCacheUtil.java @@ -0,0 +1,55 @@ +package com.cheeeese.global.util; + +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; + +import java.util.Set; +import java.util.concurrent.TimeUnit; + +@Component +@RequiredArgsConstructor +public class RedisCacheUtil { + + @Qualifier("cacheRedisTemplate") + private final RedisTemplate redisTemplate; + + /** + * 캐시 저장 (유효 기간 존재) + */ + public void setValue(String key, Object value, Long expiredTime) { + redisTemplate.opsForValue().set(key, value, expiredTime, TimeUnit.MILLISECONDS); + } + + /** + * 캐시 영구 저장 + */ + public void setPermanent(String key, Object value) { + redisTemplate.opsForValue().set(key, value); + } + + public Long getValue(String key) { + return (Long) redisTemplate.opsForValue().get(key); + } + + /** + * 캐시 객체 조회 + */ + @SuppressWarnings("unchecked") + public T getObject(String key, Class clazz) { + return (T) redisTemplate.opsForValue().get(key); + } + + /** + * 패턴 기반 키 삭제 (대규모 삭제) + */ + public void deletePattern(String pattern) { + Set keys = redisTemplate.keys(pattern); + redisTemplate.delete(keys); + } + + public boolean exists(String key) { + return redisTemplate.hasKey(key); + } +} diff --git a/src/main/java/com/cheeeese/global/util/RedisUtil.java b/src/main/java/com/cheeeese/global/util/RedisUtil.java index a3a78f9..d2c7d41 100644 --- a/src/main/java/com/cheeeese/global/util/RedisUtil.java +++ b/src/main/java/com/cheeeese/global/util/RedisUtil.java @@ -1,6 +1,7 @@ package com.cheeeese.global.util; import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; @@ -10,6 +11,7 @@ @RequiredArgsConstructor public class RedisUtil { + @Qualifier("tokenRedisTemplate") private final RedisTemplate redisTemplate; public void setValue(String key, Object value, Long expiredTime) { From 3b2add33b3e838f8ecebe0d0f0428314380254ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Sat, 1 Nov 2025 15:45:37 +0900 Subject: [PATCH 185/402] =?UTF-8?q?#37=20feat:=20=EC=95=A8=EB=B2=94=20?= =?UTF-8?q?=EC=B0=B8=EC=97=AC=EC=9E=90=20=EC=A1=B0=ED=9A=8C=20response=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AlbumParticipantListResponse.java | 30 ++++++++++++++ .../response/AlbumParticipantResponse.java | 41 +++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 src/main/java/com/cheeeese/album/dto/response/AlbumParticipantListResponse.java create mode 100644 src/main/java/com/cheeeese/album/dto/response/AlbumParticipantResponse.java diff --git a/src/main/java/com/cheeeese/album/dto/response/AlbumParticipantListResponse.java b/src/main/java/com/cheeeese/album/dto/response/AlbumParticipantListResponse.java new file mode 100644 index 0000000..3eef646 --- /dev/null +++ b/src/main/java/com/cheeeese/album/dto/response/AlbumParticipantListResponse.java @@ -0,0 +1,30 @@ +package com.cheeeese.album.dto.response; + +import com.cheeeese.album.domain.type.Role; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Builder; + +import java.util.List; + +@Builder +@Schema(description = "앨범 참여자 공통 정보 구조") +public record AlbumParticipantListResponse( + @Schema(description = "참가자 목록 (정렬 포함)") + List participants +) { + @Builder + @Schema(description = "참가자 개별 정보") + public record ParticipantInfo( + @Schema(description = "이름", example = "우다현") + String name, + + @Schema(description = "프로필 이미지 URL", example = "https://cdn.cheeeese.com/users/1/profile.jpg") + String profileImage, + + @Schema(description = "역할 (MAKER/GUEST)", example = "GUEST") + Role role, + + @Schema(description = "현재 로그인 사용자 여부", example = "true") + boolean isMe + ) {} +} diff --git a/src/main/java/com/cheeeese/album/dto/response/AlbumParticipantResponse.java b/src/main/java/com/cheeeese/album/dto/response/AlbumParticipantResponse.java new file mode 100644 index 0000000..ae54b69 --- /dev/null +++ b/src/main/java/com/cheeeese/album/dto/response/AlbumParticipantResponse.java @@ -0,0 +1,41 @@ +package com.cheeeese.album.dto.response; + +import com.cheeeese.album.domain.type.Role; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Builder; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.List; + +@Builder +@Schema(description = "앨범 참여자 목록 응답 DTO (활성/만료 공용)") +public record AlbumParticipantResponse( + + @Schema(description = "만료 여부", example = "false") + boolean isExpired, + + @Schema(description = "앨범 제목", example = "졸업식") + String title, + + @Schema(description = "앨범 테마 이모지 (또는 이미지 URL)", example = "U+1F9C0") + String themeEmoji, + + @Schema(description = "이벤트 날짜 (yyyy-MM-dd)", example = "2025-02-01") + LocalDate eventDate, + + @Schema(description = "만료 일시 (ISO 형식)", example = "2025-10-30T12:11:27.282") + LocalDateTime expiredAt, + + @Schema(description = "총 참여 가능 인원", example = "64") + Integer maxParticipantCount, + + @Schema(description = "현재 앨범 참가 인원", example = "58") + Integer currentParticipantCount, + + @Schema(description = "참가자 목록 (정렬 포함)") + List participants, + + @Schema(description = "현재 사용자의 역할 (MAKER / GUEST)", example = "GUEST", nullable = true) + Role myRole +) {} From de697ae8235324f8c8a5730e0e18c0d961a273ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Sat, 1 Nov 2025 15:46:35 +0900 Subject: [PATCH 186/402] =?UTF-8?q?#37=20feat:=20=EC=95=A8=EB=B2=94=20?= =?UTF-8?q?=EC=B0=B8=EC=97=AC=EC=9E=90=20=EC=A1=B0=ED=9A=8C=20API=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../album/application/AlbumService.java | 57 +++++++++++++++++++ .../mapper/UserAlbumMapper.java | 32 +++++++++++ .../album/presentation/AlbumController.java | 18 ++++-- .../presentation/swagger/AlbumSwagger.java | 43 ++++++++++++-- .../global/common/code/SuccessCode.java | 1 + 5 files changed, 143 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/cheeeese/album/application/AlbumService.java b/src/main/java/com/cheeeese/album/application/AlbumService.java index d85bd0c..013d4a5 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumService.java +++ b/src/main/java/com/cheeeese/album/application/AlbumService.java @@ -29,7 +29,9 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; +import java.util.Comparator; import java.util.List; +import java.util.Map; import java.util.Optional; import java.util.stream.Collectors; @@ -139,6 +141,36 @@ public UploadAvailableCountResponse getAvailablePhotoCount(User user, String cod ); } + public AlbumParticipantResponse getAlbumParticipantList(User currentUser, String code) { + Album album = albumValidator.validateAlbumCode(code); + + boolean isExpired = album.isExpired(); + + // 참여 여부 검증 + UserAlbum myUserAlbum = userAlbumRepository.findByUserIdAndAlbumId(currentUser.getId(), album.getId()) + .orElseThrow(() -> new AlbumException(AlbumErrorCode.USER_NOT_PARTICIPANT)); + + Role myRole = myUserAlbum.getRole(); + + // 앨범의 전체 참여자 목록 + List userAlbums = userAlbumRepository.findAllByAlbumId(album.getId()); + + Map roleMap = userAlbums.stream() + .collect(Collectors.toMap( + ua -> ua.getUser().getId(), + UserAlbum::getRole + )); + + List participantInfos = buildSortedParticipantInfos(userAlbums, roleMap, currentUser); + + return UserAlbumMapper.toAlbumParticipantResponse( + album, + isExpired, + myRole, + participantInfos + ); + } + private int calculateRemainingUploadSlots(Album album) { int current = album.getCurrentPhotoCount(); int max = album.getMaxPhotoCount(); @@ -176,4 +208,29 @@ private List getRecentPhotosWithUploaderIn .map(AlbumMapper::toRecentPhotoResponse) .collect(Collectors.toList()); } + + private List buildSortedParticipantInfos( + List userAlbums, + Map roleMap, + User currentUser + ) { + return userAlbums.stream() + .map(UserAlbum::getUser) + .map(user -> { + Role role = roleMap.getOrDefault(user.getId(), Role.GUEST); + boolean isMe = user.getId().equals(currentUser.getId()); + return UserAlbumMapper.toParticipantInfo(user, role, isMe); + }) + .sorted(Comparator + .comparing(AlbumParticipantListResponse.ParticipantInfo::isMe, Comparator.reverseOrder()) + .thenComparing(p -> p.role() == Role.MAKER ? 0 : 1) + .thenComparing(AlbumParticipantListResponse.ParticipantInfo::name) + ) + .toList(); + } + + + + + } diff --git a/src/main/java/com/cheeeese/album/infrastructure/mapper/UserAlbumMapper.java b/src/main/java/com/cheeeese/album/infrastructure/mapper/UserAlbumMapper.java index ce00558..b67b178 100644 --- a/src/main/java/com/cheeeese/album/infrastructure/mapper/UserAlbumMapper.java +++ b/src/main/java/com/cheeeese/album/infrastructure/mapper/UserAlbumMapper.java @@ -3,8 +3,12 @@ import com.cheeeese.album.domain.Album; import com.cheeeese.album.domain.UserAlbum; import com.cheeeese.album.domain.type.Role; +import com.cheeeese.album.dto.response.AlbumParticipantListResponse; +import com.cheeeese.album.dto.response.AlbumParticipantResponse; import com.cheeeese.user.domain.User; +import java.util.List; + public class UserAlbumMapper { public static UserAlbum toEntity(User user, Album album, Role role) { @@ -15,4 +19,32 @@ public static UserAlbum toEntity(User user, Album album, Role role) { .isVisible(true) .build(); } + + public static AlbumParticipantListResponse.ParticipantInfo toParticipantInfo(User user, Role role, boolean isMe) { + return AlbumParticipantListResponse.ParticipantInfo.builder() + .name(user.getName()) + .role(role) + .profileImage(user.getProfileImage()) + .isMe(isMe) + .build(); + } + + public static AlbumParticipantResponse toAlbumParticipantResponse( + Album album, + boolean isExpired, + Role myRole, + List participants + ) { + return AlbumParticipantResponse.builder() + .isExpired(isExpired) + .title(album.getTitle()) + .themeEmoji(album.getThemeEmoji()) + .eventDate(album.getEventDate()) + .expiredAt(album.getExpiredAt()) + .maxParticipantCount(album.getParticipant()) + .currentParticipantCount(album.getCurrentParticipant()) + .participants(participants) + .myRole(myRole) + .build(); + } } diff --git a/src/main/java/com/cheeeese/album/presentation/AlbumController.java b/src/main/java/com/cheeeese/album/presentation/AlbumController.java index 67e59a2..b8acc2b 100644 --- a/src/main/java/com/cheeeese/album/presentation/AlbumController.java +++ b/src/main/java/com/cheeeese/album/presentation/AlbumController.java @@ -2,13 +2,10 @@ import com.cheeeese.album.application.AlbumService; import com.cheeeese.album.dto.request.AlbumCreationRequest; -import com.cheeeese.album.dto.response.AlbumCreationResponse; -import com.cheeeese.album.dto.response.AlbumEnterResponse; -import com.cheeeese.album.dto.response.AlbumInvitationResponse; +import com.cheeeese.album.dto.response.*; import com.cheeeese.album.presentation.swagger.AlbumSwagger; import com.cheeeese.global.common.CommonResponse; import com.cheeeese.global.util.CurrentUser; -import com.cheeeese.album.dto.response.UploadAvailableCountResponse; import com.cheeeese.user.domain.User; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; @@ -60,4 +57,17 @@ public CommonResponse getAvailableUploadCount( albumService.getAvailablePhotoCount(user, code) ); } + + @Override + @GetMapping("/{code}/participants") + public CommonResponse getAlbumParticipants( + @CurrentUser User user, + @PathVariable String code + ) { + return CommonResponse.success( + ALBUM_PARTICIPANT_FETCH_SUCCESS, + albumService.getAlbumParticipantList(user,code) + ); + } + } \ No newline at end of file diff --git a/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java b/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java index 4927239..141b143 100644 --- a/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java +++ b/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java @@ -1,12 +1,9 @@ package com.cheeeese.album.presentation.swagger; import com.cheeeese.album.dto.request.AlbumCreationRequest; -import com.cheeeese.album.dto.response.AlbumCreationResponse; -import com.cheeeese.album.dto.response.AlbumEnterResponse; -import com.cheeeese.album.dto.response.AlbumInvitationResponse; +import com.cheeeese.album.dto.response.*; import com.cheeeese.global.common.CommonResponse; import com.cheeeese.global.util.CurrentUser; -import com.cheeeese.album.dto.response.UploadAvailableCountResponse; import com.cheeeese.user.domain.User; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.media.Content; @@ -219,4 +216,42 @@ CommonResponse getAvailableUploadCount( @CurrentUser User user, @PathVariable String code ); + + @Operation( + summary = "앨범 참여자 정보 제공 API", + description = """ + ### PathVariable + --- + `code`: 앨범 코드 + + ### 로직 상세 + --- + 1. 만료된 앨범의 경우 -> title, emoji, evnetDate, participant, 참여자 리스트 제공 + 2. 유효한 앨범의 경우 -> 현재 참여한 수, 전체 앨범 수, 참여자 리스트 제공(정렬 O) + """ + ) + @ApiResponses(value = { + @ApiResponse( + responseCode = "200", + description = "앨범 참여자 조회가 성공적으로 완료되었습니다." + ), + @ApiResponse( + responseCode = "403", + description = "참여자가 아닌 사용자의 경우", + content = @Content( + mediaType = "application/json", + schema = @Schema(example = """ + { + "isSuccess": false, + "code": 403, + "message": "사용자가 해당 앨범의 참가자가 아닙니다." + } + """) + ) + ) + }) + CommonResponse getAlbumParticipants( + @CurrentUser User user, + @PathVariable String code + ); } \ No newline at end of file diff --git a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java index 3aa409c..66fc76e 100644 --- a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java +++ b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java @@ -24,6 +24,7 @@ public enum SuccessCode implements BaseCode { ALBUM_INVITATION_FETCH_SUCCESS(HttpStatus.OK, "앨범 초대장 정보 조회가 성공적으로 완료되었습니다."), ALBUM_ENTER_SUCCESS(HttpStatus.OK, "앨범 입장이 성공적으로 완료되었습니다."), ALBUM_CREATE_SUCCESS(HttpStatus.OK, "앨범 생성이 성공적으로 완료되었습니다."), + ALBUM_PARTICIPANT_FETCH_SUCCESS(HttpStatus.OK, "앨범 참여자 조회가 성공적으로 완료되었습니다."), // photo PHOTO_AVAILABLE_COUNT_FETCH_SUCCESS(HttpStatus.OK, "업로드 가능 사진 수 조회가 성공적으로 완료되었습니다."), From 2339f394bc9ec42f6ab0a831205c123dd289c841 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Sat, 1 Nov 2025 16:01:04 +0900 Subject: [PATCH 187/402] =?UTF-8?q?#37=20fix:=20=ED=94=BC=EB=93=9C?= =?UTF-8?q?=EB=B0=B1=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cheeeese/album/application/AlbumService.java | 15 ++++----------- .../persistence/UserAlbumRepository.java | 2 +- .../album/presentation/swagger/AlbumSwagger.java | 2 +- 3 files changed, 6 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/cheeeese/album/application/AlbumService.java b/src/main/java/com/cheeeese/album/application/AlbumService.java index 013d4a5..7d026fe 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumService.java +++ b/src/main/java/com/cheeeese/album/application/AlbumService.java @@ -155,13 +155,7 @@ public AlbumParticipantResponse getAlbumParticipantList(User currentUser, String // 앨범의 전체 참여자 목록 List userAlbums = userAlbumRepository.findAllByAlbumId(album.getId()); - Map roleMap = userAlbums.stream() - .collect(Collectors.toMap( - ua -> ua.getUser().getId(), - UserAlbum::getRole - )); - - List participantInfos = buildSortedParticipantInfos(userAlbums, roleMap, currentUser); + List participantInfos = buildSortedParticipantInfos(userAlbums, currentUser); return UserAlbumMapper.toAlbumParticipantResponse( album, @@ -211,13 +205,12 @@ private List getRecentPhotosWithUploaderIn private List buildSortedParticipantInfos( List userAlbums, - Map roleMap, User currentUser ) { return userAlbums.stream() - .map(UserAlbum::getUser) - .map(user -> { - Role role = roleMap.getOrDefault(user.getId(), Role.GUEST); + .map(userAlbum -> { + User user = userAlbum.getUser(); + Role role = userAlbum.getRole(); boolean isMe = user.getId().equals(currentUser.getId()); return UserAlbumMapper.toParticipantInfo(user, role, isMe); }) diff --git a/src/main/java/com/cheeeese/album/infrastructure/persistence/UserAlbumRepository.java b/src/main/java/com/cheeeese/album/infrastructure/persistence/UserAlbumRepository.java index acfa82e..c1eb92d 100644 --- a/src/main/java/com/cheeeese/album/infrastructure/persistence/UserAlbumRepository.java +++ b/src/main/java/com/cheeeese/album/infrastructure/persistence/UserAlbumRepository.java @@ -13,7 +13,7 @@ public interface UserAlbumRepository extends JpaRepository { @Query("SELECT ua FROM UserAlbum ua WHERE ua.user.id = :userId AND ua.album.id = :albumId") Optional findByUserIdAndAlbumId(@Param("userId") Long userId, @Param("albumId") Long albumId); - @Query("SELECT ua FROM UserAlbum ua WHERE ua.album.id = :albumId") + @Query("SELECT ua FROM UserAlbum ua JOIN FETCH ua.user WHERE ua.album.id = :albumId") List findAllByAlbumId(@Param("albumId") Long albumId); @Query("SELECT ua FROM UserAlbum ua WHERE ua.album.id = :albumId AND ua.user.id = :userId AND ua.role = :role") diff --git a/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java b/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java index 141b143..3f20a76 100644 --- a/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java +++ b/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java @@ -226,7 +226,7 @@ CommonResponse getAvailableUploadCount( ### 로직 상세 --- - 1. 만료된 앨범의 경우 -> title, emoji, evnetDate, participant, 참여자 리스트 제공 + 1. 만료된 앨범의 경우 -> title, emoji, eventDate, participant, 참여자 리스트 제공 2. 유효한 앨범의 경우 -> 현재 참여한 수, 전체 앨범 수, 참여자 리스트 제공(정렬 O) """ ) From 30336a9b9c55b89f23131d1c88705b2f63d99f49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Sat, 1 Nov 2025 16:09:47 +0900 Subject: [PATCH 188/402] =?UTF-8?q?#37=20fix:=20=ED=98=B8=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20->=20=EB=A9=94=EC=9D=B4=EC=BB=A4=20=EC=9B=8C?= =?UTF-8?q?=EB=94=A9=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cheeeese/album/application/AlbumService.java | 4 ++-- .../album/dto/response/AlbumInvitationResponse.java | 8 ++++---- .../album/infrastructure/mapper/AlbumMapper.java | 10 +++++----- .../album/presentation/swagger/AlbumSwagger.java | 2 +- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/cheeeese/album/application/AlbumService.java b/src/main/java/com/cheeeese/album/application/AlbumService.java index 7d026fe..c3ffb90 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumService.java +++ b/src/main/java/com/cheeeese/album/application/AlbumService.java @@ -83,9 +83,9 @@ public AlbumInvitationResponse getInvitationInfo(String code) { if (album.isExpired()) { return AlbumMapper.toExpiredInvitationResponse(album); } - User host = getMaker(album.getMakerId()); + User maker = getMaker(album.getMakerId()); - return AlbumMapper.toInvitationResponse(album, host); + return AlbumMapper.toInvitationResponse(album, maker); } @Transactional diff --git a/src/main/java/com/cheeeese/album/dto/response/AlbumInvitationResponse.java b/src/main/java/com/cheeeese/album/dto/response/AlbumInvitationResponse.java index 4a30cb7..9fed092 100644 --- a/src/main/java/com/cheeeese/album/dto/response/AlbumInvitationResponse.java +++ b/src/main/java/com/cheeeese/album/dto/response/AlbumInvitationResponse.java @@ -20,11 +20,11 @@ public record AlbumInvitationResponse( @Schema(description = "열람 종료 시각 (만료일)", example = "2025-03-05T00:00:00") LocalDateTime expiredAt, - @Schema(description = "호스트 이름", example = "이유") - String hostName, + @Schema(description = "메이커 이름", example = "이유") + String makerName, - @Schema(description = "호스트 프로필 이미지 URL", example = "http://example.com/host_profile.png") - String hostProfileImage, + @Schema(description = "메이커 프로필 이미지 URL", example = "http://example.com/host_profile.png") + String makerProfileImage, @Schema(description = "앨범 만료 여부", example = "false") boolean isExpired diff --git a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java index 6ab21b0..2020561 100644 --- a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java +++ b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java @@ -59,14 +59,14 @@ public static AlbumCreationResponse toCreationResponse(Album album) { /** * Album 엔티티와 Maker User 정보를 초대장 응답 DTO로 변환합니다. */ - public static AlbumInvitationResponse toInvitationResponse(Album album, User host) { + public static AlbumInvitationResponse toInvitationResponse(Album album, User user) { return AlbumInvitationResponse.builder() .title(album.getTitle()) .themeEmoji(album.getThemeEmoji()) .eventDate(album.getEventDate().toString()) .expiredAt(album.getExpiredAt()) - .hostName(host.getName()) - .hostProfileImage(host.getProfileImage()) + .makerName(user.getName()) + .makerProfileImage(user.getProfileImage()) .isExpired(false) .build(); } @@ -80,8 +80,8 @@ public static AlbumInvitationResponse toExpiredInvitationResponse(Album album) { .themeEmoji(album.getThemeEmoji()) .eventDate(album.getEventDate().toString()) .expiredAt(album.getExpiredAt()) - .hostName(null) - .hostProfileImage(null) + .makerName(null) + .makerProfileImage(null) .isExpired(true) .build(); } diff --git a/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java b/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java index 3f20a76..bab089a 100644 --- a/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java +++ b/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java @@ -51,7 +51,7 @@ CommonResponse createAlbum( ### API 설명 --- - URL/QR을 통해 앨범 코드를 전달 받아 제목, 만료일, 호스트 등 기본 정보를 제공합니다. 로그인 여부와 관계없이 호출 가능 + URL/QR을 통해 앨범 코드를 전달 받아 제목, 만료일, 메이커 등 기본 정보를 제공합니다. 로그인 여부와 관계없이 호출 가능 """ ) @ApiResponses(value = { From 18bad0d61de977c3b8cf502cec2a8591a462f99f Mon Sep 17 00:00:00 2001 From: zyovn Date: Sat, 1 Nov 2025 16:15:44 +0900 Subject: [PATCH 189/402] =?UTF-8?q?#21=20feat:=20=EB=B8=8C=EB=9E=9C?= =?UTF-8?q?=EC=B9=98=20=EA=B5=90=EC=B2=B4=EB=A5=BC=20=EC=9C=84=ED=95=9C=20?= =?UTF-8?q?=EC=A4=91=EA=B0=84=20=EC=BB=A4=EB=B0=8B=20(=EC=95=A8=EB=B2=94?= =?UTF-8?q?=20=EB=82=B4=20=EC=82=AC=EC=A7=84=20=EB=AA=A9=EB=A1=9D=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20=EB=A1=9C=EC=A7=81=20=EC=9D=BC=EB=B6=80=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../photo/application/PhotoQueryService.java | 39 +++++++++++++++++++ .../photo/dto/cache/PhotoCachedList.java | 11 ++++++ .../photo/dto/response/PhotoListResponse.java | 10 +++++ 3 files changed, 60 insertions(+) create mode 100644 src/main/java/com/cheeeese/photo/application/PhotoQueryService.java create mode 100644 src/main/java/com/cheeeese/photo/dto/cache/PhotoCachedList.java create mode 100644 src/main/java/com/cheeeese/photo/dto/response/PhotoListResponse.java diff --git a/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java b/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java new file mode 100644 index 0000000..ca1f03e --- /dev/null +++ b/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java @@ -0,0 +1,39 @@ +package com.cheeeese.photo.application; + + +import com.cheeeese.global.util.RedisCacheUtil; +import com.cheeeese.photo.dto.response.PhotoListResponse; +import com.cheeeese.photo.infrastructure.persistence.PhotoRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Service +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class PhotoQueryService { + + private final PhotoRepository photoRepository; + private final RedisCacheUtil redisCacheUtil; + + private static final String PHOTO_KEY = "album:%s:photos:page:%d"; + private static final String VERSION_KEY = "album:%s:version"; + + public List getPhotoList( + String code, + int page, + int size + ) { + String photoKey = String.format(PHOTO_KEY, code, page); + String versionKey = String.format(VERSION_KEY, code); + + Long curVersion = redisCacheUtil.getValue(versionKey); + if (curVersion == null) { + curVersion = 0L; + } + + + } +} diff --git a/src/main/java/com/cheeeese/photo/dto/cache/PhotoCachedList.java b/src/main/java/com/cheeeese/photo/dto/cache/PhotoCachedList.java new file mode 100644 index 0000000..b9f76d2 --- /dev/null +++ b/src/main/java/com/cheeeese/photo/dto/cache/PhotoCachedList.java @@ -0,0 +1,11 @@ +package com.cheeeese.photo.dto.cache; + +import lombok.Builder; + +import java.util.List; + +@Builder +public record PhotoCachedList( + Long version +) { +} diff --git a/src/main/java/com/cheeeese/photo/dto/response/PhotoListResponse.java b/src/main/java/com/cheeeese/photo/dto/response/PhotoListResponse.java new file mode 100644 index 0000000..4d649fc --- /dev/null +++ b/src/main/java/com/cheeeese/photo/dto/response/PhotoListResponse.java @@ -0,0 +1,10 @@ +package com.cheeeese.photo.dto.response; + +import lombok.Builder; + +@Builder +public record PhotoListResponse( + Long photoId, + String thumbnailUrl +) { +} From d973fc7c4a94a59cdea1fe8f82619e54659f6f07 Mon Sep 17 00:00:00 2001 From: zyovn Date: Sat, 1 Nov 2025 18:34:16 +0900 Subject: [PATCH 190/402] =?UTF-8?q?#40=20feat:=20isTermsAgreement=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C=20=EB=B0=8F=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20user,=20album=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../album/application/AlbumService.java | 3 +- .../java/com/cheeeese/album/domain/Album.java | 7 +--- .../dto/request/AlbumCreationRequest.java | 5 +-- .../infrastructure/mapper/AlbumMapper.java | 4 +- .../UserAlbumServiceIntegrationTest.java | 25 ++++++----- .../com/cheeeese/fixture/FixtureFactory.java | 42 +++++++++++++++---- 6 files changed, 52 insertions(+), 34 deletions(-) diff --git a/src/main/java/com/cheeeese/album/application/AlbumService.java b/src/main/java/com/cheeeese/album/application/AlbumService.java index d85bd0c..73ef279 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumService.java +++ b/src/main/java/com/cheeeese/album/application/AlbumService.java @@ -61,8 +61,7 @@ public AlbumCreationResponse createAlbum(User user, AlbumCreationRequest request request.participant(), request.eventDate(), true, - LocalDateTime.now().plusDays(7), - request.isTermsAgreement() + LocalDateTime.now().plusDays(7) ); albumRepository.save(album); diff --git a/src/main/java/com/cheeeese/album/domain/Album.java b/src/main/java/com/cheeeese/album/domain/Album.java index cb3d2f9..c236aea 100644 --- a/src/main/java/com/cheeeese/album/domain/Album.java +++ b/src/main/java/com/cheeeese/album/domain/Album.java @@ -58,9 +58,6 @@ public class Album extends BaseEntity { @Column(name = "status", nullable = false) private AlbumStatus status; - @Column(name = "is_terms_agreement", nullable = false) - private boolean isTermsAgreement; - public enum AlbumStatus { ACTIVE, EXPIRED, DELETED } @@ -82,8 +79,7 @@ private Album( int currentPhotoCount, boolean isInfoAvailable, LocalDateTime expiredAt, - AlbumStatus status, - boolean isTermsAgreement + AlbumStatus status ) { this.makerId = makerId; this.title = title; @@ -97,6 +93,5 @@ private Album( this.isInfoAvailable = isInfoAvailable; this.expiredAt = expiredAt; this.status = status; - this.isTermsAgreement = isTermsAgreement; } } diff --git a/src/main/java/com/cheeeese/album/dto/request/AlbumCreationRequest.java b/src/main/java/com/cheeeese/album/dto/request/AlbumCreationRequest.java index 5063712..220f4a3 100644 --- a/src/main/java/com/cheeeese/album/dto/request/AlbumCreationRequest.java +++ b/src/main/java/com/cheeeese/album/dto/request/AlbumCreationRequest.java @@ -18,9 +18,6 @@ public record AlbumCreationRequest( int participant, @Schema(description = "행사 날짜", example = "2025-02-01") - LocalDate eventDate, - - @Schema(description = "앨범 생성 필수 약관 동의", example = "true") - boolean isTermsAgreement + LocalDate eventDate ) { } diff --git a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java index 6ab21b0..7e7239f 100644 --- a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java +++ b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java @@ -23,8 +23,7 @@ public static Album toEntity( int participant, LocalDate eventDate, boolean isInfoAvailable, - LocalDateTime expiredAt, - boolean isTermsAgreement + LocalDateTime expiredAt ) { return Album.builder() .makerId(makerId) @@ -39,7 +38,6 @@ public static Album toEntity( .isInfoAvailable(isInfoAvailable) .expiredAt(expiredAt) .status(Album.AlbumStatus.ACTIVE) - .isTermsAgreement(isTermsAgreement) .build(); } diff --git a/src/test/java/com/cheeeese/album/integration/UserAlbumServiceIntegrationTest.java b/src/test/java/com/cheeeese/album/integration/UserAlbumServiceIntegrationTest.java index 478cbf8..e704b45 100644 --- a/src/test/java/com/cheeeese/album/integration/UserAlbumServiceIntegrationTest.java +++ b/src/test/java/com/cheeeese/album/integration/UserAlbumServiceIntegrationTest.java @@ -6,6 +6,8 @@ import com.cheeeese.album.infrastructure.persistence.AlbumRepository; import com.cheeeese.album.infrastructure.persistence.UserAlbumRepository; import com.cheeeese.fixture.FixtureFactory; +import com.cheeeese.user.domain.User; +import com.cheeeese.user.infrastructure.persistence.UserRepository; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -23,19 +25,22 @@ public class UserAlbumServiceIntegrationTest { private static final int ITERATIONS = 1000; - private static final Long TEST_USER = 1L; - private static Long testAlbumId; + private static User testUser; + private static Album testAlbum; @BeforeAll static void setUp( + @Autowired UserRepository userRepository, @Autowired AlbumRepository albumRepository, @Autowired UserAlbumRepository userAlbumRepository ) { - Album album = FixtureFactory.createAlbum(TEST_USER); - albumRepository.save(album); - testAlbumId = album.getId(); + testUser = FixtureFactory.createKakaoUser(); + userRepository.save(testUser); - UserAlbum userAlbum = FixtureFactory.createHostUserAlbum(TEST_USER, testAlbumId); + testAlbum = FixtureFactory.createAlbum(testUser.getId()); + albumRepository.save(testAlbum); + + UserAlbum userAlbum = FixtureFactory.createHostUserAlbum(testUser, testAlbum); userAlbumRepository.save(userAlbum); System.out.println("[테스트 데이터 생성 완료]"); @@ -45,8 +50,8 @@ static void setUp( @DisplayName("JOIN 조회 vs 직접 조회 성능 테스트") void compareJoinQueryAndDirectQueryPerformance() { for (int i = 0; i < 5; i++) { - albumRepository.findByMakerId(TEST_USER); - userAlbumRepository.findByAlbumIdAndUserIdAndRole(testAlbumId, TEST_USER, Role.MAKER); + albumRepository.findByMakerId(testAlbum.getMakerId()); + userAlbumRepository.findByAlbumIdAndUserIdAndRole(testAlbum.getId(), testUser.getId(), Role.MAKER); } long total1 = 0; @@ -54,11 +59,11 @@ void compareJoinQueryAndDirectQueryPerformance() { for (int i = 0; i < ITERATIONS; i++) { long start = System.nanoTime(); - albumRepository.findByMakerId(TEST_USER); + albumRepository.findByMakerId(testAlbum.getMakerId()); total1 += System.nanoTime() - start; start = System.nanoTime(); - userAlbumRepository.findByAlbumIdAndUserIdAndRole(testAlbumId, TEST_USER, Role.MAKER); + userAlbumRepository.findByAlbumIdAndUserIdAndRole(testAlbum.getId(), testUser.getId(), Role.MAKER); total2 += System.nanoTime() - start; } diff --git a/src/test/java/com/cheeeese/fixture/FixtureFactory.java b/src/test/java/com/cheeeese/fixture/FixtureFactory.java index 3190b0e..fb7b30f 100644 --- a/src/test/java/com/cheeeese/fixture/FixtureFactory.java +++ b/src/test/java/com/cheeeese/fixture/FixtureFactory.java @@ -5,14 +5,41 @@ import com.cheeeese.album.domain.type.Role; import com.cheeeese.album.infrastructure.mapper.AlbumMapper; import com.cheeeese.album.infrastructure.mapper.UserAlbumMapper; +import com.cheeeese.oauth2.domain.OAuth2UserInfo; +import com.cheeeese.oauth2.infrastructure.userinfo.KakaoUserInfo; +import com.cheeeese.user.domain.User; +import com.cheeeese.user.infrastructure.mapper.UserMapper; import com.github.f4b6a3.uuid.UuidCreator; import java.time.LocalDate; import java.time.LocalDateTime; +import java.util.HashMap; +import java.util.Map; import java.util.UUID; public class FixtureFactory { + public static KakaoUserInfo createKakaoUserInfo() { + Map profile = new HashMap<>(); + profile.put("nickname", "카카오유저"); + profile.put("profile_image_url", "https://example.com/kakao-profile.png"); + + Map kakaoAccount = new HashMap<>(); + kakaoAccount.put("email", "kakao_user@test.com"); + kakaoAccount.put("profile", profile); + + Map attributes = new HashMap<>(); + attributes.put("id", 1234567890L); + attributes.put("kakao_account", kakaoAccount); + + return new KakaoUserInfo(attributes); + } + + public static User createKakaoUser() { + KakaoUserInfo kakaoInfo = createKakaoUserInfo(); + return UserMapper.toEntity(kakaoInfo); + } + public static Album createAlbum(Long userId) { return AlbumMapper.toEntity( userId, @@ -22,8 +49,7 @@ public static Album createAlbum(Long userId) { 4, LocalDate.of(2025, 1, 1), true, - LocalDateTime.now().plusDays(7), - true + LocalDateTime.now().plusDays(7) ); } @@ -36,8 +62,7 @@ public static Album createAlbumV4(int i) { 4, LocalDate.of(2025, 1, 1), true, - LocalDateTime.now().plusDays(7), - true + LocalDateTime.now().plusDays(7) ); } @@ -50,15 +75,14 @@ public static Album createAlbumV7(int i) { 4, LocalDate.of(2025, 1, 1), true, - LocalDateTime.now().plusDays(7), - true + LocalDateTime.now().plusDays(7) ); } - public static UserAlbum createHostUserAlbum(Long userId, Long albumId) { + public static UserAlbum createHostUserAlbum(User user, Album album) { return UserAlbumMapper.toEntity( - userId, - albumId, + user, + album, Role.MAKER ); } From c708fcd41c7fb364beada2b2e9593fb5b7584933 Mon Sep 17 00:00:00 2001 From: zyovn Date: Sat, 1 Nov 2025 18:43:30 +0900 Subject: [PATCH 191/402] =?UTF-8?q?#40=20fix:=20swagger=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20=EB=B0=8F=20validator=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cheeeese/album/application/validator/AlbumValidator.java | 4 ---- .../com/cheeeese/album/exception/code/AlbumErrorCode.java | 1 - .../com/cheeeese/album/presentation/swagger/AlbumSwagger.java | 3 +-- 3 files changed, 1 insertion(+), 7 deletions(-) diff --git a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java index 8ee05a7..4ef79ec 100644 --- a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java +++ b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java @@ -21,10 +21,6 @@ public class AlbumValidator { private final UserAlbumRepository userAlbumRepository; public void validateAlbumCreation(long createdThisWeek, AlbumCreationRequest request) { - if (!request.isTermsAgreement()) { - throw new AlbumException(AlbumErrorCode.ALBUM_REQUIRED_TERMS_NOT_AGREED); - } - if (request.themeEmoji() == null || request.themeEmoji().isBlank()) { throw new AlbumException(AlbumErrorCode.ALBUM_THEME_EMOJI_NOT_SELECTED); } diff --git a/src/main/java/com/cheeeese/album/exception/code/AlbumErrorCode.java b/src/main/java/com/cheeeese/album/exception/code/AlbumErrorCode.java index f4a0cd4..5a41b41 100644 --- a/src/main/java/com/cheeeese/album/exception/code/AlbumErrorCode.java +++ b/src/main/java/com/cheeeese/album/exception/code/AlbumErrorCode.java @@ -14,7 +14,6 @@ public enum AlbumErrorCode implements BaseCode { ALBUM_MAX_PARTICIPANT_REACHED(HttpStatus.BAD_REQUEST, "앨범의 최대 참가 인원수를 초과했습니다."), USER_IS_BLACKLISTED(HttpStatus.FORBIDDEN, "앨범 관리자에 의해 접근이 금지된 사용자입니다."), USER_ALREADY_JOINED_CONCURRENTLY(HttpStatus.CONFLICT, "동시성 오류: 이미 앨범에 참여 요청이 완료되었습니다."), - ALBUM_REQUIRED_TERMS_NOT_AGREED(HttpStatus.BAD_REQUEST, "앨범 생성 필수 약관에 동의하지 않았습니다."), ALBUM_THEME_EMOJI_NOT_SELECTED(HttpStatus.BAD_REQUEST, "앨범 썸네일 이모지가 선택되지 않았습니다."), ALBUM_TITLE_REQUIRED(HttpStatus.BAD_REQUEST, "행사 이름이 입력되지 않았습니다."), ALBUM_EVENT_DATE_REQUIRED(HttpStatus.BAD_REQUEST, "행사 날짜가 입력되지 않았습니다."), diff --git a/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java b/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java index 4927239..c7a94c7 100644 --- a/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java +++ b/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java @@ -28,8 +28,7 @@ public interface AlbumSwagger { `themeEmoji`: 앨범 썸네일 이모지 (String) \n `title`: 앨범 이름 (String) \n `participant`: 참여자 수 (int) \n - `eventDate`: 행사 날짜 (LocalDate) \n - `isTermsAgreement`: 앨범 생성 필수 약관 동의 (boolean) + `eventDate`: 행사 날짜 (LocalDate) """ ) @ApiResponses(value = { From 6c43641aea103396960ee8d4b4bdf4d387700865 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Sun, 2 Nov 2025 19:30:23 +0900 Subject: [PATCH 192/402] =?UTF-8?q?#37=20fix:=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20import=EB=AC=B8=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/cheeeese/album/application/AlbumService.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/cheeeese/album/application/AlbumService.java b/src/main/java/com/cheeeese/album/application/AlbumService.java index c3ffb90..0bda33e 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumService.java +++ b/src/main/java/com/cheeeese/album/application/AlbumService.java @@ -31,7 +31,6 @@ import java.time.LocalTime; import java.util.Comparator; import java.util.List; -import java.util.Map; import java.util.Optional; import java.util.stream.Collectors; From 3365cc3042567c141829e4f5ebe6a971936bd640 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Sun, 2 Nov 2025 19:56:50 +0900 Subject: [PATCH 193/402] =?UTF-8?q?#42=20fix:=20=EB=B2=84=ED=82=B7?= =?UTF-8?q?=EB=AA=85/objectKey=20=ED=98=95=ED=83=9C=EB=A1=9C=20=EC=A0=80?= =?UTF-8?q?=EC=9E=A5=20=EB=B0=A9=EC=8B=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cheeeese/photo/application/PhotoService.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/cheeeese/photo/application/PhotoService.java b/src/main/java/com/cheeeese/photo/application/PhotoService.java index 4d4d0fd..da54a9b 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoService.java @@ -15,6 +15,7 @@ import com.cheeeese.photo.infrastructure.persistence.PhotoRepository; import com.cheeeese.user.domain.User; import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; import org.springframework.data.domain.PageRequest; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -34,6 +35,9 @@ public class PhotoService { private final AlbumRepository albumRepository; private final PresignedUrlService presignedUrlService; + @Value("${ncp.object-storage.bucket}") + private String bucket; + private static final String ORIGINAL_PHOTO_PATH_FORMAT = "album/%s/original/%d_%s"; public List getRecentPhotosForNewEnter(Long albumId) { @@ -108,9 +112,10 @@ private PhotoPresignedUrlResponse.PresignedUrlInfo createPresignedUrlForFile( photo.getId(), safeFileName ); + String imageUrl = bucket + "/" + objectKey; + photo.updateImageUrl(imageUrl); String uploadUrl = presignedUrlService.generatePresignedPutUrl(objectKey, file.contentType()); - photo.updateImageUrl(objectKey); return PhotoMapper.toPresignedUrlInfo(photo.getId(), uploadUrl); } From bb6465c68f69efe6b9d768c5a23c845c34b365b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Sun, 2 Nov 2025 20:46:52 +0900 Subject: [PATCH 194/402] =?UTF-8?q?#42=20fix:=20photoStatus=20=EC=97=90=20?= =?UTF-8?q?PROCESSING=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cheeeese/photo/application/PhotoCallbackService.java | 2 +- src/main/java/com/cheeeese/photo/domain/PhotoStatus.java | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/com/cheeeese/photo/application/PhotoCallbackService.java b/src/main/java/com/cheeeese/photo/application/PhotoCallbackService.java index a238b2c..b0ecd7e 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoCallbackService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoCallbackService.java @@ -19,7 +19,7 @@ public class PhotoCallbackService { public void markUploadCompleted(PhotoCompleteRequest request) { int updated = photoRepository.updateStatusAndUrl( request.photoId(), - PhotoStatus.PROCESSING, + PhotoStatus.UPLOADING, PhotoStatus.COMPLETED, request.thumbnailUrl() ); diff --git a/src/main/java/com/cheeeese/photo/domain/PhotoStatus.java b/src/main/java/com/cheeeese/photo/domain/PhotoStatus.java index a1351a9..ac4b3f8 100644 --- a/src/main/java/com/cheeeese/photo/domain/PhotoStatus.java +++ b/src/main/java/com/cheeeese/photo/domain/PhotoStatus.java @@ -2,7 +2,6 @@ public enum PhotoStatus { UPLOADING, - PROCESSING, COMPLETED, FAILED } From 0789f5db7c083e0f2299088fc214e34f628e5bd0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Sun, 2 Nov 2025 20:58:45 +0900 Subject: [PATCH 195/402] =?UTF-8?q?#42=20fix:=20report=20API=20request=20?= =?UTF-8?q?=EB=B6=80=EB=B6=84=EC=97=90=20=EC=84=B1=EA=B3=B5=20=EC=97=AC?= =?UTF-8?q?=EB=B6=80=20=EC=A0=9C=EC=99=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../photo/application/PhotoService.java | 49 +++---------------- .../application/validator/PhotoValidator.java | 7 +-- .../dto/request/PhotoUploadReportRequest.java | 8 +-- .../presentation/swagger/PhotoSwagger.java | 20 +------- 4 files changed, 14 insertions(+), 70 deletions(-) diff --git a/src/main/java/com/cheeeese/photo/application/PhotoService.java b/src/main/java/com/cheeeese/photo/application/PhotoService.java index da54a9b..97e8041 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoService.java @@ -22,7 +22,6 @@ import java.util.List; import java.util.stream.Collectors; -import java.util.stream.Stream; @Service @RequiredArgsConstructor @@ -64,12 +63,14 @@ public PhotoPresignedUrlResponse createPresignedUrls(User user, PhotoPresignedUr @Transactional public void reportUploadResult(User user, PhotoUploadReportRequest request) { - PhotoValidator.ValidatedPhotos validated = validateRequestAndPhotos(user, request); - Long albumId = validated.albumId(); + List failurePhotoIds = request.failurePhotoIds().stream() + .distinct() + .toList(); - handleSuccessfulUploads(user.getId(), request.successPhotoIds()); + PhotoValidator.ValidatedPhotos validated = photoValidator.validatePhotos(user.getId(), failurePhotoIds); + Long albumId = validated.albumId(); - handleFailedUploads(user.getId(), albumId, request.failurePhotoIds()); + handleFailedUploads(user.getId(), albumId, failurePhotoIds); } private Album validateAlbumAndPermission(User user, String albumCode) { @@ -130,45 +131,7 @@ private String sanitizeFileName(String raw) { return name; } - private PhotoValidator.ValidatedPhotos validateRequestAndPhotos(User user, PhotoUploadReportRequest request) { - var success = new java.util.HashSet<>(request.successPhotoIds()); - var failure = new java.util.HashSet<>(request.failurePhotoIds()); - success.retainAll(failure); - - if (!success.isEmpty()) { - throw new PhotoException(PhotoErrorCode.PHOTO_REPORT_CONFLICTING_IDS); - } - - List allPhotoIds = Stream.concat( - request.successPhotoIds().stream(), - request.failurePhotoIds().stream() - ).toList(); - - return photoValidator.validatePhotos(user.getId(), allPhotoIds); - } - - private void handleSuccessfulUploads(Long userId, List successPhotoIds) { - if (successPhotoIds == null || successPhotoIds.isEmpty()) { - return; - } - - int updatedRows = photoRepository.updateStatusByIdsAndUserIdAndExpectedStatus( - successPhotoIds, - userId, - PhotoStatus.PROCESSING, - PhotoStatus.UPLOADING - ); - - if (updatedRows != successPhotoIds.size()) { - throw new PhotoException(PhotoErrorCode.PHOTO_STATUS_UPDATE_FAILED); - } - } - private void handleFailedUploads(Long userId, Long albumId, List failurePhotoIds) { - if (failurePhotoIds == null || failurePhotoIds.isEmpty()) { - return; - } - int updatedRows = photoRepository.updateStatusByIdsAndUserIdAndExpectedStatus( failurePhotoIds, userId, diff --git a/src/main/java/com/cheeeese/photo/application/validator/PhotoValidator.java b/src/main/java/com/cheeeese/photo/application/validator/PhotoValidator.java index 502bdb9..51b4a44 100644 --- a/src/main/java/com/cheeeese/photo/application/validator/PhotoValidator.java +++ b/src/main/java/com/cheeeese/photo/application/validator/PhotoValidator.java @@ -80,14 +80,15 @@ private void validatePhotoIdsNotEmpty(List photoIds) { * photoId 리스트 기반으로 존재하는 사진 조회 및 존재 검증 */ private List findAndValidateExistence(List photoIds) { - Set requestedIds = new HashSet<>(photoIds); - List photos = photoRepository.findAllById(requestedIds); + List photos = photoRepository.findAllById(photoIds); + + Set uniqueRequestedIds = new HashSet<>(photoIds); Set foundIds = photos.stream() .map(Photo::getId) .collect(Collectors.toSet()); - Set missingIds = requestedIds.stream() + Set missingIds = uniqueRequestedIds.stream() .filter(id -> !foundIds.contains(id)) .collect(Collectors.toSet()); diff --git a/src/main/java/com/cheeeese/photo/dto/request/PhotoUploadReportRequest.java b/src/main/java/com/cheeeese/photo/dto/request/PhotoUploadReportRequest.java index c983c9c..6ac7e69 100644 --- a/src/main/java/com/cheeeese/photo/dto/request/PhotoUploadReportRequest.java +++ b/src/main/java/com/cheeeese/photo/dto/request/PhotoUploadReportRequest.java @@ -7,14 +7,10 @@ import java.util.List; @Builder -@Schema(description = "사진 업로드 결과 보고 요청 (부분 성공/실패 처리)") +@Schema(description = "사진 업로드 결과 보고 요청 (실패 처리)") public record PhotoUploadReportRequest( @NotNull - @Schema(description = "업로드가 성공적으로 완료된 사진 ID 목록 (UPLOADING -> PROCESSING)", example = "[100, 102]") - List successPhotoIds, - - @NotNull - @Schema(description = "업로드 중 실패하거나 취소된 사진 ID 목록 (UPLOADING -> FAILED & 롤백)", example = "[101, 103]") + @Schema(description = "업로드 중 실패하거나 취소된 사진 ID 목록 (PROCESSING -> FAILED & 롤백)", example = "[1, 3]") List failurePhotoIds ) { } \ No newline at end of file diff --git a/src/main/java/com/cheeeese/photo/presentation/swagger/PhotoSwagger.java b/src/main/java/com/cheeeese/photo/presentation/swagger/PhotoSwagger.java index 634ad64..d1e89a9 100644 --- a/src/main/java/com/cheeeese/photo/presentation/swagger/PhotoSwagger.java +++ b/src/main/java/com/cheeeese/photo/presentation/swagger/PhotoSwagger.java @@ -74,17 +74,15 @@ CommonResponse createPresignedUrls( ); @Operation( - summary = "사진 업로드 결과 보고 API (부분 성공/실패 처리)", // [추가] + summary = "사진 업로드 결과 보고 API (실패 처리)", // [추가] description = """ ### RequestBody --- - `successPhotoIds`: Object Storage 업로드 성공 ID 목록 \n `failurePhotoIds`: Object Storage 업로드 실패 ID 목록 \n ### 로직 상세 --- - 1. **Success IDs 처리**: `Photo` 상태를 `UPLOADING`에서 `PROCESSING`으로 변경 (후처리 대기). - 2. **Failure IDs 처리**: `Photo` 상태를 `UPLOADING`에서 `FAILED`으로 변경, 앨범의 `currentPhotoCount`를 **롤백** (감소)합니다. + 1. **Failure IDs 처리**: `Photo` 상태를 `UPLOADING`에서 `FAILED`으로 변경, 앨범의 `currentPhotoCount`를 **롤백** (감소)합니다. """ ) @ApiResponses(value = { @@ -106,20 +104,6 @@ CommonResponse createPresignedUrls( """) ) ), - @ApiResponse( - responseCode = "400", - description = "업로드 결과(success/failure) 목록에 중복된 사진 ID가 포함되어 있습니다.", - content = @Content( - mediaType = "application/json", - schema = @Schema(example = """ - { - "isSuccess": false, - "code": 400, - "message": "업로드 결과(success/failure) 목록에 중복된 사진 ID가 포함되어 있습니다." - } - """) - ) - ), @ApiResponse( responseCode = "403", description = "사용자와 사진의 소유자가 일치하지 않습니다.", From c401b5e3d694d4442259e9ebd96633684665a9b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Sun, 2 Nov 2025 21:10:05 +0900 Subject: [PATCH 196/402] =?UTF-8?q?#42=20feat:=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=9E=90=EC=9D=98=20photoCnt=20=EC=A6=9D=EA=B0=80,=20=EA=B0=90?= =?UTF-8?q?=EC=86=8C=20=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cheeeese/photo/application/PhotoService.java | 13 +++++++++---- src/main/java/com/cheeeese/user/domain/User.java | 8 ++++++++ 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/cheeeese/photo/application/PhotoService.java b/src/main/java/com/cheeeese/photo/application/PhotoService.java index 97e8041..fc36b9c 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoService.java @@ -52,11 +52,15 @@ public PhotoPresignedUrlResponse createPresignedUrls(User user, PhotoPresignedUr Album album = validateAlbumAndPermission(user, request.albumCode()); validateUploadRequest(album, request); - int updatedRows = albumRepository.incrementPhotoCount(album.getId(), request.fileInfos().size()); + int uploadCount = request.fileInfos().size(); + + int updatedRows = albumRepository.incrementPhotoCount(album.getId(), uploadCount); if (updatedRows != 1) { throw new PhotoException(PhotoErrorCode.PHOTO_COUNT_INCREMENT_FAILED); } + user.incrementPhotoCount(uploadCount); + List presignedUrls = generatePresignedUrls(user, album, request.fileInfos()); return PhotoMapper.toPresignedUrlResponse(presignedUrls); } @@ -70,7 +74,7 @@ public void reportUploadResult(User user, PhotoUploadReportRequest request) { PhotoValidator.ValidatedPhotos validated = photoValidator.validatePhotos(user.getId(), failurePhotoIds); Long albumId = validated.albumId(); - handleFailedUploads(user.getId(), albumId, failurePhotoIds); + handleFailedUploads(user, albumId, failurePhotoIds); } private Album validateAlbumAndPermission(User user, String albumCode) { @@ -131,10 +135,10 @@ private String sanitizeFileName(String raw) { return name; } - private void handleFailedUploads(Long userId, Long albumId, List failurePhotoIds) { + private void handleFailedUploads(User user, Long albumId, List failurePhotoIds) { int updatedRows = photoRepository.updateStatusByIdsAndUserIdAndExpectedStatus( failurePhotoIds, - userId, + user.getId(), PhotoStatus.FAILED, PhotoStatus.UPLOADING ); @@ -144,6 +148,7 @@ private void handleFailedUploads(Long userId, Long albumId, List failurePh } if (updatedRows > 0) { + user.decrementPhotoCount(updatedRows); int decremented = albumRepository.decrementPhotoCount(albumId, updatedRows); if (decremented == 0) { throw new PhotoException(PhotoErrorCode.PHOTO_COUNT_DECREMENT_FAILED); diff --git a/src/main/java/com/cheeeese/user/domain/User.java b/src/main/java/com/cheeeese/user/domain/User.java index 316d5ee..da2de3f 100644 --- a/src/main/java/com/cheeeese/user/domain/User.java +++ b/src/main/java/com/cheeeese/user/domain/User.java @@ -99,4 +99,12 @@ public void saveUserAgreement( this.isMarketingAgreement = isMarketingAgreement; this.isThirdPartyAgreement = isThirdPartyAgreement; } + + public void incrementPhotoCount(int count) { + this.photoCnt += count; + } + + public void decrementPhotoCount(int count) { + this.photoCnt -= count; + } } From 958d51d56a34f7449a30eb90a86a738e7a969e47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Sun, 2 Nov 2025 21:35:14 +0900 Subject: [PATCH 197/402] =?UTF-8?q?#42=20fix:=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=9E=90=EC=9D=98=20photoCnt=20=EC=A6=9D=EA=B0=80,=20=EA=B0=90?= =?UTF-8?q?=EC=86=8C=20=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../photo/application/PhotoService.java | 6 ++++-- .../user/application/UserService.java | 20 +++++++++++++++++++ .../java/com/cheeeese/user/domain/User.java | 8 -------- .../user/exception/code/UserErrorCode.java | 2 ++ .../persistence/UserRepository.java | 11 ++++++++++ 5 files changed, 37 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/cheeeese/photo/application/PhotoService.java b/src/main/java/com/cheeeese/photo/application/PhotoService.java index fc36b9c..d4c6986 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoService.java @@ -13,6 +13,7 @@ import com.cheeeese.photo.exception.code.PhotoErrorCode; import com.cheeeese.photo.infrastructure.mapper.PhotoMapper; import com.cheeeese.photo.infrastructure.persistence.PhotoRepository; +import com.cheeeese.user.application.UserService; import com.cheeeese.user.domain.User; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Value; @@ -28,6 +29,7 @@ @Transactional(readOnly = true) public class PhotoService { + private final UserService userService; private final PhotoRepository photoRepository; private final PhotoValidator photoValidator; private final AlbumValidator albumValidator; @@ -59,7 +61,7 @@ public PhotoPresignedUrlResponse createPresignedUrls(User user, PhotoPresignedUr throw new PhotoException(PhotoErrorCode.PHOTO_COUNT_INCREMENT_FAILED); } - user.incrementPhotoCount(uploadCount); + userService.incrementPhotoCount(user.getId(), uploadCount); List presignedUrls = generatePresignedUrls(user, album, request.fileInfos()); return PhotoMapper.toPresignedUrlResponse(presignedUrls); @@ -148,7 +150,7 @@ private void handleFailedUploads(User user, Long albumId, List failurePhot } if (updatedRows > 0) { - user.decrementPhotoCount(updatedRows); + userService.decrementPhotoCount(user.getId(), updatedRows); int decremented = albumRepository.decrementPhotoCount(albumId, updatedRows); if (decremented == 0) { throw new PhotoException(PhotoErrorCode.PHOTO_COUNT_DECREMENT_FAILED); diff --git a/src/main/java/com/cheeeese/user/application/UserService.java b/src/main/java/com/cheeeese/user/application/UserService.java index 8de480a..69bb542 100644 --- a/src/main/java/com/cheeeese/user/application/UserService.java +++ b/src/main/java/com/cheeeese/user/application/UserService.java @@ -4,6 +4,9 @@ import com.cheeeese.user.domain.User; import com.cheeeese.user.dto.request.UserAgreementRequest; import com.cheeeese.user.dto.request.UserProfileRequest; +import com.cheeeese.user.exception.UserException; +import com.cheeeese.user.exception.code.UserErrorCode; +import com.cheeeese.user.infrastructure.persistence.UserRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -14,6 +17,7 @@ public class UserService { private final UserValidator userValidator; + private final UserRepository userRepository; @Transactional public void updateUserProfile(User user, UserProfileRequest request) { @@ -33,4 +37,20 @@ public void saveUserAgreement(User user, UserAgreementRequest request) { request.isThirdPartyAgreement() ); } + + @Transactional + public void incrementPhotoCount(Long userId, int count) { + int updated = userRepository.incrementPhotoCount(userId, count); + if (updated != 1) { + throw new UserException(UserErrorCode.USER_PHOTO_COUNT_INCREMENT_FAILED); + } + } + + @Transactional + public void decrementPhotoCount(Long userId, int count) { + int updated = userRepository.decrementPhotoCount(userId, count); + if (updated != 1) { + throw new UserException(UserErrorCode.USER_PHOTO_COUNT_DECREMENT_FAILED); + } + } } diff --git a/src/main/java/com/cheeeese/user/domain/User.java b/src/main/java/com/cheeeese/user/domain/User.java index da2de3f..316d5ee 100644 --- a/src/main/java/com/cheeeese/user/domain/User.java +++ b/src/main/java/com/cheeeese/user/domain/User.java @@ -99,12 +99,4 @@ public void saveUserAgreement( this.isMarketingAgreement = isMarketingAgreement; this.isThirdPartyAgreement = isThirdPartyAgreement; } - - public void incrementPhotoCount(int count) { - this.photoCnt += count; - } - - public void decrementPhotoCount(int count) { - this.photoCnt -= count; - } } diff --git a/src/main/java/com/cheeeese/user/exception/code/UserErrorCode.java b/src/main/java/com/cheeeese/user/exception/code/UserErrorCode.java index a98d1ea..0349417 100644 --- a/src/main/java/com/cheeeese/user/exception/code/UserErrorCode.java +++ b/src/main/java/com/cheeeese/user/exception/code/UserErrorCode.java @@ -11,6 +11,8 @@ public enum UserErrorCode implements BaseCode { USER_NOT_FOUND(HttpStatus.NOT_FOUND, "존재하지 않는 사용자입니다."), REQUIRED_TERMS_NOT_AGREED(HttpStatus.BAD_REQUEST, "필수 약관에 동의하지 않았습니다."), + USER_PHOTO_COUNT_INCREMENT_FAILED(HttpStatus.CONFLICT, "유저의 앨범 사진 개수 증가에 실패했습니다."), + USER_PHOTO_COUNT_DECREMENT_FAILED(HttpStatus.CONFLICT, "유저의 앨범 사진 개수 감소에 실패했습니다."), ; private final HttpStatus httpStatus; diff --git a/src/main/java/com/cheeeese/user/infrastructure/persistence/UserRepository.java b/src/main/java/com/cheeeese/user/infrastructure/persistence/UserRepository.java index 7b208b3..2112114 100644 --- a/src/main/java/com/cheeeese/user/infrastructure/persistence/UserRepository.java +++ b/src/main/java/com/cheeeese/user/infrastructure/persistence/UserRepository.java @@ -2,9 +2,20 @@ import com.cheeeese.user.domain.User; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import java.util.Optional; public interface UserRepository extends JpaRepository { Optional findByProviderId(String providerId); + + @Modifying(clearAutomatically = true, flushAutomatically = true) + @Query("UPDATE User u SET u.photoCnt = u.photoCnt + :count WHERE u.id = :userId") + int incrementPhotoCount(@Param("userId") Long userId, @Param("count") int count); + + @Modifying(clearAutomatically = true, flushAutomatically = true) + @Query("UPDATE User u SET u.photoCnt = u.photoCnt - :count WHERE u.id = :userId") + int decrementPhotoCount(@Param("userId") Long userId, @Param("count") int count); } From 80df22f2fb07933a32a2cdf02001ec8af6f5f2c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Sun, 2 Nov 2025 21:49:47 +0900 Subject: [PATCH 198/402] =?UTF-8?q?#42=20fix:=20=ED=94=BC=EB=93=9C?= =?UTF-8?q?=EB=B0=B1=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/cheeeese/photo/application/PhotoService.java | 2 +- .../cheeeese/photo/dto/request/PhotoUploadReportRequest.java | 2 +- .../user/infrastructure/persistence/UserRepository.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/cheeeese/photo/application/PhotoService.java b/src/main/java/com/cheeeese/photo/application/PhotoService.java index d4c6986..075e3e2 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoService.java @@ -150,11 +150,11 @@ private void handleFailedUploads(User user, Long albumId, List failurePhot } if (updatedRows > 0) { - userService.decrementPhotoCount(user.getId(), updatedRows); int decremented = albumRepository.decrementPhotoCount(albumId, updatedRows); if (decremented == 0) { throw new PhotoException(PhotoErrorCode.PHOTO_COUNT_DECREMENT_FAILED); } + userService.decrementPhotoCount(user.getId(), updatedRows); } } diff --git a/src/main/java/com/cheeeese/photo/dto/request/PhotoUploadReportRequest.java b/src/main/java/com/cheeeese/photo/dto/request/PhotoUploadReportRequest.java index 6ac7e69..5fbc186 100644 --- a/src/main/java/com/cheeeese/photo/dto/request/PhotoUploadReportRequest.java +++ b/src/main/java/com/cheeeese/photo/dto/request/PhotoUploadReportRequest.java @@ -10,7 +10,7 @@ @Schema(description = "사진 업로드 결과 보고 요청 (실패 처리)") public record PhotoUploadReportRequest( @NotNull - @Schema(description = "업로드 중 실패하거나 취소된 사진 ID 목록 (PROCESSING -> FAILED & 롤백)", example = "[1, 3]") + @Schema(description = "업로드 중 실패하거나 취소된 사진 ID 목록 (UPLOADING -> FAILED & 롤백)", example = "[1, 3]") List failurePhotoIds ) { } \ No newline at end of file diff --git a/src/main/java/com/cheeeese/user/infrastructure/persistence/UserRepository.java b/src/main/java/com/cheeeese/user/infrastructure/persistence/UserRepository.java index 2112114..b818609 100644 --- a/src/main/java/com/cheeeese/user/infrastructure/persistence/UserRepository.java +++ b/src/main/java/com/cheeeese/user/infrastructure/persistence/UserRepository.java @@ -16,6 +16,6 @@ public interface UserRepository extends JpaRepository { int incrementPhotoCount(@Param("userId") Long userId, @Param("count") int count); @Modifying(clearAutomatically = true, flushAutomatically = true) - @Query("UPDATE User u SET u.photoCnt = u.photoCnt - :count WHERE u.id = :userId") + @Query("UPDATE User u SET u.photoCnt = u.photoCnt - :count WHERE u.id = :userId AND u.photoCnt >= :count") int decrementPhotoCount(@Param("userId") Long userId, @Param("count") int count); } From 3d724e3070b4498e67b6a18b83c59009494a2c6f Mon Sep 17 00:00:00 2001 From: zyovn Date: Mon, 3 Nov 2025 00:35:59 +0900 Subject: [PATCH 199/402] =?UTF-8?q?#21=20feat:=20=EC=95=A8=EB=B2=94=20?= =?UTF-8?q?=EB=82=B4=20=EC=82=AC=EC=A7=84=20=EB=AA=A9=EB=A1=9D=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=201=EC=B0=A8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../album/presentation/AlbumController.java | 15 ++++++ .../application/TokenBlacklistService.java | 9 +++- .../cheeeese/global/config/RedisConfig.java | 4 +- .../cheeeese/global/util/RedisCacheUtil.java | 27 +++++----- .../com/cheeeese/global/util/RedisUtil.java | 8 +-- .../photo/application/PhotoQueryService.java | 49 ++++++++++++++----- .../photo/dto/cache/PhotoCachedList.java | 11 ----- .../photo/dto/response/PhotoListResponse.java | 5 +- .../photo/dto/response/PhotoPageResponse.java | 15 ++++++ .../infrastructure/mapper/PhotoMapper.java | 27 ++++++++++ .../persistence/PhotoRepository.java | 10 ++++ 11 files changed, 134 insertions(+), 46 deletions(-) delete mode 100644 src/main/java/com/cheeeese/photo/dto/cache/PhotoCachedList.java create mode 100644 src/main/java/com/cheeeese/photo/dto/response/PhotoPageResponse.java diff --git a/src/main/java/com/cheeeese/album/presentation/AlbumController.java b/src/main/java/com/cheeeese/album/presentation/AlbumController.java index 67e59a2..9756424 100644 --- a/src/main/java/com/cheeeese/album/presentation/AlbumController.java +++ b/src/main/java/com/cheeeese/album/presentation/AlbumController.java @@ -9,6 +9,8 @@ import com.cheeeese.global.common.CommonResponse; import com.cheeeese.global.util.CurrentUser; import com.cheeeese.album.dto.response.UploadAvailableCountResponse; +import com.cheeeese.photo.application.PhotoQueryService; +import com.cheeeese.photo.dto.response.PhotoPageResponse; import com.cheeeese.user.domain.User; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; @@ -23,6 +25,7 @@ public class AlbumController implements AlbumSwagger { private final AlbumService albumService; + private final PhotoQueryService photoQueryService; @Override @PostMapping @@ -60,4 +63,16 @@ public CommonResponse getAvailableUploadCount( albumService.getAvailablePhotoCount(user, code) ); } + + @GetMapping("/{code}/photos") + public CommonResponse getAlbumPhotoPage( + @PathVariable String code, + @RequestParam(defaultValue = "0") int page, + @RequestParam(defaultValue = "20") int size + ) { + return CommonResponse.success( + PHOTO_UPLOAD_REPORT_SUCCESS, + photoQueryService.getPhotoPage(code, page, size) + ); + } } \ No newline at end of file diff --git a/src/main/java/com/cheeeese/auth/application/TokenBlacklistService.java b/src/main/java/com/cheeeese/auth/application/TokenBlacklistService.java index 5b6dbf1..04eed56 100644 --- a/src/main/java/com/cheeeese/auth/application/TokenBlacklistService.java +++ b/src/main/java/com/cheeeese/auth/application/TokenBlacklistService.java @@ -1,18 +1,23 @@ package com.cheeeese.auth.application; -import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import java.time.Duration; @Service -@RequiredArgsConstructor public class TokenBlacklistService { private final RedisTemplate redisTemplate; private static final String BLACKLIST_PREFIX = "accessTokenBlackList:"; + public TokenBlacklistService( + @Qualifier("tokenRedisTemplate") RedisTemplate redisTemplate + ) { + this.redisTemplate = redisTemplate; + } + public void addBlackList(String token, Object o, Duration expiration) { String key = BLACKLIST_PREFIX + token; redisTemplate.opsForValue().set(key, o, expiration); diff --git a/src/main/java/com/cheeeese/global/config/RedisConfig.java b/src/main/java/com/cheeeese/global/config/RedisConfig.java index b5ab24a..03bae68 100644 --- a/src/main/java/com/cheeeese/global/config/RedisConfig.java +++ b/src/main/java/com/cheeeese/global/config/RedisConfig.java @@ -32,7 +32,7 @@ public LettuceConnectionFactory redisConnectionFactory() { } @Bean(name = "tokenRedisTemplate") - public RedisTemplate redisTemplate() { + public RedisTemplate tokenRedisTemplate() { RedisTemplate redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(redisConnectionFactory()); @@ -43,7 +43,7 @@ public RedisTemplate redisTemplate() { } @Bean(name = "cacheRedisTemplate") - public RedisTemplate cahceRedisTemplate() { + public RedisTemplate cacheRedisTemplate() { RedisTemplate redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(redisConnectionFactory()); diff --git a/src/main/java/com/cheeeese/global/util/RedisCacheUtil.java b/src/main/java/com/cheeeese/global/util/RedisCacheUtil.java index b51e2ac..e9198b3 100644 --- a/src/main/java/com/cheeeese/global/util/RedisCacheUtil.java +++ b/src/main/java/com/cheeeese/global/util/RedisCacheUtil.java @@ -13,24 +13,21 @@ public class RedisCacheUtil { @Qualifier("cacheRedisTemplate") - private final RedisTemplate redisTemplate; + private final RedisTemplate cacheRedisTemplate; /** - * 캐시 저장 (유효 기간 존재) + * 캐시 저장 */ public void setValue(String key, Object value, Long expiredTime) { - redisTemplate.opsForValue().set(key, value, expiredTime, TimeUnit.MILLISECONDS); - } - - /** - * 캐시 영구 저장 - */ - public void setPermanent(String key, Object value) { - redisTemplate.opsForValue().set(key, value); + if (expiredTime != null) { + cacheRedisTemplate.opsForValue().set(key, value, expiredTime, TimeUnit.SECONDS); + } else { + cacheRedisTemplate.opsForValue().set(key, value); + } } public Long getValue(String key) { - return (Long) redisTemplate.opsForValue().get(key); + return (Long) cacheRedisTemplate.opsForValue().get(key); } /** @@ -38,18 +35,18 @@ public Long getValue(String key) { */ @SuppressWarnings("unchecked") public T getObject(String key, Class clazz) { - return (T) redisTemplate.opsForValue().get(key); + return (T) cacheRedisTemplate.opsForValue().get(key); } /** * 패턴 기반 키 삭제 (대규모 삭제) */ public void deletePattern(String pattern) { - Set keys = redisTemplate.keys(pattern); - redisTemplate.delete(keys); + Set keys = cacheRedisTemplate.keys(pattern); + cacheRedisTemplate.delete(keys); } public boolean exists(String key) { - return redisTemplate.hasKey(key); + return cacheRedisTemplate.hasKey(key); } } diff --git a/src/main/java/com/cheeeese/global/util/RedisUtil.java b/src/main/java/com/cheeeese/global/util/RedisUtil.java index d2c7d41..3aafe33 100644 --- a/src/main/java/com/cheeeese/global/util/RedisUtil.java +++ b/src/main/java/com/cheeeese/global/util/RedisUtil.java @@ -12,17 +12,17 @@ public class RedisUtil { @Qualifier("tokenRedisTemplate") - private final RedisTemplate redisTemplate; + private final RedisTemplate tokenRedisTemplate; public void setValue(String key, Object value, Long expiredTime) { - redisTemplate.opsForValue().set(key, value, expiredTime, TimeUnit.MILLISECONDS); + tokenRedisTemplate.opsForValue().set(key, value, expiredTime, TimeUnit.MILLISECONDS); } public String getValue(String key) { - return (String) redisTemplate.opsForValue().get(key); + return (String) tokenRedisTemplate.opsForValue().get(key); } public void deleteValue(String key) { - redisTemplate.delete(key); + tokenRedisTemplate.delete(key); } } diff --git a/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java b/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java index ca1f03e..2b4a301 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java @@ -1,15 +1,17 @@ package com.cheeeese.photo.application; - import com.cheeeese.global.util.RedisCacheUtil; -import com.cheeeese.photo.dto.response.PhotoListResponse; +import com.cheeeese.photo.domain.Photo; +import com.cheeeese.photo.dto.response.PhotoPageResponse; +import com.cheeeese.photo.infrastructure.mapper.PhotoMapper; import com.cheeeese.photo.infrastructure.persistence.PhotoRepository; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Slice; +import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.List; - @Service @RequiredArgsConstructor @Transactional(readOnly = true) @@ -18,22 +20,47 @@ public class PhotoQueryService { private final PhotoRepository photoRepository; private final RedisCacheUtil redisCacheUtil; - private static final String PHOTO_KEY = "album:%s:photos:page:%d"; + private static final String PHOTO_KEY = "album:%s:photos:page:%d:version:%d"; private static final String VERSION_KEY = "album:%s:version"; - public List getPhotoList( - String code, - int page, - int size - ) { - String photoKey = String.format(PHOTO_KEY, code, page); + public PhotoPageResponse getPhotoPage(String code, int page, int size) { String versionKey = String.format(VERSION_KEY, code); + Long curVersion = redisCacheUtil.getValue(versionKey); + + if (curVersion == null) { + curVersion = 0L; + } + + String photoKey = String.format(PHOTO_KEY, code, page, curVersion); + PhotoPageResponse cachedList = redisCacheUtil.getObject(photoKey, PhotoPageResponse.class); + // redis에 존재할 경우, db 접근 X + 바로 반환 + if (cachedList != null) { + return cachedList; + } + PhotoPageResponse responses = getPhotoPageFromDB(code, page, size); + + redisCacheUtil.setValue(photoKey, responses, 300000L); + + return responses; + } + + @Transactional + public void invalidatePhotoCache(String code) { + String versionKey = String.format(VERSION_KEY, code); Long curVersion = redisCacheUtil.getValue(versionKey); + if (curVersion == null) { curVersion = 0L; } + redisCacheUtil.setValue(versionKey, curVersion + 1, null); + redisCacheUtil.deletePattern("album:" + code + ":photos:*"); + } + private PhotoPageResponse getPhotoPageFromDB(String code, int page, int size) { + PageRequest pageRequest = PageRequest.of(page, size, Sort.by(Sort.Direction.DESC, "createdAt")); + Slice photos = photoRepository.findAllByAlbumCode(code, pageRequest); + return PhotoMapper.toPhotoPageResponse(photos); } } diff --git a/src/main/java/com/cheeeese/photo/dto/cache/PhotoCachedList.java b/src/main/java/com/cheeeese/photo/dto/cache/PhotoCachedList.java deleted file mode 100644 index b9f76d2..0000000 --- a/src/main/java/com/cheeeese/photo/dto/cache/PhotoCachedList.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.cheeeese.photo.dto.cache; - -import lombok.Builder; - -import java.util.List; - -@Builder -public record PhotoCachedList( - Long version -) { -} diff --git a/src/main/java/com/cheeeese/photo/dto/response/PhotoListResponse.java b/src/main/java/com/cheeeese/photo/dto/response/PhotoListResponse.java index 4d649fc..5ff5bdc 100644 --- a/src/main/java/com/cheeeese/photo/dto/response/PhotoListResponse.java +++ b/src/main/java/com/cheeeese/photo/dto/response/PhotoListResponse.java @@ -5,6 +5,9 @@ @Builder public record PhotoListResponse( Long photoId, - String thumbnailUrl + String thumbnailUrl, + int likeCnt, + boolean isLiked, + boolean isDownloaded ) { } diff --git a/src/main/java/com/cheeeese/photo/dto/response/PhotoPageResponse.java b/src/main/java/com/cheeeese/photo/dto/response/PhotoPageResponse.java new file mode 100644 index 0000000..5700e76 --- /dev/null +++ b/src/main/java/com/cheeeese/photo/dto/response/PhotoPageResponse.java @@ -0,0 +1,15 @@ +package com.cheeeese.photo.dto.response; + +import lombok.Builder; + +import java.util.List; + +@Builder +public record PhotoPageResponse( + List responses, + int listSize, + boolean isFirst, + boolean isLast, + boolean hasNext +) { +} diff --git a/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java b/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java index d5caad9..5d8c311 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java @@ -3,8 +3,11 @@ import com.cheeeese.album.domain.Album; import com.cheeeese.photo.domain.Photo; import com.cheeeese.photo.domain.PhotoStatus; +import com.cheeeese.photo.dto.response.PhotoListResponse; +import com.cheeeese.photo.dto.response.PhotoPageResponse; import com.cheeeese.photo.dto.response.PhotoPresignedUrlResponse; import com.cheeeese.user.domain.User; +import org.springframework.data.domain.Slice; import java.time.LocalDateTime; import java.util.List; @@ -39,4 +42,28 @@ public static PhotoPresignedUrlResponse toPresignedUrlResponse( .presignedUrlInfos(presignedUrlInfos) .build(); } + + public static PhotoListResponse toPhotoListResponse(Photo photo, boolean isLiked, boolean isDownloaded) { + return PhotoListResponse.builder() + .photoId(photo.getId()) + .thumbnailUrl(photo.getThumbnailUrl()) + .likeCnt(photo.getLikesCnt()) + .isLiked(isLiked) + .isDownloaded(isDownloaded) + .build(); + } + + public static PhotoPageResponse toPhotoPageResponse(Slice photos) { + List responses = photos.getContent().stream() + .map(photo -> PhotoMapper.toPhotoListResponse(photo, false, false)) + .toList(); + + return PhotoPageResponse.builder() + .responses(responses) + .listSize(responses.size()) + .isFirst(photos.isFirst()) + .isLast(photos.isLast()) + .hasNext(photos.hasNext()) + .build(); + } } diff --git a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java index ec04eee..9fe1a18 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java @@ -3,6 +3,7 @@ import com.cheeeese.photo.domain.Photo; import com.cheeeese.photo.domain.PhotoStatus; import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Slice; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; @@ -12,6 +13,15 @@ public interface PhotoRepository extends JpaRepository { + @Query(""" + SELECT p + FROM Photo p + JOIN p.album a + WHERE a.code = :code + ORDER BY p.createdAt DESC + """) + Slice findAllByAlbumCode(@Param("code") String code, Pageable pageable); + @Query(""" SELECT p FROM Photo p From 6e9295dcf1ad0e73a5435e67c919948a6a70535d Mon Sep 17 00:00:00 2001 From: zyovn Date: Mon, 3 Nov 2025 12:30:54 +0900 Subject: [PATCH 200/402] =?UTF-8?q?#21=20feat:=20=EC=95=A8=EB=B2=94=20?= =?UTF-8?q?=EB=82=B4=20=EC=82=AC=EC=A7=84=20=EB=AA=A9=EB=A1=9D=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20=EC=A0=95=EB=A0=AC=20=EB=B0=8F=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=9E=90=20=EC=83=81=ED=83=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../album/domain/type/AlbumSorting.java | 15 ++++ .../album/presentation/AlbumController.java | 10 ++- .../global/common/code/SuccessCode.java | 1 + .../photo/application/PhotoQueryService.java | 80 +++++++++++++++---- .../cheeeese/photo/domain/PhotoHistory.java | 40 ++++++++++ .../com/cheeeese/photo/domain/PhotoLikes.java | 40 ++++++++++ .../photo/dto/response/PhotoListResponse.java | 8 +- .../infrastructure/mapper/PhotoMapper.java | 10 +++ .../persistence/PhotoHistoryRepository.java | 24 ++++++ .../persistence/PhotoLikesRepository.java | 18 +++++ 10 files changed, 225 insertions(+), 21 deletions(-) create mode 100644 src/main/java/com/cheeeese/album/domain/type/AlbumSorting.java create mode 100644 src/main/java/com/cheeeese/photo/domain/PhotoHistory.java create mode 100644 src/main/java/com/cheeeese/photo/domain/PhotoLikes.java create mode 100644 src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoHistoryRepository.java create mode 100644 src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoLikesRepository.java diff --git a/src/main/java/com/cheeeese/album/domain/type/AlbumSorting.java b/src/main/java/com/cheeeese/album/domain/type/AlbumSorting.java new file mode 100644 index 0000000..549d503 --- /dev/null +++ b/src/main/java/com/cheeeese/album/domain/type/AlbumSorting.java @@ -0,0 +1,15 @@ +package com.cheeeese.album.domain.type; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor +public enum AlbumSorting { + POPULAR("popular", "띱 많은순"), + CAPTURED_AT("captured", "최근 촬영한 시간순"), + CREATED_AT("uploaded", "최근 업로드된 사진순"); + + private final String param; + private final String description; +} diff --git a/src/main/java/com/cheeeese/album/presentation/AlbumController.java b/src/main/java/com/cheeeese/album/presentation/AlbumController.java index 9756424..fd434e4 100644 --- a/src/main/java/com/cheeeese/album/presentation/AlbumController.java +++ b/src/main/java/com/cheeeese/album/presentation/AlbumController.java @@ -1,6 +1,7 @@ package com.cheeeese.album.presentation; import com.cheeeese.album.application.AlbumService; +import com.cheeeese.album.domain.type.AlbumSorting; import com.cheeeese.album.dto.request.AlbumCreationRequest; import com.cheeeese.album.dto.response.AlbumCreationResponse; import com.cheeeese.album.dto.response.AlbumEnterResponse; @@ -18,7 +19,6 @@ import static com.cheeeese.global.common.code.SuccessCode.*; - @RestController @RequiredArgsConstructor @RequestMapping("/v1/album") @@ -66,13 +66,15 @@ public CommonResponse getAvailableUploadCount( @GetMapping("/{code}/photos") public CommonResponse getAlbumPhotoPage( + @CurrentUser User user, @PathVariable String code, @RequestParam(defaultValue = "0") int page, - @RequestParam(defaultValue = "20") int size + @RequestParam(defaultValue = "20") int size, + @RequestParam(defaultValue = "CREATED_AT") AlbumSorting sorting ) { return CommonResponse.success( - PHOTO_UPLOAD_REPORT_SUCCESS, - photoQueryService.getPhotoPage(code, page, size) + ALBUM_PHOTO_LIST_GET_SUCCESS, + photoQueryService.getPhotoPage(user, code, page, size, sorting) ); } } \ No newline at end of file diff --git a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java index 3aa409c..c3b5f01 100644 --- a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java +++ b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java @@ -24,6 +24,7 @@ public enum SuccessCode implements BaseCode { ALBUM_INVITATION_FETCH_SUCCESS(HttpStatus.OK, "앨범 초대장 정보 조회가 성공적으로 완료되었습니다."), ALBUM_ENTER_SUCCESS(HttpStatus.OK, "앨범 입장이 성공적으로 완료되었습니다."), ALBUM_CREATE_SUCCESS(HttpStatus.OK, "앨범 생성이 성공적으로 완료되었습니다."), + ALBUM_PHOTO_LIST_GET_SUCCESS(HttpStatus.OK, "앨범 내 사진 목록 조회가 성공적으로 완료되었습니다."), // photo PHOTO_AVAILABLE_COUNT_FETCH_SUCCESS(HttpStatus.OK, "업로드 가능 사진 수 조회가 성공적으로 완료되었습니다."), diff --git a/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java b/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java index 2b4a301..88c825f 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java @@ -1,10 +1,15 @@ package com.cheeeese.photo.application; +import com.cheeeese.album.domain.type.AlbumSorting; import com.cheeeese.global.util.RedisCacheUtil; import com.cheeeese.photo.domain.Photo; +import com.cheeeese.photo.dto.response.PhotoListResponse; import com.cheeeese.photo.dto.response.PhotoPageResponse; import com.cheeeese.photo.infrastructure.mapper.PhotoMapper; +import com.cheeeese.photo.infrastructure.persistence.PhotoHistoryRepository; +import com.cheeeese.photo.infrastructure.persistence.PhotoLikesRepository; import com.cheeeese.photo.infrastructure.persistence.PhotoRepository; +import com.cheeeese.user.domain.User; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Slice; @@ -12,55 +17,98 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDateTime; +import java.util.HashSet; +import java.util.List; +import java.util.Optional; +import java.util.Set; + @Service @RequiredArgsConstructor @Transactional(readOnly = true) public class PhotoQueryService { private final PhotoRepository photoRepository; + private final PhotoLikesRepository photoLikesRepository; + private final PhotoHistoryRepository photoHistoryRepository; private final RedisCacheUtil redisCacheUtil; private static final String PHOTO_KEY = "album:%s:photos:page:%d:version:%d"; private static final String VERSION_KEY = "album:%s:version"; - public PhotoPageResponse getPhotoPage(String code, int page, int size) { + public PhotoPageResponse getPhotoPage(User user, String code, int page, int size, AlbumSorting albumSorting) { String versionKey = String.format(VERSION_KEY, code); - Long curVersion = redisCacheUtil.getValue(versionKey); - - if (curVersion == null) { - curVersion = 0L; - } + Long curVersion = Optional.ofNullable(redisCacheUtil.getValue(versionKey)).orElse(0L); String photoKey = String.format(PHOTO_KEY, code, page, curVersion); PhotoPageResponse cachedList = redisCacheUtil.getObject(photoKey, PhotoPageResponse.class); // redis에 존재할 경우, db 접근 X + 바로 반환 if (cachedList != null) { - return cachedList; + return attachUserStatus(user, cachedList); } - PhotoPageResponse responses = getPhotoPageFromDB(code, page, size); + PhotoPageResponse responses = getPhotoPageFromDB(code, page, size, albumSorting); redisCacheUtil.setValue(photoKey, responses, 300000L); - return responses; + return attachUserStatus(user, responses); } @Transactional public void invalidatePhotoCache(String code) { String versionKey = String.format(VERSION_KEY, code); - Long curVersion = redisCacheUtil.getValue(versionKey); + Long version = Optional.ofNullable(redisCacheUtil.getValue(versionKey)).orElse(0L); - if (curVersion == null) { - curVersion = 0L; - } - redisCacheUtil.setValue(versionKey, curVersion + 1, null); + redisCacheUtil.setValue(versionKey, version + 1, null); redisCacheUtil.deletePattern("album:" + code + ":photos:*"); } - private PhotoPageResponse getPhotoPageFromDB(String code, int page, int size) { - PageRequest pageRequest = PageRequest.of(page, size, Sort.by(Sort.Direction.DESC, "createdAt")); + private PhotoPageResponse getPhotoPageFromDB(String code, int page, int size, AlbumSorting albumSorting) { + PageRequest pageRequest = PageRequest.of(page, size, getPhotoSortingOption(albumSorting)); Slice photos = photoRepository.findAllByAlbumCode(code, pageRequest); return PhotoMapper.toPhotoPageResponse(photos); } + + private PhotoPageResponse attachUserStatus(User user, PhotoPageResponse response) { + List photoIds = extractPhotoIds(response); + Set likedIds = findUserLikedPhotoIds(user.getId(), photoIds); + Set downloadedIds = findUserDownloadedPhotoIds(user.getId(), photoIds); + List updatedResponses = updateUserStatus(response.responses(), likedIds, downloadedIds); + return PhotoMapper.toRebuildPhotoPageResponse(response, updatedResponses); + } + + private List extractPhotoIds(PhotoPageResponse response) { + return response.responses().stream() + .map(PhotoListResponse::photoId) + .toList(); + } + + private Set findUserLikedPhotoIds(Long userId, List photoIds) { + return new HashSet<>(photoLikesRepository.findAllLikedPhotoIds(userId, photoIds)); + } + + private Set findUserDownloadedPhotoIds(Long userId, List photoIds) { + return new HashSet<>(photoHistoryRepository.findAllHistoryPhotoIds(userId, photoIds, LocalDateTime.now().minusHours(1))); + } + + private List updateUserStatus( + List responses, + Set likeIds, + Set downloadedIds + ) { + return responses.stream() + .map(response -> response.withUserStatus( + likeIds.contains(response.photoId()), + downloadedIds.contains(response.photoId()) + )).toList(); + } + + private Sort getPhotoSortingOption(AlbumSorting albumSorting) { + return switch (albumSorting) { + case POPULAR -> Sort.by(Sort.Order.desc("likesCnt"), Sort.Order.desc("createdAt")); + case CAPTURED_AT -> Sort.by(Sort.Direction.DESC, "captureTime"); + case CREATED_AT -> Sort.by(Sort.Direction.DESC, "createdAt"); + }; + } } diff --git a/src/main/java/com/cheeeese/photo/domain/PhotoHistory.java b/src/main/java/com/cheeeese/photo/domain/PhotoHistory.java new file mode 100644 index 0000000..e02a111 --- /dev/null +++ b/src/main/java/com/cheeeese/photo/domain/PhotoHistory.java @@ -0,0 +1,40 @@ +package com.cheeeese.photo.domain; + +import com.cheeeese.global.domain.BaseEntity; +import com.cheeeese.user.domain.User; +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Getter +@Table( + name = "photo_history", + uniqueConstraints = @UniqueConstraint( + columnNames = {"user_id", "photo_id"} + ) +) +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class PhotoHistory extends BaseEntity { + + @Id + @Column(name = "photo_history_id", nullable = false) + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id", nullable = false) + private User user; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "photo_id", nullable = false) + private Photo photo; + + @Builder + private PhotoHistory(User user, Photo photo) { + this.user = user; + this.photo = photo; + } +} diff --git a/src/main/java/com/cheeeese/photo/domain/PhotoLikes.java b/src/main/java/com/cheeeese/photo/domain/PhotoLikes.java new file mode 100644 index 0000000..24ecacf --- /dev/null +++ b/src/main/java/com/cheeeese/photo/domain/PhotoLikes.java @@ -0,0 +1,40 @@ +package com.cheeeese.photo.domain; + +import com.cheeeese.global.domain.BaseEntity; +import com.cheeeese.user.domain.User; +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Getter +@Table( + name = "photo_likes", + uniqueConstraints = @UniqueConstraint( + columnNames = {"user_id", "photo_id"} + ) +) +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class PhotoLikes extends BaseEntity { + + @Id + @Column(name = "photo_likes_id", nullable = false) + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id", nullable = false) + private User user; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "photo_id", nullable = false) + private Photo photo; + + @Builder + private PhotoLikes(User user, Photo photo) { + this.user = user; + this.photo = photo; + } +} diff --git a/src/main/java/com/cheeeese/photo/dto/response/PhotoListResponse.java b/src/main/java/com/cheeeese/photo/dto/response/PhotoListResponse.java index 5ff5bdc..c4d588b 100644 --- a/src/main/java/com/cheeeese/photo/dto/response/PhotoListResponse.java +++ b/src/main/java/com/cheeeese/photo/dto/response/PhotoListResponse.java @@ -2,7 +2,7 @@ import lombok.Builder; -@Builder +@Builder(toBuilder = true) public record PhotoListResponse( Long photoId, String thumbnailUrl, @@ -10,4 +10,10 @@ public record PhotoListResponse( boolean isLiked, boolean isDownloaded ) { + public PhotoListResponse withUserStatus(boolean isLiked, boolean isDownloaded) { + return this.toBuilder() + .isLiked(isLiked) + .isDownloaded(isDownloaded) + .build(); + } } diff --git a/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java b/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java index 5d8c311..99d8faf 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java @@ -66,4 +66,14 @@ public static PhotoPageResponse toPhotoPageResponse(Slice photos) { .hasNext(photos.hasNext()) .build(); } + + public static PhotoPageResponse toRebuildPhotoPageResponse(PhotoPageResponse response, List updated) { + return PhotoPageResponse.builder() + .responses(updated) + .listSize(updated.size()) + .isFirst(response.isFirst()) + .isLast(response.isLast()) + .hasNext(response.hasNext()) + .build(); + } } diff --git a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoHistoryRepository.java b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoHistoryRepository.java new file mode 100644 index 0000000..76f4808 --- /dev/null +++ b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoHistoryRepository.java @@ -0,0 +1,24 @@ +package com.cheeeese.photo.infrastructure.persistence; + +import com.cheeeese.photo.domain.PhotoHistory; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +import java.time.LocalDateTime; +import java.util.List; + +public interface PhotoHistoryRepository extends JpaRepository { + @Query(""" + SELECT ph.photo.id + FROM PhotoHistory ph + WHERE ph.user.id = :userId + AND ph.photo.id IN :photoIds + AND ph.createdAt >= :threshold + """) + List findAllHistoryPhotoIds( + @Param("userId") Long userId, + @Param("photoIds") List photoIds, + @Param("threshold") LocalDateTime threshold + ); +} diff --git a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoLikesRepository.java b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoLikesRepository.java new file mode 100644 index 0000000..f1058f3 --- /dev/null +++ b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoLikesRepository.java @@ -0,0 +1,18 @@ +package com.cheeeese.photo.infrastructure.persistence; + +import com.cheeeese.photo.domain.PhotoLikes; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +import java.util.List; + +public interface PhotoLikesRepository extends JpaRepository { + @Query(""" + SELECT pl.photo.id + FROM PhotoLikes pl + WHERE pl.user.id = :userId + AND pl.photo.id IN :photoIds + """) + List findAllLikedPhotoIds(@Param("userId") Long userId, @Param("photoIds") List photoIds); +} From d30d7654704b62f1d3c14c556bdee3f7344e3ba2 Mon Sep 17 00:00:00 2001 From: zyovn Date: Mon, 3 Nov 2025 12:41:55 +0900 Subject: [PATCH 201/402] =?UTF-8?q?#21=20rename:=20=EC=95=A8=EB=B2=94=20?= =?UTF-8?q?=EB=82=B4=20=EC=82=AC=EC=A7=84=20=EB=AA=A9=EB=A1=9D=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20API=20photoQueryController=EB=A1=9C=20=EC=9D=B4?= =?UTF-8?q?=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../album/presentation/AlbumController.java | 18 ---------- .../global/common/code/SuccessCode.java | 2 +- .../presentation/PhotoQueryController.java | 34 +++++++++++++++++++ 3 files changed, 35 insertions(+), 19 deletions(-) create mode 100644 src/main/java/com/cheeeese/photo/presentation/PhotoQueryController.java diff --git a/src/main/java/com/cheeeese/album/presentation/AlbumController.java b/src/main/java/com/cheeeese/album/presentation/AlbumController.java index fd434e4..2d4de41 100644 --- a/src/main/java/com/cheeeese/album/presentation/AlbumController.java +++ b/src/main/java/com/cheeeese/album/presentation/AlbumController.java @@ -1,7 +1,6 @@ package com.cheeeese.album.presentation; import com.cheeeese.album.application.AlbumService; -import com.cheeeese.album.domain.type.AlbumSorting; import com.cheeeese.album.dto.request.AlbumCreationRequest; import com.cheeeese.album.dto.response.AlbumCreationResponse; import com.cheeeese.album.dto.response.AlbumEnterResponse; @@ -10,8 +9,6 @@ import com.cheeeese.global.common.CommonResponse; import com.cheeeese.global.util.CurrentUser; import com.cheeeese.album.dto.response.UploadAvailableCountResponse; -import com.cheeeese.photo.application.PhotoQueryService; -import com.cheeeese.photo.dto.response.PhotoPageResponse; import com.cheeeese.user.domain.User; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; @@ -25,7 +22,6 @@ public class AlbumController implements AlbumSwagger { private final AlbumService albumService; - private final PhotoQueryService photoQueryService; @Override @PostMapping @@ -63,18 +59,4 @@ public CommonResponse getAvailableUploadCount( albumService.getAvailablePhotoCount(user, code) ); } - - @GetMapping("/{code}/photos") - public CommonResponse getAlbumPhotoPage( - @CurrentUser User user, - @PathVariable String code, - @RequestParam(defaultValue = "0") int page, - @RequestParam(defaultValue = "20") int size, - @RequestParam(defaultValue = "CREATED_AT") AlbumSorting sorting - ) { - return CommonResponse.success( - ALBUM_PHOTO_LIST_GET_SUCCESS, - photoQueryService.getPhotoPage(user, code, page, size, sorting) - ); - } } \ No newline at end of file diff --git a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java index c3b5f01..265705b 100644 --- a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java +++ b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java @@ -24,13 +24,13 @@ public enum SuccessCode implements BaseCode { ALBUM_INVITATION_FETCH_SUCCESS(HttpStatus.OK, "앨범 초대장 정보 조회가 성공적으로 완료되었습니다."), ALBUM_ENTER_SUCCESS(HttpStatus.OK, "앨범 입장이 성공적으로 완료되었습니다."), ALBUM_CREATE_SUCCESS(HttpStatus.OK, "앨범 생성이 성공적으로 완료되었습니다."), - ALBUM_PHOTO_LIST_GET_SUCCESS(HttpStatus.OK, "앨범 내 사진 목록 조회가 성공적으로 완료되었습니다."), // photo PHOTO_AVAILABLE_COUNT_FETCH_SUCCESS(HttpStatus.OK, "업로드 가능 사진 수 조회가 성공적으로 완료되었습니다."), PRESIGNED_URL_ISSUE_SUCCESS(HttpStatus.OK, "Presigned URL 발급이 성공적으로 완료되었습니다."), PHOTO_UPLOAD_REPORT_SUCCESS(HttpStatus.OK, "사진 업로드 결과 보고가 성공적으로 처리되었습니다."), THUMBNAIL_PRODUCE_COMPLETE(HttpStatus.OK, "썸네일 생성이 성공적으로 완료되었습니다."), + PHOTO_LIST_GET_SUCCESS(HttpStatus.OK, "앨범 내 사진 목록 조회가 성공적으로 완료되었습니다."), ; private final HttpStatus httpStatus; diff --git a/src/main/java/com/cheeeese/photo/presentation/PhotoQueryController.java b/src/main/java/com/cheeeese/photo/presentation/PhotoQueryController.java new file mode 100644 index 0000000..df8b9b2 --- /dev/null +++ b/src/main/java/com/cheeeese/photo/presentation/PhotoQueryController.java @@ -0,0 +1,34 @@ +package com.cheeeese.photo.presentation; + +import com.cheeeese.album.domain.type.AlbumSorting; +import com.cheeeese.global.common.CommonResponse; +import com.cheeeese.global.util.CurrentUser; +import com.cheeeese.photo.application.PhotoQueryService; +import com.cheeeese.photo.dto.response.PhotoPageResponse; +import com.cheeeese.user.domain.User; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +import static com.cheeeese.global.common.code.SuccessCode.PHOTO_LIST_GET_SUCCESS; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/v1/album") +public class PhotoQueryController { + + private final PhotoQueryService photoQueryService; + + @GetMapping("/{code}/photos") + public CommonResponse getAlbumPhotoPage( + @CurrentUser User user, + @PathVariable String code, + @RequestParam(defaultValue = "0") int page, + @RequestParam(defaultValue = "20") int size, + @RequestParam(defaultValue = "CREATED_AT") AlbumSorting sorting + ) { + return CommonResponse.success( + PHOTO_LIST_GET_SUCCESS, + photoQueryService.getPhotoPage(user, code, page, size, sorting) + ); + } +} From 52817e482d9e0c900b42e26cd9efdf6ec1f5b778 Mon Sep 17 00:00:00 2001 From: zyovn Date: Mon, 3 Nov 2025 12:42:54 +0900 Subject: [PATCH 202/402] =?UTF-8?q?#21=20chore:=20todo=20=EC=A3=BC?= =?UTF-8?q?=EC=84=9D=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cheeeese/photo/application/PhotoQueryService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java b/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java index 88c825f..356148a 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java @@ -55,7 +55,7 @@ public PhotoPageResponse getPhotoPage(User user, String code, int page, int size } @Transactional - public void invalidatePhotoCache(String code) { + public void invalidatePhotoCache(String code) { // TODO: 사진 삭제, 업로드 등 변화가 일어난 부분에 해당 메서드 추가 String versionKey = String.format(VERSION_KEY, code); Long version = Optional.ofNullable(redisCacheUtil.getValue(versionKey)).orElse(0L); From 8c97f46f06f1779b134090978c62d6816d723547 Mon Sep 17 00:00:00 2001 From: zyovn Date: Mon, 3 Nov 2025 16:54:30 +0900 Subject: [PATCH 203/402] =?UTF-8?q?#21=20feat:=20=EC=95=A8=EB=B2=94=20?= =?UTF-8?q?=EB=82=B4=20=EC=82=AC=EC=A7=84=20=EC=83=81=EC=84=B8=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cheeeese/global/common/code/SuccessCode.java | 1 + .../photo/application/PhotoQueryService.java | 13 +++++++++++++ .../photo/dto/response/PhotoDetailResponse.java | 14 ++++++++++++++ .../photo/infrastructure/mapper/PhotoMapper.java | 12 ++++++++++++ .../persistence/PhotoHistoryRepository.java | 2 ++ .../persistence/PhotoLikesRepository.java | 2 ++ .../persistence/PhotoRepository.java | 2 ++ .../photo/presentation/PhotoQueryController.java | 14 ++++++++++++++ 8 files changed, 60 insertions(+) create mode 100644 src/main/java/com/cheeeese/photo/dto/response/PhotoDetailResponse.java diff --git a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java index 265705b..dc0b98c 100644 --- a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java +++ b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java @@ -31,6 +31,7 @@ public enum SuccessCode implements BaseCode { PHOTO_UPLOAD_REPORT_SUCCESS(HttpStatus.OK, "사진 업로드 결과 보고가 성공적으로 처리되었습니다."), THUMBNAIL_PRODUCE_COMPLETE(HttpStatus.OK, "썸네일 생성이 성공적으로 완료되었습니다."), PHOTO_LIST_GET_SUCCESS(HttpStatus.OK, "앨범 내 사진 목록 조회가 성공적으로 완료되었습니다."), + PHOTO_DETAIL_GET_SUCCESS(HttpStatus.OK, "앨범 내 사진 상세 조회가 성공적으로 완료되었습니다."), ; private final HttpStatus httpStatus; diff --git a/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java b/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java index 356148a..7a59e46 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java @@ -3,8 +3,11 @@ import com.cheeeese.album.domain.type.AlbumSorting; import com.cheeeese.global.util.RedisCacheUtil; import com.cheeeese.photo.domain.Photo; +import com.cheeeese.photo.dto.response.PhotoDetailResponse; import com.cheeeese.photo.dto.response.PhotoListResponse; import com.cheeeese.photo.dto.response.PhotoPageResponse; +import com.cheeeese.photo.exception.PhotoException; +import com.cheeeese.photo.exception.code.PhotoErrorCode; import com.cheeeese.photo.infrastructure.mapper.PhotoMapper; import com.cheeeese.photo.infrastructure.persistence.PhotoHistoryRepository; import com.cheeeese.photo.infrastructure.persistence.PhotoLikesRepository; @@ -64,6 +67,16 @@ public void invalidatePhotoCache(String code) { // TODO: 사진 삭제, 업로 redisCacheUtil.deletePattern("album:" + code + ":photos:*"); } + public PhotoDetailResponse getPhotoDetail(User user, String code, Long photoId) { + Photo photo = photoRepository.findByIdAndAlbum_Code(photoId, code) + .orElseThrow(() -> new PhotoException(PhotoErrorCode.PHOTO_ID_NOT_FOUND)); + + boolean isLiked = photoLikesRepository.existsByUserIdAndPhotoId(user.getId(), photo.getId()); + boolean isDownloaded = photoHistoryRepository.existsByUserIdAndPhotoId(user.getId(), photo.getId()); + + return PhotoMapper.toPhotoDetailResponse(photo, isLiked, isDownloaded); + } + private PhotoPageResponse getPhotoPageFromDB(String code, int page, int size, AlbumSorting albumSorting) { PageRequest pageRequest = PageRequest.of(page, size, getPhotoSortingOption(albumSorting)); Slice photos = photoRepository.findAllByAlbumCode(code, pageRequest); diff --git a/src/main/java/com/cheeeese/photo/dto/response/PhotoDetailResponse.java b/src/main/java/com/cheeeese/photo/dto/response/PhotoDetailResponse.java new file mode 100644 index 0000000..46bf681 --- /dev/null +++ b/src/main/java/com/cheeeese/photo/dto/response/PhotoDetailResponse.java @@ -0,0 +1,14 @@ +package com.cheeeese.photo.dto.response; + +import lombok.Builder; + +@Builder +public record PhotoDetailResponse( + Long photoId, + String imageUrl, + String thumbnailUrl, + int likesCnt, + boolean isLiked, + boolean isDownloaded +) { +} diff --git a/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java b/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java index 99d8faf..fe998ef 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java @@ -3,6 +3,7 @@ import com.cheeeese.album.domain.Album; import com.cheeeese.photo.domain.Photo; import com.cheeeese.photo.domain.PhotoStatus; +import com.cheeeese.photo.dto.response.PhotoDetailResponse; import com.cheeeese.photo.dto.response.PhotoListResponse; import com.cheeeese.photo.dto.response.PhotoPageResponse; import com.cheeeese.photo.dto.response.PhotoPresignedUrlResponse; @@ -76,4 +77,15 @@ public static PhotoPageResponse toRebuildPhotoPageResponse(PhotoPageResponse res .hasNext(response.hasNext()) .build(); } + + public static PhotoDetailResponse toPhotoDetailResponse(Photo photo, boolean isLiked, boolean isDownloaded) { + return PhotoDetailResponse.builder() + .photoId(photo.getId()) + .imageUrl(photo.getImageUrl()) + .thumbnailUrl(photo.getThumbnailUrl()) + .likesCnt(photo.getLikesCnt()) + .isLiked(isLiked) + .isDownloaded(isDownloaded) + .build(); + } } diff --git a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoHistoryRepository.java b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoHistoryRepository.java index 76f4808..4997e2b 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoHistoryRepository.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoHistoryRepository.java @@ -21,4 +21,6 @@ List findAllHistoryPhotoIds( @Param("photoIds") List photoIds, @Param("threshold") LocalDateTime threshold ); + + boolean existsByUserIdAndPhotoId(Long userId, Long photoId); } diff --git a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoLikesRepository.java b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoLikesRepository.java index f1058f3..2b520cb 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoLikesRepository.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoLikesRepository.java @@ -15,4 +15,6 @@ public interface PhotoLikesRepository extends JpaRepository { AND pl.photo.id IN :photoIds """) List findAllLikedPhotoIds(@Param("userId") Long userId, @Param("photoIds") List photoIds); + + boolean existsByUserIdAndPhotoId(Long userId, Long photoId); } diff --git a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java index 9fe1a18..eda3ad3 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java @@ -10,9 +10,11 @@ import org.springframework.data.repository.query.Param; import java.util.List; +import java.util.Optional; public interface PhotoRepository extends JpaRepository { + Optional findByIdAndAlbum_Code(Long photoId, String albumCode); @Query(""" SELECT p FROM Photo p diff --git a/src/main/java/com/cheeeese/photo/presentation/PhotoQueryController.java b/src/main/java/com/cheeeese/photo/presentation/PhotoQueryController.java index df8b9b2..10be799 100644 --- a/src/main/java/com/cheeeese/photo/presentation/PhotoQueryController.java +++ b/src/main/java/com/cheeeese/photo/presentation/PhotoQueryController.java @@ -4,11 +4,13 @@ import com.cheeeese.global.common.CommonResponse; import com.cheeeese.global.util.CurrentUser; import com.cheeeese.photo.application.PhotoQueryService; +import com.cheeeese.photo.dto.response.PhotoDetailResponse; import com.cheeeese.photo.dto.response.PhotoPageResponse; import com.cheeeese.user.domain.User; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; +import static com.cheeeese.global.common.code.SuccessCode.PHOTO_DETAIL_GET_SUCCESS; import static com.cheeeese.global.common.code.SuccessCode.PHOTO_LIST_GET_SUCCESS; @RestController @@ -31,4 +33,16 @@ public CommonResponse getAlbumPhotoPage( photoQueryService.getPhotoPage(user, code, page, size, sorting) ); } + + @GetMapping("/{code}/photos/{photoId}") + public CommonResponse getPhotoDetail( + @CurrentUser User user, + @PathVariable String code, + @PathVariable Long photoId + ) { + return CommonResponse.success( + PHOTO_DETAIL_GET_SUCCESS, + photoQueryService.getPhotoDetail(user, code, photoId) + ); + } } From 0485aed55c08e6bc415b2671cf8416066bc93ece Mon Sep 17 00:00:00 2001 From: zyovn Date: Mon, 3 Nov 2025 17:16:12 +0900 Subject: [PATCH 204/402] =?UTF-8?q?#21=20feat:=20=EB=82=B4=EA=B0=80=20?= =?UTF-8?q?=EB=9D=B1=ED=95=9C=20=EC=82=AC=EC=A7=84=20=EB=AA=A9=EB=A1=9D=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../photo/application/PhotoQueryService.java | 6 ++++++ .../persistence/PhotoRepository.java | 16 ++++++++++++++++ .../photo/presentation/PhotoQueryController.java | 14 ++++++++++++++ 3 files changed, 36 insertions(+) diff --git a/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java b/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java index 7a59e46..86f8b30 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java @@ -67,6 +67,12 @@ public void invalidatePhotoCache(String code) { // TODO: 사진 삭제, 업로 redisCacheUtil.deletePattern("album:" + code + ":photos:*"); } + public PhotoPageResponse getPhotoLiked(User user, String code, int page, int size) { + PageRequest pageRequest = PageRequest.of(page, size); + Slice photos = photoRepository.findLikedPhotosByAlbumAndUser(code, user.getId(), pageRequest); + return PhotoMapper.toPhotoPageResponse(photos); + } + public PhotoDetailResponse getPhotoDetail(User user, String code, Long photoId) { Photo photo = photoRepository.findByIdAndAlbum_Code(photoId, code) .orElseThrow(() -> new PhotoException(PhotoErrorCode.PHOTO_ID_NOT_FOUND)); diff --git a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java index eda3ad3..0dfa7a9 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java @@ -24,6 +24,22 @@ public interface PhotoRepository extends JpaRepository { """) Slice findAllByAlbumCode(@Param("code") String code, Pageable pageable); + @Query(""" + SELECT p + FROM Photo p + JOIN p.album a + JOIN PhotoLikes pl ON pl.photo = p + WHERE a.code = :albumCode + AND pl.user.id = :userId + ORDER BY p.createdAt DESC + """) + Slice findLikedPhotosByAlbumAndUser( + @Param("albumCode") String albumCode, + @Param("userId") Long userId, + Pageable pageable + ); + + @Query(""" SELECT p FROM Photo p diff --git a/src/main/java/com/cheeeese/photo/presentation/PhotoQueryController.java b/src/main/java/com/cheeeese/photo/presentation/PhotoQueryController.java index 10be799..6e40756 100644 --- a/src/main/java/com/cheeeese/photo/presentation/PhotoQueryController.java +++ b/src/main/java/com/cheeeese/photo/presentation/PhotoQueryController.java @@ -8,6 +8,7 @@ import com.cheeeese.photo.dto.response.PhotoPageResponse; import com.cheeeese.user.domain.User; import lombok.RequiredArgsConstructor; +import org.springframework.security.core.parameters.P; import org.springframework.web.bind.annotation.*; import static com.cheeeese.global.common.code.SuccessCode.PHOTO_DETAIL_GET_SUCCESS; @@ -34,6 +35,19 @@ public CommonResponse getAlbumPhotoPage( ); } + @GetMapping("/{code}/photos/liked") + public CommonResponse getAlbumLikedPhotoPage( + @CurrentUser User user, + @PathVariable String code, + @RequestParam(defaultValue = "0") int page, + @RequestParam(defaultValue = "10") int size + ) { + return CommonResponse.success( + PHOTO_LIST_GET_SUCCESS, + photoQueryService.getPhotoLiked(user, code, page, size) + ); + } + @GetMapping("/{code}/photos/{photoId}") public CommonResponse getPhotoDetail( @CurrentUser User user, From c04e51501883819a0fac85ab3cce9929356cd99b Mon Sep 17 00:00:00 2001 From: zyovn Date: Mon, 3 Nov 2025 17:17:45 +0900 Subject: [PATCH 205/402] =?UTF-8?q?#21=20chore:=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20import=EB=AC=B8=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cheeeese/photo/presentation/PhotoQueryController.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/cheeeese/photo/presentation/PhotoQueryController.java b/src/main/java/com/cheeeese/photo/presentation/PhotoQueryController.java index 6e40756..36c4b77 100644 --- a/src/main/java/com/cheeeese/photo/presentation/PhotoQueryController.java +++ b/src/main/java/com/cheeeese/photo/presentation/PhotoQueryController.java @@ -8,7 +8,6 @@ import com.cheeeese.photo.dto.response.PhotoPageResponse; import com.cheeeese.user.domain.User; import lombok.RequiredArgsConstructor; -import org.springframework.security.core.parameters.P; import org.springframework.web.bind.annotation.*; import static com.cheeeese.global.common.code.SuccessCode.PHOTO_DETAIL_GET_SUCCESS; From fd8ff2302bf2ec6211204d749bb90e40055d155e Mon Sep 17 00:00:00 2001 From: zyovn Date: Tue, 4 Nov 2025 01:39:25 +0900 Subject: [PATCH 206/402] =?UTF-8?q?#21=20feat:=20=EC=82=AC=EC=A7=84=20?= =?UTF-8?q?=EC=A2=8B=EC=95=84=EC=9A=94=20=EC=83=9D=EC=84=B1,=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../global/common/code/SuccessCode.java | 2 ++ .../photo/application/PhotoService.java | 27 +++++++++++++++++++ .../photo/exception/code/PhotoErrorCode.java | 4 +++ .../mapper/PhotoLikesMapper.java | 15 +++++++++++ .../persistence/PhotoLikesRepository.java | 3 +++ .../persistence/PhotoRepository.java | 17 ++++++++++++ .../photo/presentation/PhotoController.java | 12 +++++++++ 7 files changed, 80 insertions(+) create mode 100644 src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoLikesMapper.java diff --git a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java index dc0b98c..8aa98fb 100644 --- a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java +++ b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java @@ -32,6 +32,8 @@ public enum SuccessCode implements BaseCode { THUMBNAIL_PRODUCE_COMPLETE(HttpStatus.OK, "썸네일 생성이 성공적으로 완료되었습니다."), PHOTO_LIST_GET_SUCCESS(HttpStatus.OK, "앨범 내 사진 목록 조회가 성공적으로 완료되었습니다."), PHOTO_DETAIL_GET_SUCCESS(HttpStatus.OK, "앨범 내 사진 상세 조회가 성공적으로 완료되었습니다."), + PHOTO_LIKES_CREATE_SUCCESS(HttpStatus.OK, "사진 좋아요 생성이 완료되었습니다."), + PHOTO_LIKES_DELETE_SUCCESS(HttpStatus.OK, "사진 좋아요 삭제가 완료되었습니다."), ; private final HttpStatus httpStatus; diff --git a/src/main/java/com/cheeeese/photo/application/PhotoService.java b/src/main/java/com/cheeeese/photo/application/PhotoService.java index b2c3429..6de3260 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoService.java @@ -5,13 +5,16 @@ import com.cheeeese.album.infrastructure.persistence.AlbumRepository; import com.cheeeese.photo.application.validator.PhotoValidator; import com.cheeeese.photo.domain.Photo; +import com.cheeeese.photo.domain.PhotoLikes; import com.cheeeese.photo.domain.PhotoStatus; import com.cheeeese.photo.dto.request.PhotoPresignedUrlRequest; import com.cheeeese.photo.dto.request.PhotoUploadReportRequest; import com.cheeeese.photo.dto.response.PhotoPresignedUrlResponse; import com.cheeeese.photo.exception.PhotoException; import com.cheeeese.photo.exception.code.PhotoErrorCode; +import com.cheeeese.photo.infrastructure.mapper.PhotoLikesMapper; import com.cheeeese.photo.infrastructure.mapper.PhotoMapper; +import com.cheeeese.photo.infrastructure.persistence.PhotoLikesRepository; import com.cheeeese.photo.infrastructure.persistence.PhotoRepository; import com.cheeeese.user.domain.User; import lombok.RequiredArgsConstructor; @@ -29,6 +32,7 @@ public class PhotoService { private final PhotoRepository photoRepository; + private final PhotoLikesRepository photoLikesRepository; private final PhotoValidator photoValidator; private final AlbumValidator albumValidator; private final AlbumRepository albumRepository; @@ -68,6 +72,29 @@ public void reportUploadResult(User user, PhotoUploadReportRequest request) { handleFailedUploads(user.getId(), albumId, request.failurePhotoIds()); } + @Transactional + public void createPhotoLikes(User user, Long photoId) { + Photo photo = photoRepository.findById(photoId) + .orElseThrow(() -> new PhotoException(PhotoErrorCode.PHOTO_NOT_FOUND)); + + PhotoLikes photoLikes = PhotoLikesMapper.toEntity(user, photo); + + photoRepository.incrementLikeCnt(photo.getId()); + photoLikesRepository.save(photoLikes); + } + + @Transactional + public void deletePhotoLikes(User user, Long photoId) { + Photo photo = photoRepository.findById(photoId) + .orElseThrow(() -> new PhotoException(PhotoErrorCode.PHOTO_NOT_FOUND)); + + PhotoLikes photoLikes = photoLikesRepository.findByUserIdAndPhotoId(user.getId(), photo.getId()) + .orElseThrow(() -> new PhotoException(PhotoErrorCode.PHOTO_LIKES_NOT_FOUND)); + + photoRepository.decrementLikeCnt(photo.getId()); + photoLikesRepository.delete(photoLikes); + } + private Album validateAlbumAndPermission(User user, String albumCode) { Album album = albumValidator.validateAlbumCode(albumCode); albumValidator.validateUploadPermission(album, user); diff --git a/src/main/java/com/cheeeese/photo/exception/code/PhotoErrorCode.java b/src/main/java/com/cheeeese/photo/exception/code/PhotoErrorCode.java index 97edf90..08044ac 100644 --- a/src/main/java/com/cheeeese/photo/exception/code/PhotoErrorCode.java +++ b/src/main/java/com/cheeeese/photo/exception/code/PhotoErrorCode.java @@ -26,6 +26,10 @@ public enum PhotoErrorCode implements BaseCode { PHOTO_STATUS_UPDATE_FAILED(HttpStatus.CONFLICT, "사진 상태 업데이트에 실패했습니다."), PHOTO_COUNT_DECREMENT_FAILED(HttpStatus.CONFLICT, "앨범 사진 개수 감소에 실패했습니다."), THUMBNAIL_UPDATE_FAILED(HttpStatus.CONFLICT, "썸네일 상태 업데이트에 실패했습니다."), + + // 사진 도메인 관련 오류 + PHOTO_NOT_FOUND(HttpStatus.NOT_FOUND, "해당 사진을 찾을 수 없습니다."), + PHOTO_LIKES_NOT_FOUND(HttpStatus.NOT_FOUND, "사진에 대한 좋아요 내역이 존재하지 않습니다."), ; private final HttpStatus httpStatus; diff --git a/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoLikesMapper.java b/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoLikesMapper.java new file mode 100644 index 0000000..d7979cf --- /dev/null +++ b/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoLikesMapper.java @@ -0,0 +1,15 @@ +package com.cheeeese.photo.infrastructure.mapper; + +import com.cheeeese.photo.domain.Photo; +import com.cheeeese.photo.domain.PhotoLikes; +import com.cheeeese.user.domain.User; + +public class PhotoLikesMapper { + + public static PhotoLikes toEntity(User user, Photo photo) { + return PhotoLikes.builder() + .user(user) + .photo(photo) + .build(); + } +} diff --git a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoLikesRepository.java b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoLikesRepository.java index 2b520cb..4d44d0d 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoLikesRepository.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoLikesRepository.java @@ -6,6 +6,7 @@ import org.springframework.data.repository.query.Param; import java.util.List; +import java.util.Optional; public interface PhotoLikesRepository extends JpaRepository { @Query(""" @@ -17,4 +18,6 @@ public interface PhotoLikesRepository extends JpaRepository { List findAllLikedPhotoIds(@Param("userId") Long userId, @Param("photoIds") List photoIds); boolean existsByUserIdAndPhotoId(Long userId, Long photoId); + + Optional findByUserIdAndPhotoId(Long userId, Long photoId); } diff --git a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java index 0dfa7a9..6e5d120 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java @@ -15,6 +15,7 @@ public interface PhotoRepository extends JpaRepository { Optional findByIdAndAlbum_Code(Long photoId, String albumCode); + @Query(""" SELECT p FROM Photo p @@ -39,6 +40,22 @@ Slice findLikedPhotosByAlbumAndUser( Pageable pageable ); + @Modifying + @Query(""" + UPDATE Photo p + SET p.likesCnt = p.likesCnt + 1 + WHERE p.id = :photoId + """) + void incrementLikeCnt(@Param("photoId") Long photoId); + + @Modifying + @Query(""" + UPDATE Photo p + SET p.likesCnt = p.likesCnt - 1 + WHERE p.id = :photoId + AND p.likesCnt > 0 + """) + void decrementLikeCnt(@Param("photoId") Long photoId); @Query(""" SELECT p diff --git a/src/main/java/com/cheeeese/photo/presentation/PhotoController.java b/src/main/java/com/cheeeese/photo/presentation/PhotoController.java index bf78310..2bfb137 100644 --- a/src/main/java/com/cheeeese/photo/presentation/PhotoController.java +++ b/src/main/java/com/cheeeese/photo/presentation/PhotoController.java @@ -40,4 +40,16 @@ public CommonResponse reportUploadResult( photoService.reportUploadResult(user, request); return CommonResponse.success(PHOTO_UPLOAD_REPORT_SUCCESS); } + + @PostMapping("/{photoId}/liked") + public CommonResponse createPhotoLikes(@CurrentUser User user, @PathVariable Long photoId) { + photoService.createPhotoLikes(user, photoId); + return CommonResponse.success(PHOTO_LIKES_CREATE_SUCCESS); + } + + @DeleteMapping("/{photoId}/unliked") + public CommonResponse deletePhotoLikes(@CurrentUser User user, @PathVariable Long photoId) { + photoService.deletePhotoLikes(user, photoId); + return CommonResponse.success(PHOTO_LIKES_DELETE_SUCCESS); + } } \ No newline at end of file From e7727b31e7a7557a81eab4e88a61d5a93cc85df5 Mon Sep 17 00:00:00 2001 From: zyovn Date: Tue, 4 Nov 2025 03:11:16 +0900 Subject: [PATCH 207/402] =?UTF-8?q?#21=20feat:=20=EC=82=AC=EC=A7=84=20?= =?UTF-8?q?=EC=97=85=EB=A1=9C=EB=93=9C,=20=EC=82=AC=EC=A7=84=20=EC=A2=8B?= =?UTF-8?q?=EC=95=84=EC=9A=94=20=EB=93=B1=20=EC=83=81=ED=83=9C=20=EB=B3=80?= =?UTF-8?q?=ED=99=94=20=EB=A1=9C=EC=A7=81=EC=97=90=20=EC=BA=90=EC=8B=9C=20?= =?UTF-8?q?=EB=AC=B4=ED=9A=A8=ED=99=94=20=EB=A1=9C=EC=A7=81=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=EB=B0=8F=20=ED=83=80=EC=9E=85=20=EC=BA=90=EC=8A=A4?= =?UTF-8?q?=ED=8C=85=20=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/cheeeese/global/config/RedisConfig.java | 2 +- .../java/com/cheeeese/global/util/RedisCacheUtil.java | 5 ++++- .../java/com/cheeeese/photo/application/PhotoService.java | 8 ++++++++ 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/cheeeese/global/config/RedisConfig.java b/src/main/java/com/cheeeese/global/config/RedisConfig.java index 03bae68..6b3fb9b 100644 --- a/src/main/java/com/cheeeese/global/config/RedisConfig.java +++ b/src/main/java/com/cheeeese/global/config/RedisConfig.java @@ -49,9 +49,9 @@ public RedisTemplate cacheRedisTemplate() { GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer(); redisTemplate.setKeySerializer(new StringRedisSerializer()); - redisTemplate.setKeySerializer(serializer); redisTemplate.setHashKeySerializer(new StringRedisSerializer()); redisTemplate.setValueSerializer(serializer); + redisTemplate.setHashValueSerializer(serializer); return redisTemplate; } diff --git a/src/main/java/com/cheeeese/global/util/RedisCacheUtil.java b/src/main/java/com/cheeeese/global/util/RedisCacheUtil.java index e9198b3..8645957 100644 --- a/src/main/java/com/cheeeese/global/util/RedisCacheUtil.java +++ b/src/main/java/com/cheeeese/global/util/RedisCacheUtil.java @@ -27,7 +27,10 @@ public void setValue(String key, Object value, Long expiredTime) { } public Long getValue(String key) { - return (Long) cacheRedisTemplate.opsForValue().get(key); + Object value = cacheRedisTemplate.opsForValue().get(key); + if (value instanceof Long) return (Long) value; + if (value instanceof Integer) return ((Integer) value).longValue(); + return null; } /** diff --git a/src/main/java/com/cheeeese/photo/application/PhotoService.java b/src/main/java/com/cheeeese/photo/application/PhotoService.java index 6de3260..2122391 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoService.java @@ -37,6 +37,7 @@ public class PhotoService { private final AlbumValidator albumValidator; private final AlbumRepository albumRepository; private final PresignedUrlService presignedUrlService; + private final PhotoQueryService photoQueryService; private static final String ORIGINAL_PHOTO_PATH_FORMAT = "album/%s/original/%d_%s"; @@ -59,6 +60,9 @@ public PhotoPresignedUrlResponse createPresignedUrls(User user, PhotoPresignedUr } List presignedUrls = generatePresignedUrls(user, album, request.fileInfos()); + + photoQueryService.invalidatePhotoCache(album.getCode()); + return PhotoMapper.toPresignedUrlResponse(presignedUrls); } @@ -81,6 +85,8 @@ public void createPhotoLikes(User user, Long photoId) { photoRepository.incrementLikeCnt(photo.getId()); photoLikesRepository.save(photoLikes); + + photoQueryService.invalidatePhotoCache(photo.getAlbum().getCode()); } @Transactional @@ -93,6 +99,8 @@ public void deletePhotoLikes(User user, Long photoId) { photoRepository.decrementLikeCnt(photo.getId()); photoLikesRepository.delete(photoLikes); + + photoQueryService.invalidatePhotoCache(photo.getAlbum().getCode()); } private Album validateAlbumAndPermission(User user, String albumCode) { From fd1c8be1e10a14fa3e97c9fc20bc77f38fd4a18d Mon Sep 17 00:00:00 2001 From: zyovn Date: Tue, 4 Nov 2025 03:21:20 +0900 Subject: [PATCH 208/402] =?UTF-8?q?#21=20feat:=20=EC=82=AC=EC=A7=84=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=20=EC=A1=B0=ED=9A=8C=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=9E=90=20=EC=9D=B4=EB=A6=84=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cheeeese/photo/dto/response/PhotoDetailResponse.java | 1 + .../com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java | 1 + 2 files changed, 2 insertions(+) diff --git a/src/main/java/com/cheeeese/photo/dto/response/PhotoDetailResponse.java b/src/main/java/com/cheeeese/photo/dto/response/PhotoDetailResponse.java index 46bf681..681496a 100644 --- a/src/main/java/com/cheeeese/photo/dto/response/PhotoDetailResponse.java +++ b/src/main/java/com/cheeeese/photo/dto/response/PhotoDetailResponse.java @@ -4,6 +4,7 @@ @Builder public record PhotoDetailResponse( + String name, Long photoId, String imageUrl, String thumbnailUrl, diff --git a/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java b/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java index fe998ef..11fc0cc 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java @@ -80,6 +80,7 @@ public static PhotoPageResponse toRebuildPhotoPageResponse(PhotoPageResponse res public static PhotoDetailResponse toPhotoDetailResponse(Photo photo, boolean isLiked, boolean isDownloaded) { return PhotoDetailResponse.builder() + .name(photo.getUser().getName()) .photoId(photo.getId()) .imageUrl(photo.getImageUrl()) .thumbnailUrl(photo.getThumbnailUrl()) From 12095c66ddebc275e48f82c637dd0a2b355a7b5b Mon Sep 17 00:00:00 2001 From: zyovn Date: Tue, 4 Nov 2025 13:57:49 +0900 Subject: [PATCH 209/402] =?UTF-8?q?#21=20fix:=20=EB=82=B4=EA=B0=80=20?= =?UTF-8?q?=EB=9D=B1=ED=95=9C=20=EC=82=AC=EC=A7=84=20=EB=AA=A9=EB=A1=9D=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../global/common/code/SuccessCode.java | 1 + .../photo/application/PhotoQueryService.java | 16 +++++++++---- .../dto/response/PhotoLikedPageResponse.java | 15 ++++++++++++ .../dto/response/PhotoLikedResponse.java | 11 +++++++++ .../infrastructure/mapper/PhotoMapper.java | 23 +++++++++++++++---- .../presentation/PhotoQueryController.java | 3 ++- 6 files changed, 59 insertions(+), 10 deletions(-) create mode 100644 src/main/java/com/cheeeese/photo/dto/response/PhotoLikedPageResponse.java create mode 100644 src/main/java/com/cheeeese/photo/dto/response/PhotoLikedResponse.java diff --git a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java index 8aa98fb..8910386 100644 --- a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java +++ b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java @@ -31,6 +31,7 @@ public enum SuccessCode implements BaseCode { PHOTO_UPLOAD_REPORT_SUCCESS(HttpStatus.OK, "사진 업로드 결과 보고가 성공적으로 처리되었습니다."), THUMBNAIL_PRODUCE_COMPLETE(HttpStatus.OK, "썸네일 생성이 성공적으로 완료되었습니다."), PHOTO_LIST_GET_SUCCESS(HttpStatus.OK, "앨범 내 사진 목록 조회가 성공적으로 완료되었습니다."), + PHOTO_LIKES_LIST_GET_SUCCESS(HttpStatus.OK, "내가 띱한 사진 목록 조회가 성공적으로 완료되었습니다."), PHOTO_DETAIL_GET_SUCCESS(HttpStatus.OK, "앨범 내 사진 상세 조회가 성공적으로 완료되었습니다."), PHOTO_LIKES_CREATE_SUCCESS(HttpStatus.OK, "사진 좋아요 생성이 완료되었습니다."), PHOTO_LIKES_DELETE_SUCCESS(HttpStatus.OK, "사진 좋아요 삭제가 완료되었습니다."), diff --git a/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java b/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java index 86f8b30..eb1aab3 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java @@ -3,9 +3,7 @@ import com.cheeeese.album.domain.type.AlbumSorting; import com.cheeeese.global.util.RedisCacheUtil; import com.cheeeese.photo.domain.Photo; -import com.cheeeese.photo.dto.response.PhotoDetailResponse; -import com.cheeeese.photo.dto.response.PhotoListResponse; -import com.cheeeese.photo.dto.response.PhotoPageResponse; +import com.cheeeese.photo.dto.response.*; import com.cheeeese.photo.exception.PhotoException; import com.cheeeese.photo.exception.code.PhotoErrorCode; import com.cheeeese.photo.infrastructure.mapper.PhotoMapper; @@ -67,10 +65,18 @@ public void invalidatePhotoCache(String code) { // TODO: 사진 삭제, 업로 redisCacheUtil.deletePattern("album:" + code + ":photos:*"); } - public PhotoPageResponse getPhotoLiked(User user, String code, int page, int size) { + public PhotoLikedPageResponse getPhotoLiked(User user, String code, int page, int size) { PageRequest pageRequest = PageRequest.of(page, size); Slice photos = photoRepository.findLikedPhotosByAlbumAndUser(code, user.getId(), pageRequest); - return PhotoMapper.toPhotoPageResponse(photos); + + List responses = photos.getContent().stream() + .map(photo -> { + boolean isDownloaded = photoHistoryRepository.existsByUserIdAndPhotoId(user.getId(), photo.getId()); + return PhotoMapper.toPhotoLikedResponse(photo, isDownloaded); + }) + .toList(); + + return PhotoMapper.toPhotoLikedPageResponse(photos, responses); } public PhotoDetailResponse getPhotoDetail(User user, String code, Long photoId) { diff --git a/src/main/java/com/cheeeese/photo/dto/response/PhotoLikedPageResponse.java b/src/main/java/com/cheeeese/photo/dto/response/PhotoLikedPageResponse.java new file mode 100644 index 0000000..e063ba9 --- /dev/null +++ b/src/main/java/com/cheeeese/photo/dto/response/PhotoLikedPageResponse.java @@ -0,0 +1,15 @@ +package com.cheeeese.photo.dto.response; + +import lombok.Builder; + +import java.util.List; + +@Builder +public record PhotoLikedPageResponse( + List responses, + int listSize, + boolean isFirst, + boolean isLast, + boolean hasNext +) { +} diff --git a/src/main/java/com/cheeeese/photo/dto/response/PhotoLikedResponse.java b/src/main/java/com/cheeeese/photo/dto/response/PhotoLikedResponse.java new file mode 100644 index 0000000..2450363 --- /dev/null +++ b/src/main/java/com/cheeeese/photo/dto/response/PhotoLikedResponse.java @@ -0,0 +1,11 @@ +package com.cheeeese.photo.dto.response; + +import lombok.Builder; + +@Builder +public record PhotoLikedResponse( + Long photoId, + String thumbnailUrl, + boolean isDownloaded +) { +} diff --git a/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java b/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java index 11fc0cc..b881514 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java @@ -3,10 +3,7 @@ import com.cheeeese.album.domain.Album; import com.cheeeese.photo.domain.Photo; import com.cheeeese.photo.domain.PhotoStatus; -import com.cheeeese.photo.dto.response.PhotoDetailResponse; -import com.cheeeese.photo.dto.response.PhotoListResponse; -import com.cheeeese.photo.dto.response.PhotoPageResponse; -import com.cheeeese.photo.dto.response.PhotoPresignedUrlResponse; +import com.cheeeese.photo.dto.response.*; import com.cheeeese.user.domain.User; import org.springframework.data.domain.Slice; @@ -54,6 +51,14 @@ public static PhotoListResponse toPhotoListResponse(Photo photo, boolean isLiked .build(); } + public static PhotoLikedResponse toPhotoLikedResponse(Photo photo, boolean isDownloaded) { + return PhotoLikedResponse.builder() + .photoId(photo.getId()) + .thumbnailUrl(photo.getThumbnailUrl()) + .isDownloaded(isDownloaded) + .build(); + } + public static PhotoPageResponse toPhotoPageResponse(Slice photos) { List responses = photos.getContent().stream() .map(photo -> PhotoMapper.toPhotoListResponse(photo, false, false)) @@ -68,6 +73,16 @@ public static PhotoPageResponse toPhotoPageResponse(Slice photos) { .build(); } + public static PhotoLikedPageResponse toPhotoLikedPageResponse(Slice photos, List responses) { + return PhotoLikedPageResponse.builder() + .responses(responses) + .listSize(responses.size()) + .isFirst(photos.isFirst()) + .isLast(photos.isLast()) + .hasNext(photos.hasNext()) + .build(); + } + public static PhotoPageResponse toRebuildPhotoPageResponse(PhotoPageResponse response, List updated) { return PhotoPageResponse.builder() .responses(updated) diff --git a/src/main/java/com/cheeeese/photo/presentation/PhotoQueryController.java b/src/main/java/com/cheeeese/photo/presentation/PhotoQueryController.java index 36c4b77..8ba71c3 100644 --- a/src/main/java/com/cheeeese/photo/presentation/PhotoQueryController.java +++ b/src/main/java/com/cheeeese/photo/presentation/PhotoQueryController.java @@ -5,6 +5,7 @@ import com.cheeeese.global.util.CurrentUser; import com.cheeeese.photo.application.PhotoQueryService; import com.cheeeese.photo.dto.response.PhotoDetailResponse; +import com.cheeeese.photo.dto.response.PhotoLikedPageResponse; import com.cheeeese.photo.dto.response.PhotoPageResponse; import com.cheeeese.user.domain.User; import lombok.RequiredArgsConstructor; @@ -35,7 +36,7 @@ public CommonResponse getAlbumPhotoPage( } @GetMapping("/{code}/photos/liked") - public CommonResponse getAlbumLikedPhotoPage( + public CommonResponse getAlbumLikedPhotoPage( @CurrentUser User user, @PathVariable String code, @RequestParam(defaultValue = "0") int page, From d240197270ed41b3a8f9c5f02c0d8254d8d8a963 Mon Sep 17 00:00:00 2001 From: zyovn Date: Tue, 4 Nov 2025 15:17:21 +0900 Subject: [PATCH 210/402] =?UTF-8?q?#21=20docs:=20swagger=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/response/PhotoDetailResponse.java | 15 +++ .../dto/response/PhotoLikedPageResponse.java | 11 +++ .../dto/response/PhotoLikedResponse.java | 7 ++ .../photo/dto/response/PhotoListResponse.java | 11 +++ .../photo/dto/response/PhotoPageResponse.java | 11 +++ .../photo/presentation/PhotoController.java | 2 + .../presentation/PhotoQueryController.java | 7 +- .../swagger/PhotoQuerySwagger.java | 93 +++++++++++++++++++ .../presentation/swagger/PhotoSwagger.java | 39 ++++++++ 9 files changed, 195 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/cheeeese/photo/presentation/swagger/PhotoQuerySwagger.java diff --git a/src/main/java/com/cheeeese/photo/dto/response/PhotoDetailResponse.java b/src/main/java/com/cheeeese/photo/dto/response/PhotoDetailResponse.java index 681496a..9cb325b 100644 --- a/src/main/java/com/cheeeese/photo/dto/response/PhotoDetailResponse.java +++ b/src/main/java/com/cheeeese/photo/dto/response/PhotoDetailResponse.java @@ -1,15 +1,30 @@ package com.cheeeese.photo.dto.response; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Builder; @Builder +@Schema(description = "사진 상세 조회 API") public record PhotoDetailResponse( + @Schema(description = "사용자 이름", example = "주정빈") String name, + + @Schema(description = "사진 ID", example = "1") Long photoId, + + @Schema(description = "사진 원본 url", example = "example.jpg") String imageUrl, + + @Schema(description = "사진 썸네일 url", example = "example.jpg") String thumbnailUrl, + + @Schema(description = "좋아요 수", example = "1") int likesCnt, + + @Schema(description = "좋아요 여부", example = "true") boolean isLiked, + + @Schema(description = "다운로드 여부", example = "false") boolean isDownloaded ) { } diff --git a/src/main/java/com/cheeeese/photo/dto/response/PhotoLikedPageResponse.java b/src/main/java/com/cheeeese/photo/dto/response/PhotoLikedPageResponse.java index e063ba9..46bb067 100644 --- a/src/main/java/com/cheeeese/photo/dto/response/PhotoLikedPageResponse.java +++ b/src/main/java/com/cheeeese/photo/dto/response/PhotoLikedPageResponse.java @@ -1,15 +1,26 @@ package com.cheeeese.photo.dto.response; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Builder; import java.util.List; @Builder +@Schema(description = "내가 띱한 사진 조회 페이지네이션") public record PhotoLikedPageResponse( + @Schema(description = "좋아요한 사진 목록", example = "[{ \"photoId\": 1, \"thumbnailUrl\": \"https://cdn.cheeeese.me/thumb1.jpg\", \"isDownloaded\": true }]") List responses, + + @Schema(description = "현재 페이지의 사진 개수", example = "10") int listSize, + + @Schema(description = "첫 번째 페이지 여부", example = "true") boolean isFirst, + + @Schema(description = "마지막 페이지 여부", example = "false") boolean isLast, + + @Schema(description = "다음 페이지 존재 여부", example = "true") boolean hasNext ) { } diff --git a/src/main/java/com/cheeeese/photo/dto/response/PhotoLikedResponse.java b/src/main/java/com/cheeeese/photo/dto/response/PhotoLikedResponse.java index 2450363..be564c1 100644 --- a/src/main/java/com/cheeeese/photo/dto/response/PhotoLikedResponse.java +++ b/src/main/java/com/cheeeese/photo/dto/response/PhotoLikedResponse.java @@ -1,11 +1,18 @@ package com.cheeeese.photo.dto.response; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Builder; @Builder +@Schema(description = "내가 띱한 사진 목록 조회 API") public record PhotoLikedResponse( + @Schema(description = "사진 ID", example = "1") Long photoId, + + @Schema(description = "사진 썸네일 url", example = "example.jpg") String thumbnailUrl, + + @Schema(description = "다운로드 여부", example = "false") boolean isDownloaded ) { } diff --git a/src/main/java/com/cheeeese/photo/dto/response/PhotoListResponse.java b/src/main/java/com/cheeeese/photo/dto/response/PhotoListResponse.java index c4d588b..49a1189 100644 --- a/src/main/java/com/cheeeese/photo/dto/response/PhotoListResponse.java +++ b/src/main/java/com/cheeeese/photo/dto/response/PhotoListResponse.java @@ -1,13 +1,24 @@ package com.cheeeese.photo.dto.response; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Builder; @Builder(toBuilder = true) +@Schema(description = "사진 목록 조회 API") public record PhotoListResponse( + @Schema(description = "사진 ID", example = "1") Long photoId, + + @Schema(description = "사진 썸네일 url", example = "example.jpg") String thumbnailUrl, + + @Schema(description = "좋아요 수", example = "1") int likeCnt, + + @Schema(description = "좋아요 여부", example = "true") boolean isLiked, + + @Schema(description = "다운로드 여부", example = "false") boolean isDownloaded ) { public PhotoListResponse withUserStatus(boolean isLiked, boolean isDownloaded) { diff --git a/src/main/java/com/cheeeese/photo/dto/response/PhotoPageResponse.java b/src/main/java/com/cheeeese/photo/dto/response/PhotoPageResponse.java index 5700e76..0e6e4b8 100644 --- a/src/main/java/com/cheeeese/photo/dto/response/PhotoPageResponse.java +++ b/src/main/java/com/cheeeese/photo/dto/response/PhotoPageResponse.java @@ -1,15 +1,26 @@ package com.cheeeese.photo.dto.response; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Builder; import java.util.List; @Builder +@Schema(description = "사진 목록 조회 페이지네이션") public record PhotoPageResponse( + @Schema(description = "사진 목록", example = "[{ \"photoId\": 1, \"thumbnailUrl\": \"https://cdn.cheeeese.me/thumb1.jpg\", \"isLiked\": true, \"isDownloaded\": false }]") List responses, + + @Schema(description = "현재 페이지의 사진 개수", example = "20") int listSize, + + @Schema(description = "첫 번째 페이지 여부", example = "true") boolean isFirst, + + @Schema(description = "마지막 페이지 여부", example = "false") boolean isLast, + + @Schema(description = "다음 페이지 존재 여부", example = "true") boolean hasNext ) { } diff --git a/src/main/java/com/cheeeese/photo/presentation/PhotoController.java b/src/main/java/com/cheeeese/photo/presentation/PhotoController.java index 2bfb137..47d0326 100644 --- a/src/main/java/com/cheeeese/photo/presentation/PhotoController.java +++ b/src/main/java/com/cheeeese/photo/presentation/PhotoController.java @@ -41,12 +41,14 @@ public CommonResponse reportUploadResult( return CommonResponse.success(PHOTO_UPLOAD_REPORT_SUCCESS); } + @Override @PostMapping("/{photoId}/liked") public CommonResponse createPhotoLikes(@CurrentUser User user, @PathVariable Long photoId) { photoService.createPhotoLikes(user, photoId); return CommonResponse.success(PHOTO_LIKES_CREATE_SUCCESS); } + @Override @DeleteMapping("/{photoId}/unliked") public CommonResponse deletePhotoLikes(@CurrentUser User user, @PathVariable Long photoId) { photoService.deletePhotoLikes(user, photoId); diff --git a/src/main/java/com/cheeeese/photo/presentation/PhotoQueryController.java b/src/main/java/com/cheeeese/photo/presentation/PhotoQueryController.java index 8ba71c3..c179fd4 100644 --- a/src/main/java/com/cheeeese/photo/presentation/PhotoQueryController.java +++ b/src/main/java/com/cheeeese/photo/presentation/PhotoQueryController.java @@ -7,6 +7,8 @@ import com.cheeeese.photo.dto.response.PhotoDetailResponse; import com.cheeeese.photo.dto.response.PhotoLikedPageResponse; import com.cheeeese.photo.dto.response.PhotoPageResponse; +import com.cheeeese.photo.presentation.swagger.PhotoQuerySwagger; +import com.cheeeese.photo.presentation.swagger.PhotoSwagger; import com.cheeeese.user.domain.User; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; @@ -17,10 +19,11 @@ @RestController @RequiredArgsConstructor @RequestMapping("/v1/album") -public class PhotoQueryController { +public class PhotoQueryController implements PhotoQuerySwagger { private final PhotoQueryService photoQueryService; + @Override @GetMapping("/{code}/photos") public CommonResponse getAlbumPhotoPage( @CurrentUser User user, @@ -35,6 +38,7 @@ public CommonResponse getAlbumPhotoPage( ); } + @Override @GetMapping("/{code}/photos/liked") public CommonResponse getAlbumLikedPhotoPage( @CurrentUser User user, @@ -48,6 +52,7 @@ public CommonResponse getAlbumLikedPhotoPage( ); } + @Override @GetMapping("/{code}/photos/{photoId}") public CommonResponse getPhotoDetail( @CurrentUser User user, diff --git a/src/main/java/com/cheeeese/photo/presentation/swagger/PhotoQuerySwagger.java b/src/main/java/com/cheeeese/photo/presentation/swagger/PhotoQuerySwagger.java new file mode 100644 index 0000000..3751bff --- /dev/null +++ b/src/main/java/com/cheeeese/photo/presentation/swagger/PhotoQuerySwagger.java @@ -0,0 +1,93 @@ +package com.cheeeese.photo.presentation.swagger; + +import com.cheeeese.album.domain.type.AlbumSorting; +import com.cheeeese.global.common.CommonResponse; +import com.cheeeese.global.util.CurrentUser; +import com.cheeeese.photo.dto.response.PhotoDetailResponse; +import com.cheeeese.photo.dto.response.PhotoLikedPageResponse; +import com.cheeeese.photo.dto.response.PhotoPageResponse; +import com.cheeeese.user.domain.User; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestParam; + +@Tag(name = "[사진 조회]", description = "사진 조회 관련 API") +public interface PhotoQuerySwagger { + @Operation( + summary = "앨범 내 사진 목록 조회 API", + description = """ + ### PathVariable + --- + `code`: 앨범 코드 \n + + ### RequestParam + --- + `page`: 조회할 페이지 번호 (기본값: 0) \n + `size`: 페이지당 사진 개수 (기본값: 20) \n + `sorting`: 정렬 기준 (`CREATED_AT`: 업로드 시간순, `POPULAR`: 띱 많은순, `CAPTURED_AT`: 최근 촬영한 시간순) + """ + ) + @ApiResponses(value = { + @ApiResponse( + responseCode = "200", + description = "앨범 내 사진 목록 조회가 성공적으로 실행되었습니다." + ) + }) + CommonResponse getAlbumPhotoPage( + @CurrentUser User user, + @PathVariable String code, + @RequestParam(defaultValue = "0") int page, + @RequestParam(defaultValue = "20") int size, + @RequestParam(defaultValue = "CREATED_AT") AlbumSorting sorting + ); + + @Operation( + summary = "내가 띱한 사진 목록 조회 API", + description = """ + ### PathVariable + --- + `code`: 앨범 코드 \n + + ### RequestParam + --- + `page`: 조회할 페이지 번호 (기본값: 0) \n + `size`: 페이지당 사진 개수 (기본값: 10) \n + """ + ) + @ApiResponses(value = { + @ApiResponse( + responseCode = "200", + description = "내가 띱한 사진 목록 조회가 성공적으로 실행되었습니다." + ) + }) + CommonResponse getAlbumLikedPhotoPage( + @CurrentUser User user, + @PathVariable String code, + @RequestParam(defaultValue = "0") int page, + @RequestParam(defaultValue = "10") int size + ); + + @Operation( + summary = "앨범 내 사진 상세 조회 API", + description = """ + ### PathVariable + --- + `code`: 앨범 코드 \n + `photoId`: 사진 ID + """ + ) + @ApiResponses(value = { + @ApiResponse( + responseCode = "200", + description = "앨범 내 사진 상세 조회가 성공적으로 실행되었습니다." + ) + }) + CommonResponse getPhotoDetail( + @CurrentUser User user, + @PathVariable String code, + @PathVariable Long photoId + ); +} diff --git a/src/main/java/com/cheeeese/photo/presentation/swagger/PhotoSwagger.java b/src/main/java/com/cheeeese/photo/presentation/swagger/PhotoSwagger.java index 634ad64..72c2255 100644 --- a/src/main/java/com/cheeeese/photo/presentation/swagger/PhotoSwagger.java +++ b/src/main/java/com/cheeeese/photo/presentation/swagger/PhotoSwagger.java @@ -13,6 +13,7 @@ import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; @Tag(name = "[사진]", description = "사진 업로드 및 관리에 대한 API") @@ -167,4 +168,42 @@ CommonResponse reportUploadResult( @CurrentUser User user, @RequestBody @Valid PhotoUploadReportRequest request ); + + @Operation( + summary = "사진 좋아요 생성 API", + description = """ + ### PathVariable + --- + `photoId`: 사진 ID + """ + ) + @ApiResponses(value = { + @ApiResponse( + responseCode = "200", + description = "사진에 대한 좋아요 생성이 성공적으로 실행되었습니다." + ) + }) + CommonResponse createPhotoLikes( + @CurrentUser User user, + @PathVariable Long photoId + ); + + @Operation( + summary = "사진 좋아요 삭제 API", + description = """ + ### PathVariable + --- + `photoId`: 사진 ID + """ + ) + @ApiResponses(value = { + @ApiResponse( + responseCode = "200", + description = "사진에 대한 좋아요 삭제가 성공적으로 실행되었습니다." + ) + }) + CommonResponse deletePhotoLikes( + @CurrentUser User user, + @PathVariable Long photoId + ); } From c83b7a1628a3304996a0190f198077c0bdefc079 Mon Sep 17 00:00:00 2001 From: zyovn Date: Tue, 4 Nov 2025 15:54:27 +0900 Subject: [PATCH 211/402] =?UTF-8?q?#21=20feat:=201=EC=8B=9C=EA=B0=84=20?= =?UTF-8?q?=EB=82=B4=20=EB=8B=A4=EC=9A=B4=EB=A1=9C=EB=93=9C=20=EC=97=AC?= =?UTF-8?q?=EB=B6=80=20=ED=95=84=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../photo/application/PhotoQueryService.java | 25 ++++++++++++++----- .../dto/response/PhotoDetailResponse.java | 5 +++- .../dto/response/PhotoLikedPageResponse.java | 14 ++++++++++- .../dto/response/PhotoLikedResponse.java | 5 +++- .../photo/dto/response/PhotoListResponse.java | 8 ++++-- .../photo/dto/response/PhotoPageResponse.java | 16 +++++++++++- .../infrastructure/mapper/PhotoMapper.java | 6 +++-- .../persistence/PhotoHistoryRepository.java | 12 ++++++++- 8 files changed, 76 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java b/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java index eb1aab3..e0401f7 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java @@ -72,7 +72,10 @@ public PhotoLikedPageResponse getPhotoLiked(User user, String code, int page, in List responses = photos.getContent().stream() .map(photo -> { boolean isDownloaded = photoHistoryRepository.existsByUserIdAndPhotoId(user.getId(), photo.getId()); - return PhotoMapper.toPhotoLikedResponse(photo, isDownloaded); + boolean isRecentlyDownloaded = photoHistoryRepository.existsByUserIdAndPhotoIdAndCreatedAt( + user.getId(), photo.getId(), LocalDateTime.now().minusHours(1) + ); + return PhotoMapper.toPhotoLikedResponse(photo, isDownloaded, isRecentlyDownloaded); }) .toList(); @@ -85,8 +88,11 @@ public PhotoDetailResponse getPhotoDetail(User user, String code, Long photoId) boolean isLiked = photoLikesRepository.existsByUserIdAndPhotoId(user.getId(), photo.getId()); boolean isDownloaded = photoHistoryRepository.existsByUserIdAndPhotoId(user.getId(), photo.getId()); + boolean isRecentlyDownloaded = photoHistoryRepository.existsByUserIdAndPhotoIdAndCreatedAt( + user.getId(), photo.getId(), LocalDateTime.now().minusHours(1) + ); - return PhotoMapper.toPhotoDetailResponse(photo, isLiked, isDownloaded); + return PhotoMapper.toPhotoDetailResponse(photo, isLiked, isDownloaded, isRecentlyDownloaded); } private PhotoPageResponse getPhotoPageFromDB(String code, int page, int size, AlbumSorting albumSorting) { @@ -99,7 +105,8 @@ private PhotoPageResponse attachUserStatus(User user, PhotoPageResponse response List photoIds = extractPhotoIds(response); Set likedIds = findUserLikedPhotoIds(user.getId(), photoIds); Set downloadedIds = findUserDownloadedPhotoIds(user.getId(), photoIds); - List updatedResponses = updateUserStatus(response.responses(), likedIds, downloadedIds); + Set recentlyDownloadedIds = findUserRecentlyDownloadedPhotoIds(user.getId(), photoIds); + List updatedResponses = updateUserStatus(response.responses(), likedIds, downloadedIds, recentlyDownloadedIds); return PhotoMapper.toRebuildPhotoPageResponse(response, updatedResponses); } @@ -114,18 +121,24 @@ private Set findUserLikedPhotoIds(Long userId, List photoIds) { } private Set findUserDownloadedPhotoIds(Long userId, List photoIds) { - return new HashSet<>(photoHistoryRepository.findAllHistoryPhotoIds(userId, photoIds, LocalDateTime.now().minusHours(1))); + return new HashSet<>(photoHistoryRepository.findDownloadedPhotoIdsByUserId(userId, photoIds)); + } + + private Set findUserRecentlyDownloadedPhotoIds(Long userId, List photoIds) { + return new HashSet<>(photoHistoryRepository.findRecentlyDownloadedPhotoIdsByUserId(userId, photoIds, LocalDateTime.now().minusHours(1))); } private List updateUserStatus( List responses, Set likeIds, - Set downloadedIds + Set downloadedIds, + Set recentlyDownloadedIds ) { return responses.stream() .map(response -> response.withUserStatus( likeIds.contains(response.photoId()), - downloadedIds.contains(response.photoId()) + downloadedIds.contains(response.photoId()), + recentlyDownloadedIds.contains(response.photoId()) )).toList(); } diff --git a/src/main/java/com/cheeeese/photo/dto/response/PhotoDetailResponse.java b/src/main/java/com/cheeeese/photo/dto/response/PhotoDetailResponse.java index 9cb325b..15df716 100644 --- a/src/main/java/com/cheeeese/photo/dto/response/PhotoDetailResponse.java +++ b/src/main/java/com/cheeeese/photo/dto/response/PhotoDetailResponse.java @@ -25,6 +25,9 @@ public record PhotoDetailResponse( boolean isLiked, @Schema(description = "다운로드 여부", example = "false") - boolean isDownloaded + boolean isDownloaded, + + @Schema(description = "1시간 이내 다운로드 여부", example = "false") + boolean isRecentlyDownloaded ) { } diff --git a/src/main/java/com/cheeeese/photo/dto/response/PhotoLikedPageResponse.java b/src/main/java/com/cheeeese/photo/dto/response/PhotoLikedPageResponse.java index 46bb067..ee299cb 100644 --- a/src/main/java/com/cheeeese/photo/dto/response/PhotoLikedPageResponse.java +++ b/src/main/java/com/cheeeese/photo/dto/response/PhotoLikedPageResponse.java @@ -8,7 +8,19 @@ @Builder @Schema(description = "내가 띱한 사진 조회 페이지네이션") public record PhotoLikedPageResponse( - @Schema(description = "좋아요한 사진 목록", example = "[{ \"photoId\": 1, \"thumbnailUrl\": \"https://cdn.cheeeese.me/thumb1.jpg\", \"isDownloaded\": true }]") + @Schema( + description = "사진 목록", + example = """ + [ + { + "photoId": 1, + "thumbnailUrl": "https://cdn.cheeeese.me/thumb1.jpg", + "isDownloaded": false, + "isRecentlyDownloaded": false + } + ] + """ + ) List responses, @Schema(description = "현재 페이지의 사진 개수", example = "10") diff --git a/src/main/java/com/cheeeese/photo/dto/response/PhotoLikedResponse.java b/src/main/java/com/cheeeese/photo/dto/response/PhotoLikedResponse.java index be564c1..3254348 100644 --- a/src/main/java/com/cheeeese/photo/dto/response/PhotoLikedResponse.java +++ b/src/main/java/com/cheeeese/photo/dto/response/PhotoLikedResponse.java @@ -13,6 +13,9 @@ public record PhotoLikedResponse( String thumbnailUrl, @Schema(description = "다운로드 여부", example = "false") - boolean isDownloaded + boolean isDownloaded, + + @Schema(description = "1시간 이내 다운로드 여부", example = "false") + boolean isRecentlyDownloaded ) { } diff --git a/src/main/java/com/cheeeese/photo/dto/response/PhotoListResponse.java b/src/main/java/com/cheeeese/photo/dto/response/PhotoListResponse.java index 49a1189..351a5cf 100644 --- a/src/main/java/com/cheeeese/photo/dto/response/PhotoListResponse.java +++ b/src/main/java/com/cheeeese/photo/dto/response/PhotoListResponse.java @@ -19,12 +19,16 @@ public record PhotoListResponse( boolean isLiked, @Schema(description = "다운로드 여부", example = "false") - boolean isDownloaded + boolean isDownloaded, + + @Schema(description = "1시간 이내 다운로드 여부", example = "false") + boolean isRecentlyDownloaded ) { - public PhotoListResponse withUserStatus(boolean isLiked, boolean isDownloaded) { + public PhotoListResponse withUserStatus(boolean isLiked, boolean isDownloaded, boolean isRecentlyDownloaded) { return this.toBuilder() .isLiked(isLiked) .isDownloaded(isDownloaded) + .isRecentlyDownloaded(isRecentlyDownloaded) .build(); } } diff --git a/src/main/java/com/cheeeese/photo/dto/response/PhotoPageResponse.java b/src/main/java/com/cheeeese/photo/dto/response/PhotoPageResponse.java index 0e6e4b8..3bb482a 100644 --- a/src/main/java/com/cheeeese/photo/dto/response/PhotoPageResponse.java +++ b/src/main/java/com/cheeeese/photo/dto/response/PhotoPageResponse.java @@ -8,7 +8,21 @@ @Builder @Schema(description = "사진 목록 조회 페이지네이션") public record PhotoPageResponse( - @Schema(description = "사진 목록", example = "[{ \"photoId\": 1, \"thumbnailUrl\": \"https://cdn.cheeeese.me/thumb1.jpg\", \"isLiked\": true, \"isDownloaded\": false }]") + @Schema( + description = "사진 목록", + example = """ + [ + { + "photoId": 1, + "thumbnailUrl": "https://cdn.cheeeese.me/thumb1.jpg", + "likesCnt": 1, + "isLiked": true, + "isDownloaded": false, + "isRecentlyDownloaded": false + } + ] + """ + ) List responses, @Schema(description = "현재 페이지의 사진 개수", example = "20") diff --git a/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java b/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java index b881514..105a655 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java @@ -51,11 +51,12 @@ public static PhotoListResponse toPhotoListResponse(Photo photo, boolean isLiked .build(); } - public static PhotoLikedResponse toPhotoLikedResponse(Photo photo, boolean isDownloaded) { + public static PhotoLikedResponse toPhotoLikedResponse(Photo photo, boolean isDownloaded, boolean isRecentlyDownloaded) { return PhotoLikedResponse.builder() .photoId(photo.getId()) .thumbnailUrl(photo.getThumbnailUrl()) .isDownloaded(isDownloaded) + .isRecentlyDownloaded(isRecentlyDownloaded) .build(); } @@ -93,7 +94,7 @@ public static PhotoPageResponse toRebuildPhotoPageResponse(PhotoPageResponse res .build(); } - public static PhotoDetailResponse toPhotoDetailResponse(Photo photo, boolean isLiked, boolean isDownloaded) { + public static PhotoDetailResponse toPhotoDetailResponse(Photo photo, boolean isLiked, boolean isDownloaded, boolean isRecentlyDownloaded) { return PhotoDetailResponse.builder() .name(photo.getUser().getName()) .photoId(photo.getId()) @@ -102,6 +103,7 @@ public static PhotoDetailResponse toPhotoDetailResponse(Photo photo, boolean isL .likesCnt(photo.getLikesCnt()) .isLiked(isLiked) .isDownloaded(isDownloaded) + .isRecentlyDownloaded(isRecentlyDownloaded) .build(); } } diff --git a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoHistoryRepository.java b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoHistoryRepository.java index 4997e2b..5b88203 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoHistoryRepository.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoHistoryRepository.java @@ -9,6 +9,14 @@ import java.util.List; public interface PhotoHistoryRepository extends JpaRepository { + @Query(""" + SELECT ph.photo.id + FROM PhotoHistory ph + WHERE ph.user.id = :userId + AND ph.photo.id IN :photoIds + """) + List findDownloadedPhotoIdsByUserId(@Param("userId") Long userId, @Param("photoIds") List photoIds); + @Query(""" SELECT ph.photo.id FROM PhotoHistory ph @@ -16,11 +24,13 @@ public interface PhotoHistoryRepository extends JpaRepository= :threshold """) - List findAllHistoryPhotoIds( + List findRecentlyDownloadedPhotoIdsByUserId( @Param("userId") Long userId, @Param("photoIds") List photoIds, @Param("threshold") LocalDateTime threshold ); boolean existsByUserIdAndPhotoId(Long userId, Long photoId); + + boolean existsByUserIdAndPhotoIdAndCreatedAt(Long userId, Long photoId, LocalDateTime createdAt); } From 954be6157f2afb365a84eb1ad21bb593843ca743 Mon Sep 17 00:00:00 2001 From: zyovn Date: Tue, 4 Nov 2025 15:56:50 +0900 Subject: [PATCH 212/402] =?UTF-8?q?#21=20refactor:=20=EB=82=B4=EA=B0=80=20?= =?UTF-8?q?=EB=9D=B1=ED=95=9C=20=EC=82=AC=EC=A7=84=20=EB=AA=A9=EB=A1=9D=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20=EC=84=B1=EA=B3=B5=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cheeeese/photo/presentation/PhotoQueryController.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/cheeeese/photo/presentation/PhotoQueryController.java b/src/main/java/com/cheeeese/photo/presentation/PhotoQueryController.java index c179fd4..20ceae6 100644 --- a/src/main/java/com/cheeeese/photo/presentation/PhotoQueryController.java +++ b/src/main/java/com/cheeeese/photo/presentation/PhotoQueryController.java @@ -8,13 +8,11 @@ import com.cheeeese.photo.dto.response.PhotoLikedPageResponse; import com.cheeeese.photo.dto.response.PhotoPageResponse; import com.cheeeese.photo.presentation.swagger.PhotoQuerySwagger; -import com.cheeeese.photo.presentation.swagger.PhotoSwagger; import com.cheeeese.user.domain.User; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; -import static com.cheeeese.global.common.code.SuccessCode.PHOTO_DETAIL_GET_SUCCESS; -import static com.cheeeese.global.common.code.SuccessCode.PHOTO_LIST_GET_SUCCESS; +import static com.cheeeese.global.common.code.SuccessCode.*; @RestController @RequiredArgsConstructor @@ -47,7 +45,7 @@ public CommonResponse getAlbumLikedPhotoPage( @RequestParam(defaultValue = "10") int size ) { return CommonResponse.success( - PHOTO_LIST_GET_SUCCESS, + PHOTO_LIKES_LIST_GET_SUCCESS, photoQueryService.getPhotoLiked(user, code, page, size) ); } From 03f3ed4e197b98eb09b791b1d4f451fdd4b6fbc3 Mon Sep 17 00:00:00 2001 From: zyovn Date: Wed, 5 Nov 2025 03:07:53 +0900 Subject: [PATCH 213/402] =?UTF-8?q?#21=20fix:=20=ED=94=BC=EB=93=9C?= =?UTF-8?q?=EB=B0=B1=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/PULL_REQUEST_TEMPLATE.md | 12 ++++++ .../cheeeese/global/util/RedisCacheUtil.java | 13 +++++-- .../photo/application/PhotoQueryService.java | 38 ++++++++++++++----- .../application/validator/PhotoValidator.java | 2 +- .../photo/exception/code/PhotoErrorCode.java | 1 - .../persistence/PhotoHistoryRepository.java | 23 +++++++++++ 6 files changed, 75 insertions(+), 14 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 7a2052f..a63e0a2 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -18,4 +18,16 @@ ## 💬 리뷰 요구사항 + +### 📜 리뷰 규칙 + +Reviewer는 아래 **P5 Rule**을 참고하여 리뷰를 진행합니다. +P5 Rule을 통해 Reviewer는 Reviewee에게 리뷰의 의도를 보다 정확히 전달할 수 있습니다. + +> - **P1:** 꼭 반영해주세요 (Comment) +> - **P2:** 적극적으로 고려해주세요 (Comment) +> - **P3:** 웬만하면 반영해 주세요 (Comment) +> - **P4:** 반영해도 좋고 넘어가도 좋습니다 (Approve) +> - **P5:** 그냥 사소한 의견입니다 (Approve) + - \ No newline at end of file diff --git a/src/main/java/com/cheeeese/global/util/RedisCacheUtil.java b/src/main/java/com/cheeeese/global/util/RedisCacheUtil.java index 8645957..10d3330 100644 --- a/src/main/java/com/cheeeese/global/util/RedisCacheUtil.java +++ b/src/main/java/com/cheeeese/global/util/RedisCacheUtil.java @@ -36,9 +36,14 @@ public Long getValue(String key) { /** * 캐시 객체 조회 */ - @SuppressWarnings("unchecked") public T getObject(String key, Class clazz) { - return (T) cacheRedisTemplate.opsForValue().get(key); + Object value = cacheRedisTemplate.opsForValue().get(key); + if (!clazz.isInstance(value)) { + throw new IllegalStateException( + "⚠️ Cached value type mismatch. Expected: " + clazz.getName() + " but found " + value.getClass().getName() + ); + } + return clazz.cast(value); } /** @@ -46,7 +51,9 @@ public T getObject(String key, Class clazz) { */ public void deletePattern(String pattern) { Set keys = cacheRedisTemplate.keys(pattern); - cacheRedisTemplate.delete(keys); + if (!keys.isEmpty()) { + cacheRedisTemplate.delete(keys); + } } public boolean exists(String key) { diff --git a/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java b/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java index e0401f7..e494bb5 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java @@ -65,26 +65,35 @@ public void invalidatePhotoCache(String code) { // TODO: 사진 삭제, 업로 redisCacheUtil.deletePattern("album:" + code + ":photos:*"); } + // TODO: 데이터 조회 로직을 Reader 클래스로 분리하는 것 고려 public PhotoLikedPageResponse getPhotoLiked(User user, String code, int page, int size) { PageRequest pageRequest = PageRequest.of(page, size); Slice photos = photoRepository.findLikedPhotosByAlbumAndUser(code, user.getId(), pageRequest); - List responses = photos.getContent().stream() - .map(photo -> { - boolean isDownloaded = photoHistoryRepository.existsByUserIdAndPhotoId(user.getId(), photo.getId()); - boolean isRecentlyDownloaded = photoHistoryRepository.existsByUserIdAndPhotoIdAndCreatedAt( - user.getId(), photo.getId(), LocalDateTime.now().minusHours(1) - ); - return PhotoMapper.toPhotoLikedResponse(photo, isDownloaded, isRecentlyDownloaded); - }) + List photoIds = photos.getContent().stream() + .map(Photo::getId) .toList(); + if (photoIds.isEmpty()) { + return PhotoMapper.toPhotoLikedPageResponse(photos, List.of()); + } + + Set downloaded = photoHistoryRepository.findDownloadedPhotoIds(user.getId(), photoIds); + + Set recent = photoHistoryRepository.findRecentlyDownloadedPhotoIds( + user.getId(), + photoIds, + LocalDateTime.now().minusHours(1) + ); + + List responses = buildPhotoLikedResponses(photos.getContent(), downloaded, recent); + return PhotoMapper.toPhotoLikedPageResponse(photos, responses); } public PhotoDetailResponse getPhotoDetail(User user, String code, Long photoId) { Photo photo = photoRepository.findByIdAndAlbum_Code(photoId, code) - .orElseThrow(() -> new PhotoException(PhotoErrorCode.PHOTO_ID_NOT_FOUND)); + .orElseThrow(() -> new PhotoException(PhotoErrorCode.PHOTO_NOT_FOUND)); boolean isLiked = photoLikesRepository.existsByUserIdAndPhotoId(user.getId(), photo.getId()); boolean isDownloaded = photoHistoryRepository.existsByUserIdAndPhotoId(user.getId(), photo.getId()); @@ -149,4 +158,15 @@ private Sort getPhotoSortingOption(AlbumSorting albumSorting) { case CREATED_AT -> Sort.by(Sort.Direction.DESC, "createdAt"); }; } + + private List buildPhotoLikedResponses(List photos, Set downloaded, Set recent) { + return photos.stream() + .map(photo -> { + Long id = photo.getId(); + boolean isDownloaded = downloaded.contains(id); + boolean isRecentlyDownloaded = recent.contains(id); + return PhotoMapper.toPhotoLikedResponse(photo, isDownloaded, isRecentlyDownloaded); + }) + .toList(); + } } diff --git a/src/main/java/com/cheeeese/photo/application/validator/PhotoValidator.java b/src/main/java/com/cheeeese/photo/application/validator/PhotoValidator.java index 502bdb9..2ed0ada 100644 --- a/src/main/java/com/cheeeese/photo/application/validator/PhotoValidator.java +++ b/src/main/java/com/cheeeese/photo/application/validator/PhotoValidator.java @@ -93,7 +93,7 @@ private List findAndValidateExistence(List photoIds) { if (!missingIds.isEmpty()) { log.error("존재하지 않는 photoIds: {}", missingIds); - throw new PhotoException(PhotoErrorCode.PHOTO_ID_NOT_FOUND); + throw new PhotoException(PhotoErrorCode.PHOTO_NOT_FOUND); } return photos; } diff --git a/src/main/java/com/cheeeese/photo/exception/code/PhotoErrorCode.java b/src/main/java/com/cheeeese/photo/exception/code/PhotoErrorCode.java index 08044ac..df4dfc3 100644 --- a/src/main/java/com/cheeeese/photo/exception/code/PhotoErrorCode.java +++ b/src/main/java/com/cheeeese/photo/exception/code/PhotoErrorCode.java @@ -21,7 +21,6 @@ public enum PhotoErrorCode implements BaseCode { PHOTO_ID_LIST_EMPTY(HttpStatus.BAD_REQUEST, "요청에 photoId 리스트가 비어 있습니다."), PHOTO_REPORT_INVALID_ALBUM(HttpStatus.BAD_REQUEST, "보고된 사진들은 반드시 동일한 앨범에 속해야 합니다."), PHOTO_OWNER_MISMATCH(HttpStatus.FORBIDDEN, "사용자와 사진의 소유자가 일치하지 않습니다."), - PHOTO_ID_NOT_FOUND(HttpStatus.NOT_FOUND, "보고된 사진 ID 중 존재하지 않는 ID가 포함되어 있습니다."), PHOTO_REPORT_CONFLICTING_IDS(HttpStatus.BAD_REQUEST, "업로드 결과(success/failure) 목록에 중복된 사진 ID가 포함되어 있습니다."), PHOTO_STATUS_UPDATE_FAILED(HttpStatus.CONFLICT, "사진 상태 업데이트에 실패했습니다."), PHOTO_COUNT_DECREMENT_FAILED(HttpStatus.CONFLICT, "앨범 사진 개수 감소에 실패했습니다."), diff --git a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoHistoryRepository.java b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoHistoryRepository.java index 5b88203..39c35d5 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoHistoryRepository.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoHistoryRepository.java @@ -7,6 +7,7 @@ import java.time.LocalDateTime; import java.util.List; +import java.util.Set; public interface PhotoHistoryRepository extends JpaRepository { @Query(""" @@ -33,4 +34,26 @@ List findRecentlyDownloadedPhotoIdsByUserId( boolean existsByUserIdAndPhotoId(Long userId, Long photoId); boolean existsByUserIdAndPhotoIdAndCreatedAt(Long userId, Long photoId, LocalDateTime createdAt); + + @Query(""" + SELECT ph.photo.id + FROM PhotoHistory ph + WHERE ph.user.id = :userId + AND ph.photo.id + IN :photoIds + """) + Set findDownloadedPhotoIds(@Param("userId") Long userId, @Param("photoIds") List photoIds); + + @Query(""" + SELECT ph.photo.id + FROM PhotoHistory ph + WHERE ph.user.id = :userId + AND ph.photo.id IN :photoIds + AND ph.createdAt >= :threshold + """) + Set findRecentlyDownloadedPhotoIds( + @Param("userId") Long userId, + @Param("photoIds") List photoIds, + @Param("threshold") LocalDateTime threshold + ); } From 650b557b2fb80e15e716df57798a19b9b38d6188 Mon Sep 17 00:00:00 2001 From: zyovn Date: Wed, 5 Nov 2025 12:40:51 +0900 Subject: [PATCH 214/402] =?UTF-8?q?#21=20fix:=20=ED=94=BC=EB=93=9C?= =?UTF-8?q?=EB=B0=B1=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../photo/application/PhotoQueryService.java | 9 +++---- .../persistence/PhotoHistoryRepository.java | 26 ++----------------- .../persistence/PhotoLikesRepository.java | 3 ++- 3 files changed, 8 insertions(+), 30 deletions(-) diff --git a/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java b/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java index e494bb5..660473a 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java @@ -19,7 +19,6 @@ import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; -import java.util.HashSet; import java.util.List; import java.util.Optional; import java.util.Set; @@ -97,7 +96,7 @@ public PhotoDetailResponse getPhotoDetail(User user, String code, Long photoId) boolean isLiked = photoLikesRepository.existsByUserIdAndPhotoId(user.getId(), photo.getId()); boolean isDownloaded = photoHistoryRepository.existsByUserIdAndPhotoId(user.getId(), photo.getId()); - boolean isRecentlyDownloaded = photoHistoryRepository.existsByUserIdAndPhotoIdAndCreatedAt( + boolean isRecentlyDownloaded = photoHistoryRepository.existsByUserIdAndPhotoIdAndCreatedAtAfter( user.getId(), photo.getId(), LocalDateTime.now().minusHours(1) ); @@ -126,15 +125,15 @@ private List extractPhotoIds(PhotoPageResponse response) { } private Set findUserLikedPhotoIds(Long userId, List photoIds) { - return new HashSet<>(photoLikesRepository.findAllLikedPhotoIds(userId, photoIds)); + return photoLikesRepository.findAllLikedPhotoIds(userId, photoIds); } private Set findUserDownloadedPhotoIds(Long userId, List photoIds) { - return new HashSet<>(photoHistoryRepository.findDownloadedPhotoIdsByUserId(userId, photoIds)); + return photoHistoryRepository.findDownloadedPhotoIds(userId, photoIds); } private Set findUserRecentlyDownloadedPhotoIds(Long userId, List photoIds) { - return new HashSet<>(photoHistoryRepository.findRecentlyDownloadedPhotoIdsByUserId(userId, photoIds, LocalDateTime.now().minusHours(1))); + return photoHistoryRepository.findRecentlyDownloadedPhotoIds(userId, photoIds, LocalDateTime.now().minusHours(1)); } private List updateUserStatus( diff --git a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoHistoryRepository.java b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoHistoryRepository.java index 39c35d5..7df2358 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoHistoryRepository.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoHistoryRepository.java @@ -10,37 +10,15 @@ import java.util.Set; public interface PhotoHistoryRepository extends JpaRepository { - @Query(""" - SELECT ph.photo.id - FROM PhotoHistory ph - WHERE ph.user.id = :userId - AND ph.photo.id IN :photoIds - """) - List findDownloadedPhotoIdsByUserId(@Param("userId") Long userId, @Param("photoIds") List photoIds); - - @Query(""" - SELECT ph.photo.id - FROM PhotoHistory ph - WHERE ph.user.id = :userId - AND ph.photo.id IN :photoIds - AND ph.createdAt >= :threshold - """) - List findRecentlyDownloadedPhotoIdsByUserId( - @Param("userId") Long userId, - @Param("photoIds") List photoIds, - @Param("threshold") LocalDateTime threshold - ); - boolean existsByUserIdAndPhotoId(Long userId, Long photoId); - boolean existsByUserIdAndPhotoIdAndCreatedAt(Long userId, Long photoId, LocalDateTime createdAt); + boolean existsByUserIdAndPhotoIdAndCreatedAtAfter(Long userId, Long photoId, LocalDateTime createdAt); @Query(""" SELECT ph.photo.id FROM PhotoHistory ph WHERE ph.user.id = :userId - AND ph.photo.id - IN :photoIds + AND ph.photo.id IN :photoIds """) Set findDownloadedPhotoIds(@Param("userId") Long userId, @Param("photoIds") List photoIds); diff --git a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoLikesRepository.java b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoLikesRepository.java index 4d44d0d..3303b3a 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoLikesRepository.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoLikesRepository.java @@ -7,6 +7,7 @@ import java.util.List; import java.util.Optional; +import java.util.Set; public interface PhotoLikesRepository extends JpaRepository { @Query(""" @@ -15,7 +16,7 @@ public interface PhotoLikesRepository extends JpaRepository { WHERE pl.user.id = :userId AND pl.photo.id IN :photoIds """) - List findAllLikedPhotoIds(@Param("userId") Long userId, @Param("photoIds") List photoIds); + Set findAllLikedPhotoIds(@Param("userId") Long userId, @Param("photoIds") List photoIds); boolean existsByUserIdAndPhotoId(Long userId, Long photoId); From f37af7fa867bd93874c9110271ed1443180fd1a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Wed, 5 Nov 2025 17:08:22 +0900 Subject: [PATCH 215/402] =?UTF-8?q?#39=20feat:=20=EB=9D=B1=EC=9D=84=20?= =?UTF-8?q?=EB=A7=8E=EC=9D=B4=20=EB=B0=9B=EC=9D=80=204=EA=B0=9C=EC=9D=98?= =?UTF-8?q?=20=EC=82=AC=EC=A7=84=20=EC=A1=B0=ED=9A=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../infrastructure/persistence/PhotoRepository.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java index ec04eee..e62732d 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java @@ -46,4 +46,17 @@ int updateStatusByIdsAndUserIdAndExpectedStatus( @Query("update Photo p set p.status = :newStatus, p.thumbnailUrl = :thumbnailUrl " + "where p.id = :photoId and p.status = :expectedStatus") int updateStatusAndUrl(Long photoId, PhotoStatus expectedStatus, PhotoStatus newStatus, String thumbnailUrl); + + @Query(""" + SELECT p.id + FROM Photo p + WHERE p.album.id = :albumId + AND p.isDeleted = FALSE + AND p.status = com.cheeeese.photo.domain.PhotoStatus.COMPLETED + ORDER BY p.likesCnt DESC, p.createdAt DESC +""") + List findTop4CompletedPhotoIdsByLikes( + @Param("albumId") Long albumId, + Pageable pageable + ); } From 109a5cd3c30933eb2e3d4eb3a8636dcd2b5078f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Wed, 5 Nov 2025 17:08:44 +0900 Subject: [PATCH 216/402] =?UTF-8?q?#39=20feat:=20=EC=B9=98=EC=A6=88?= =?UTF-8?q?=EB=84=A4=EC=BB=B7=20=EC=A1=B0=ED=9A=8C=20=EC=84=B1=EA=B3=B5=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/cheeeese/global/common/code/SuccessCode.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java index 66fc76e..adb2c25 100644 --- a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java +++ b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java @@ -31,6 +31,9 @@ public enum SuccessCode implements BaseCode { PRESIGNED_URL_ISSUE_SUCCESS(HttpStatus.OK, "Presigned URL 발급이 성공적으로 완료되었습니다."), PHOTO_UPLOAD_REPORT_SUCCESS(HttpStatus.OK, "사진 업로드 결과 보고가 성공적으로 처리되었습니다."), THUMBNAIL_PRODUCE_COMPLETE(HttpStatus.OK, "썸네일 생성이 성공적으로 완료되었습니다."), + + // cheese4cut + CHEESE4CUT_GET_SUCCESS(HttpStatus.OK, "치즈네컷 조회가 성공적으로 완료되었습니다."), ; private final HttpStatus httpStatus; From 1b822b12e2ca62da9e7e6977ff29167d5e0367cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Wed, 5 Nov 2025 17:09:09 +0900 Subject: [PATCH 217/402] =?UTF-8?q?#39=20feat:=20=EC=B9=98=EC=A6=88?= =?UTF-8?q?=EB=84=A4=EC=BB=B7=20=EC=97=94=ED=8B=B0=ED=8B=B0=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cheese4cut/domain/Cheese4cut.java | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 src/main/java/com/cheeeese/cheese4cut/domain/Cheese4cut.java diff --git a/src/main/java/com/cheeeese/cheese4cut/domain/Cheese4cut.java b/src/main/java/com/cheeeese/cheese4cut/domain/Cheese4cut.java new file mode 100644 index 0000000..2335194 --- /dev/null +++ b/src/main/java/com/cheeeese/cheese4cut/domain/Cheese4cut.java @@ -0,0 +1,43 @@ +package com.cheeeese.cheese4cut.domain; + +import com.cheeeese.album.domain.Album; +import com.cheeeese.global.domain.BaseEntity; +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Entity +@Getter +@Table(name = "cheese4cut") +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class Cheese4cut extends BaseEntity { + + @Id + @Column(name = "cheese4cut_id", nullable = false) + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @OneToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "album_id", nullable = false, unique = true) + private Album album; + + @ElementCollection + @CollectionTable(name = "cheese4cut_photos", joinColumns = @JoinColumn(name = "cheese4cut_id")) + @Column(name = "photo_id", nullable = false) + private List photoIds; + + @Column(name = "frame_image_url", nullable = false) + private String frameImageUrl; + + @Builder + private Cheese4cut(Album album, List photoIds, String frameImageUrl) { + this.album = album; + this.photoIds = photoIds; + this.frameImageUrl = frameImageUrl; + } +} + From 3203d06fb865d8828c5676863cecea02391dacc8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Wed, 5 Nov 2025 17:09:21 +0900 Subject: [PATCH 218/402] =?UTF-8?q?#39=20feat:=20=EC=B9=98=EC=A6=88?= =?UTF-8?q?=EB=84=A4=EC=BB=B7=20=EC=98=88=EC=99=B8=20=EB=B0=8F=20=EC=97=90?= =?UTF-8?q?=EB=9F=AC=20=EC=BD=94=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../exception/Cheese4cutException.java | 12 ++++++++++++ .../exception/code/Cheese4cutErrorCode.java | 18 ++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 src/main/java/com/cheeeese/cheese4cut/exception/Cheese4cutException.java create mode 100644 src/main/java/com/cheeeese/cheese4cut/exception/code/Cheese4cutErrorCode.java diff --git a/src/main/java/com/cheeeese/cheese4cut/exception/Cheese4cutException.java b/src/main/java/com/cheeeese/cheese4cut/exception/Cheese4cutException.java new file mode 100644 index 0000000..0428f11 --- /dev/null +++ b/src/main/java/com/cheeeese/cheese4cut/exception/Cheese4cutException.java @@ -0,0 +1,12 @@ +package com.cheeeese.cheese4cut.exception; + +import com.cheeeese.cheese4cut.exception.code.Cheese4cutErrorCode; +import com.cheeeese.global.exception.BusinessException; +import lombok.Getter; + +@Getter +public class Cheese4cutException extends BusinessException { + public Cheese4cutException(Cheese4cutErrorCode errorCode) { + super(errorCode); + } +} diff --git a/src/main/java/com/cheeeese/cheese4cut/exception/code/Cheese4cutErrorCode.java b/src/main/java/com/cheeeese/cheese4cut/exception/code/Cheese4cutErrorCode.java new file mode 100644 index 0000000..8cf7679 --- /dev/null +++ b/src/main/java/com/cheeeese/cheese4cut/exception/code/Cheese4cutErrorCode.java @@ -0,0 +1,18 @@ +package com.cheeeese.cheese4cut.exception.code; + +import com.cheeeese.global.common.code.BaseCode; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; + +@Getter +@RequiredArgsConstructor +public enum Cheese4cutErrorCode implements BaseCode { + + CHEESE4CUT_NOT_FOUND(HttpStatus.NOT_FOUND, "치즈네컷이 존재하지 않습니다."), + + ; + + private final HttpStatus httpStatus; + private final String message; +} \ No newline at end of file From 8d9fc68bf217277b59ecd6c3fda8fa4166a9a632 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Wed, 5 Nov 2025 17:11:57 +0900 Subject: [PATCH 219/402] =?UTF-8?q?#39=20feat:=20=EC=B9=98=EC=A6=88?= =?UTF-8?q?=EB=84=A4=EC=BB=B7=20=EC=A1=B0=ED=9A=8C=20response=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/response/Cheese4cutFinalResponse.java | 16 +++++++++++ .../response/Cheese4cutPreviewResponse.java | 27 +++++++++++++++++++ .../dto/response/Cheese4cutResponse.java | 9 +++++++ 3 files changed, 52 insertions(+) create mode 100644 src/main/java/com/cheeeese/cheese4cut/dto/response/Cheese4cutFinalResponse.java create mode 100644 src/main/java/com/cheeeese/cheese4cut/dto/response/Cheese4cutPreviewResponse.java create mode 100644 src/main/java/com/cheeeese/cheese4cut/dto/response/Cheese4cutResponse.java diff --git a/src/main/java/com/cheeeese/cheese4cut/dto/response/Cheese4cutFinalResponse.java b/src/main/java/com/cheeeese/cheese4cut/dto/response/Cheese4cutFinalResponse.java new file mode 100644 index 0000000..8311e20 --- /dev/null +++ b/src/main/java/com/cheeeese/cheese4cut/dto/response/Cheese4cutFinalResponse.java @@ -0,0 +1,16 @@ +package com.cheeeese.cheese4cut.dto.response; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Builder; + +@Builder +@Schema(description = "치즈네컷 확정 완료 응답 DTO (최종 프레임 이미지)") +public record Cheese4cutFinalResponse( + @Schema(description = "확정 여부 (항상 true)", example = "true") + boolean isFinalized, + + @Schema(description = "최종 프레임 이미지 URL", example = "https://cdn.cheeeese.com/cheese4cut/final/1.png") + String finalFrameImageUrl + +) implements Cheese4cutResponse { +} diff --git a/src/main/java/com/cheeeese/cheese4cut/dto/response/Cheese4cutPreviewResponse.java b/src/main/java/com/cheeeese/cheese4cut/dto/response/Cheese4cutPreviewResponse.java new file mode 100644 index 0000000..bc8deb7 --- /dev/null +++ b/src/main/java/com/cheeeese/cheese4cut/dto/response/Cheese4cutPreviewResponse.java @@ -0,0 +1,27 @@ +package com.cheeeese.cheese4cut.dto.response; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Builder; + +import java.util.List; + +@Builder +@Schema(description = "치즈네컷 확정 전 미리보기 응답 DTO (좋아요 TOP 4)") +public record Cheese4cutPreviewResponse( + @Schema(description = "확정 여부 (항상 false)", example = "false") + boolean isFinalized, + + @Schema(description = "미리보기 사진 목록 (최대 4개)") + List previewPhotos + +) implements Cheese4cutResponse { + @Builder + @Schema(description = "미리보기 사진 정보 DTO") + public record PreviewPhotoInfo( + @Schema(description = "사진 ID", example = "101") + Long photoId, + + @Schema(description = "사진 원본 URL", example = "https://cdn.cheeeese.com/album/1/original/101.jpg") + String imageUrl + ) {} +} diff --git a/src/main/java/com/cheeeese/cheese4cut/dto/response/Cheese4cutResponse.java b/src/main/java/com/cheeeese/cheese4cut/dto/response/Cheese4cutResponse.java new file mode 100644 index 0000000..b012d8a --- /dev/null +++ b/src/main/java/com/cheeeese/cheese4cut/dto/response/Cheese4cutResponse.java @@ -0,0 +1,9 @@ +package com.cheeeese.cheese4cut.dto.response; + +import io.swagger.v3.oas.annotations.media.Schema; + +@Schema(description = "치즈네컷 조회 응답 (다형 구조)") +public sealed interface Cheese4cutResponse + permits Cheese4cutPreviewResponse, Cheese4cutFinalResponse { + boolean isFinalized(); +} From bed2019729db8ada204e5fe48eefafdf4878afa5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Wed, 5 Nov 2025 17:12:25 +0900 Subject: [PATCH 220/402] =?UTF-8?q?#39=20feat:=20=EC=B9=98=EC=A6=88?= =?UTF-8?q?=EB=84=A4=EC=BB=B7=20=EC=A1=B0=ED=9A=8C=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/Cheese4cutService.java | 54 +++++++++++++++++++ .../mapper/Cheese4cutMapper.java | 41 ++++++++++++++ .../persistence/Cheese4cutRepository.java | 10 ++++ 3 files changed, 105 insertions(+) create mode 100644 src/main/java/com/cheeeese/cheese4cut/application/Cheese4cutService.java create mode 100644 src/main/java/com/cheeeese/cheese4cut/infrastructure/mapper/Cheese4cutMapper.java create mode 100644 src/main/java/com/cheeeese/cheese4cut/infrastructure/persistence/Cheese4cutRepository.java diff --git a/src/main/java/com/cheeeese/cheese4cut/application/Cheese4cutService.java b/src/main/java/com/cheeeese/cheese4cut/application/Cheese4cutService.java new file mode 100644 index 0000000..b87f4d6 --- /dev/null +++ b/src/main/java/com/cheeeese/cheese4cut/application/Cheese4cutService.java @@ -0,0 +1,54 @@ +package com.cheeeese.cheese4cut.application; + +import com.cheeeese.album.domain.Album; +import com.cheeeese.album.exception.AlbumException; +import com.cheeeese.album.exception.code.AlbumErrorCode; +import com.cheeeese.album.infrastructure.persistence.AlbumRepository; +import com.cheeeese.cheese4cut.domain.Cheese4cut; +import com.cheeeese.cheese4cut.dto.response.Cheese4cutResponse; +import com.cheeeese.cheese4cut.infrastructure.mapper.Cheese4cutMapper; +import com.cheeeese.cheese4cut.infrastructure.persistence.Cheese4cutRepository; +import com.cheeeese.photo.domain.Photo; +import com.cheeeese.photo.infrastructure.persistence.PhotoRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Optional; + +@Service +@RequiredArgsConstructor +@Transactional +public class Cheese4cutService { + + private final Cheese4cutRepository cheese4cutRepository; + private final AlbumRepository albumRepository; + private final PhotoRepository photoRepository; + + @Transactional(readOnly = true) + public Cheese4cutResponse getCheese4cutByAlbumCode(String code) { + Album album = albumRepository.findByCode(code) + .orElseThrow(() -> new AlbumException(AlbumErrorCode.ALBUM_NOT_FOUND)); + + Optional cheese4cutOptional = cheese4cutRepository.findByAlbumId(album.getId()); + + if (cheese4cutOptional.isPresent()) { + return Cheese4cutMapper.toFinalResponse(cheese4cutOptional.get()); + } + + return getPreviewResponse(album.getId()); + } + + private Cheese4cutResponse getPreviewResponse(Long albumId) { + List topPhotoIds = photoRepository.findTop4CompletedPhotoIdsByLikes( + albumId, + PageRequest.of(0, 4) + ); + + List topPhotos = photoRepository.findAllById(topPhotoIds); + + return Cheese4cutMapper.toPreviewResponse(topPhotos); + } +} diff --git a/src/main/java/com/cheeeese/cheese4cut/infrastructure/mapper/Cheese4cutMapper.java b/src/main/java/com/cheeeese/cheese4cut/infrastructure/mapper/Cheese4cutMapper.java new file mode 100644 index 0000000..3258409 --- /dev/null +++ b/src/main/java/com/cheeeese/cheese4cut/infrastructure/mapper/Cheese4cutMapper.java @@ -0,0 +1,41 @@ +package com.cheeeese.cheese4cut.infrastructure.mapper; + +import com.cheeeese.cheese4cut.domain.Cheese4cut; +import com.cheeeese.cheese4cut.dto.response.Cheese4cutFinalResponse; +import com.cheeeese.cheese4cut.dto.response.Cheese4cutPreviewResponse; +import com.cheeeese.photo.domain.Photo; + +import java.util.List; +import java.util.stream.Collectors; + +public class Cheese4cutMapper { + + private Cheese4cutMapper() {} + + /** + * 확정 후 응답 (Cheese4cut 엔티티 기반) + */ + public static Cheese4cutFinalResponse toFinalResponse(Cheese4cut cheese4cut) { + return Cheese4cutFinalResponse.builder() + .isFinalized(true) + .finalFrameImageUrl(cheese4cut.getFrameImageUrl()) + .build(); + } + + /** + * 확정 전 응답 (좋아요 TOP 4 사진 목록 기반) + */ + public static Cheese4cutPreviewResponse toPreviewResponse(List topPhotos) { + List photoInfos = topPhotos.stream() + .map(photo -> Cheese4cutPreviewResponse.PreviewPhotoInfo.builder() + .photoId(photo.getId()) + .imageUrl(photo.getImageUrl()) + .build()) + .collect(Collectors.toList()); + + return Cheese4cutPreviewResponse.builder() + .isFinalized(false) + .previewPhotos(photoInfos) + .build(); + } +} diff --git a/src/main/java/com/cheeeese/cheese4cut/infrastructure/persistence/Cheese4cutRepository.java b/src/main/java/com/cheeeese/cheese4cut/infrastructure/persistence/Cheese4cutRepository.java new file mode 100644 index 0000000..16fee3a --- /dev/null +++ b/src/main/java/com/cheeeese/cheese4cut/infrastructure/persistence/Cheese4cutRepository.java @@ -0,0 +1,10 @@ +package com.cheeeese.cheese4cut.infrastructure.persistence; + +import com.cheeeese.cheese4cut.domain.Cheese4cut; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; + +public interface Cheese4cutRepository extends JpaRepository { + Optional findByAlbumId(Long albumId); +} From 719f604901e94d98a2cdeb9e9e53757709f30935 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Wed, 5 Nov 2025 17:58:01 +0900 Subject: [PATCH 221/402] =?UTF-8?q?#39=20feat:=20=EC=B9=98=EC=A6=88?= =?UTF-8?q?=EB=84=A4=EC=BB=B7=20=EC=A1=B0=ED=9A=8C=20api=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/Cheese4cutController.java | 26 ++++ .../swagger/Cheese4cutSwagger.java | 116 ++++++++++++++++++ 2 files changed, 142 insertions(+) create mode 100644 src/main/java/com/cheeeese/cheese4cut/presentation/Cheese4cutController.java create mode 100644 src/main/java/com/cheeeese/cheese4cut/presentation/swagger/Cheese4cutSwagger.java diff --git a/src/main/java/com/cheeeese/cheese4cut/presentation/Cheese4cutController.java b/src/main/java/com/cheeeese/cheese4cut/presentation/Cheese4cutController.java new file mode 100644 index 0000000..a109484 --- /dev/null +++ b/src/main/java/com/cheeeese/cheese4cut/presentation/Cheese4cutController.java @@ -0,0 +1,26 @@ +package com.cheeeese.cheese4cut.presentation; + +import com.cheeeese.cheese4cut.application.Cheese4cutService; +import com.cheeeese.cheese4cut.dto.response.Cheese4cutResponse; +import com.cheeeese.cheese4cut.presentation.swagger.Cheese4cutSwagger; +import com.cheeeese.global.common.CommonResponse; +import com.cheeeese.global.common.code.SuccessCode; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/v1/cheese4cut/{code}") +public class Cheese4cutController implements Cheese4cutSwagger { + + private final Cheese4cutService cheese4cutService; + + @GetMapping + public CommonResponse getCheese4cut(@PathVariable String code) { + return CommonResponse.success(SuccessCode.CHEESE4CUT_GET_SUCCESS, + cheese4cutService.getCheese4cutByAlbumCode(code)); + } +} diff --git a/src/main/java/com/cheeeese/cheese4cut/presentation/swagger/Cheese4cutSwagger.java b/src/main/java/com/cheeeese/cheese4cut/presentation/swagger/Cheese4cutSwagger.java new file mode 100644 index 0000000..79882f6 --- /dev/null +++ b/src/main/java/com/cheeeese/cheese4cut/presentation/swagger/Cheese4cutSwagger.java @@ -0,0 +1,116 @@ +package com.cheeeese.cheese4cut.presentation.swagger; + +import com.cheeeese.global.common.CommonResponse; +import com.cheeeese.cheese4cut.dto.response.Cheese4cutResponse; +import com.cheeeese.cheese4cut.dto.response.Cheese4cutPreviewResponse; +import com.cheeeese.cheese4cut.dto.response.Cheese4cutFinalResponse; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.ExampleObject; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.web.bind.annotation.PathVariable; + +@Tag(name = "[치즈네컷]", description = "치즈네컷 관련 API") +public interface Cheese4cutSwagger { + + @Operation( + summary = "치즈네컷 정보 조회 API", + description = """ + ### PathVariable + --- + `code`: 앨범 코드 + + ### API 설명 (확정 전/후 분기) + --- + 이 API는 앨범의 **치즈네컷 확정 상태**에 따라 응답 형태가 달라지는 다형적(Polymorphic) 응답을 반환합니다. + + 1. **확정 전 (isFinalized: false)**: 좋아요 TOP 4 사진의 원본 URL, 유니크 좋아요 수, 전체 참여자 수를 제공합니다. + 2. **확정 후 (isFinalized: true)**: 최종 프레임 이미지 URL만 제공합니다. (만료 이벤트 또는 수동 확정 완료) + """ + ) + @ApiResponses(value = { + @ApiResponse( + responseCode = "200", + description = "치즈네컷 정보 조회가 성공적으로 실행되었습니다.", + content = @Content( + mediaType = "application/json", + schema = @Schema(oneOf = {Cheese4cutPreviewResponse.class, Cheese4cutFinalResponse.class}), + examples = { + @ExampleObject( + name = "Case 1: 확정 전 미리보기 (버튼 활성화)", + description = "완료된 사진이 4장 이상이며, 최종 확정 전 상태.", + value = """ + { + "isSuccess": true, + "code": 200, + "message": "치즈네컷 정보 조회가 성공적으로 실행되었습니다.", + "result": { + "isFinalized": false, + "previewPhotos": [ + {"photoId": 101, "imageUrl": "https://cdn.img/101_orig.jpg"}, + // ... 4 photos + ], + "uniqueLikesCount": 5, + "participant": 6 + } + } + """ + ), + @ExampleObject( + name = "Case 2: 확정 후 최종 이미지", + description = "앨범이 만료되어 치즈네컷이 자동/수동 확정된 상태.", + value = """ + { + "isSuccess": true, + "code": 200, + "message": "치즈네컷 정보 조회가 성공적으로 실행되었습니다.", + "result": { + "isFinalized": true, + "finalFrameImageUrl": "https://cdn.img/cheese4cut/final/1.png" + } + } + """ + ) + } + ) + ), + @ApiResponse( + responseCode = "400", + description = "완료된 사진 부족으로 미리보기 불가", + content = @Content( + mediaType = "application/json", + examples = @ExampleObject( + value = """ + { + "isSuccess": false, + "code": 400, + "message": "치즈네컷 생성을 위한 완료된 사진이 4장 미만입니다." + } + """ + ) + ) + ), + @ApiResponse( + responseCode = "404", + description = "존재하지 않거나 유효하지 않은 앨범 코드", + content = @Content( + mediaType = "application/json", + examples = @ExampleObject( + value = """ + { + "isSuccess": false, + "code": 404, + "message": "존재하지 않거나 유효하지 않은 앨범 코드입니다." + } + """ + ) + ) + ) + }) + CommonResponse getCheese4cut( + @PathVariable String code + ); +} \ No newline at end of file From febc6c66d300b9fe77f5bdc750793b6e1d960b46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Wed, 5 Nov 2025 17:59:28 +0900 Subject: [PATCH 222/402] =?UTF-8?q?#39=20feat:=20=EC=B9=98=EC=A6=88?= =?UTF-8?q?=EB=84=A4=EC=BB=B7=20=ED=99=95=EC=A0=95=20=EC=A0=84=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=EC=8B=9C=20response=EC=97=90=20=EB=9D=B1=20=EB=88=84?= =?UTF-8?q?=EB=A5=B8=20=EC=B0=B8=EC=97=AC=EC=9E=90=EC=88=98=20=ED=95=84?= =?UTF-8?q?=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/Cheese4cutService.java | 26 ++++++++++++++++--- .../response/Cheese4cutPreviewResponse.java | 8 +++++- .../exception/code/Cheese4cutErrorCode.java | 1 + .../mapper/Cheese4cutMapper.java | 8 +++++- .../persistence/PhotoLikesRepository.java | 7 +++++ 5 files changed, 45 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/cheeeese/cheese4cut/application/Cheese4cutService.java b/src/main/java/com/cheeeese/cheese4cut/application/Cheese4cutService.java index b87f4d6..9ea7515 100644 --- a/src/main/java/com/cheeeese/cheese4cut/application/Cheese4cutService.java +++ b/src/main/java/com/cheeeese/cheese4cut/application/Cheese4cutService.java @@ -6,9 +6,12 @@ import com.cheeeese.album.infrastructure.persistence.AlbumRepository; import com.cheeeese.cheese4cut.domain.Cheese4cut; import com.cheeeese.cheese4cut.dto.response.Cheese4cutResponse; +import com.cheeeese.cheese4cut.exception.Cheese4cutException; +import com.cheeeese.cheese4cut.exception.code.Cheese4cutErrorCode; import com.cheeeese.cheese4cut.infrastructure.mapper.Cheese4cutMapper; import com.cheeeese.cheese4cut.infrastructure.persistence.Cheese4cutRepository; import com.cheeeese.photo.domain.Photo; +import com.cheeeese.photo.infrastructure.persistence.PhotoLikesRepository; import com.cheeeese.photo.infrastructure.persistence.PhotoRepository; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.PageRequest; @@ -16,7 +19,10 @@ import org.springframework.transaction.annotation.Transactional; import java.util.List; +import java.util.Map; import java.util.Optional; +import java.util.function.Function; +import java.util.stream.Collectors; @Service @RequiredArgsConstructor @@ -26,6 +32,7 @@ public class Cheese4cutService { private final Cheese4cutRepository cheese4cutRepository; private final AlbumRepository albumRepository; private final PhotoRepository photoRepository; + private final PhotoLikesRepository photoLikesRepository; @Transactional(readOnly = true) public Cheese4cutResponse getCheese4cutByAlbumCode(String code) { @@ -38,17 +45,30 @@ public Cheese4cutResponse getCheese4cutByAlbumCode(String code) { return Cheese4cutMapper.toFinalResponse(cheese4cutOptional.get()); } - return getPreviewResponse(album.getId()); + return getPreviewResponse(album.getId(), album.getParticipant()); } - private Cheese4cutResponse getPreviewResponse(Long albumId) { + private Cheese4cutResponse getPreviewResponse(Long albumId, int participant) { List topPhotoIds = photoRepository.findTop4CompletedPhotoIdsByLikes( albumId, PageRequest.of(0, 4) ); + if (topPhotoIds.size() < 4) { + throw new Cheese4cutException(Cheese4cutErrorCode.INSUFFICIENT_COUNT_FOR_CHEESE4CUT); + } + List topPhotos = photoRepository.findAllById(topPhotoIds); - return Cheese4cutMapper.toPreviewResponse(topPhotos); + Map photoMap = topPhotos.stream() + .collect(Collectors.toMap(Photo::getId, Function.identity())); + + List orderedPhotos = topPhotoIds.stream() + .map(photoMap::get) + .toList(); + + long uniqueLikesCount = photoLikesRepository.countDistinctUserIdsByPhotoIds(topPhotoIds); + + return Cheese4cutMapper.toPreviewResponse(orderedPhotos, uniqueLikesCount, participant); } } diff --git a/src/main/java/com/cheeeese/cheese4cut/dto/response/Cheese4cutPreviewResponse.java b/src/main/java/com/cheeeese/cheese4cut/dto/response/Cheese4cutPreviewResponse.java index bc8deb7..d13827c 100644 --- a/src/main/java/com/cheeeese/cheese4cut/dto/response/Cheese4cutPreviewResponse.java +++ b/src/main/java/com/cheeeese/cheese4cut/dto/response/Cheese4cutPreviewResponse.java @@ -12,7 +12,13 @@ public record Cheese4cutPreviewResponse( boolean isFinalized, @Schema(description = "미리보기 사진 목록 (최대 4개)") - List previewPhotos + List previewPhotos, + + @Schema(description = "4개 사진에 좋아요를 누른 유니크한 참여자 수", example = "5") + int uniqueLikesCount, + + @Schema(description = "전체 참여자 수", example = "6") + int participant ) implements Cheese4cutResponse { @Builder diff --git a/src/main/java/com/cheeeese/cheese4cut/exception/code/Cheese4cutErrorCode.java b/src/main/java/com/cheeeese/cheese4cut/exception/code/Cheese4cutErrorCode.java index 8cf7679..372428f 100644 --- a/src/main/java/com/cheeeese/cheese4cut/exception/code/Cheese4cutErrorCode.java +++ b/src/main/java/com/cheeeese/cheese4cut/exception/code/Cheese4cutErrorCode.java @@ -10,6 +10,7 @@ public enum Cheese4cutErrorCode implements BaseCode { CHEESE4CUT_NOT_FOUND(HttpStatus.NOT_FOUND, "치즈네컷이 존재하지 않습니다."), + INSUFFICIENT_COUNT_FOR_CHEESE4CUT(HttpStatus.BAD_REQUEST, "치즈네컷 생성을 위한 완료된 사진이 4장 미만입니다."), ; diff --git a/src/main/java/com/cheeeese/cheese4cut/infrastructure/mapper/Cheese4cutMapper.java b/src/main/java/com/cheeeese/cheese4cut/infrastructure/mapper/Cheese4cutMapper.java index 3258409..9cef297 100644 --- a/src/main/java/com/cheeeese/cheese4cut/infrastructure/mapper/Cheese4cutMapper.java +++ b/src/main/java/com/cheeeese/cheese4cut/infrastructure/mapper/Cheese4cutMapper.java @@ -25,7 +25,11 @@ public static Cheese4cutFinalResponse toFinalResponse(Cheese4cut cheese4cut) { /** * 확정 전 응답 (좋아요 TOP 4 사진 목록 기반) */ - public static Cheese4cutPreviewResponse toPreviewResponse(List topPhotos) { + public static Cheese4cutPreviewResponse toPreviewResponse( + List topPhotos, + long uniqueLikesCount, + int participant + ) { List photoInfos = topPhotos.stream() .map(photo -> Cheese4cutPreviewResponse.PreviewPhotoInfo.builder() .photoId(photo.getId()) @@ -36,6 +40,8 @@ public static Cheese4cutPreviewResponse toPreviewResponse(List topPhotos) return Cheese4cutPreviewResponse.builder() .isFinalized(false) .previewPhotos(photoInfos) + .uniqueLikesCount((int) uniqueLikesCount) + .participant(participant) .build(); } } diff --git a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoLikesRepository.java b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoLikesRepository.java index 3303b3a..f5bf9b9 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoLikesRepository.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoLikesRepository.java @@ -21,4 +21,11 @@ public interface PhotoLikesRepository extends JpaRepository { boolean existsByUserIdAndPhotoId(Long userId, Long photoId); Optional findByUserIdAndPhotoId(Long userId, Long photoId); + + @Query(""" + SELECT COUNT(DISTINCT pl.user.id) + FROM PhotoLikes pl + WHERE pl.photo.id IN :photoIds + """) + long countDistinctUserIdsByPhotoIds(@Param("photoIds") List photoIds); } From f40479768603de5771fa8a1a39edb9cf6d9fbaf7 Mon Sep 17 00:00:00 2001 From: zyovn Date: Thu, 6 Nov 2025 23:30:00 +0900 Subject: [PATCH 223/402] =?UTF-8?q?#45=20chore:=20=EB=B8=8C=EB=9E=9C?= =?UTF-8?q?=EC=B9=98=20=EB=B3=80=EA=B2=BD=EC=9D=84=20=EC=9C=84=ED=95=9C=20?= =?UTF-8?q?=EC=9E=84=EC=8B=9C=20=EC=BB=A4=EB=B0=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../photo/application/PhotoService.java | 28 +++++++++++++++++++ .../application/PresignedUrlService.java | 17 +++++++++++ .../dto/request/PhotoDownloadRequest.java | 12 ++++++++ .../dto/response/PhotoDownloadResponse.java | 13 +++++++++ .../infrastructure/mapper/PhotoMapper.java | 6 ++++ .../persistence/PhotoRepository.java | 2 ++ 6 files changed, 78 insertions(+) create mode 100644 src/main/java/com/cheeeese/photo/dto/request/PhotoDownloadRequest.java create mode 100644 src/main/java/com/cheeeese/photo/dto/response/PhotoDownloadResponse.java diff --git a/src/main/java/com/cheeeese/photo/application/PhotoService.java b/src/main/java/com/cheeeese/photo/application/PhotoService.java index 94b4b83..4a69ecf 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoService.java @@ -7,13 +7,16 @@ import com.cheeeese.photo.domain.Photo; import com.cheeeese.photo.domain.PhotoLikes; import com.cheeeese.photo.domain.PhotoStatus; +import com.cheeeese.photo.dto.request.PhotoDownloadRequest; import com.cheeeese.photo.dto.request.PhotoPresignedUrlRequest; import com.cheeeese.photo.dto.request.PhotoUploadReportRequest; +import com.cheeeese.photo.dto.response.PhotoDownloadResponse; import com.cheeeese.photo.dto.response.PhotoPresignedUrlResponse; import com.cheeeese.photo.exception.PhotoException; import com.cheeeese.photo.exception.code.PhotoErrorCode; import com.cheeeese.photo.infrastructure.mapper.PhotoLikesMapper; import com.cheeeese.photo.infrastructure.mapper.PhotoMapper; +import com.cheeeese.photo.infrastructure.persistence.PhotoHistoryRepository; import com.cheeeese.photo.infrastructure.persistence.PhotoLikesRepository; import com.cheeeese.photo.infrastructure.persistence.PhotoRepository; import com.cheeeese.user.application.UserService; @@ -35,6 +38,7 @@ public class PhotoService { private final UserService userService; private final PhotoRepository photoRepository; private final PhotoLikesRepository photoLikesRepository; + private final PhotoHistoryRepository photoHistoryRepository; private final PhotoValidator photoValidator; private final AlbumValidator albumValidator; private final AlbumRepository albumRepository; @@ -75,6 +79,23 @@ public PhotoPresignedUrlResponse createPresignedUrls(User user, PhotoPresignedUr return PhotoMapper.toPresignedUrlResponse(presignedUrls); } + @Transactional + public PhotoPresignedUrlResponse createDownloadPresignedUrls(User user, PhotoDownloadRequest request) { + // 1. 권한 검증 + Album album = validateAlbumAndPermission(user, request.code()); + + // 2. 사진 목록 조회 + List photos = photoRepository.findAllByIdIn(request.photoIds()); + + // 3. 다운로드용 url 생성 + + + // 4. history 저장 + + + return PhotoMapper.toPresignedUrlResponse(null); + } + @Transactional public void reportUploadResult(User user, PhotoUploadReportRequest request) { List failurePhotoIds = request.failurePhotoIds().stream() @@ -162,6 +183,13 @@ private PhotoPresignedUrlResponse.PresignedUrlInfo createPresignedUrlForFile( return PhotoMapper.toPresignedUrlInfo(photo.getId(), uploadUrl); } + private PhotoPresignedUrlResponse.PresignedUrlInfo createPresignedUrlForDownload(User user, Album album, Photo photo) { + String objectKey = String.format(ORIGINAL_PHOTO_PATH_FORMAT); + String url = presignedUrlService.generatePresignedGetUrl(objectKey); + + return PhotoMapper.toPresignedUrlInfo(photo.getId(), url); + } + private String sanitizeFileName(String raw) { String name = raw == null ? "unnamed" : raw; name = name.replace('\\', '/'); // 구분자 통일 diff --git a/src/main/java/com/cheeeese/photo/application/PresignedUrlService.java b/src/main/java/com/cheeeese/photo/application/PresignedUrlService.java index 77db1d2..b0f348d 100644 --- a/src/main/java/com/cheeeese/photo/application/PresignedUrlService.java +++ b/src/main/java/com/cheeeese/photo/application/PresignedUrlService.java @@ -3,8 +3,10 @@ import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; +import software.amazon.awssdk.services.s3.model.GetObjectRequest; import software.amazon.awssdk.services.s3.model.PutObjectRequest; import software.amazon.awssdk.services.s3.presigner.S3Presigner; +import software.amazon.awssdk.services.s3.presigner.model.PresignedGetObjectRequest; import software.amazon.awssdk.services.s3.presigner.model.PresignedPutObjectRequest; import java.time.Duration; @@ -33,4 +35,19 @@ public String generatePresignedPutUrl(String uniqueKey, String contentType) { return presignedRequest.url().toString(); } + + public String generatePresignedGetUrl(String uniqueKey) { + GetObjectRequest getObjectRequest = GetObjectRequest.builder() + .bucket(bucket) + .key(uniqueKey) + .build(); + + PresignedGetObjectRequest presignedRequest = + s3Presigner.presignGetObject(r -> r + .signatureDuration(Duration.ofMinutes(10)) + .getObjectRequest(getObjectRequest) + ); + + return presignedRequest.url().toString(); + } } diff --git a/src/main/java/com/cheeeese/photo/dto/request/PhotoDownloadRequest.java b/src/main/java/com/cheeeese/photo/dto/request/PhotoDownloadRequest.java new file mode 100644 index 0000000..0b379bb --- /dev/null +++ b/src/main/java/com/cheeeese/photo/dto/request/PhotoDownloadRequest.java @@ -0,0 +1,12 @@ +package com.cheeeese.photo.dto.request; + +import lombok.Builder; + +import java.util.List; + +@Builder +public record PhotoDownloadRequest( + String code, + List photoIds +) { +} diff --git a/src/main/java/com/cheeeese/photo/dto/response/PhotoDownloadResponse.java b/src/main/java/com/cheeeese/photo/dto/response/PhotoDownloadResponse.java new file mode 100644 index 0000000..b648c7e --- /dev/null +++ b/src/main/java/com/cheeeese/photo/dto/response/PhotoDownloadResponse.java @@ -0,0 +1,13 @@ +package com.cheeeese.photo.dto.response; + +import lombok.Builder; + +import java.time.LocalDateTime; + +@Builder +public record PhotoDownloadResponse( + String fileName, + LocalDateTime captureTime, + LocalDateTime createdAt +) { +} diff --git a/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java b/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java index 105a655..08e7d84 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java @@ -41,6 +41,12 @@ public static PhotoPresignedUrlResponse toPresignedUrlResponse( .build(); } + public static PhotoDownloadResponse toPhotoDownloadResponse(Photo photo) { + return PhotoDownloadResponse.builder() + .fileName() + .build(); + } + public static PhotoListResponse toPhotoListResponse(Photo photo, boolean isLiked, boolean isDownloaded) { return PhotoListResponse.builder() .photoId(photo.getId()) diff --git a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java index 6e5d120..4c3bbca 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java @@ -91,4 +91,6 @@ int updateStatusByIdsAndUserIdAndExpectedStatus( @Query("update Photo p set p.status = :newStatus, p.thumbnailUrl = :thumbnailUrl " + "where p.id = :photoId and p.status = :expectedStatus") int updateStatusAndUrl(Long photoId, PhotoStatus expectedStatus, PhotoStatus newStatus, String thumbnailUrl); + + List findAllByIdIn(List photoIds); } From d70217c9adc4113c89e77e46705c96c329e30d13 Mon Sep 17 00:00:00 2001 From: zyovn Date: Fri, 7 Nov 2025 02:03:26 +0900 Subject: [PATCH 224/402] =?UTF-8?q?#46=20feat:=20=EC=95=A8=EB=B2=94=20?= =?UTF-8?q?=EC=82=AC=EC=A7=84=20=EC=A0=9C=ED=95=9C=2010=EC=9E=A5=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EC=88=98=EC=A0=95=20=EB=B0=8F=20=EC=95=A8=EB=B2=94?= =?UTF-8?q?=20=EC=83=9D=EC=84=B1=20=EC=9D=BC=EC=A3=BC=EC=9D=BC=203?= =?UTF-8?q?=EA=B0=9C=20=EC=A0=9C=ED=95=9C=20=EC=9E=84=EC=8B=9C=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cheeeese/album/application/AlbumService.java | 4 ++-- .../album/application/validator/AlbumValidator.java | 8 ++++---- .../cheeeese/album/infrastructure/mapper/AlbumMapper.java | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/cheeeese/album/application/AlbumService.java b/src/main/java/com/cheeeese/album/application/AlbumService.java index 180e241..41e55eb 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumService.java +++ b/src/main/java/com/cheeeese/album/application/AlbumService.java @@ -50,9 +50,9 @@ public class AlbumService { public AlbumCreationResponse createAlbum(User user, AlbumCreationRequest request) { String code = UuidCreator.getTimeOrdered().toString(); - long createdThisWeek = countUserAlbumsCreatedThisWeek(user); + // long createdThisWeek = countUserAlbumsCreatedThisWeek(user); - albumValidator.validateAlbumCreation(createdThisWeek, request); + albumValidator.validateAlbumCreation(request); Album album = AlbumMapper.toEntity( user.getId(), diff --git a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java index 4ef79ec..8434c2b 100644 --- a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java +++ b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java @@ -20,7 +20,7 @@ public class AlbumValidator { private final AlbumRepository albumRepository; private final UserAlbumRepository userAlbumRepository; - public void validateAlbumCreation(long createdThisWeek, AlbumCreationRequest request) { + public void validateAlbumCreation(AlbumCreationRequest request) { if (request.themeEmoji() == null || request.themeEmoji().isBlank()) { throw new AlbumException(AlbumErrorCode.ALBUM_THEME_EMOJI_NOT_SELECTED); } @@ -41,9 +41,9 @@ public void validateAlbumCreation(long createdThisWeek, AlbumCreationRequest req throw new AlbumException(AlbumErrorCode.ALBUM_INVALID_CAPACITY); } - if (createdThisWeek >= 3) { - throw new AlbumException(AlbumErrorCode.ALBUM_CREATION_LIMIT_EXCEEDED); - } +// if (createdThisWeek >= 3) { +// throw new AlbumException(AlbumErrorCode.ALBUM_CREATION_LIMIT_EXCEEDED); +// } } public Album validateAlbumCode(String code) { diff --git a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java index 004eacc..62d0f3f 100644 --- a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java +++ b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java @@ -33,7 +33,7 @@ public static Album toEntity( .participant(participant) .currentParticipant(1) .eventDate(eventDate) - .maxPhotoCount(2000) + .maxPhotoCount(10) .currentPhotoCount(0) .isInfoAvailable(isInfoAvailable) .expiredAt(expiredAt) From c993f2546df40d9bad2706048ec9a9140aa6a951 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Fri, 7 Nov 2025 13:32:09 +0900 Subject: [PATCH 225/402] =?UTF-8?q?#48=20fix:=20=EB=B9=84=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=EC=9D=B8,=20=EC=95=A8=EB=B2=94=20=EB=AF=B8=EC=B0=B8?= =?UTF-8?q?=EC=97=AC=20=EC=82=AC=EC=9A=A9=EC=9E=90=EB=8F=84=20=EC=95=A8?= =?UTF-8?q?=EB=B2=94=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?=EA=B0=80=EB=8A=A5=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../album/application/AlbumService.java | 19 ++++++++++++------- .../album/presentation/AlbumController.java | 19 +++++++++++++++++-- .../presentation/swagger/AlbumSwagger.java | 3 ++- .../global/config/SecurityConfig.java | 1 + 4 files changed, 32 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/cheeeese/album/application/AlbumService.java b/src/main/java/com/cheeeese/album/application/AlbumService.java index 180e241..35c94ae 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumService.java +++ b/src/main/java/com/cheeeese/album/application/AlbumService.java @@ -144,16 +144,21 @@ public AlbumParticipantResponse getAlbumParticipantList(User currentUser, String boolean isExpired = album.isExpired(); - // 참여 여부 검증 - UserAlbum myUserAlbum = userAlbumRepository.findByUserIdAndAlbumId(currentUser.getId(), album.getId()) - .orElseThrow(() -> new AlbumException(AlbumErrorCode.USER_NOT_PARTICIPANT)); + Role myRole = null; + Long currentUserId = currentUser != null ? currentUser.getId() : null; - Role myRole = myUserAlbum.getRole(); + if (currentUserId != null) { + Optional myUserAlbumOptional = userAlbumRepository.findByUserIdAndAlbumId(currentUserId, album.getId()); + + if (myUserAlbumOptional.isPresent()) { + myRole = myUserAlbumOptional.get().getRole(); + } + } // 앨범의 전체 참여자 목록 List userAlbums = userAlbumRepository.findAllByAlbumId(album.getId()); - List participantInfos = buildSortedParticipantInfos(userAlbums, currentUser); + List participantInfos = buildSortedParticipantInfos(userAlbums, currentUserId); return UserAlbumMapper.toAlbumParticipantResponse( album, @@ -203,13 +208,13 @@ private List getRecentPhotosWithUploaderIn private List buildSortedParticipantInfos( List userAlbums, - User currentUser + Long currentUserId ) { return userAlbums.stream() .map(userAlbum -> { User user = userAlbum.getUser(); Role role = userAlbum.getRole(); - boolean isMe = user.getId().equals(currentUser.getId()); + boolean isMe = currentUserId != null && user.getId().equals(currentUserId); return UserAlbumMapper.toParticipantInfo(user, role, isMe); }) .sorted(Comparator diff --git a/src/main/java/com/cheeeese/album/presentation/AlbumController.java b/src/main/java/com/cheeeese/album/presentation/AlbumController.java index 9eb7bea..3df87fb 100644 --- a/src/main/java/com/cheeeese/album/presentation/AlbumController.java +++ b/src/main/java/com/cheeeese/album/presentation/AlbumController.java @@ -5,10 +5,14 @@ import com.cheeeese.album.dto.response.*; import com.cheeeese.album.presentation.swagger.AlbumSwagger; import com.cheeeese.global.common.CommonResponse; +import com.cheeeese.global.security.CustomUserDetails; import com.cheeeese.global.util.CurrentUser; import com.cheeeese.user.domain.User; +import com.cheeeese.user.infrastructure.persistence.UserRepository; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; +import org.springframework.security.authentication.AnonymousAuthenticationToken; +import org.springframework.security.core.Authentication; import org.springframework.web.bind.annotation.*; import static com.cheeeese.global.common.code.SuccessCode.*; @@ -19,6 +23,7 @@ public class AlbumController implements AlbumSwagger { private final AlbumService albumService; + private final UserRepository userRepository; @Override @PostMapping @@ -60,12 +65,22 @@ public CommonResponse getAvailableUploadCount( @Override @GetMapping("/{code}/participants") public CommonResponse getAlbumParticipants( - @CurrentUser User user, + Authentication authentication, @PathVariable String code ) { + User currentUser = null; + + if (authentication != null && !(authentication instanceof AnonymousAuthenticationToken)) { + Object principal = authentication.getPrincipal(); + + if (principal instanceof CustomUserDetails customUserDetails) { + currentUser = customUserDetails.getUser(); + } + } + return CommonResponse.success( ALBUM_PARTICIPANT_FETCH_SUCCESS, - albumService.getAlbumParticipantList(user,code) + albumService.getAlbumParticipantList(currentUser,code) ); } diff --git a/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java b/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java index f58a49f..e15b42e 100644 --- a/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java +++ b/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java @@ -12,6 +12,7 @@ import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; +import org.springframework.security.core.Authentication; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; @@ -250,7 +251,7 @@ CommonResponse getAvailableUploadCount( ) }) CommonResponse getAlbumParticipants( - @CurrentUser User user, + Authentication authentication, @PathVariable String code ); } \ No newline at end of file diff --git a/src/main/java/com/cheeeese/global/config/SecurityConfig.java b/src/main/java/com/cheeeese/global/config/SecurityConfig.java index b2cccba..62bdbfb 100644 --- a/src/main/java/com/cheeeese/global/config/SecurityConfig.java +++ b/src/main/java/com/cheeeese/global/config/SecurityConfig.java @@ -37,6 +37,7 @@ public class SecurityConfig { "/v1/auth/exchange", "/v1/auth/reissue", "/v1/album/*/invitation", + "/v1/album/*/participants", "/internal/thumbnail/complete" }; From 4431d77b44a742082ba58883ffba2f47499c67b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Fri, 7 Nov 2025 17:44:32 +0900 Subject: [PATCH 226/402] =?UTF-8?q?#39=20feat:=20=EC=B9=98=EC=A6=88?= =?UTF-8?q?=EB=84=A4=EC=BB=B7=20PresignedUrl=20=EB=B0=9C=EA=B8=89=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/Cheese4cutService.java | 19 ++++++ .../Cheese4cutPresignedUrlResponse.java | 11 ++++ .../mapper/Cheese4cutMapper.java | 16 +++++ .../presentation/Cheese4cutController.java | 23 +++++-- .../swagger/Cheese4cutSwagger.java | 66 +++++++------------ .../application/PresignedUrlService.java | 21 ++++++ 6 files changed, 109 insertions(+), 47 deletions(-) create mode 100644 src/main/java/com/cheeeese/cheese4cut/dto/response/Cheese4cutPresignedUrlResponse.java diff --git a/src/main/java/com/cheeeese/cheese4cut/application/Cheese4cutService.java b/src/main/java/com/cheeeese/cheese4cut/application/Cheese4cutService.java index 9ea7515..8afabd1 100644 --- a/src/main/java/com/cheeeese/cheese4cut/application/Cheese4cutService.java +++ b/src/main/java/com/cheeeese/cheese4cut/application/Cheese4cutService.java @@ -1,23 +1,29 @@ package com.cheeeese.cheese4cut.application; +import com.cheeeese.album.application.validator.AlbumValidator; import com.cheeeese.album.domain.Album; import com.cheeeese.album.exception.AlbumException; import com.cheeeese.album.exception.code.AlbumErrorCode; import com.cheeeese.album.infrastructure.persistence.AlbumRepository; +import com.cheeeese.album.infrastructure.persistence.UserAlbumRepository; import com.cheeeese.cheese4cut.domain.Cheese4cut; +import com.cheeeese.cheese4cut.dto.response.Cheese4cutPresignedUrlResponse; import com.cheeeese.cheese4cut.dto.response.Cheese4cutResponse; import com.cheeeese.cheese4cut.exception.Cheese4cutException; import com.cheeeese.cheese4cut.exception.code.Cheese4cutErrorCode; import com.cheeeese.cheese4cut.infrastructure.mapper.Cheese4cutMapper; import com.cheeeese.cheese4cut.infrastructure.persistence.Cheese4cutRepository; +import com.cheeeese.photo.application.PresignedUrlService; import com.cheeeese.photo.domain.Photo; import com.cheeeese.photo.infrastructure.persistence.PhotoLikesRepository; import com.cheeeese.photo.infrastructure.persistence.PhotoRepository; +import com.cheeeese.user.domain.User; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.PageRequest; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Optional; @@ -33,6 +39,9 @@ public class Cheese4cutService { private final AlbumRepository albumRepository; private final PhotoRepository photoRepository; private final PhotoLikesRepository photoLikesRepository; + private final UserAlbumRepository userAlbumRepository; + private final AlbumValidator albumValidator; + private final PresignedUrlService presignedUrlService; @Transactional(readOnly = true) public Cheese4cutResponse getCheese4cutByAlbumCode(String code) { @@ -71,4 +80,14 @@ private Cheese4cutResponse getPreviewResponse(Long albumId, int participant) { return Cheese4cutMapper.toPreviewResponse(orderedPhotos, uniqueLikesCount, participant); } + + @Transactional(readOnly = true) + public Cheese4cutPresignedUrlResponse createCheese4cutPresignedUrl(User user, String code) { + Album album = albumValidator.validateAlbumCode(code); + albumValidator.validateUploadPermission(album, user); + + String uploadUrl = presignedUrlService.generateCheese4cutPresignedPutUrl(code); + + return Cheese4cutMapper.toPresignedUrlResponse(uploadUrl); + } } diff --git a/src/main/java/com/cheeeese/cheese4cut/dto/response/Cheese4cutPresignedUrlResponse.java b/src/main/java/com/cheeeese/cheese4cut/dto/response/Cheese4cutPresignedUrlResponse.java new file mode 100644 index 0000000..b76c090 --- /dev/null +++ b/src/main/java/com/cheeeese/cheese4cut/dto/response/Cheese4cutPresignedUrlResponse.java @@ -0,0 +1,11 @@ +package com.cheeeese.cheese4cut.dto.response; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Builder; + +@Builder +@Schema(description = "Presigned URL 발급 응답") +public record Cheese4cutPresignedUrlResponse ( + @Schema(description = "클라우드 스토리지에 업로드할 URL", example = "https://bucket.s3.ap-northeast-2.amazonaws.com/...") + String uploadUrl +){} \ No newline at end of file diff --git a/src/main/java/com/cheeeese/cheese4cut/infrastructure/mapper/Cheese4cutMapper.java b/src/main/java/com/cheeeese/cheese4cut/infrastructure/mapper/Cheese4cutMapper.java index 9cef297..7287089 100644 --- a/src/main/java/com/cheeeese/cheese4cut/infrastructure/mapper/Cheese4cutMapper.java +++ b/src/main/java/com/cheeeese/cheese4cut/infrastructure/mapper/Cheese4cutMapper.java @@ -1,7 +1,10 @@ package com.cheeeese.cheese4cut.infrastructure.mapper; +import com.cheeeese.album.domain.Album; import com.cheeeese.cheese4cut.domain.Cheese4cut; +import com.cheeeese.cheese4cut.dto.request.Cheese4cutFixedRequest; import com.cheeeese.cheese4cut.dto.response.Cheese4cutFinalResponse; +import com.cheeeese.cheese4cut.dto.response.Cheese4cutPresignedUrlResponse; import com.cheeeese.cheese4cut.dto.response.Cheese4cutPreviewResponse; import com.cheeeese.photo.domain.Photo; @@ -44,4 +47,17 @@ public static Cheese4cutPreviewResponse toPreviewResponse( .participant(participant) .build(); } + + public static Cheese4cut toEntity(Album album, Cheese4cutFixedRequest request) { + return Cheese4cut.builder() + .album(album) + .photoIds(request.photoIds()) + .frameImageUrl(request.frameImageUrl()) + .build(); + } + + public static Cheese4cutPresignedUrlResponse toPresignedUrlResponse(String uploadUrl) { + return Cheese4cutPresignedUrlResponse.builder() + .uploadUrl(uploadUrl).build(); + } } diff --git a/src/main/java/com/cheeeese/cheese4cut/presentation/Cheese4cutController.java b/src/main/java/com/cheeeese/cheese4cut/presentation/Cheese4cutController.java index a109484..dd00888 100644 --- a/src/main/java/com/cheeeese/cheese4cut/presentation/Cheese4cutController.java +++ b/src/main/java/com/cheeeese/cheese4cut/presentation/Cheese4cutController.java @@ -1,15 +1,17 @@ package com.cheeeese.cheese4cut.presentation; import com.cheeeese.cheese4cut.application.Cheese4cutService; +import com.cheeeese.cheese4cut.dto.response.Cheese4cutPresignedUrlResponse; import com.cheeeese.cheese4cut.dto.response.Cheese4cutResponse; import com.cheeeese.cheese4cut.presentation.swagger.Cheese4cutSwagger; import com.cheeeese.global.common.CommonResponse; import com.cheeeese.global.common.code.SuccessCode; +import com.cheeeese.global.util.CurrentUser; +import com.cheeeese.user.domain.User; import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; + +import static com.cheeeese.global.common.code.SuccessCode.PRESIGNED_URL_ISSUE_SUCCESS; @RestController @RequiredArgsConstructor @@ -18,9 +20,20 @@ public class Cheese4cutController implements Cheese4cutSwagger { private final Cheese4cutService cheese4cutService; - @GetMapping + @Override + @GetMapping("/preview") public CommonResponse getCheese4cut(@PathVariable String code) { return CommonResponse.success(SuccessCode.CHEESE4CUT_GET_SUCCESS, cheese4cutService.getCheese4cutByAlbumCode(code)); } + + @Override + @PostMapping("/presigned-url") + public CommonResponse createCheese4cutPresignedUrl( + @CurrentUser User user, + @PathVariable String code + ) { + return CommonResponse.success(PRESIGNED_URL_ISSUE_SUCCESS, + cheese4cutService.createCheese4cutPresignedUrl(user, code)); + } } diff --git a/src/main/java/com/cheeeese/cheese4cut/presentation/swagger/Cheese4cutSwagger.java b/src/main/java/com/cheeeese/cheese4cut/presentation/swagger/Cheese4cutSwagger.java index 79882f6..9c188e2 100644 --- a/src/main/java/com/cheeeese/cheese4cut/presentation/swagger/Cheese4cutSwagger.java +++ b/src/main/java/com/cheeeese/cheese4cut/presentation/swagger/Cheese4cutSwagger.java @@ -1,9 +1,12 @@ package com.cheeeese.cheese4cut.presentation.swagger; +import com.cheeeese.cheese4cut.dto.response.Cheese4cutPresignedUrlResponse; import com.cheeeese.global.common.CommonResponse; import com.cheeeese.cheese4cut.dto.response.Cheese4cutResponse; import com.cheeeese.cheese4cut.dto.response.Cheese4cutPreviewResponse; import com.cheeeese.cheese4cut.dto.response.Cheese4cutFinalResponse; +import com.cheeeese.global.util.CurrentUser; +import com.cheeeese.user.domain.User; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.ExampleObject; @@ -34,48 +37,7 @@ public interface Cheese4cutSwagger { @ApiResponses(value = { @ApiResponse( responseCode = "200", - description = "치즈네컷 정보 조회가 성공적으로 실행되었습니다.", - content = @Content( - mediaType = "application/json", - schema = @Schema(oneOf = {Cheese4cutPreviewResponse.class, Cheese4cutFinalResponse.class}), - examples = { - @ExampleObject( - name = "Case 1: 확정 전 미리보기 (버튼 활성화)", - description = "완료된 사진이 4장 이상이며, 최종 확정 전 상태.", - value = """ - { - "isSuccess": true, - "code": 200, - "message": "치즈네컷 정보 조회가 성공적으로 실행되었습니다.", - "result": { - "isFinalized": false, - "previewPhotos": [ - {"photoId": 101, "imageUrl": "https://cdn.img/101_orig.jpg"}, - // ... 4 photos - ], - "uniqueLikesCount": 5, - "participant": 6 - } - } - """ - ), - @ExampleObject( - name = "Case 2: 확정 후 최종 이미지", - description = "앨범이 만료되어 치즈네컷이 자동/수동 확정된 상태.", - value = """ - { - "isSuccess": true, - "code": 200, - "message": "치즈네컷 정보 조회가 성공적으로 실행되었습니다.", - "result": { - "isFinalized": true, - "finalFrameImageUrl": "https://cdn.img/cheese4cut/final/1.png" - } - } - """ - ) - } - ) + description = "치즈네컷 정보 조회가 성공적으로 실행되었습니다." ), @ApiResponse( responseCode = "400", @@ -113,4 +75,24 @@ public interface Cheese4cutSwagger { CommonResponse getCheese4cut( @PathVariable String code ); + + @Operation( + summary = "치즈네컷 최종 이미지 업로드용 Presigned URL 발급 API", + description = """ + ### 로직 상세 + --- + 1. 사용자 권한 확인 (MAKER 혹은 참여자만 가능) + 2. **치즈네컷 전용 버킷**에 저장할 Presigned URL을 발급하여 반환 + """ + ) + @ApiResponses(value = { + @ApiResponse( + responseCode = "200", + description = "Presigned URL 발급이 성공적으로 완료되었습니다." + ) + }) + CommonResponse createCheese4cutPresignedUrl( + @CurrentUser User user, + @PathVariable String code + ); } \ No newline at end of file diff --git a/src/main/java/com/cheeeese/photo/application/PresignedUrlService.java b/src/main/java/com/cheeeese/photo/application/PresignedUrlService.java index 77db1d2..90e1c73 100644 --- a/src/main/java/com/cheeeese/photo/application/PresignedUrlService.java +++ b/src/main/java/com/cheeeese/photo/application/PresignedUrlService.java @@ -18,6 +18,9 @@ public class PresignedUrlService { @Value("${ncp.object-storage.bucket}") private String bucket; + @Value("${ncp.object-storage.cheese4cut-bucket}") + private String cheese4cutBucket; + public String generatePresignedPutUrl(String uniqueKey, String contentType) { PutObjectRequest putObjectRequest = PutObjectRequest.builder() .bucket(bucket) @@ -33,4 +36,22 @@ public String generatePresignedPutUrl(String uniqueKey, String contentType) { return presignedRequest.url().toString(); } + + public String generateCheese4cutPresignedPutUrl(String albumCode) { + String uniqueFileName = String.format("%s.png", System.currentTimeMillis()); + String objectKey = String.format("album/%s/%s", albumCode, uniqueFileName); + + PutObjectRequest putObjectRequest = PutObjectRequest.builder() + .bucket(cheese4cutBucket) + .key(objectKey) + .build(); + + PresignedPutObjectRequest presignedRequest = + s3Presigner.presignPutObject(p -> p + .signatureDuration(Duration.ofMinutes(10)) + .putObjectRequest(putObjectRequest) + ); + + return presignedRequest.url().toString(); + } } From 0dc9ae4b3726e718100ed019e0823d8aa6e985bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Fri, 7 Nov 2025 18:08:39 +0900 Subject: [PATCH 227/402] =?UTF-8?q?#39=20feat:=20WHITE=5FLIST=EC=97=90=20p?= =?UTF-8?q?review=20api=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/cheeeese/global/config/SecurityConfig.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/cheeeese/global/config/SecurityConfig.java b/src/main/java/com/cheeeese/global/config/SecurityConfig.java index b2cccba..576a7ed 100644 --- a/src/main/java/com/cheeeese/global/config/SecurityConfig.java +++ b/src/main/java/com/cheeeese/global/config/SecurityConfig.java @@ -37,6 +37,7 @@ public class SecurityConfig { "/v1/auth/exchange", "/v1/auth/reissue", "/v1/album/*/invitation", + "/v1/cheese4cut/*/preview", "/internal/thumbnail/complete" }; From aa710142f49bd242a03af48f548a4e3c98c18138 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Fri, 7 Nov 2025 18:09:29 +0900 Subject: [PATCH 228/402] =?UTF-8?q?#39=20feat:=20=EC=95=A8=EB=B2=94=20?= =?UTF-8?q?=EB=A7=8C=EB=A3=8C=20=EC=A0=84=20=EC=B9=98=EC=A6=88=EB=84=A4?= =?UTF-8?q?=EC=BB=B7=20=ED=99=95=EC=A0=95=20api=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../album/exception/code/AlbumErrorCode.java | 1 + .../application/Cheese4cutService.java | 28 +++++++++- .../validator/Cheese4cutValidator.java | 55 +++++++++++++++++++ .../dto/request/Cheese4cutFixedRequest.java | 23 ++++++++ .../exception/code/Cheese4cutErrorCode.java | 4 +- .../presentation/Cheese4cutController.java | 14 +++++ .../swagger/Cheese4cutSwagger.java | 49 ++++++++++++++++- .../global/common/code/SuccessCode.java | 1 + 8 files changed, 171 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/cheeeese/cheese4cut/application/validator/Cheese4cutValidator.java create mode 100644 src/main/java/com/cheeeese/cheese4cut/dto/request/Cheese4cutFixedRequest.java diff --git a/src/main/java/com/cheeeese/album/exception/code/AlbumErrorCode.java b/src/main/java/com/cheeeese/album/exception/code/AlbumErrorCode.java index 5a41b41..5d92841 100644 --- a/src/main/java/com/cheeeese/album/exception/code/AlbumErrorCode.java +++ b/src/main/java/com/cheeeese/album/exception/code/AlbumErrorCode.java @@ -21,6 +21,7 @@ public enum AlbumErrorCode implements BaseCode { ALBUM_INVALID_CAPACITY(HttpStatus.BAD_REQUEST, "앨범 인원은 최소 1명 이상 최대 64명 이하여야 합니다."), ALBUM_CREATION_LIMIT_EXCEEDED(HttpStatus.CONFLICT, "사용자는 일주일에 최대 3개의 앨범만 생성할 수 있습니다."), USER_NOT_PARTICIPANT(HttpStatus.FORBIDDEN, "사용자는 해당 앨범의 참가자가 아닙니다."), + USER_NOT_MAKER(HttpStatus.FORBIDDEN, "해당 사용자는 MAKER가 아닙니다.") ; private final HttpStatus httpStatus; diff --git a/src/main/java/com/cheeeese/cheese4cut/application/Cheese4cutService.java b/src/main/java/com/cheeeese/cheese4cut/application/Cheese4cutService.java index 8afabd1..20d6d3b 100644 --- a/src/main/java/com/cheeeese/cheese4cut/application/Cheese4cutService.java +++ b/src/main/java/com/cheeeese/cheese4cut/application/Cheese4cutService.java @@ -2,11 +2,14 @@ import com.cheeeese.album.application.validator.AlbumValidator; import com.cheeeese.album.domain.Album; +import com.cheeeese.album.domain.type.Role; import com.cheeeese.album.exception.AlbumException; import com.cheeeese.album.exception.code.AlbumErrorCode; import com.cheeeese.album.infrastructure.persistence.AlbumRepository; import com.cheeeese.album.infrastructure.persistence.UserAlbumRepository; +import com.cheeeese.cheese4cut.application.validator.Cheese4cutValidator; import com.cheeeese.cheese4cut.domain.Cheese4cut; +import com.cheeeese.cheese4cut.dto.request.Cheese4cutFixedRequest; import com.cheeeese.cheese4cut.dto.response.Cheese4cutPresignedUrlResponse; import com.cheeeese.cheese4cut.dto.response.Cheese4cutResponse; import com.cheeeese.cheese4cut.exception.Cheese4cutException; @@ -15,6 +18,9 @@ import com.cheeeese.cheese4cut.infrastructure.persistence.Cheese4cutRepository; import com.cheeeese.photo.application.PresignedUrlService; import com.cheeeese.photo.domain.Photo; +import com.cheeeese.photo.domain.PhotoStatus; +import com.cheeeese.photo.exception.PhotoException; +import com.cheeeese.photo.exception.code.PhotoErrorCode; import com.cheeeese.photo.infrastructure.persistence.PhotoLikesRepository; import com.cheeeese.photo.infrastructure.persistence.PhotoRepository; import com.cheeeese.user.domain.User; @@ -39,9 +45,9 @@ public class Cheese4cutService { private final AlbumRepository albumRepository; private final PhotoRepository photoRepository; private final PhotoLikesRepository photoLikesRepository; - private final UserAlbumRepository userAlbumRepository; private final AlbumValidator albumValidator; private final PresignedUrlService presignedUrlService; + private final Cheese4cutValidator cheese4cutValidator; @Transactional(readOnly = true) public Cheese4cutResponse getCheese4cutByAlbumCode(String code) { @@ -90,4 +96,24 @@ public Cheese4cutPresignedUrlResponse createCheese4cutPresignedUrl(User user, St return Cheese4cutMapper.toPresignedUrlResponse(uploadUrl); } + + public void finalizeCheese4cut(User user, String code, Cheese4cutFixedRequest request) { + Album album = albumValidator.validateAlbumCode(code); + + if (album.isExpired()) { + throw new AlbumException(AlbumErrorCode.ALBUM_EXPIRED); + } + + cheese4cutValidator.validateUserIsMaker(album, user); + + if (cheese4cutRepository.findByAlbumId(album.getId()).isPresent()) { + throw new Cheese4cutException(Cheese4cutErrorCode.CHEESE4CUT_ALREADY_FINALIZED); + } + + cheese4cutValidator.validateFinalizePhotos(album, request.photoIds()); + + Cheese4cut cheese4cut = Cheese4cutMapper.toEntity(album, request); + + cheese4cutRepository.save(cheese4cut); + } } diff --git a/src/main/java/com/cheeeese/cheese4cut/application/validator/Cheese4cutValidator.java b/src/main/java/com/cheeeese/cheese4cut/application/validator/Cheese4cutValidator.java new file mode 100644 index 0000000..07dc9d9 --- /dev/null +++ b/src/main/java/com/cheeeese/cheese4cut/application/validator/Cheese4cutValidator.java @@ -0,0 +1,55 @@ +package com.cheeeese.cheese4cut.application.validator; + +import com.cheeeese.album.domain.Album; +import com.cheeeese.album.domain.type.Role; +import com.cheeeese.album.exception.AlbumException; +import com.cheeeese.album.exception.code.AlbumErrorCode; +import com.cheeeese.album.infrastructure.persistence.UserAlbumRepository; +import com.cheeeese.cheese4cut.exception.Cheese4cutException; +import com.cheeeese.cheese4cut.exception.code.Cheese4cutErrorCode; +import com.cheeeese.photo.domain.Photo; +import com.cheeeese.photo.domain.PhotoStatus; +import com.cheeeese.photo.exception.PhotoException; +import com.cheeeese.photo.exception.code.PhotoErrorCode; +import com.cheeeese.photo.infrastructure.persistence.PhotoRepository; +import com.cheeeese.user.domain.User; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +import java.util.HashSet; +import java.util.List; + +@Component +@RequiredArgsConstructor +public class Cheese4cutValidator { + + private final UserAlbumRepository userAlbumRepository; + private final PhotoRepository photoRepository; + + public void validateUserIsMaker(Album album, User user) { + boolean isMaker = userAlbumRepository.findByAlbumIdAndUserIdAndRole(album.getId(), user.getId(), Role.MAKER).isPresent(); + if (!isMaker) { + throw new AlbumException(AlbumErrorCode.USER_NOT_PARTICIPANT); + } + } + + public void validateFinalizePhotos(Album album, List photoIds) { + if (new HashSet<>(photoIds).size() != 4) { + throw new Cheese4cutException(Cheese4cutErrorCode.CHEESE4CUT_INVALID_PHOTO_COUNT); + } + + List photos = photoRepository.findAllById(photoIds); + + if (photos.size() != 4) { + throw new PhotoException(PhotoErrorCode.PHOTO_NOT_FOUND); + } + + boolean allValid = photos.stream().allMatch(photo -> + photo.getAlbum().getId().equals(album.getId()) && photo.getStatus() == PhotoStatus.COMPLETED + ); + + if (!allValid) { + throw new Cheese4cutException(Cheese4cutErrorCode.CHEESE4CUT_PHOTO_INVALID_STATUS_OR_ALBUM); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/cheeeese/cheese4cut/dto/request/Cheese4cutFixedRequest.java b/src/main/java/com/cheeeese/cheese4cut/dto/request/Cheese4cutFixedRequest.java new file mode 100644 index 0000000..05b7e8e --- /dev/null +++ b/src/main/java/com/cheeeese/cheese4cut/dto/request/Cheese4cutFixedRequest.java @@ -0,0 +1,23 @@ +package com.cheeeese.cheese4cut.dto.request; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.Size; +import lombok.Builder; + +import java.util.List; + +@Builder +@Schema(description = "치즈네컷 수동 확정 요청 DTO") +public record Cheese4cutFixedRequest( + @NotEmpty + @Size(min = 4, max = 4, message = "4장의 사진 ID를 선택해야 합니다.") + @Schema(description = "선택된 사진 ID 목록 (정확히 4개)", example = "[101, 105, 122, 140]") + List photoIds, + + @NotBlank + @Schema(description = "최종 합성된 이미지의 Object Storage URL", example = "https://cheese4cut/album/1.png") + String frameImageUrl +) { +} \ No newline at end of file diff --git a/src/main/java/com/cheeeese/cheese4cut/exception/code/Cheese4cutErrorCode.java b/src/main/java/com/cheeeese/cheese4cut/exception/code/Cheese4cutErrorCode.java index 372428f..4fafe5b 100644 --- a/src/main/java/com/cheeeese/cheese4cut/exception/code/Cheese4cutErrorCode.java +++ b/src/main/java/com/cheeeese/cheese4cut/exception/code/Cheese4cutErrorCode.java @@ -11,7 +11,9 @@ public enum Cheese4cutErrorCode implements BaseCode { CHEESE4CUT_NOT_FOUND(HttpStatus.NOT_FOUND, "치즈네컷이 존재하지 않습니다."), INSUFFICIENT_COUNT_FOR_CHEESE4CUT(HttpStatus.BAD_REQUEST, "치즈네컷 생성을 위한 완료된 사진이 4장 미만입니다."), - + CHEESE4CUT_ALREADY_FINALIZED(HttpStatus.CONFLICT, "치즈네컷이 이미 확정되었습니다."), + CHEESE4CUT_INVALID_PHOTO_COUNT(HttpStatus.BAD_REQUEST, "치즈네컷 확정 시 4장의 사진 ID만 허용됩니다."), + CHEESE4CUT_PHOTO_INVALID_STATUS_OR_ALBUM(HttpStatus.BAD_REQUEST, "확정하려는 사진은 해당 앨범에 속하며, 업로드가 완료(COMPLETED)된 상태여야 합니다."), ; private final HttpStatus httpStatus; diff --git a/src/main/java/com/cheeeese/cheese4cut/presentation/Cheese4cutController.java b/src/main/java/com/cheeeese/cheese4cut/presentation/Cheese4cutController.java index dd00888..0b9d099 100644 --- a/src/main/java/com/cheeeese/cheese4cut/presentation/Cheese4cutController.java +++ b/src/main/java/com/cheeeese/cheese4cut/presentation/Cheese4cutController.java @@ -1,6 +1,7 @@ package com.cheeeese.cheese4cut.presentation; import com.cheeeese.cheese4cut.application.Cheese4cutService; +import com.cheeeese.cheese4cut.dto.request.Cheese4cutFixedRequest; import com.cheeeese.cheese4cut.dto.response.Cheese4cutPresignedUrlResponse; import com.cheeeese.cheese4cut.dto.response.Cheese4cutResponse; import com.cheeeese.cheese4cut.presentation.swagger.Cheese4cutSwagger; @@ -8,9 +9,11 @@ import com.cheeeese.global.common.code.SuccessCode; import com.cheeeese.global.util.CurrentUser; import com.cheeeese.user.domain.User; +import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; +import static com.cheeeese.global.common.code.SuccessCode.CHEESE4CUT_FINALIZE_SUCCESS; import static com.cheeeese.global.common.code.SuccessCode.PRESIGNED_URL_ISSUE_SUCCESS; @RestController @@ -36,4 +39,15 @@ public CommonResponse createCheese4cutPresignedU return CommonResponse.success(PRESIGNED_URL_ISSUE_SUCCESS, cheese4cutService.createCheese4cutPresignedUrl(user, code)); } + + @Override + @PostMapping("/fixed") + public CommonResponse finalizeCheese4cut( + @CurrentUser User user, + @PathVariable String code, + @RequestBody @Valid Cheese4cutFixedRequest request + ) { + cheese4cutService.finalizeCheese4cut(user, code, request); + return CommonResponse.success(CHEESE4CUT_FINALIZE_SUCCESS); + } } diff --git a/src/main/java/com/cheeeese/cheese4cut/presentation/swagger/Cheese4cutSwagger.java b/src/main/java/com/cheeeese/cheese4cut/presentation/swagger/Cheese4cutSwagger.java index 9c188e2..79812a7 100644 --- a/src/main/java/com/cheeeese/cheese4cut/presentation/swagger/Cheese4cutSwagger.java +++ b/src/main/java/com/cheeeese/cheese4cut/presentation/swagger/Cheese4cutSwagger.java @@ -1,10 +1,9 @@ package com.cheeeese.cheese4cut.presentation.swagger; +import com.cheeeese.cheese4cut.dto.request.Cheese4cutFixedRequest; import com.cheeeese.cheese4cut.dto.response.Cheese4cutPresignedUrlResponse; import com.cheeeese.global.common.CommonResponse; import com.cheeeese.cheese4cut.dto.response.Cheese4cutResponse; -import com.cheeeese.cheese4cut.dto.response.Cheese4cutPreviewResponse; -import com.cheeeese.cheese4cut.dto.response.Cheese4cutFinalResponse; import com.cheeeese.global.util.CurrentUser; import com.cheeeese.user.domain.User; import io.swagger.v3.oas.annotations.Operation; @@ -14,7 +13,9 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; @Tag(name = "[치즈네컷]", description = "치즈네컷 관련 API") public interface Cheese4cutSwagger { @@ -95,4 +96,48 @@ CommonResponse createCheese4cutPresignedUrl( @CurrentUser User user, @PathVariable String code ); + + @Operation( + summary = "치즈네컷 수동 확정 API", + description = """ + ### PathVariable + --- + `code`: 앨범 코드 + + ### RequestBody + --- + `photoIds`: 사용자가 최종 선택한 4장의 사진 ID \n + `frameImageUrl`: 전체 프레임 이미지 URL + + ### 로직 상세 + --- + 1. 사용자 권한 확인 (MAKER만 가능). + 2. 앨범 만료 및 이미 확정 여부 확인. + 3. 요청된 4장의 사진 ID가 모두 **COMPLETED 상태**이고 해당 앨범에 속하는지 검증. + 4. `Cheese4cut` 레코드를 생성하고 저장. + """ + ) + @ApiResponses(value = { + @ApiResponse( + responseCode = "200", + description = "치즈네컷 수동 확정이 성공적으로 완료되었습니다." + ), + @ApiResponse( + responseCode = "400", + description = "유효성 검증 실패 (사진 개수/상태 오류)" + ), + @ApiResponse( + responseCode = "403", + description = "권한 없음 (MAKER가 아님) 또는 만료된 앨범" + ), + @ApiResponse( + responseCode = "409", + description = "이미 치즈네컷이 확정되었습니다." + ) + }) + CommonResponse finalizeCheese4cut( + @CurrentUser User user, + @PathVariable String code, + @RequestBody @Valid Cheese4cutFixedRequest request + ); } \ No newline at end of file diff --git a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java index f3aa37d..62ec241 100644 --- a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java +++ b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java @@ -39,6 +39,7 @@ public enum SuccessCode implements BaseCode { // cheese4cut CHEESE4CUT_GET_SUCCESS(HttpStatus.OK, "치즈네컷 조회가 성공적으로 완료되었습니다."), + CHEESE4CUT_FINALIZE_SUCCESS(HttpStatus.OK, "치즈네컷 수동 확정이 성공적으로 완료되었습니다."), ; private final HttpStatus httpStatus; From de45785846df096ec2c07d3afb9bd7cf50e1b155 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Sat, 8 Nov 2025 00:42:42 +0900 Subject: [PATCH 229/402] =?UTF-8?q?#39=20fix:=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20import=EB=AC=B8=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cheeeese/cheese4cut/application/Cheese4cutService.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/main/java/com/cheeeese/cheese4cut/application/Cheese4cutService.java b/src/main/java/com/cheeeese/cheese4cut/application/Cheese4cutService.java index 20d6d3b..1919992 100644 --- a/src/main/java/com/cheeeese/cheese4cut/application/Cheese4cutService.java +++ b/src/main/java/com/cheeeese/cheese4cut/application/Cheese4cutService.java @@ -2,11 +2,9 @@ import com.cheeeese.album.application.validator.AlbumValidator; import com.cheeeese.album.domain.Album; -import com.cheeeese.album.domain.type.Role; import com.cheeeese.album.exception.AlbumException; import com.cheeeese.album.exception.code.AlbumErrorCode; import com.cheeeese.album.infrastructure.persistence.AlbumRepository; -import com.cheeeese.album.infrastructure.persistence.UserAlbumRepository; import com.cheeeese.cheese4cut.application.validator.Cheese4cutValidator; import com.cheeeese.cheese4cut.domain.Cheese4cut; import com.cheeeese.cheese4cut.dto.request.Cheese4cutFixedRequest; @@ -18,9 +16,6 @@ import com.cheeeese.cheese4cut.infrastructure.persistence.Cheese4cutRepository; import com.cheeeese.photo.application.PresignedUrlService; import com.cheeeese.photo.domain.Photo; -import com.cheeeese.photo.domain.PhotoStatus; -import com.cheeeese.photo.exception.PhotoException; -import com.cheeeese.photo.exception.code.PhotoErrorCode; import com.cheeeese.photo.infrastructure.persistence.PhotoLikesRepository; import com.cheeeese.photo.infrastructure.persistence.PhotoRepository; import com.cheeeese.user.domain.User; @@ -29,7 +24,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Optional; From d269cc523c7c8da11a97689cdd231f33850d6e11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Sat, 8 Nov 2025 16:48:37 +0900 Subject: [PATCH 230/402] =?UTF-8?q?#48=20fix:=20=ED=94=BC=EB=93=9C?= =?UTF-8?q?=EB=B0=B1=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../album/application/AlbumService.java | 19 ++++++++++++++++++- .../album/presentation/AlbumController.java | 16 +--------------- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/cheeeese/album/application/AlbumService.java b/src/main/java/com/cheeeese/album/application/AlbumService.java index 35c94ae..5a4e763 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumService.java +++ b/src/main/java/com/cheeeese/album/application/AlbumService.java @@ -11,6 +11,7 @@ import com.cheeeese.album.infrastructure.mapper.AlbumMapper; import com.cheeeese.album.infrastructure.mapper.UserAlbumMapper; import com.cheeeese.album.infrastructure.persistence.AlbumRepository; +import com.cheeeese.global.security.CustomUserDetails; import com.cheeeese.photo.application.PhotoService; import com.cheeeese.album.domain.UserAlbum; import com.cheeeese.album.infrastructure.persistence.UserAlbumRepository; @@ -22,6 +23,8 @@ import com.github.f4b6a3.uuid.UuidCreator; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.security.authentication.AnonymousAuthenticationToken; +import org.springframework.security.core.Authentication; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -139,7 +142,10 @@ public UploadAvailableCountResponse getAvailablePhotoCount(User user, String cod ); } - public AlbumParticipantResponse getAlbumParticipantList(User currentUser, String code) { + public AlbumParticipantResponse getAlbumParticipantList(Authentication authentication, String code) { + + User currentUser = extractUser(authentication); + Album album = albumValidator.validateAlbumCode(code); boolean isExpired = album.isExpired(); @@ -168,6 +174,17 @@ public AlbumParticipantResponse getAlbumParticipantList(User currentUser, String ); } + private User extractUser(Authentication authentication) { + if (authentication == null || authentication instanceof AnonymousAuthenticationToken) { + return null; + } + Object principal = authentication.getPrincipal(); + if (principal instanceof CustomUserDetails customUserDetails) { + return customUserDetails.getUser(); + } + return null; + } + private int calculateRemainingUploadSlots(Album album) { int current = album.getCurrentPhotoCount(); int max = album.getMaxPhotoCount(); diff --git a/src/main/java/com/cheeeese/album/presentation/AlbumController.java b/src/main/java/com/cheeeese/album/presentation/AlbumController.java index 3df87fb..3a8c7b2 100644 --- a/src/main/java/com/cheeeese/album/presentation/AlbumController.java +++ b/src/main/java/com/cheeeese/album/presentation/AlbumController.java @@ -5,13 +5,10 @@ import com.cheeeese.album.dto.response.*; import com.cheeeese.album.presentation.swagger.AlbumSwagger; import com.cheeeese.global.common.CommonResponse; -import com.cheeeese.global.security.CustomUserDetails; import com.cheeeese.global.util.CurrentUser; import com.cheeeese.user.domain.User; -import com.cheeeese.user.infrastructure.persistence.UserRepository; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; -import org.springframework.security.authentication.AnonymousAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.web.bind.annotation.*; @@ -23,7 +20,6 @@ public class AlbumController implements AlbumSwagger { private final AlbumService albumService; - private final UserRepository userRepository; @Override @PostMapping @@ -68,19 +64,9 @@ public CommonResponse getAlbumParticipants( Authentication authentication, @PathVariable String code ) { - User currentUser = null; - - if (authentication != null && !(authentication instanceof AnonymousAuthenticationToken)) { - Object principal = authentication.getPrincipal(); - - if (principal instanceof CustomUserDetails customUserDetails) { - currentUser = customUserDetails.getUser(); - } - } - return CommonResponse.success( ALBUM_PARTICIPANT_FETCH_SUCCESS, - albumService.getAlbumParticipantList(currentUser,code) + albumService.getAlbumParticipantList(authentication, code) ); } From ac2f10c6ef09a2ce770b5a7af0d28c59a4e59a2c Mon Sep 17 00:00:00 2001 From: zyovn Date: Sat, 8 Nov 2025 22:21:35 +0900 Subject: [PATCH 231/402] =?UTF-8?q?#45=20feat:=20=EB=8B=A4=EC=9A=B4?= =?UTF-8?q?=EB=A1=9C=EB=93=9C=EC=9A=A9=20presignedUrl=20=EB=B0=9C=EA=B8=89?= =?UTF-8?q?=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/validator/AlbumValidator.java | 1 + .../java/com/cheeeese/global/util/S3Util.java | 26 ++++++++++++++ .../photo/application/PhotoService.java | 36 +++++++++++++------ .../dto/response/PhotoDownloadResponse.java | 13 +++++-- .../mapper/PhotoHistoryMapper.java | 15 ++++++++ .../infrastructure/mapper/PhotoMapper.java | 14 ++++++-- .../photo/presentation/PhotoController.java | 10 ++++++ 7 files changed, 100 insertions(+), 15 deletions(-) create mode 100644 src/main/java/com/cheeeese/global/util/S3Util.java create mode 100644 src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoHistoryMapper.java diff --git a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java index 4ef79ec..d40af51 100644 --- a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java +++ b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java @@ -1,6 +1,7 @@ package com.cheeeese.album.application.validator; import com.cheeeese.album.domain.Album; +import com.cheeeese.album.domain.UserAlbum; import com.cheeeese.album.domain.type.Role; import com.cheeeese.album.dto.request.AlbumCreationRequest; import com.cheeeese.album.exception.AlbumException; diff --git a/src/main/java/com/cheeeese/global/util/S3Util.java b/src/main/java/com/cheeeese/global/util/S3Util.java new file mode 100644 index 0000000..786921d --- /dev/null +++ b/src/main/java/com/cheeeese/global/util/S3Util.java @@ -0,0 +1,26 @@ +package com.cheeeese.global.util; + +import java.net.URI; +import java.net.URISyntaxException; + +public class S3Util { + public static String extractObjectKey(String imageUrl) { + if (imageUrl == null) { + throw new NullPointerException("image url is null"); + } + + try { + URI uri = new URI(imageUrl); + String path = uri.getPath(); + if (path != null && !path.isBlank()) { + return path.startsWith("/") ? path.substring(1) : path; + } + } catch (URISyntaxException e) { + + } + if (imageUrl.startsWith("album/")) { + return imageUrl; + } + return imageUrl; + } +} diff --git a/src/main/java/com/cheeeese/photo/application/PhotoService.java b/src/main/java/com/cheeeese/photo/application/PhotoService.java index 4a69ecf..99f556b 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoService.java @@ -3,8 +3,10 @@ import com.cheeeese.album.application.validator.AlbumValidator; import com.cheeeese.album.domain.Album; import com.cheeeese.album.infrastructure.persistence.AlbumRepository; +import com.cheeeese.global.util.S3Util; import com.cheeeese.photo.application.validator.PhotoValidator; import com.cheeeese.photo.domain.Photo; +import com.cheeeese.photo.domain.PhotoHistory; import com.cheeeese.photo.domain.PhotoLikes; import com.cheeeese.photo.domain.PhotoStatus; import com.cheeeese.photo.dto.request.PhotoDownloadRequest; @@ -14,6 +16,7 @@ import com.cheeeese.photo.dto.response.PhotoPresignedUrlResponse; import com.cheeeese.photo.exception.PhotoException; import com.cheeeese.photo.exception.code.PhotoErrorCode; +import com.cheeeese.photo.infrastructure.mapper.PhotoHistoryMapper; import com.cheeeese.photo.infrastructure.mapper.PhotoLikesMapper; import com.cheeeese.photo.infrastructure.mapper.PhotoMapper; import com.cheeeese.photo.infrastructure.persistence.PhotoHistoryRepository; @@ -80,20 +83,20 @@ public PhotoPresignedUrlResponse createPresignedUrls(User user, PhotoPresignedUr } @Transactional - public PhotoPresignedUrlResponse createDownloadPresignedUrls(User user, PhotoDownloadRequest request) { - // 1. 권한 검증 + public PhotoDownloadResponse getDownloadPresignedUrls(User user, PhotoDownloadRequest request) { Album album = validateAlbumAndPermission(user, request.code()); - // 2. 사진 목록 조회 List photos = photoRepository.findAllByIdIn(request.photoIds()); - // 3. 다운로드용 url 생성 + List presignedUrls = generateDownloadPresignedUrls(user, album, photos); + List histories = photos.stream() + .map(photo -> PhotoHistoryMapper.toEntity(user, photo)) + .toList(); - // 4. history 저장 - + photoHistoryRepository.saveAll(histories); - return PhotoMapper.toPresignedUrlResponse(null); + return PhotoMapper.toPhotoDownloadResponse(presignedUrls); } @Transactional @@ -160,6 +163,16 @@ private List generatePresignedUrls( .collect(Collectors.toList()); } + private List generateDownloadPresignedUrls( + User user, + Album album, + List photos + ) { + return photos.stream() + .map(photo -> createPresignedUrlForDownload(user, album, photo)) + .toList(); + } + private PhotoPresignedUrlResponse.PresignedUrlInfo createPresignedUrlForFile( User user, Album album, @@ -183,11 +196,14 @@ private PhotoPresignedUrlResponse.PresignedUrlInfo createPresignedUrlForFile( return PhotoMapper.toPresignedUrlInfo(photo.getId(), uploadUrl); } - private PhotoPresignedUrlResponse.PresignedUrlInfo createPresignedUrlForDownload(User user, Album album, Photo photo) { - String objectKey = String.format(ORIGINAL_PHOTO_PATH_FORMAT); + private PhotoDownloadResponse.DownloadFileInfo createPresignedUrlForDownload(User user, Album album, Photo photo) { + // TODO: 앨범 validate 수정 + albumValidator.validateAlbumCode(album.getCode()); + + String objectKey = S3Util.extractObjectKey(photo.getImageUrl()); String url = presignedUrlService.generatePresignedGetUrl(objectKey); - return PhotoMapper.toPresignedUrlInfo(photo.getId(), url); + return PhotoMapper.toDownloadPresignedUrlInfo(photo, url); } private String sanitizeFileName(String raw) { diff --git a/src/main/java/com/cheeeese/photo/dto/response/PhotoDownloadResponse.java b/src/main/java/com/cheeeese/photo/dto/response/PhotoDownloadResponse.java index b648c7e..043250a 100644 --- a/src/main/java/com/cheeeese/photo/dto/response/PhotoDownloadResponse.java +++ b/src/main/java/com/cheeeese/photo/dto/response/PhotoDownloadResponse.java @@ -3,11 +3,18 @@ import lombok.Builder; import java.time.LocalDateTime; +import java.util.List; @Builder public record PhotoDownloadResponse( - String fileName, - LocalDateTime captureTime, - LocalDateTime createdAt + List downloadFiles ) { + @Builder + public record DownloadFileInfo( + Long photoId, + String downloadUrl, + String fileName, + LocalDateTime captureTime, + LocalDateTime createdAt + ) {} } diff --git a/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoHistoryMapper.java b/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoHistoryMapper.java new file mode 100644 index 0000000..7f4e665 --- /dev/null +++ b/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoHistoryMapper.java @@ -0,0 +1,15 @@ +package com.cheeeese.photo.infrastructure.mapper; + +import com.cheeeese.photo.domain.Photo; +import com.cheeeese.photo.domain.PhotoHistory; +import com.cheeeese.user.domain.User; + +public class PhotoHistoryMapper { + + public static PhotoHistory toEntity(User user, Photo photo) { + return PhotoHistory.builder() + .user(user) + .photo(photo) + .build(); + } +} diff --git a/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java b/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java index 08e7d84..1126037 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java @@ -41,9 +41,19 @@ public static PhotoPresignedUrlResponse toPresignedUrlResponse( .build(); } - public static PhotoDownloadResponse toPhotoDownloadResponse(Photo photo) { + public static PhotoDownloadResponse.DownloadFileInfo toDownloadPresignedUrlInfo(Photo photo, String downloadUrl) { + return PhotoDownloadResponse.DownloadFileInfo.builder() + .photoId(photo.getId()) + .downloadUrl(downloadUrl) + .fileName(photo.getImageUrl()) + .captureTime(photo.getCaptureTime()) + .createdAt(photo.getCreatedAt()) + .build(); + } + + public static PhotoDownloadResponse toPhotoDownloadResponse(List downloadFileInfos) { return PhotoDownloadResponse.builder() - .fileName() + .downloadFiles(downloadFileInfos) .build(); } diff --git a/src/main/java/com/cheeeese/photo/presentation/PhotoController.java b/src/main/java/com/cheeeese/photo/presentation/PhotoController.java index 47d0326..e95043a 100644 --- a/src/main/java/com/cheeeese/photo/presentation/PhotoController.java +++ b/src/main/java/com/cheeeese/photo/presentation/PhotoController.java @@ -3,8 +3,10 @@ import com.cheeeese.global.common.CommonResponse; import com.cheeeese.global.util.CurrentUser; import com.cheeeese.photo.application.PhotoService; +import com.cheeeese.photo.dto.request.PhotoDownloadRequest; import com.cheeeese.photo.dto.request.PhotoPresignedUrlRequest; import com.cheeeese.photo.dto.request.PhotoUploadReportRequest; +import com.cheeeese.photo.dto.response.PhotoDownloadResponse; import com.cheeeese.photo.dto.response.PhotoPresignedUrlResponse; import com.cheeeese.photo.presentation.swagger.PhotoSwagger; import com.cheeeese.user.domain.User; @@ -31,6 +33,14 @@ public CommonResponse createPresignedUrls( return CommonResponse.success(PRESIGNED_URL_ISSUE_SUCCESS, photoService.createPresignedUrls(user, request)); } + @PostMapping("/download-url") + public CommonResponse getDownloadPresignedUrls( + @CurrentUser User user, + @RequestBody @Valid PhotoDownloadRequest request + ) { + return CommonResponse.success(PRESIGNED_URL_ISSUE_SUCCESS, photoService.getDownloadPresignedUrls(user, request)); + } + @Override @PostMapping("/report") public CommonResponse reportUploadResult( From 5ead6e5151fc9f6925785be4ff257988bf59b221 Mon Sep 17 00:00:00 2001 From: zyovn Date: Sat, 8 Nov 2025 23:47:11 +0900 Subject: [PATCH 232/402] =?UTF-8?q?#50=20fix:=20getObject=20null=20?= =?UTF-8?q?=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95=20=EB=B0=8F=20redis=20k?= =?UTF-8?q?ey=EC=97=90=20sort=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cheeeese/global/util/RedisCacheUtil.java | 9 ++------- .../cheeeese/photo/application/PhotoQueryService.java | 7 ++++--- .../infrastructure/persistence/PhotoRepository.java | 1 - 3 files changed, 6 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/cheeeese/global/util/RedisCacheUtil.java b/src/main/java/com/cheeeese/global/util/RedisCacheUtil.java index 10d3330..6391c72 100644 --- a/src/main/java/com/cheeeese/global/util/RedisCacheUtil.java +++ b/src/main/java/com/cheeeese/global/util/RedisCacheUtil.java @@ -36,14 +36,9 @@ public Long getValue(String key) { /** * 캐시 객체 조회 */ + @SuppressWarnings("unchecked") public T getObject(String key, Class clazz) { - Object value = cacheRedisTemplate.opsForValue().get(key); - if (!clazz.isInstance(value)) { - throw new IllegalStateException( - "⚠️ Cached value type mismatch. Expected: " + clazz.getName() + " but found " + value.getClass().getName() - ); - } - return clazz.cast(value); + return (T) cacheRedisTemplate.opsForValue().get(key); } /** diff --git a/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java b/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java index 660473a..4d3fa7b 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java @@ -19,6 +19,7 @@ import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; +import java.util.Comparator; import java.util.List; import java.util.Optional; import java.util.Set; @@ -33,14 +34,14 @@ public class PhotoQueryService { private final PhotoHistoryRepository photoHistoryRepository; private final RedisCacheUtil redisCacheUtil; - private static final String PHOTO_KEY = "album:%s:photos:page:%d:version:%d"; - private static final String VERSION_KEY = "album:%s:version"; + private static final String PHOTO_KEY = "album:%s:photos:sort:%s:page:%d:version:%d"; + private static final String VERSION_KEY = "cache:album:%s:version"; public PhotoPageResponse getPhotoPage(User user, String code, int page, int size, AlbumSorting albumSorting) { String versionKey = String.format(VERSION_KEY, code); Long curVersion = Optional.ofNullable(redisCacheUtil.getValue(versionKey)).orElse(0L); - String photoKey = String.format(PHOTO_KEY, code, page, curVersion); + String photoKey = String.format(PHOTO_KEY, code, albumSorting.getParam(), page, curVersion); PhotoPageResponse cachedList = redisCacheUtil.getObject(photoKey, PhotoPageResponse.class); // redis에 존재할 경우, db 접근 X + 바로 반환 diff --git a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java index 6e5d120..5b65cca 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java @@ -21,7 +21,6 @@ public interface PhotoRepository extends JpaRepository { FROM Photo p JOIN p.album a WHERE a.code = :code - ORDER BY p.createdAt DESC """) Slice findAllByAlbumCode(@Param("code") String code, Pageable pageable); From 1b7791e3e169adfe64f126f3f6bd0f4fac20b8c8 Mon Sep 17 00:00:00 2001 From: zyovn Date: Sat, 8 Nov 2025 23:53:58 +0900 Subject: [PATCH 233/402] =?UTF-8?q?#50=20refactor:=20key=EC=97=90=20cache?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cheeeese/photo/application/PhotoQueryService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java b/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java index 4d3fa7b..d5355c1 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java @@ -34,7 +34,7 @@ public class PhotoQueryService { private final PhotoHistoryRepository photoHistoryRepository; private final RedisCacheUtil redisCacheUtil; - private static final String PHOTO_KEY = "album:%s:photos:sort:%s:page:%d:version:%d"; + private static final String PHOTO_KEY = "cache:album:%s:photos:sort:%s:page:%d:version:%d"; private static final String VERSION_KEY = "cache:album:%s:version"; public PhotoPageResponse getPhotoPage(User user, String code, int page, int size, AlbumSorting albumSorting) { From 4345476d28c7ae6a4969291846d40eb297fb35c1 Mon Sep 17 00:00:00 2001 From: zyovn Date: Sun, 9 Nov 2025 00:08:01 +0900 Subject: [PATCH 234/402] =?UTF-8?q?#50=20fix:=20=EB=9D=B1=ED=95=9C=20?= =?UTF-8?q?=EC=82=AC=EC=A7=84=20=EC=A1=B0=ED=9A=8C=20API=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20-=20=EC=A2=8B=EC=95=84=EC=9A=94=20=EB=A7=8E?= =?UTF-8?q?=EC=9D=80=20=EC=88=9C=EC=9C=BC=EB=A1=9C=20=EC=A0=95=EB=A0=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../photo/infrastructure/persistence/PhotoRepository.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java index 5b65cca..ff02d88 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java @@ -31,7 +31,6 @@ public interface PhotoRepository extends JpaRepository { JOIN PhotoLikes pl ON pl.photo = p WHERE a.code = :albumCode AND pl.user.id = :userId - ORDER BY p.createdAt DESC """) Slice findLikedPhotosByAlbumAndUser( @Param("albumCode") String albumCode, From 7e0b5b0036ecf4824248f86b2f92b63af0989c64 Mon Sep 17 00:00:00 2001 From: zyovn Date: Sun, 9 Nov 2025 04:53:03 +0900 Subject: [PATCH 235/402] =?UTF-8?q?#45=20feat:=20=EC=82=AC=EC=A7=84=20?= =?UTF-8?q?=EB=AA=A9=EB=A1=9D=20=EC=A1=B0=ED=9A=8C=20=EB=B0=8F=20=EB=82=B4?= =?UTF-8?q?=EA=B0=80=20=EB=9D=B1=ED=95=9C=20=EC=82=AC=EC=A7=84=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20=EC=8D=B8=EB=84=A4=EC=9D=BC=20=EC=9D=B4=EB=AF=B8?= =?UTF-8?q?=EC=A7=80=20cdn=20=EB=A1=9C=EC=A7=81=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../global/util/resolver/CdnUrlResolver.java | 36 +++++++++++++++++++ .../photo/application/PhotoQueryService.java | 7 ++-- .../infrastructure/mapper/PhotoMapper.java | 26 ++++++++++---- 3 files changed, 61 insertions(+), 8 deletions(-) create mode 100644 src/main/java/com/cheeeese/global/util/resolver/CdnUrlResolver.java diff --git a/src/main/java/com/cheeeese/global/util/resolver/CdnUrlResolver.java b/src/main/java/com/cheeeese/global/util/resolver/CdnUrlResolver.java new file mode 100644 index 0000000..f59d9cb --- /dev/null +++ b/src/main/java/com/cheeeese/global/util/resolver/CdnUrlResolver.java @@ -0,0 +1,36 @@ +package com.cheeeese.global.util.resolver; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +@Component +public class CdnUrlResolver { + + @Value("${cdn.original-domain}") + private String originalDomain; + + @Value("${cdn.thumbnail-domain}") + private String thumbnailDomain; + + @Value("${cdn.4cut-domain}") + private String cutDomain; + + public String resolveOriginal(String path) { + return resolve(originalDomain, path); + } + + public String resolveThumbnail(String path) { + return resolve(thumbnailDomain, path); + } + + public String resolveCut(String path) { + return resolve(cutDomain, path); + } + + private String resolve(String domain, String path) { + if (path == null || path.isBlank()) return null; + if (path.startsWith("http")) return path; + if (path.startsWith("/")) path = path.substring(1); + return domain + "/" + path; + } +} diff --git a/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java b/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java index 660473a..d8f6697 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java @@ -2,6 +2,7 @@ import com.cheeeese.album.domain.type.AlbumSorting; import com.cheeeese.global.util.RedisCacheUtil; +import com.cheeeese.global.util.resolver.CdnUrlResolver; import com.cheeeese.photo.domain.Photo; import com.cheeeese.photo.dto.response.*; import com.cheeeese.photo.exception.PhotoException; @@ -32,6 +33,7 @@ public class PhotoQueryService { private final PhotoLikesRepository photoLikesRepository; private final PhotoHistoryRepository photoHistoryRepository; private final RedisCacheUtil redisCacheUtil; + private final CdnUrlResolver cdnUrlResolver; private static final String PHOTO_KEY = "album:%s:photos:page:%d:version:%d"; private static final String VERSION_KEY = "album:%s:version"; @@ -106,7 +108,7 @@ public PhotoDetailResponse getPhotoDetail(User user, String code, Long photoId) private PhotoPageResponse getPhotoPageFromDB(String code, int page, int size, AlbumSorting albumSorting) { PageRequest pageRequest = PageRequest.of(page, size, getPhotoSortingOption(albumSorting)); Slice photos = photoRepository.findAllByAlbumCode(code, pageRequest); - return PhotoMapper.toPhotoPageResponse(photos); + return PhotoMapper.toPhotoPageResponse(photos, cdnUrlResolver); } private PhotoPageResponse attachUserStatus(User user, PhotoPageResponse response) { @@ -162,9 +164,10 @@ private List buildPhotoLikedResponses(List photos, Se return photos.stream() .map(photo -> { Long id = photo.getId(); + String resolvedThumbnailUrl = cdnUrlResolver.resolveThumbnail(photo.getThumbnailUrl()); boolean isDownloaded = downloaded.contains(id); boolean isRecentlyDownloaded = recent.contains(id); - return PhotoMapper.toPhotoLikedResponse(photo, isDownloaded, isRecentlyDownloaded); + return PhotoMapper.toPhotoLikedResponse(photo, resolvedThumbnailUrl, isDownloaded, isRecentlyDownloaded); }) .toList(); } diff --git a/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java b/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java index 1126037..cf978ba 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java @@ -1,6 +1,7 @@ package com.cheeeese.photo.infrastructure.mapper; import com.cheeeese.album.domain.Album; +import com.cheeeese.global.util.resolver.CdnUrlResolver; import com.cheeeese.photo.domain.Photo; import com.cheeeese.photo.domain.PhotoStatus; import com.cheeeese.photo.dto.response.*; @@ -57,28 +58,41 @@ public static PhotoDownloadResponse toPhotoDownloadResponse(List photos) { + public static PhotoPageResponse toPhotoPageResponse(Slice photos, CdnUrlResolver cdnUrlResolver) { List responses = photos.getContent().stream() - .map(photo -> PhotoMapper.toPhotoListResponse(photo, false, false)) + .map(photo -> { + String resolvedUrl = cdnUrlResolver.resolveThumbnail(photo.getThumbnailUrl()); + return PhotoMapper.toPhotoListResponse(photo, resolvedUrl, false, false); + }) .toList(); return PhotoPageResponse.builder() From 554ddb56c7c7bee94763698abe29f071484d67e1 Mon Sep 17 00:00:00 2001 From: zyovn Date: Sun, 9 Nov 2025 05:00:44 +0900 Subject: [PATCH 236/402] =?UTF-8?q?#45=20feat:=20=EC=82=AC=EC=A7=84=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=20=EC=A1=B0=ED=9A=8C=20=EC=9B=90=EB=B3=B8,?= =?UTF-8?q?=20=EC=8D=B8=EB=84=A4=EC=9D=BC=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20?= =?UTF-8?q?cdn=EC=9C=BC=EB=A1=9C=20=EC=88=98=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../photo/application/PhotoQueryService.java | 5 ++++- .../photo/infrastructure/mapper/PhotoMapper.java | 13 ++++++++++--- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java b/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java index d8f6697..3e7f4c0 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java @@ -96,13 +96,16 @@ public PhotoDetailResponse getPhotoDetail(User user, String code, Long photoId) Photo photo = photoRepository.findByIdAndAlbum_Code(photoId, code) .orElseThrow(() -> new PhotoException(PhotoErrorCode.PHOTO_NOT_FOUND)); + String resolveOriginalUrl = cdnUrlResolver.resolveOriginal(photo.getImageUrl()); + String resolveThumbnailUrl = cdnUrlResolver.resolveThumbnail(photo.getImageUrl()); + boolean isLiked = photoLikesRepository.existsByUserIdAndPhotoId(user.getId(), photo.getId()); boolean isDownloaded = photoHistoryRepository.existsByUserIdAndPhotoId(user.getId(), photo.getId()); boolean isRecentlyDownloaded = photoHistoryRepository.existsByUserIdAndPhotoIdAndCreatedAtAfter( user.getId(), photo.getId(), LocalDateTime.now().minusHours(1) ); - return PhotoMapper.toPhotoDetailResponse(photo, isLiked, isDownloaded, isRecentlyDownloaded); + return PhotoMapper.toPhotoDetailResponse(photo, resolveOriginalUrl, resolveThumbnailUrl, isLiked, isDownloaded, isRecentlyDownloaded); } private PhotoPageResponse getPhotoPageFromDB(String code, int page, int size, AlbumSorting albumSorting) { diff --git a/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java b/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java index cf978ba..0f13796 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java @@ -124,12 +124,19 @@ public static PhotoPageResponse toRebuildPhotoPageResponse(PhotoPageResponse res .build(); } - public static PhotoDetailResponse toPhotoDetailResponse(Photo photo, boolean isLiked, boolean isDownloaded, boolean isRecentlyDownloaded) { + public static PhotoDetailResponse toPhotoDetailResponse( + Photo photo, + String imageUrl, + String thumbnailUrl, + boolean isLiked, + boolean isDownloaded, + boolean isRecentlyDownloaded + ) { return PhotoDetailResponse.builder() .name(photo.getUser().getName()) .photoId(photo.getId()) - .imageUrl(photo.getImageUrl()) - .thumbnailUrl(photo.getThumbnailUrl()) + .imageUrl(imageUrl) + .thumbnailUrl(thumbnailUrl) .likesCnt(photo.getLikesCnt()) .isLiked(isLiked) .isDownloaded(isDownloaded) From 417a4d462fc9b1bf67e26c8107efd627d1db617c Mon Sep 17 00:00:00 2001 From: zyovn Date: Sun, 9 Nov 2025 05:20:41 +0900 Subject: [PATCH 237/402] =?UTF-8?q?#45=20feat:=20=EB=8B=A4=EC=9A=B4?= =?UTF-8?q?=EB=A1=9C=EB=93=9C=20response=20fileName=20=EC=B6=94=EC=B6=9C?= =?UTF-8?q?=20=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cheeeese/global/util/S3Util.java | 20 +++++++++++++++++++ .../photo/application/PhotoService.java | 4 +++- .../infrastructure/mapper/PhotoMapper.java | 8 ++++++-- 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/cheeeese/global/util/S3Util.java b/src/main/java/com/cheeeese/global/util/S3Util.java index 786921d..e27d31a 100644 --- a/src/main/java/com/cheeeese/global/util/S3Util.java +++ b/src/main/java/com/cheeeese/global/util/S3Util.java @@ -4,6 +4,7 @@ import java.net.URISyntaxException; public class S3Util { + public static String extractObjectKey(String imageUrl) { if (imageUrl == null) { throw new NullPointerException("image url is null"); @@ -23,4 +24,23 @@ public static String extractObjectKey(String imageUrl) { } return imageUrl; } + + public static String extractFileName(String imageUrl) { + if (imageUrl == null || imageUrl.isBlank()) { + return "unnamed.jpg"; + } + String normalized = imageUrl.replace('\\', '/'); + + int lastSlashIdx = normalized.lastIndexOf('/'); + String fileName = (lastSlashIdx >= 0) + ? normalized.substring(lastSlashIdx + 1) + : normalized; + + int underscoreIdx = fileName.indexOf('_'); + if (underscoreIdx >= 0 && underscoreIdx < fileName.length() - 1) { + fileName = fileName.substring(underscoreIdx + 1); + } + + return fileName; + } } diff --git a/src/main/java/com/cheeeese/photo/application/PhotoService.java b/src/main/java/com/cheeeese/photo/application/PhotoService.java index 99f556b..183aa80 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoService.java @@ -94,6 +94,7 @@ public PhotoDownloadResponse getDownloadPresignedUrls(User user, PhotoDownloadRe .map(photo -> PhotoHistoryMapper.toEntity(user, photo)) .toList(); + // TODO: 1시간 이내 다운로드 했을 시, presigned url 발급 방지 로직 추가 photoHistoryRepository.saveAll(histories); return PhotoMapper.toPhotoDownloadResponse(presignedUrls); @@ -200,10 +201,11 @@ private PhotoDownloadResponse.DownloadFileInfo createPresignedUrlForDownload(Use // TODO: 앨범 validate 수정 albumValidator.validateAlbumCode(album.getCode()); + String fileName = S3Util.extractFileName(photo.getImageUrl()); String objectKey = S3Util.extractObjectKey(photo.getImageUrl()); String url = presignedUrlService.generatePresignedGetUrl(objectKey); - return PhotoMapper.toDownloadPresignedUrlInfo(photo, url); + return PhotoMapper.toDownloadPresignedUrlInfo(photo, fileName, url); } private String sanitizeFileName(String raw) { diff --git a/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java b/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java index 0f13796..4b08b89 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java @@ -42,11 +42,15 @@ public static PhotoPresignedUrlResponse toPresignedUrlResponse( .build(); } - public static PhotoDownloadResponse.DownloadFileInfo toDownloadPresignedUrlInfo(Photo photo, String downloadUrl) { + public static PhotoDownloadResponse.DownloadFileInfo toDownloadPresignedUrlInfo( + Photo photo, + String fileName, + String downloadUrl + ) { return PhotoDownloadResponse.DownloadFileInfo.builder() .photoId(photo.getId()) .downloadUrl(downloadUrl) - .fileName(photo.getImageUrl()) + .fileName(fileName) .captureTime(photo.getCaptureTime()) .createdAt(photo.getCreatedAt()) .build(); From 57c0971acba1c4b6fa106bca868cd1907bf77f53 Mon Sep 17 00:00:00 2001 From: zyovn Date: Mon, 10 Nov 2025 16:54:47 +0900 Subject: [PATCH 238/402] =?UTF-8?q?#45=20feat:=201=EC=8B=9C=EA=B0=84=20?= =?UTF-8?q?=EC=9D=B4=EB=82=B4=20=EB=8B=A4=EC=9A=B4=EB=A1=9C=EB=93=9C=20?= =?UTF-8?q?=EC=9D=B4=EB=A0=A5=20=EC=A1=B4=EC=9E=AC=20=EC=8B=9C,=20?= =?UTF-8?q?=EB=8B=A4=EC=9A=B4=EB=A1=9C=EB=93=9C=20=EB=B0=A9=EC=A7=80=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cheeeese/global/domain/BaseEntity.java | 4 ++ .../photo/application/PhotoService.java | 41 +++++++++++++++---- .../cheeeese/photo/domain/PhotoHistory.java | 6 +++ .../persistence/PhotoHistoryRepository.java | 3 ++ 4 files changed, 45 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/cheeeese/global/domain/BaseEntity.java b/src/main/java/com/cheeeese/global/domain/BaseEntity.java index 6151d46..d61a51d 100644 --- a/src/main/java/com/cheeeese/global/domain/BaseEntity.java +++ b/src/main/java/com/cheeeese/global/domain/BaseEntity.java @@ -22,4 +22,8 @@ public abstract class BaseEntity { @LastModifiedDate @Column(name = "updated_at") private LocalDateTime updatedAt; + + protected void markUpdated() { + this.updatedAt = LocalDateTime.now(); + } } diff --git a/src/main/java/com/cheeeese/photo/application/PhotoService.java b/src/main/java/com/cheeeese/photo/application/PhotoService.java index 183aa80..5d563c1 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoService.java @@ -30,7 +30,9 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDateTime; import java.util.List; +import java.util.Set; import java.util.stream.Collectors; @Service @@ -88,14 +90,23 @@ public PhotoDownloadResponse getDownloadPresignedUrls(User user, PhotoDownloadRe List photos = photoRepository.findAllByIdIn(request.photoIds()); - List presignedUrls = generateDownloadPresignedUrls(user, album, photos); + Set recentDownloadIds = photoHistoryRepository.findRecentlyDownloadedPhotoIds( + user.getId(), + request.photoIds(), + LocalDateTime.now().minusHours(1) + ); - List histories = photos.stream() - .map(photo -> PhotoHistoryMapper.toEntity(user, photo)) - .toList(); + List presignedUrls = generateDownloadPresignedUrls( + user, album, photos, recentDownloadIds + ); - // TODO: 1시간 이내 다운로드 했을 시, presigned url 발급 방지 로직 추가 - photoHistoryRepository.saveAll(histories); + photos.stream() + .filter(photo -> !recentDownloadIds.contains(photo.getId())) + .forEach(photo -> photoHistoryRepository.findByUserIdAndPhotoId(user.getId(), photo.getId()) + .ifPresentOrElse( + PhotoHistory::touch, + () -> photoHistoryRepository.save(PhotoHistoryMapper.toEntity(user, photo)) + )); return PhotoMapper.toPhotoDownloadResponse(presignedUrls); } @@ -167,10 +178,11 @@ private List generatePresignedUrls( private List generateDownloadPresignedUrls( User user, Album album, - List photos + List photos, + Set recentDownloadedIds ) { return photos.stream() - .map(photo -> createPresignedUrlForDownload(user, album, photo)) + .map(photo -> createPresignedUrlForDownload(user, album, photo, recentDownloadedIds)) .toList(); } @@ -197,11 +209,22 @@ private PhotoPresignedUrlResponse.PresignedUrlInfo createPresignedUrlForFile( return PhotoMapper.toPresignedUrlInfo(photo.getId(), uploadUrl); } - private PhotoDownloadResponse.DownloadFileInfo createPresignedUrlForDownload(User user, Album album, Photo photo) { + private PhotoDownloadResponse.DownloadFileInfo createPresignedUrlForDownload( + User user, + Album album, + Photo photo, + Set recentDownloadedIds + ) { // TODO: 앨범 validate 수정 albumValidator.validateAlbumCode(album.getCode()); String fileName = S3Util.extractFileName(photo.getImageUrl()); + + // 1시간 이내 다운로드 O -> null 반환 + if (recentDownloadedIds.contains(photo.getId())) { + return PhotoMapper.toDownloadPresignedUrlInfo(photo, fileName, null); + } + String objectKey = S3Util.extractObjectKey(photo.getImageUrl()); String url = presignedUrlService.generatePresignedGetUrl(objectKey); diff --git a/src/main/java/com/cheeeese/photo/domain/PhotoHistory.java b/src/main/java/com/cheeeese/photo/domain/PhotoHistory.java index e02a111..a28f304 100644 --- a/src/main/java/com/cheeeese/photo/domain/PhotoHistory.java +++ b/src/main/java/com/cheeeese/photo/domain/PhotoHistory.java @@ -8,6 +8,8 @@ import lombok.Getter; import lombok.NoArgsConstructor; +import java.time.LocalDateTime; + @Entity @Getter @Table( @@ -37,4 +39,8 @@ private PhotoHistory(User user, Photo photo) { this.user = user; this.photo = photo; } + + public void touch() { + this.markUpdated(); + } } diff --git a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoHistoryRepository.java b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoHistoryRepository.java index 7df2358..4987ceb 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoHistoryRepository.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoHistoryRepository.java @@ -7,6 +7,7 @@ import java.time.LocalDateTime; import java.util.List; +import java.util.Optional; import java.util.Set; public interface PhotoHistoryRepository extends JpaRepository { @@ -34,4 +35,6 @@ Set findRecentlyDownloadedPhotoIds( @Param("photoIds") List photoIds, @Param("threshold") LocalDateTime threshold ); + + Optional findByUserIdAndPhotoId(Long userId, Long photoId); } From 461a7914d4a04be3f36b6989b12fba37fa40d11a Mon Sep 17 00:00:00 2001 From: zyovn Date: Mon, 10 Nov 2025 17:14:25 +0900 Subject: [PATCH 239/402] =?UTF-8?q?#45=20feat:=20validateDownload=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/validator/AlbumValidator.java | 15 ++++++++++++- .../photo/application/PhotoService.java | 21 +++++++------------ .../photo/exception/code/PhotoErrorCode.java | 1 + 3 files changed, 22 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java index d40af51..fdd1e92 100644 --- a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java +++ b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java @@ -1,18 +1,21 @@ package com.cheeeese.album.application.validator; import com.cheeeese.album.domain.Album; -import com.cheeeese.album.domain.UserAlbum; import com.cheeeese.album.domain.type.Role; import com.cheeeese.album.dto.request.AlbumCreationRequest; import com.cheeeese.album.exception.AlbumException; import com.cheeeese.album.exception.code.AlbumErrorCode; import com.cheeeese.album.infrastructure.persistence.AlbumRepository; import com.cheeeese.album.infrastructure.persistence.UserAlbumRepository; +import com.cheeeese.photo.domain.Photo; +import com.cheeeese.photo.exception.PhotoException; +import com.cheeeese.photo.exception.code.PhotoErrorCode; import com.cheeeese.user.domain.User; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; import java.time.LocalDate; +import java.util.List; @Component @RequiredArgsConstructor @@ -78,6 +81,16 @@ public void validateUploadPermission(Album album, User user) { // [NEW] .orElseThrow(() -> new AlbumException(AlbumErrorCode.USER_NOT_PARTICIPANT)); } + public void validateDownloadPermission(Album album, User user, List photos) { + validateUploadPermission(album, user); + + boolean existsPhotoInAlbum = photos.stream().allMatch(photo -> photo.getAlbum().getId().equals(album.getId())); + + if (!existsPhotoInAlbum) { + throw new PhotoException(PhotoErrorCode.PHOTO_NOT_FOUND_IN_ALBUM); + } + } + private void validateAlbumExpiration(Album album) { if (album.isExpired()) { throw new AlbumException(AlbumErrorCode.ALBUM_EXPIRED); diff --git a/src/main/java/com/cheeeese/photo/application/PhotoService.java b/src/main/java/com/cheeeese/photo/application/PhotoService.java index 5d563c1..99f5b3f 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoService.java @@ -90,6 +90,8 @@ public PhotoDownloadResponse getDownloadPresignedUrls(User user, PhotoDownloadRe List photos = photoRepository.findAllByIdIn(request.photoIds()); + albumValidator.validateDownloadPermission(album, user, photos); + Set recentDownloadIds = photoHistoryRepository.findRecentlyDownloadedPhotoIds( user.getId(), request.photoIds(), @@ -97,7 +99,7 @@ public PhotoDownloadResponse getDownloadPresignedUrls(User user, PhotoDownloadRe ); List presignedUrls = generateDownloadPresignedUrls( - user, album, photos, recentDownloadIds + photos, recentDownloadIds ); photos.stream() @@ -106,7 +108,8 @@ public PhotoDownloadResponse getDownloadPresignedUrls(User user, PhotoDownloadRe .ifPresentOrElse( PhotoHistory::touch, () -> photoHistoryRepository.save(PhotoHistoryMapper.toEntity(user, photo)) - )); + ) + ); return PhotoMapper.toPhotoDownloadResponse(presignedUrls); } @@ -176,13 +179,11 @@ private List generatePresignedUrls( } private List generateDownloadPresignedUrls( - User user, - Album album, List photos, Set recentDownloadedIds ) { return photos.stream() - .map(photo -> createPresignedUrlForDownload(user, album, photo, recentDownloadedIds)) + .map(photo -> createPresignedUrlForDownload(photo, recentDownloadedIds)) .toList(); } @@ -209,15 +210,7 @@ private PhotoPresignedUrlResponse.PresignedUrlInfo createPresignedUrlForFile( return PhotoMapper.toPresignedUrlInfo(photo.getId(), uploadUrl); } - private PhotoDownloadResponse.DownloadFileInfo createPresignedUrlForDownload( - User user, - Album album, - Photo photo, - Set recentDownloadedIds - ) { - // TODO: 앨범 validate 수정 - albumValidator.validateAlbumCode(album.getCode()); - + private PhotoDownloadResponse.DownloadFileInfo createPresignedUrlForDownload(Photo photo, Set recentDownloadedIds) { String fileName = S3Util.extractFileName(photo.getImageUrl()); // 1시간 이내 다운로드 O -> null 반환 diff --git a/src/main/java/com/cheeeese/photo/exception/code/PhotoErrorCode.java b/src/main/java/com/cheeeese/photo/exception/code/PhotoErrorCode.java index df4dfc3..aad59b1 100644 --- a/src/main/java/com/cheeeese/photo/exception/code/PhotoErrorCode.java +++ b/src/main/java/com/cheeeese/photo/exception/code/PhotoErrorCode.java @@ -29,6 +29,7 @@ public enum PhotoErrorCode implements BaseCode { // 사진 도메인 관련 오류 PHOTO_NOT_FOUND(HttpStatus.NOT_FOUND, "해당 사진을 찾을 수 없습니다."), PHOTO_LIKES_NOT_FOUND(HttpStatus.NOT_FOUND, "사진에 대한 좋아요 내역이 존재하지 않습니다."), + PHOTO_NOT_FOUND_IN_ALBUM(HttpStatus.NOT_FOUND, "해당 사진은 이 앨범에 포함되어 있지 않습니다."), ; private final HttpStatus httpStatus; From 58649745006cfa48e8613b9c13f341c35eeba685 Mon Sep 17 00:00:00 2001 From: zyovn Date: Mon, 10 Nov 2025 17:28:27 +0900 Subject: [PATCH 240/402] =?UTF-8?q?#45=20docs:=20swagger=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/request/PhotoDownloadRequest.java | 5 +++ .../dto/response/PhotoDownloadResponse.java | 32 +++++++++++++++++++ .../photo/presentation/PhotoController.java | 17 +++++----- .../presentation/swagger/PhotoSwagger.java | 24 +++++++++++++- 4 files changed, 69 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/cheeeese/photo/dto/request/PhotoDownloadRequest.java b/src/main/java/com/cheeeese/photo/dto/request/PhotoDownloadRequest.java index 0b379bb..357de44 100644 --- a/src/main/java/com/cheeeese/photo/dto/request/PhotoDownloadRequest.java +++ b/src/main/java/com/cheeeese/photo/dto/request/PhotoDownloadRequest.java @@ -1,12 +1,17 @@ package com.cheeeese.photo.dto.request; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Builder; import java.util.List; @Builder +@Schema(description = "사진 다운로드 presigned url 발급 API") public record PhotoDownloadRequest( + @Schema(description = "앨범 코드", example = "1f0b7ea8-fab6-6581-95e3-0720bc07603e") String code, + + @Schema(description = "사진 고유 ID", example = "[1, 2, 3]") List photoIds ) { } diff --git a/src/main/java/com/cheeeese/photo/dto/response/PhotoDownloadResponse.java b/src/main/java/com/cheeeese/photo/dto/response/PhotoDownloadResponse.java index 043250a..4efdcdc 100644 --- a/src/main/java/com/cheeeese/photo/dto/response/PhotoDownloadResponse.java +++ b/src/main/java/com/cheeeese/photo/dto/response/PhotoDownloadResponse.java @@ -1,20 +1,52 @@ package com.cheeeese.photo.dto.response; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Builder; import java.time.LocalDateTime; import java.util.List; @Builder +@Schema(description = "") public record PhotoDownloadResponse( + @Schema( + description = "다운로드 가능한 사진 파일 정보 목록", + example = """ + [ + { + "photoId": 1, + "downloadUrl": "https://kr.objectstorage...", + "fileName": "IMG_001.jpg", + "captureTime": "2025-11-10T13:45:12", + "createdAt": "2025-11-10T14:00:00" + }, + { + "photoId": 2, + "downloadUrl": null, + "fileName": "IMG_002.jpg", + "captureTime": "2025-11-10T13:50:30", + "createdAt": "2025-11-10T14:10:00" + } + ] + """ + ) List downloadFiles ) { @Builder public record DownloadFileInfo( + @Schema(description = "사진 고유 ID", example = "1") Long photoId, + + @Schema(description = "클라우드 스토리지에서 다운로드 받을 URL", example = "https://kr.objectstorage...") String downloadUrl, + + @Schema(description = "파일 원본 이름", example = "IMG_002.jpg") String fileName, + + @Schema(description = "사진 촬영 시각", example = "2025-11-10T13:50:30") LocalDateTime captureTime, + + @Schema(description = "사진 업로드 시각", example = "2025-11-10T14:10:00") LocalDateTime createdAt ) {} } diff --git a/src/main/java/com/cheeeese/photo/presentation/PhotoController.java b/src/main/java/com/cheeeese/photo/presentation/PhotoController.java index e95043a..5cbad22 100644 --- a/src/main/java/com/cheeeese/photo/presentation/PhotoController.java +++ b/src/main/java/com/cheeeese/photo/presentation/PhotoController.java @@ -33,14 +33,6 @@ public CommonResponse createPresignedUrls( return CommonResponse.success(PRESIGNED_URL_ISSUE_SUCCESS, photoService.createPresignedUrls(user, request)); } - @PostMapping("/download-url") - public CommonResponse getDownloadPresignedUrls( - @CurrentUser User user, - @RequestBody @Valid PhotoDownloadRequest request - ) { - return CommonResponse.success(PRESIGNED_URL_ISSUE_SUCCESS, photoService.getDownloadPresignedUrls(user, request)); - } - @Override @PostMapping("/report") public CommonResponse reportUploadResult( @@ -51,6 +43,15 @@ public CommonResponse reportUploadResult( return CommonResponse.success(PHOTO_UPLOAD_REPORT_SUCCESS); } + @Override + @PostMapping("/download-url") + public CommonResponse getDownloadPresignedUrls( + @CurrentUser User user, + @RequestBody @Valid PhotoDownloadRequest request + ) { + return CommonResponse.success(PRESIGNED_URL_ISSUE_SUCCESS, photoService.getDownloadPresignedUrls(user, request)); + } + @Override @PostMapping("/{photoId}/liked") public CommonResponse createPhotoLikes(@CurrentUser User user, @PathVariable Long photoId) { diff --git a/src/main/java/com/cheeeese/photo/presentation/swagger/PhotoSwagger.java b/src/main/java/com/cheeeese/photo/presentation/swagger/PhotoSwagger.java index 74db0b7..a169669 100644 --- a/src/main/java/com/cheeeese/photo/presentation/swagger/PhotoSwagger.java +++ b/src/main/java/com/cheeeese/photo/presentation/swagger/PhotoSwagger.java @@ -2,8 +2,10 @@ import com.cheeeese.global.common.CommonResponse; import com.cheeeese.global.util.CurrentUser; +import com.cheeeese.photo.dto.request.PhotoDownloadRequest; import com.cheeeese.photo.dto.request.PhotoPresignedUrlRequest; import com.cheeeese.photo.dto.request.PhotoUploadReportRequest; +import com.cheeeese.photo.dto.response.PhotoDownloadResponse; import com.cheeeese.photo.dto.response.PhotoPresignedUrlResponse; import com.cheeeese.user.domain.User; import io.swagger.v3.oas.annotations.Operation; @@ -19,7 +21,7 @@ @Tag(name = "[사진]", description = "사진 업로드 및 관리에 대한 API") public interface PhotoSwagger { @Operation( - summary = "Presigned URL 발급 API", + summary = "사진 업로드 Presigned URL 발급 API", description = """ ### RequestBody --- @@ -153,6 +155,26 @@ CommonResponse reportUploadResult( @RequestBody @Valid PhotoUploadReportRequest request ); + @Operation( + summary = "사진 다운로드 Presigned Url 발급 API", + description = """ + ### RequestBody + --- + `code`: 앨범 코드 (String) \n + `photoIds`: 다운로드 받을 사진 ID (List) + """ + ) + @ApiResponses(value = { + @ApiResponse( + responseCode = "200", + description = "사진 다운로드 presigned url 발급이 성공적으로 실행되었습니다." + ) + }) + CommonResponse getDownloadPresignedUrls( + @CurrentUser User user, + @RequestBody @Valid PhotoDownloadRequest request + ); + @Operation( summary = "사진 좋아요 생성 API", description = """ From 88096beb880b4c0d04ca3546929effca7645b293 Mon Sep 17 00:00:00 2001 From: zyovn Date: Mon, 10 Nov 2025 18:22:39 +0900 Subject: [PATCH 241/402] =?UTF-8?q?#45=20fix:=20=ED=94=BC=EB=93=9C?= =?UTF-8?q?=EB=B0=B1=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/validator/AlbumValidator.java | 18 +++++++++++------- .../photo/application/PhotoQueryService.java | 2 +- .../cheeeese/photo/domain/PhotoHistory.java | 2 -- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java index fdd1e92..fc786bc 100644 --- a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java +++ b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java @@ -73,16 +73,11 @@ public void validateAlbumCapacity(Album album) { } public void validateUploadPermission(Album album, User user) { // [NEW] - validateAlbumExpiration(album); - - validateUserBlacklisted(album, user); - - userAlbumRepository.findByUserIdAndAlbumId(user.getId(), album.getId()) - .orElseThrow(() -> new AlbumException(AlbumErrorCode.USER_NOT_PARTICIPANT)); + validateAlbumParticipant(album, user); } public void validateDownloadPermission(Album album, User user, List photos) { - validateUploadPermission(album, user); + validateAlbumParticipant(album, user); boolean existsPhotoInAlbum = photos.stream().allMatch(photo -> photo.getAlbum().getId().equals(album.getId())); @@ -91,6 +86,15 @@ public void validateDownloadPermission(Album album, User user, List photo } } + private void validateAlbumParticipant(Album album, User user) { + validateAlbumExpiration(album); + + validateUserBlacklisted(album, user); + + userAlbumRepository.findByUserIdAndAlbumId(user.getId(), album.getId()) + .orElseThrow(() -> new AlbumException(AlbumErrorCode.USER_NOT_PARTICIPANT)); + } + private void validateAlbumExpiration(Album album) { if (album.isExpired()) { throw new AlbumException(AlbumErrorCode.ALBUM_EXPIRED); diff --git a/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java b/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java index 3e7f4c0..53892b9 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java @@ -97,7 +97,7 @@ public PhotoDetailResponse getPhotoDetail(User user, String code, Long photoId) .orElseThrow(() -> new PhotoException(PhotoErrorCode.PHOTO_NOT_FOUND)); String resolveOriginalUrl = cdnUrlResolver.resolveOriginal(photo.getImageUrl()); - String resolveThumbnailUrl = cdnUrlResolver.resolveThumbnail(photo.getImageUrl()); + String resolveThumbnailUrl = cdnUrlResolver.resolveThumbnail(photo.getThumbnailUrl()); boolean isLiked = photoLikesRepository.existsByUserIdAndPhotoId(user.getId(), photo.getId()); boolean isDownloaded = photoHistoryRepository.existsByUserIdAndPhotoId(user.getId(), photo.getId()); diff --git a/src/main/java/com/cheeeese/photo/domain/PhotoHistory.java b/src/main/java/com/cheeeese/photo/domain/PhotoHistory.java index a28f304..7d90aec 100644 --- a/src/main/java/com/cheeeese/photo/domain/PhotoHistory.java +++ b/src/main/java/com/cheeeese/photo/domain/PhotoHistory.java @@ -8,8 +8,6 @@ import lombok.Getter; import lombok.NoArgsConstructor; -import java.time.LocalDateTime; - @Entity @Getter @Table( From 0217caa3f8fba4cc13f75944caa87a846dc1d742 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Tue, 11 Nov 2025 01:12:55 +0900 Subject: [PATCH 242/402] =?UTF-8?q?#39=20fix:=20=EB=B2=A0=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=BB=B7=204=EA=B0=9C=20=EC=A0=95=EB=A0=AC=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../photo/infrastructure/persistence/PhotoRepository.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java index 804e0e9..5722c99 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java @@ -98,7 +98,7 @@ int updateStatusByIdsAndUserIdAndExpectedStatus( WHERE p.album.id = :albumId AND p.isDeleted = FALSE AND p.status = com.cheeeese.photo.domain.PhotoStatus.COMPLETED - ORDER BY p.likesCnt DESC, p.createdAt DESC + ORDER BY p.likesCnt DESC, p.createdAt ASC """) List findTop4CompletedPhotoIdsByLikes( @Param("albumId") Long albumId, From 4a194080ad28d146c547a6bf6448a086c8be28c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Tue, 11 Nov 2025 02:41:40 +0900 Subject: [PATCH 243/402] =?UTF-8?q?#39=20feat:=20=EC=8A=A4=EC=BC=80?= =?UTF-8?q?=EC=A4=84=EB=9F=AC=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cheeeese/CheeeeseApplication.java | 2 + .../application/AlbumExpirationScheduler.java | 40 +++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 src/main/java/com/cheeeese/album/application/AlbumExpirationScheduler.java diff --git a/src/main/java/com/cheeeese/CheeeeseApplication.java b/src/main/java/com/cheeeese/CheeeeseApplication.java index 1910471..e920eb3 100644 --- a/src/main/java/com/cheeeese/CheeeeseApplication.java +++ b/src/main/java/com/cheeeese/CheeeeseApplication.java @@ -4,10 +4,12 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.data.jpa.repository.config.EnableJpaAuditing; import org.springframework.data.redis.repository.configuration.EnableRedisRepositories; +import org.springframework.scheduling.annotation.EnableScheduling; @SpringBootApplication @EnableJpaAuditing @EnableRedisRepositories(basePackages = "com.cheeeese.auth.infrastructure.persistence") +@EnableScheduling public class CheeeeseApplication { public static void main(String[] args) { diff --git a/src/main/java/com/cheeeese/album/application/AlbumExpirationScheduler.java b/src/main/java/com/cheeeese/album/application/AlbumExpirationScheduler.java new file mode 100644 index 0000000..97af695 --- /dev/null +++ b/src/main/java/com/cheeeese/album/application/AlbumExpirationScheduler.java @@ -0,0 +1,40 @@ +package com.cheeeese.album.application; + +import com.cheeeese.album.infrastructure.persistence.AlbumExpirationRedisRepository; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.util.Set; + +@Slf4j +@Component +@RequiredArgsConstructor +public class AlbumExpirationScheduler { + + private final AlbumExpirationRedisRepository albumExpirationRedisRepository; + private final AlbumExpirationService albumExpirationService; + + @Scheduled(fixedDelay = 1000L) + public void handleAlbumExpirations() { + Set trackedAlbumIds = albumExpirationRedisRepository.getTrackedAlbumIds(); + + if (trackedAlbumIds.isEmpty()) { + return; + } + + for (Long albumId : trackedAlbumIds) { + if (!albumExpirationRedisRepository.isExpired(albumId)) { + continue; + } + + try { + albumExpirationService.expireAlbum(albumId); + albumExpirationRedisRepository.unregister(albumId); + } catch (Exception exception) { + log.error("[AlbumExpiration] Failed to process album id={}", albumId, exception); + } + } + } +} \ No newline at end of file From f29427ffbbf7e96230f94357d22429ef21e96627 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Tue, 11 Nov 2025 02:43:38 +0900 Subject: [PATCH 244/402] =?UTF-8?q?#39=20feat:=207=EC=9D=BC=20=ED=9B=84?= =?UTF-8?q?=EC=97=90=20=EC=9E=90=EB=8F=99=20=EB=A7=8C=EB=A3=8C=20=ED=9B=84?= =?UTF-8?q?=20=EC=B9=98=EC=A6=88=EB=84=A4=EC=BB=B7=20=EC=83=9D=EC=84=B1=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/AlbumExpirationService.java | 65 +++++++++++++++++++ .../album/application/AlbumService.java | 4 ++ .../java/com/cheeeese/album/domain/Album.java | 4 ++ .../AlbumExpirationRedisRepository.java | 65 +++++++++++++++++++ .../mapper/Cheese4cutMapper.java | 14 ++++ 5 files changed, 152 insertions(+) create mode 100644 src/main/java/com/cheeeese/album/application/AlbumExpirationService.java create mode 100644 src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumExpirationRedisRepository.java diff --git a/src/main/java/com/cheeeese/album/application/AlbumExpirationService.java b/src/main/java/com/cheeeese/album/application/AlbumExpirationService.java new file mode 100644 index 0000000..24930a8 --- /dev/null +++ b/src/main/java/com/cheeeese/album/application/AlbumExpirationService.java @@ -0,0 +1,65 @@ +package com.cheeeese.album.application; + +import com.cheeeese.album.domain.Album; +import com.cheeeese.album.exception.AlbumException; +import com.cheeeese.album.exception.code.AlbumErrorCode; +import com.cheeeese.album.infrastructure.persistence.AlbumRepository; +import com.cheeeese.cheese4cut.domain.Cheese4cut; +import com.cheeeese.cheese4cut.infrastructure.mapper.Cheese4cutMapper; +import com.cheeeese.cheese4cut.infrastructure.persistence.Cheese4cutRepository; +import com.cheeeese.photo.infrastructure.persistence.PhotoRepository; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Slf4j +@Service +@RequiredArgsConstructor +public class AlbumExpirationService { + + private static final int CHEESE4CUT_PHOTO_COUNT = 4; + // TODO: 치즈네컷 생성 로직을 프론트에서 하면 스케줄러가 만료된 앨범에 대해서 만료되었다고 프론트에 알려서 치즈네컷 이미지 업로드(?) + private static final String DEFAULT_FRAME_IMAGE_URL = ""; + + private final AlbumRepository albumRepository; + private final PhotoRepository photoRepository; + private final Cheese4cutRepository cheese4cutRepository; + + @Transactional + public void expireAlbum(Long albumId) { + Album album = albumRepository.findById(albumId) + .orElseThrow(() -> new AlbumException(AlbumErrorCode.ALBUM_NOT_FOUND)); + + if (album.getStatus() != Album.AlbumStatus.EXPIRED) { + album.expire(); + log.info("[AlbumExpiration] Album id={} status updated to EXPIRED", albumId); + } + + if (cheese4cutRepository.findByAlbumId(albumId).isPresent()) { + return; + } + + List topPhotoIds = photoRepository.findTop4CompletedPhotoIdsByLikes( + albumId, + PageRequest.of(0, CHEESE4CUT_PHOTO_COUNT) + ); + + if (topPhotoIds.size() < CHEESE4CUT_PHOTO_COUNT) { + log.warn( + "[AlbumExpiration] Album id={} does not have enough photos to create cheese4cut (found={})", + albumId, + topPhotoIds.size() + ); + return; + } + + Cheese4cut cheese4cut = Cheese4cutMapper.toEntity(album, topPhotoIds, DEFAULT_FRAME_IMAGE_URL); + + cheese4cutRepository.save(cheese4cut); + log.info("[AlbumExpiration] Cheese4cut created automatically for album id={}", albumId); + } +} \ No newline at end of file diff --git a/src/main/java/com/cheeeese/album/application/AlbumService.java b/src/main/java/com/cheeeese/album/application/AlbumService.java index 180e241..2f89baf 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumService.java +++ b/src/main/java/com/cheeeese/album/application/AlbumService.java @@ -11,6 +11,7 @@ import com.cheeeese.album.infrastructure.mapper.AlbumMapper; import com.cheeeese.album.infrastructure.mapper.UserAlbumMapper; import com.cheeeese.album.infrastructure.persistence.AlbumRepository; +import com.cheeeese.album.infrastructure.persistence.AlbumExpirationRedisRepository; import com.cheeeese.photo.application.PhotoService; import com.cheeeese.album.domain.UserAlbum; import com.cheeeese.album.infrastructure.persistence.UserAlbumRepository; @@ -45,6 +46,7 @@ public class AlbumService { private final UserAlbumRepository userAlbumRepository; private final UserRepository userRepository; private final PhotoService photoService; + private final AlbumExpirationRedisRepository albumExpirationRedisRepository; @Transactional public AlbumCreationResponse createAlbum(User user, AlbumCreationRequest request) { @@ -72,6 +74,8 @@ public AlbumCreationResponse createAlbum(User user, AlbumCreationRequest request Role.MAKER )); + albumExpirationRedisRepository.registerAlbum(album.getId()); + return AlbumMapper.toCreationResponse(album); } diff --git a/src/main/java/com/cheeeese/album/domain/Album.java b/src/main/java/com/cheeeese/album/domain/Album.java index c236aea..9fb9ece 100644 --- a/src/main/java/com/cheeeese/album/domain/Album.java +++ b/src/main/java/com/cheeeese/album/domain/Album.java @@ -66,6 +66,10 @@ public boolean isExpired() { return this.expiredAt.isBefore(LocalDateTime.now()) || this.status == AlbumStatus.EXPIRED; } + public void expire() { + this.status = AlbumStatus.EXPIRED; + } + @Builder private Album( Long makerId, diff --git a/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumExpirationRedisRepository.java b/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumExpirationRedisRepository.java new file mode 100644 index 0000000..4962348 --- /dev/null +++ b/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumExpirationRedisRepository.java @@ -0,0 +1,65 @@ +package com.cheeeese.album.infrastructure.persistence; + +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; + +import java.time.Duration; +import java.util.Collections; +import java.util.Set; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +@Component +@RequiredArgsConstructor +public class AlbumExpirationRedisRepository { + + private static final String TRACKING_KEY = "expired:album:tracking"; + private static final Duration ALBUM_TTL = Duration.ofDays(7); + + @Qualifier("cacheRedisTemplate") + private final RedisTemplate cacheRedisTemplate; + + public void registerAlbum(Long albumId) { + String key = buildAlbumKey(albumId); + cacheRedisTemplate.opsForValue().set(key, albumId.toString(), ALBUM_TTL); + cacheRedisTemplate.opsForSet().add(TRACKING_KEY, albumId.toString()); + } + + public Set getTrackedAlbumIds() { + Set members = cacheRedisTemplate.opsForSet().members(TRACKING_KEY); + if (members == null || members.isEmpty()) { + return Collections.emptySet(); + } + return members.stream() + .map(Object::toString) + .map(Long::valueOf) + .collect(Collectors.toSet()); + } + + public boolean isExpired(Long albumId) { + Long ttl = cacheRedisTemplate.getExpire(buildAlbumKey(albumId), TimeUnit.SECONDS); + if (ttl == null) { + return true; + } + + if (ttl == -2) { + return true; + } + + if (ttl == -1) { + return false; + } + + return ttl <= 0; + } + + public void unregister(Long albumId) { + cacheRedisTemplate.opsForSet().remove(TRACKING_KEY, albumId.toString()); + } + + private String buildAlbumKey(Long albumId) { + return "expired:album:" + albumId; + } +} diff --git a/src/main/java/com/cheeeese/cheese4cut/infrastructure/mapper/Cheese4cutMapper.java b/src/main/java/com/cheeeese/cheese4cut/infrastructure/mapper/Cheese4cutMapper.java index 7287089..9a9b8b4 100644 --- a/src/main/java/com/cheeeese/cheese4cut/infrastructure/mapper/Cheese4cutMapper.java +++ b/src/main/java/com/cheeeese/cheese4cut/infrastructure/mapper/Cheese4cutMapper.java @@ -48,6 +48,9 @@ public static Cheese4cutPreviewResponse toPreviewResponse( .build(); } + /** + * 사용자가 직접 확정할 때 요청 DTO 기반 엔티티 변환 + */ public static Cheese4cut toEntity(Album album, Cheese4cutFixedRequest request) { return Cheese4cut.builder() .album(album) @@ -56,6 +59,17 @@ public static Cheese4cut toEntity(Album album, Cheese4cutFixedRequest request) { .build(); } + /** + * 만료 자동 확정 시 (top4 사진 및 기본 프레임 기반) + */ + public static Cheese4cut toEntity(Album album, List photoIds, String frameImageUrl) { + return Cheese4cut.builder() + .album(album) + .photoIds(photoIds) + .frameImageUrl(frameImageUrl) + .build(); + } + public static Cheese4cutPresignedUrlResponse toPresignedUrlResponse(String uploadUrl) { return Cheese4cutPresignedUrlResponse.builder() .uploadUrl(uploadUrl).build(); From fe31ef790fc0607e2f698251e4bf10b78854dd18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Tue, 11 Nov 2025 23:42:41 +0900 Subject: [PATCH 245/402] =?UTF-8?q?#39=20fix:=20=EC=BD=94=EB=93=9C?= =?UTF-8?q?=EB=9E=98=EB=B9=97=20=ED=94=BC=EB=93=9C=EB=B0=B1=20=EB=B0=98?= =?UTF-8?q?=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../album/application/AlbumExpirationService.java | 2 ++ .../cheese4cut/application/Cheese4cutService.java | 10 +++++++++- .../application/validator/Cheese4cutValidator.java | 2 +- .../com/cheeeese/cheese4cut/domain/Cheese4cut.java | 2 ++ .../cheese4cut/presentation/Cheese4cutController.java | 7 +++++-- .../photo/application/PresignedUrlService.java | 3 ++- .../infrastructure/persistence/PhotoRepository.java | 3 ++- 7 files changed, 23 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/cheeeese/album/application/AlbumExpirationService.java b/src/main/java/com/cheeeese/album/application/AlbumExpirationService.java index 24930a8..8716619 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumExpirationService.java +++ b/src/main/java/com/cheeeese/album/application/AlbumExpirationService.java @@ -7,6 +7,7 @@ import com.cheeeese.cheese4cut.domain.Cheese4cut; import com.cheeeese.cheese4cut.infrastructure.mapper.Cheese4cutMapper; import com.cheeeese.cheese4cut.infrastructure.persistence.Cheese4cutRepository; +import com.cheeeese.photo.domain.PhotoStatus; import com.cheeeese.photo.infrastructure.persistence.PhotoRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -45,6 +46,7 @@ public void expireAlbum(Long albumId) { List topPhotoIds = photoRepository.findTop4CompletedPhotoIdsByLikes( albumId, + PhotoStatus.COMPLETED, PageRequest.of(0, CHEESE4CUT_PHOTO_COUNT) ); diff --git a/src/main/java/com/cheeeese/cheese4cut/application/Cheese4cutService.java b/src/main/java/com/cheeeese/cheese4cut/application/Cheese4cutService.java index 1919992..3d65b83 100644 --- a/src/main/java/com/cheeeese/cheese4cut/application/Cheese4cutService.java +++ b/src/main/java/com/cheeeese/cheese4cut/application/Cheese4cutService.java @@ -16,6 +16,7 @@ import com.cheeeese.cheese4cut.infrastructure.persistence.Cheese4cutRepository; import com.cheeeese.photo.application.PresignedUrlService; import com.cheeeese.photo.domain.Photo; +import com.cheeeese.photo.domain.PhotoStatus; import com.cheeeese.photo.infrastructure.persistence.PhotoLikesRepository; import com.cheeeese.photo.infrastructure.persistence.PhotoRepository; import com.cheeeese.user.domain.User; @@ -60,6 +61,7 @@ public Cheese4cutResponse getCheese4cutByAlbumCode(String code) { private Cheese4cutResponse getPreviewResponse(Long albumId, int participant) { List topPhotoIds = photoRepository.findTop4CompletedPhotoIdsByLikes( albumId, + PhotoStatus.COMPLETED, PageRequest.of(0, 4) ); @@ -73,7 +75,13 @@ private Cheese4cutResponse getPreviewResponse(Long albumId, int participant) { .collect(Collectors.toMap(Photo::getId, Function.identity())); List orderedPhotos = topPhotoIds.stream() - .map(photoMap::get) + .map(photoId -> { + Photo photo = photoMap.get(photoId); + if (photo == null) { + throw new Cheese4cutException(Cheese4cutErrorCode.INSUFFICIENT_COUNT_FOR_CHEESE4CUT); + } + return photo; + }) .toList(); long uniqueLikesCount = photoLikesRepository.countDistinctUserIdsByPhotoIds(topPhotoIds); diff --git a/src/main/java/com/cheeeese/cheese4cut/application/validator/Cheese4cutValidator.java b/src/main/java/com/cheeeese/cheese4cut/application/validator/Cheese4cutValidator.java index 07dc9d9..ce71eec 100644 --- a/src/main/java/com/cheeeese/cheese4cut/application/validator/Cheese4cutValidator.java +++ b/src/main/java/com/cheeeese/cheese4cut/application/validator/Cheese4cutValidator.java @@ -29,7 +29,7 @@ public class Cheese4cutValidator { public void validateUserIsMaker(Album album, User user) { boolean isMaker = userAlbumRepository.findByAlbumIdAndUserIdAndRole(album.getId(), user.getId(), Role.MAKER).isPresent(); if (!isMaker) { - throw new AlbumException(AlbumErrorCode.USER_NOT_PARTICIPANT); + throw new AlbumException(AlbumErrorCode.USER_NOT_MAKER); } } diff --git a/src/main/java/com/cheeeese/cheese4cut/domain/Cheese4cut.java b/src/main/java/com/cheeeese/cheese4cut/domain/Cheese4cut.java index 2335194..87f1a2a 100644 --- a/src/main/java/com/cheeeese/cheese4cut/domain/Cheese4cut.java +++ b/src/main/java/com/cheeeese/cheese4cut/domain/Cheese4cut.java @@ -3,6 +3,7 @@ import com.cheeeese.album.domain.Album; import com.cheeeese.global.domain.BaseEntity; import jakarta.persistence.*; +import jakarta.validation.constraints.Size; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; @@ -28,6 +29,7 @@ public class Cheese4cut extends BaseEntity { @ElementCollection @CollectionTable(name = "cheese4cut_photos", joinColumns = @JoinColumn(name = "cheese4cut_id")) @Column(name = "photo_id", nullable = false) + @Size(min = 4, max = 4) private List photoIds; @Column(name = "frame_image_url", nullable = false) diff --git a/src/main/java/com/cheeeese/cheese4cut/presentation/Cheese4cutController.java b/src/main/java/com/cheeeese/cheese4cut/presentation/Cheese4cutController.java index 0b9d099..c762a9d 100644 --- a/src/main/java/com/cheeeese/cheese4cut/presentation/Cheese4cutController.java +++ b/src/main/java/com/cheeeese/cheese4cut/presentation/Cheese4cutController.java @@ -10,6 +10,7 @@ import com.cheeeese.global.util.CurrentUser; import com.cheeeese.user.domain.User; import jakarta.validation.Valid; +import jakarta.validation.constraints.NotBlank; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; @@ -25,7 +26,9 @@ public class Cheese4cutController implements Cheese4cutSwagger { @Override @GetMapping("/preview") - public CommonResponse getCheese4cut(@PathVariable String code) { + public CommonResponse getCheese4cut( + @PathVariable @NotBlank String code + ) { return CommonResponse.success(SuccessCode.CHEESE4CUT_GET_SUCCESS, cheese4cutService.getCheese4cutByAlbumCode(code)); } @@ -34,7 +37,7 @@ public CommonResponse getCheese4cut(@PathVariable String cod @PostMapping("/presigned-url") public CommonResponse createCheese4cutPresignedUrl( @CurrentUser User user, - @PathVariable String code + @PathVariable @NotBlank String code ) { return CommonResponse.success(PRESIGNED_URL_ISSUE_SUCCESS, cheese4cutService.createCheese4cutPresignedUrl(user, code)); diff --git a/src/main/java/com/cheeeese/photo/application/PresignedUrlService.java b/src/main/java/com/cheeeese/photo/application/PresignedUrlService.java index 581d9ad..74e7cdd 100644 --- a/src/main/java/com/cheeeese/photo/application/PresignedUrlService.java +++ b/src/main/java/com/cheeeese/photo/application/PresignedUrlService.java @@ -10,6 +10,7 @@ import software.amazon.awssdk.services.s3.presigner.model.PresignedPutObjectRequest; import java.time.Duration; +import java.util.UUID; @Component @RequiredArgsConstructor @@ -40,7 +41,7 @@ public String generatePresignedPutUrl(String uniqueKey, String contentType) { } public String generateCheese4cutPresignedPutUrl(String albumCode) { - String uniqueFileName = String.format("%s.png", System.currentTimeMillis()); + String uniqueFileName = String.format("%s.png", UUID.randomUUID().toString()); String objectKey = String.format("album/%s/%s", albumCode, uniqueFileName); PutObjectRequest putObjectRequest = PutObjectRequest.builder() diff --git a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java index df5d960..3804805 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java @@ -95,11 +95,12 @@ int updateStatusByIdsAndUserIdAndExpectedStatus( FROM Photo p WHERE p.album.id = :albumId AND p.isDeleted = FALSE - AND p.status = com.cheeeese.photo.domain.PhotoStatus.COMPLETED + AND p.status = :status ORDER BY p.likesCnt DESC, p.createdAt ASC """) List findTop4CompletedPhotoIdsByLikes( @Param("albumId") Long albumId, + @Param("status") PhotoStatus status, Pageable pageable ); From 119e17d61dc8ef5bea3d37bf72f77483f67d76a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Wed, 12 Nov 2025 00:06:45 +0900 Subject: [PATCH 246/402] =?UTF-8?q?#39=20fix:=20cheese4cut=20=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EB=B8=94=EC=97=90=20=EC=B5=9C=EC=A2=85=20=ED=94=84?= =?UTF-8?q?=EB=A0=88=EC=9E=84=20=EC=BB=AC=EB=9F=BC=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../album/application/AlbumExpirationService.java | 5 ++--- .../java/com/cheeeese/cheese4cut/domain/Cheese4cut.java | 5 +---- .../cheese4cut/dto/request/Cheese4cutFixedRequest.java | 6 +----- .../cheese4cut/dto/response/Cheese4cutFinalResponse.java | 6 +----- .../infrastructure/mapper/Cheese4cutMapper.java | 8 +++----- .../cheese4cut/presentation/Cheese4cutController.java | 2 +- 6 files changed, 9 insertions(+), 23 deletions(-) diff --git a/src/main/java/com/cheeeese/album/application/AlbumExpirationService.java b/src/main/java/com/cheeeese/album/application/AlbumExpirationService.java index 8716619..a75d7c3 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumExpirationService.java +++ b/src/main/java/com/cheeeese/album/application/AlbumExpirationService.java @@ -23,8 +23,7 @@ public class AlbumExpirationService { private static final int CHEESE4CUT_PHOTO_COUNT = 4; - // TODO: 치즈네컷 생성 로직을 프론트에서 하면 스케줄러가 만료된 앨범에 대해서 만료되었다고 프론트에 알려서 치즈네컷 이미지 업로드(?) - private static final String DEFAULT_FRAME_IMAGE_URL = ""; + // TODO: 최종 프레임 백엔드에서 저장안함에 따라 photo 4장만 저장 private final AlbumRepository albumRepository; private final PhotoRepository photoRepository; @@ -59,7 +58,7 @@ public void expireAlbum(Long albumId) { return; } - Cheese4cut cheese4cut = Cheese4cutMapper.toEntity(album, topPhotoIds, DEFAULT_FRAME_IMAGE_URL); + Cheese4cut cheese4cut = Cheese4cutMapper.toEntity(album, topPhotoIds); cheese4cutRepository.save(cheese4cut); log.info("[AlbumExpiration] Cheese4cut created automatically for album id={}", albumId); diff --git a/src/main/java/com/cheeeese/cheese4cut/domain/Cheese4cut.java b/src/main/java/com/cheeeese/cheese4cut/domain/Cheese4cut.java index 87f1a2a..f97a6f9 100644 --- a/src/main/java/com/cheeeese/cheese4cut/domain/Cheese4cut.java +++ b/src/main/java/com/cheeeese/cheese4cut/domain/Cheese4cut.java @@ -32,14 +32,11 @@ public class Cheese4cut extends BaseEntity { @Size(min = 4, max = 4) private List photoIds; - @Column(name = "frame_image_url", nullable = false) - private String frameImageUrl; @Builder - private Cheese4cut(Album album, List photoIds, String frameImageUrl) { + private Cheese4cut(Album album, List photoIds) { this.album = album; this.photoIds = photoIds; - this.frameImageUrl = frameImageUrl; } } diff --git a/src/main/java/com/cheeeese/cheese4cut/dto/request/Cheese4cutFixedRequest.java b/src/main/java/com/cheeeese/cheese4cut/dto/request/Cheese4cutFixedRequest.java index 05b7e8e..a50b90b 100644 --- a/src/main/java/com/cheeeese/cheese4cut/dto/request/Cheese4cutFixedRequest.java +++ b/src/main/java/com/cheeeese/cheese4cut/dto/request/Cheese4cutFixedRequest.java @@ -14,10 +14,6 @@ public record Cheese4cutFixedRequest( @NotEmpty @Size(min = 4, max = 4, message = "4장의 사진 ID를 선택해야 합니다.") @Schema(description = "선택된 사진 ID 목록 (정확히 4개)", example = "[101, 105, 122, 140]") - List photoIds, - - @NotBlank - @Schema(description = "최종 합성된 이미지의 Object Storage URL", example = "https://cheese4cut/album/1.png") - String frameImageUrl + List photoIds ) { } \ No newline at end of file diff --git a/src/main/java/com/cheeeese/cheese4cut/dto/response/Cheese4cutFinalResponse.java b/src/main/java/com/cheeeese/cheese4cut/dto/response/Cheese4cutFinalResponse.java index 8311e20..d07204a 100644 --- a/src/main/java/com/cheeeese/cheese4cut/dto/response/Cheese4cutFinalResponse.java +++ b/src/main/java/com/cheeeese/cheese4cut/dto/response/Cheese4cutFinalResponse.java @@ -7,10 +7,6 @@ @Schema(description = "치즈네컷 확정 완료 응답 DTO (최종 프레임 이미지)") public record Cheese4cutFinalResponse( @Schema(description = "확정 여부 (항상 true)", example = "true") - boolean isFinalized, - - @Schema(description = "최종 프레임 이미지 URL", example = "https://cdn.cheeeese.com/cheese4cut/final/1.png") - String finalFrameImageUrl - + boolean isFinalized ) implements Cheese4cutResponse { } diff --git a/src/main/java/com/cheeeese/cheese4cut/infrastructure/mapper/Cheese4cutMapper.java b/src/main/java/com/cheeeese/cheese4cut/infrastructure/mapper/Cheese4cutMapper.java index 9a9b8b4..ecfcd01 100644 --- a/src/main/java/com/cheeeese/cheese4cut/infrastructure/mapper/Cheese4cutMapper.java +++ b/src/main/java/com/cheeeese/cheese4cut/infrastructure/mapper/Cheese4cutMapper.java @@ -18,10 +18,10 @@ private Cheese4cutMapper() {} /** * 확정 후 응답 (Cheese4cut 엔티티 기반) */ - public static Cheese4cutFinalResponse toFinalResponse(Cheese4cut cheese4cut) { + // TODO: 프레임 이미지 제거에 따른 응답 형식 수정하기 + public static Cheese4cutFinalResponse toFinalResponse() { return Cheese4cutFinalResponse.builder() .isFinalized(true) - .finalFrameImageUrl(cheese4cut.getFrameImageUrl()) .build(); } @@ -55,18 +55,16 @@ public static Cheese4cut toEntity(Album album, Cheese4cutFixedRequest request) { return Cheese4cut.builder() .album(album) .photoIds(request.photoIds()) - .frameImageUrl(request.frameImageUrl()) .build(); } /** * 만료 자동 확정 시 (top4 사진 및 기본 프레임 기반) */ - public static Cheese4cut toEntity(Album album, List photoIds, String frameImageUrl) { + public static Cheese4cut toEntity(Album album, List photoIds) { return Cheese4cut.builder() .album(album) .photoIds(photoIds) - .frameImageUrl(frameImageUrl) .build(); } diff --git a/src/main/java/com/cheeeese/cheese4cut/presentation/Cheese4cutController.java b/src/main/java/com/cheeeese/cheese4cut/presentation/Cheese4cutController.java index c762a9d..1d155c8 100644 --- a/src/main/java/com/cheeeese/cheese4cut/presentation/Cheese4cutController.java +++ b/src/main/java/com/cheeeese/cheese4cut/presentation/Cheese4cutController.java @@ -47,7 +47,7 @@ public CommonResponse createCheese4cutPresignedU @PostMapping("/fixed") public CommonResponse finalizeCheese4cut( @CurrentUser User user, - @PathVariable String code, + @PathVariable @NotBlank String code, @RequestBody @Valid Cheese4cutFixedRequest request ) { cheese4cutService.finalizeCheese4cut(user, code, request); From ffee386cfae1862bed98cc903bbdbf04bb3c979d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Wed, 12 Nov 2025 00:07:34 +0900 Subject: [PATCH 247/402] =?UTF-8?q?#39=20fix:=20=ED=94=BC=EB=93=9C?= =?UTF-8?q?=EB=B0=B1=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cheese4cut/application/Cheese4cutService.java | 3 ++- .../cheese4cut/dto/request/Cheese4cutFixedRequest.java | 1 - .../presentation/swagger/Cheese4cutSwagger.java | 10 +++++----- .../photo/application/PresignedUrlService.java | 2 +- .../infrastructure/persistence/PhotoRepository.java | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/cheeeese/cheese4cut/application/Cheese4cutService.java b/src/main/java/com/cheeeese/cheese4cut/application/Cheese4cutService.java index 3d65b83..ef22431 100644 --- a/src/main/java/com/cheeeese/cheese4cut/application/Cheese4cutService.java +++ b/src/main/java/com/cheeeese/cheese4cut/application/Cheese4cutService.java @@ -51,8 +51,9 @@ public Cheese4cutResponse getCheese4cutByAlbumCode(String code) { Optional cheese4cutOptional = cheese4cutRepository.findByAlbumId(album.getId()); + // TODO: 최종 확정된 4장의 photo 제공으로 변경 if (cheese4cutOptional.isPresent()) { - return Cheese4cutMapper.toFinalResponse(cheese4cutOptional.get()); + return Cheese4cutMapper.toFinalResponse(); } return getPreviewResponse(album.getId(), album.getParticipant()); diff --git a/src/main/java/com/cheeeese/cheese4cut/dto/request/Cheese4cutFixedRequest.java b/src/main/java/com/cheeeese/cheese4cut/dto/request/Cheese4cutFixedRequest.java index a50b90b..574fa7f 100644 --- a/src/main/java/com/cheeeese/cheese4cut/dto/request/Cheese4cutFixedRequest.java +++ b/src/main/java/com/cheeeese/cheese4cut/dto/request/Cheese4cutFixedRequest.java @@ -1,7 +1,6 @@ package com.cheeeese.cheese4cut.dto.request; import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.Size; import lombok.Builder; diff --git a/src/main/java/com/cheeeese/cheese4cut/presentation/swagger/Cheese4cutSwagger.java b/src/main/java/com/cheeeese/cheese4cut/presentation/swagger/Cheese4cutSwagger.java index 79812a7..03f3a77 100644 --- a/src/main/java/com/cheeeese/cheese4cut/presentation/swagger/Cheese4cutSwagger.java +++ b/src/main/java/com/cheeeese/cheese4cut/presentation/swagger/Cheese4cutSwagger.java @@ -14,6 +14,7 @@ import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; +import jakarta.validation.constraints.NotBlank; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; @@ -32,7 +33,7 @@ public interface Cheese4cutSwagger { 이 API는 앨범의 **치즈네컷 확정 상태**에 따라 응답 형태가 달라지는 다형적(Polymorphic) 응답을 반환합니다. 1. **확정 전 (isFinalized: false)**: 좋아요 TOP 4 사진의 원본 URL, 유니크 좋아요 수, 전체 참여자 수를 제공합니다. - 2. **확정 후 (isFinalized: true)**: 최종 프레임 이미지 URL만 제공합니다. (만료 이벤트 또는 수동 확정 완료) + 2. **확정 후 (isFinalized: true)**: 확정된 좋아요 TOP 4 사진의 원본 URL """ ) @ApiResponses(value = { @@ -74,7 +75,7 @@ public interface Cheese4cutSwagger { ) }) CommonResponse getCheese4cut( - @PathVariable String code + @PathVariable @NotBlank String code ); @Operation( @@ -94,7 +95,7 @@ CommonResponse getCheese4cut( }) CommonResponse createCheese4cutPresignedUrl( @CurrentUser User user, - @PathVariable String code + @PathVariable @NotBlank String code ); @Operation( @@ -107,7 +108,6 @@ CommonResponse createCheese4cutPresignedUrl( ### RequestBody --- `photoIds`: 사용자가 최종 선택한 4장의 사진 ID \n - `frameImageUrl`: 전체 프레임 이미지 URL ### 로직 상세 --- @@ -137,7 +137,7 @@ CommonResponse createCheese4cutPresignedUrl( }) CommonResponse finalizeCheese4cut( @CurrentUser User user, - @PathVariable String code, + @PathVariable @NotBlank String code, @RequestBody @Valid Cheese4cutFixedRequest request ); } \ No newline at end of file diff --git a/src/main/java/com/cheeeese/photo/application/PresignedUrlService.java b/src/main/java/com/cheeeese/photo/application/PresignedUrlService.java index 74e7cdd..0ca7993 100644 --- a/src/main/java/com/cheeeese/photo/application/PresignedUrlService.java +++ b/src/main/java/com/cheeeese/photo/application/PresignedUrlService.java @@ -41,7 +41,7 @@ public String generatePresignedPutUrl(String uniqueKey, String contentType) { } public String generateCheese4cutPresignedPutUrl(String albumCode) { - String uniqueFileName = String.format("%s.png", UUID.randomUUID().toString()); + String uniqueFileName = String.format("%s.png", UUID.randomUUID()); String objectKey = String.format("album/%s/%s", albumCode, uniqueFileName); PutObjectRequest putObjectRequest = PutObjectRequest.builder() diff --git a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java index 3804805..09e97cd 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java @@ -56,8 +56,8 @@ Slice findLikedPhotosByAlbumAndUser( void decrementLikeCnt(@Param("photoId") Long photoId); @Query(""" - SELECT p - FROM Photo p + SELECT p + FROM Photo p JOIN FETCH p.user WHERE p.album.id = :albumId AND p.isDeleted = FALSE From 5089da52fa5c92639de1ccd6064045f11fe58189 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Wed, 12 Nov 2025 00:23:09 +0900 Subject: [PATCH 248/402] =?UTF-8?q?#39=20fix:=20=ED=94=BC=EB=93=9C?= =?UTF-8?q?=EB=B0=B1=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cheese4cut/dto/request/Cheese4cutFixedRequest.java | 3 ++- .../cheeeese/cheese4cut/presentation/Cheese4cutController.java | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/cheeeese/cheese4cut/dto/request/Cheese4cutFixedRequest.java b/src/main/java/com/cheeeese/cheese4cut/dto/request/Cheese4cutFixedRequest.java index 574fa7f..604761a 100644 --- a/src/main/java/com/cheeeese/cheese4cut/dto/request/Cheese4cutFixedRequest.java +++ b/src/main/java/com/cheeeese/cheese4cut/dto/request/Cheese4cutFixedRequest.java @@ -2,6 +2,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Size; import lombok.Builder; @@ -13,6 +14,6 @@ public record Cheese4cutFixedRequest( @NotEmpty @Size(min = 4, max = 4, message = "4장의 사진 ID를 선택해야 합니다.") @Schema(description = "선택된 사진 ID 목록 (정확히 4개)", example = "[101, 105, 122, 140]") - List photoIds + List<@NotNull Long> photoIds ) { } \ No newline at end of file diff --git a/src/main/java/com/cheeeese/cheese4cut/presentation/Cheese4cutController.java b/src/main/java/com/cheeeese/cheese4cut/presentation/Cheese4cutController.java index 1d155c8..1019e8a 100644 --- a/src/main/java/com/cheeeese/cheese4cut/presentation/Cheese4cutController.java +++ b/src/main/java/com/cheeeese/cheese4cut/presentation/Cheese4cutController.java @@ -12,11 +12,13 @@ import jakarta.validation.Valid; import jakarta.validation.constraints.NotBlank; import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import static com.cheeeese.global.common.code.SuccessCode.CHEESE4CUT_FINALIZE_SUCCESS; import static com.cheeeese.global.common.code.SuccessCode.PRESIGNED_URL_ISSUE_SUCCESS; +@Validated @RestController @RequiredArgsConstructor @RequestMapping("/v1/cheese4cut/{code}") From 3c127b34129c7af292c9f532314cd1e28e01f106 Mon Sep 17 00:00:00 2001 From: zyovn Date: Wed, 12 Nov 2025 12:29:32 +0900 Subject: [PATCH 249/402] =?UTF-8?q?#54=20feat:=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=9E=90=20=EC=95=A8=EB=B2=94=20=EC=A6=9D=EA=B0=80=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cheeeese/album/application/AlbumService.java | 2 ++ .../user/infrastructure/persistence/UserRepository.java | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/src/main/java/com/cheeeese/album/application/AlbumService.java b/src/main/java/com/cheeeese/album/application/AlbumService.java index d7d2364..ef42218 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumService.java +++ b/src/main/java/com/cheeeese/album/application/AlbumService.java @@ -76,6 +76,7 @@ public AlbumCreationResponse createAlbum(User user, AlbumCreationRequest request album, Role.MAKER )); + userRepository.incrementAlbumCnt(user.getId()); albumExpirationRedisRepository.registerAlbum(album.getId()); @@ -125,6 +126,7 @@ public AlbumEnterResponse enterAlbum(String code, User currentUser) { if (updated == 0) { throw new AlbumException(AlbumErrorCode.ALBUM_MAX_PARTICIPANT_REACHED); } + userRepository.incrementAlbumCnt(currentUser.getId()); List recentPhotos = getRecentPhotosWithUploaderInfo(album.getId()); diff --git a/src/main/java/com/cheeeese/user/infrastructure/persistence/UserRepository.java b/src/main/java/com/cheeeese/user/infrastructure/persistence/UserRepository.java index b818609..4a4c3f3 100644 --- a/src/main/java/com/cheeeese/user/infrastructure/persistence/UserRepository.java +++ b/src/main/java/com/cheeeese/user/infrastructure/persistence/UserRepository.java @@ -18,4 +18,12 @@ public interface UserRepository extends JpaRepository { @Modifying(clearAutomatically = true, flushAutomatically = true) @Query("UPDATE User u SET u.photoCnt = u.photoCnt - :count WHERE u.id = :userId AND u.photoCnt >= :count") int decrementPhotoCount(@Param("userId") Long userId, @Param("count") int count); + + @Modifying + @Query(""" + UPDATE User u + SET u.albumCnt = u.albumCnt + 1 + WHERE u.id = :userId + """) + void incrementAlbumCnt(@Param("userId") Long userId); } From e67a51dbaa2bb05ba8a222de58efe278a6413ae3 Mon Sep 17 00:00:00 2001 From: zyovn Date: Wed, 12 Nov 2025 17:14:38 +0900 Subject: [PATCH 250/402] =?UTF-8?q?#54=20feat:=20=EC=82=AC=EC=A7=84=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=20=EC=A1=B0=ED=9A=8C=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/validator/AlbumValidator.java | 2 +- .../global/common/code/SuccessCode.java | 1 + .../photo/application/PhotoInfoService.java | 34 +++++++++++++++++++ .../photo/dto/response/PhotoInfoResponse.java | 13 +++++++ .../infrastructure/mapper/PhotoMapper.java | 8 +++++ .../presentation/PhotoQueryController.java | 15 ++++++++ 6 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/cheeeese/photo/application/PhotoInfoService.java create mode 100644 src/main/java/com/cheeeese/photo/dto/response/PhotoInfoResponse.java diff --git a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java index b0289c7..45a4db4 100644 --- a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java +++ b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java @@ -86,7 +86,7 @@ public void validateDownloadPermission(Album album, User user, List photo } } - private void validateAlbumParticipant(Album album, User user) { + public void validateAlbumParticipant(Album album, User user) { validateAlbumExpiration(album); validateUserBlacklisted(album, user); diff --git a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java index 62ec241..245de0d 100644 --- a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java +++ b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java @@ -36,6 +36,7 @@ public enum SuccessCode implements BaseCode { PHOTO_DETAIL_GET_SUCCESS(HttpStatus.OK, "앨범 내 사진 상세 조회가 성공적으로 완료되었습니다."), PHOTO_LIKES_CREATE_SUCCESS(HttpStatus.OK, "사진 좋아요 생성이 완료되었습니다."), PHOTO_LIKES_DELETE_SUCCESS(HttpStatus.OK, "사진 좋아요 삭제가 완료되었습니다."), + PHOTO_INFO_GET_SUCCESS(HttpStatus.OK, "사진 정보 조회가 성공적으로 완료되었습니다."), // cheese4cut CHEESE4CUT_GET_SUCCESS(HttpStatus.OK, "치즈네컷 조회가 성공적으로 완료되었습니다."), diff --git a/src/main/java/com/cheeeese/photo/application/PhotoInfoService.java b/src/main/java/com/cheeeese/photo/application/PhotoInfoService.java new file mode 100644 index 0000000..c6b9eaf --- /dev/null +++ b/src/main/java/com/cheeeese/photo/application/PhotoInfoService.java @@ -0,0 +1,34 @@ +package com.cheeeese.photo.application; + +import com.cheeeese.album.application.validator.AlbumValidator; +import com.cheeeese.album.domain.Album; +import com.cheeeese.photo.domain.Photo; +import com.cheeeese.photo.dto.response.PhotoInfoResponse; +import com.cheeeese.photo.exception.PhotoException; +import com.cheeeese.photo.exception.code.PhotoErrorCode; +import com.cheeeese.photo.infrastructure.mapper.PhotoMapper; +import com.cheeeese.photo.infrastructure.persistence.PhotoRepository; +import com.cheeeese.user.domain.User; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class PhotoInfoService { + + private final PhotoRepository photoRepository; + private final AlbumValidator albumValidator; + + public PhotoInfoResponse getPhotoInfo(User user, String code, Long photoId) { + Album album = albumValidator.validateAlbumCode(code); + + albumValidator.validateAlbumParticipant(album, user); + + Photo photo = photoRepository.findById(photoId) + .orElseThrow(() -> new PhotoException(PhotoErrorCode.PHOTO_NOT_FOUND)); + + return PhotoMapper.toPhotoInfoResponse(photo); + } +} diff --git a/src/main/java/com/cheeeese/photo/dto/response/PhotoInfoResponse.java b/src/main/java/com/cheeeese/photo/dto/response/PhotoInfoResponse.java new file mode 100644 index 0000000..049d317 --- /dev/null +++ b/src/main/java/com/cheeeese/photo/dto/response/PhotoInfoResponse.java @@ -0,0 +1,13 @@ +package com.cheeeese.photo.dto.response; + +import lombok.Builder; + +import java.time.LocalDateTime; + +@Builder +public record PhotoInfoResponse( + String name, + LocalDateTime captureTime, + LocalDateTime createdAt +) { +} diff --git a/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java b/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java index 4b08b89..1a10152 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java @@ -147,4 +147,12 @@ public static PhotoDetailResponse toPhotoDetailResponse( .isRecentlyDownloaded(isRecentlyDownloaded) .build(); } + + public static PhotoInfoResponse toPhotoInfoResponse(Photo photo) { + return PhotoInfoResponse.builder() + .name(photo.getUser().getName()) + .captureTime(photo.getCaptureTime()) + .createdAt(photo.getCreatedAt()) + .build(); + } } diff --git a/src/main/java/com/cheeeese/photo/presentation/PhotoQueryController.java b/src/main/java/com/cheeeese/photo/presentation/PhotoQueryController.java index 20ceae6..ebf187a 100644 --- a/src/main/java/com/cheeeese/photo/presentation/PhotoQueryController.java +++ b/src/main/java/com/cheeeese/photo/presentation/PhotoQueryController.java @@ -3,8 +3,10 @@ import com.cheeeese.album.domain.type.AlbumSorting; import com.cheeeese.global.common.CommonResponse; import com.cheeeese.global.util.CurrentUser; +import com.cheeeese.photo.application.PhotoInfoService; import com.cheeeese.photo.application.PhotoQueryService; import com.cheeeese.photo.dto.response.PhotoDetailResponse; +import com.cheeeese.photo.dto.response.PhotoInfoResponse; import com.cheeeese.photo.dto.response.PhotoLikedPageResponse; import com.cheeeese.photo.dto.response.PhotoPageResponse; import com.cheeeese.photo.presentation.swagger.PhotoQuerySwagger; @@ -20,6 +22,7 @@ public class PhotoQueryController implements PhotoQuerySwagger { private final PhotoQueryService photoQueryService; + private final PhotoInfoService photoInfoService; @Override @GetMapping("/{code}/photos") @@ -62,4 +65,16 @@ public CommonResponse getPhotoDetail( photoQueryService.getPhotoDetail(user, code, photoId) ); } + + @GetMapping("/{code}/photos/{photoId}/info") + public CommonResponse getPhotoInfo( + @CurrentUser User user, + @PathVariable String code, + @PathVariable Long photoId + ) { + return CommonResponse.success( + PHOTO_INFO_GET_SUCCESS, + photoInfoService.getPhotoInfo(user, code, photoId) + ); + } } From 6c2547632d94186ed23c2a324320ae28f4372b89 Mon Sep 17 00:00:00 2001 From: zyovn Date: Thu, 13 Nov 2025 00:57:21 +0900 Subject: [PATCH 251/402] =?UTF-8?q?#54=20feat:=20=EB=9D=B1=ED=95=9C=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=EC=9E=90=20=EB=AA=A9=EB=A1=9D=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../global/common/code/SuccessCode.java | 1 + .../photo/application/PhotoInfoService.java | 29 +++++++++++++++++++ .../dto/response/PhotoLikerResponse.java | 21 ++++++++++++++ .../infrastructure/mapper/PhotoMapper.java | 20 +++++++++++++ .../persistence/PhotoLikesRepository.java | 8 +++++ .../presentation/PhotoQueryController.java | 17 ++++++++--- 6 files changed, 92 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/cheeeese/photo/dto/response/PhotoLikerResponse.java diff --git a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java index 245de0d..f168743 100644 --- a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java +++ b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java @@ -37,6 +37,7 @@ public enum SuccessCode implements BaseCode { PHOTO_LIKES_CREATE_SUCCESS(HttpStatus.OK, "사진 좋아요 생성이 완료되었습니다."), PHOTO_LIKES_DELETE_SUCCESS(HttpStatus.OK, "사진 좋아요 삭제가 완료되었습니다."), PHOTO_INFO_GET_SUCCESS(HttpStatus.OK, "사진 정보 조회가 성공적으로 완료되었습니다."), + PHOTO_LIKERS_GET_SUCCESS(HttpStatus.OK, "띱한 사람 목록 조회가 성공적으로 완료되었습니다."), // cheese4cut CHEESE4CUT_GET_SUCCESS(HttpStatus.OK, "치즈네컷 조회가 성공적으로 완료되었습니다."), diff --git a/src/main/java/com/cheeeese/photo/application/PhotoInfoService.java b/src/main/java/com/cheeeese/photo/application/PhotoInfoService.java index c6b9eaf..9e54636 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoInfoService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoInfoService.java @@ -2,23 +2,31 @@ import com.cheeeese.album.application.validator.AlbumValidator; import com.cheeeese.album.domain.Album; +import com.cheeeese.album.domain.type.Role; +import com.cheeeese.global.security.CurrentUserProvider; import com.cheeeese.photo.domain.Photo; import com.cheeeese.photo.dto.response.PhotoInfoResponse; +import com.cheeeese.photo.dto.response.PhotoLikerResponse; import com.cheeeese.photo.exception.PhotoException; import com.cheeeese.photo.exception.code.PhotoErrorCode; import com.cheeeese.photo.infrastructure.mapper.PhotoMapper; +import com.cheeeese.photo.infrastructure.persistence.PhotoLikesRepository; import com.cheeeese.photo.infrastructure.persistence.PhotoRepository; import com.cheeeese.user.domain.User; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.List; + @Service @RequiredArgsConstructor @Transactional(readOnly = true) public class PhotoInfoService { + private final CurrentUserProvider currentUserProvider; private final PhotoRepository photoRepository; + private final PhotoLikesRepository photoLikesRepository; private final AlbumValidator albumValidator; public PhotoInfoResponse getPhotoInfo(User user, String code, Long photoId) { @@ -31,4 +39,25 @@ public PhotoInfoResponse getPhotoInfo(User user, String code, Long photoId) { return PhotoMapper.toPhotoInfoResponse(photo); } + + public PhotoLikerResponse getPhotoLikers(User user, String code, Long photoId) { + Album album = albumValidator.validateAlbumCode(code); + + albumValidator.validateAlbumParticipant(album, user); + + Photo photo = photoRepository.findById(photoId) + .orElseThrow(() -> new PhotoException(PhotoErrorCode.PHOTO_NOT_FOUND)); + + List users = photoLikesRepository.findLikersByPhotoId(photo.getId()); + + List likers = users.stream() + .map(userList -> { + boolean isMe = user.getId().equals(currentUserProvider.getCurrentUser().getId()); + Role role = user.getId().equals(album.getMakerId()) ? Role.MAKER : Role.GUEST; + return PhotoMapper.toPhotoLiker(user, isMe, role); + }) + .toList(); + + return PhotoMapper.toPhotoLikerResponse(photo, likers); + } } diff --git a/src/main/java/com/cheeeese/photo/dto/response/PhotoLikerResponse.java b/src/main/java/com/cheeeese/photo/dto/response/PhotoLikerResponse.java new file mode 100644 index 0000000..adb40d8 --- /dev/null +++ b/src/main/java/com/cheeeese/photo/dto/response/PhotoLikerResponse.java @@ -0,0 +1,21 @@ +package com.cheeeese.photo.dto.response; + +import com.cheeeese.album.domain.type.Role; +import lombok.Builder; + +import java.util.List; + +@Builder +public record PhotoLikerResponse( + int likeCnt, + List photoLikers +) { + + @Builder + public record PhotoLiker( + String name, + String profileImageUrl, + boolean isMe, + Role role + ) {} +} diff --git a/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java b/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java index 1a10152..21c0311 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java @@ -1,6 +1,7 @@ package com.cheeeese.photo.infrastructure.mapper; import com.cheeeese.album.domain.Album; +import com.cheeeese.album.domain.type.Role; import com.cheeeese.global.util.resolver.CdnUrlResolver; import com.cheeeese.photo.domain.Photo; import com.cheeeese.photo.domain.PhotoStatus; @@ -155,4 +156,23 @@ public static PhotoInfoResponse toPhotoInfoResponse(Photo photo) { .createdAt(photo.getCreatedAt()) .build(); } + + public static PhotoLikerResponse.PhotoLiker toPhotoLiker(User user, boolean isMe, Role role) { + return PhotoLikerResponse.PhotoLiker.builder() + .name(user.getName()) + .profileImageUrl(user.getProfileImage()) + .isMe(isMe) + .role(role) + .build(); + } + + public static PhotoLikerResponse toPhotoLikerResponse( + Photo photo, + List likers + ) { + return PhotoLikerResponse.builder() + .likeCnt(photo.getLikesCnt()) + .photoLikers(likers) + .build(); + } } diff --git a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoLikesRepository.java b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoLikesRepository.java index f5bf9b9..0c7ee47 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoLikesRepository.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoLikesRepository.java @@ -1,6 +1,7 @@ package com.cheeeese.photo.infrastructure.persistence; import com.cheeeese.photo.domain.PhotoLikes; +import com.cheeeese.user.domain.User; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; @@ -28,4 +29,11 @@ SELECT COUNT(DISTINCT pl.user.id) WHERE pl.photo.id IN :photoIds """) long countDistinctUserIdsByPhotoIds(@Param("photoIds") List photoIds); + + @Query(""" + SELECT pl.user + FROM PhotoLikes pl + WHERE pl.photo.id = :photoId + """) + List findLikersByPhotoId(@Param("photoId") Long photoId); } diff --git a/src/main/java/com/cheeeese/photo/presentation/PhotoQueryController.java b/src/main/java/com/cheeeese/photo/presentation/PhotoQueryController.java index ebf187a..00c9c7b 100644 --- a/src/main/java/com/cheeeese/photo/presentation/PhotoQueryController.java +++ b/src/main/java/com/cheeeese/photo/presentation/PhotoQueryController.java @@ -5,10 +5,7 @@ import com.cheeeese.global.util.CurrentUser; import com.cheeeese.photo.application.PhotoInfoService; import com.cheeeese.photo.application.PhotoQueryService; -import com.cheeeese.photo.dto.response.PhotoDetailResponse; -import com.cheeeese.photo.dto.response.PhotoInfoResponse; -import com.cheeeese.photo.dto.response.PhotoLikedPageResponse; -import com.cheeeese.photo.dto.response.PhotoPageResponse; +import com.cheeeese.photo.dto.response.*; import com.cheeeese.photo.presentation.swagger.PhotoQuerySwagger; import com.cheeeese.user.domain.User; import lombok.RequiredArgsConstructor; @@ -77,4 +74,16 @@ public CommonResponse getPhotoInfo( photoInfoService.getPhotoInfo(user, code, photoId) ); } + + @GetMapping("/{code}/photos/{photoId}/liker") + public CommonResponse getPhotoLikers( + @CurrentUser User user, + @PathVariable String code, + @PathVariable Long photoId + ) { + return CommonResponse.success( + PHOTO_LIKERS_GET_SUCCESS, + photoInfoService.getPhotoLikers(user, code, photoId) + ); + } } From d12b6931e5d7f94e8a37b650a15c852539d8f735 Mon Sep 17 00:00:00 2001 From: zyovn Date: Thu, 13 Nov 2025 01:19:09 +0900 Subject: [PATCH 252/402] =?UTF-8?q?#54=20fix:=20=EB=B2=A0=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=95=A8=EB=B2=94=EC=BB=B7=20=EC=A2=8B=EC=95=84?= =?UTF-8?q?=EC=9A=94=20=EC=88=98=20=EA=B0=99=EC=9D=84=20=EC=8B=9C=20?= =?UTF-8?q?=EC=B5=9C=EC=8B=A0=EC=88=9C=EC=9C=BC=EB=A1=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../infrastructure/persistence/PhotoRepository.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java index 09e97cd..c92f6ad 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java @@ -91,12 +91,12 @@ int updateStatusByIdsAndUserIdAndExpectedStatus( int updateStatusAndUrl(Long photoId, PhotoStatus expectedStatus, PhotoStatus newStatus, String thumbnailUrl); @Query(""" - SELECT p.id - FROM Photo p - WHERE p.album.id = :albumId - AND p.isDeleted = FALSE - AND p.status = :status - ORDER BY p.likesCnt DESC, p.createdAt ASC + SELECT p.id + FROM Photo p + WHERE p.album.id = :albumId + AND p.isDeleted = FALSE + AND p.status = :status + ORDER BY p.likesCnt DESC, p.createdAt DESC """) List findTop4CompletedPhotoIdsByLikes( @Param("albumId") Long albumId, From 1cad54eb6a5d1a0cfb8c1a03fd5077c64a3b5d30 Mon Sep 17 00:00:00 2001 From: zyovn Date: Thu, 13 Nov 2025 01:59:53 +0900 Subject: [PATCH 253/402] =?UTF-8?q?#54=20feat:=20=EC=95=A8=EB=B2=94=20?= =?UTF-8?q?=EB=B2=A0=EC=8A=A4=ED=8A=B8=20=EC=BB=B7=20=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../album/application/AlbumService.java | 5 ---- .../infrastructure/mapper/AlbumMapper.java | 9 +++++++ .../album/presentation/AlbumController.java | 1 - .../global/common/code/SuccessCode.java | 1 + .../photo/application/PhotoQueryService.java | 26 ++++++++++++++++++- .../dto/response/PhotoBest4CutResponse.java | 11 ++++++++ .../persistence/PhotoRepository.java | 18 +++++++++++-- .../presentation/PhotoQueryController.java | 14 ++++++++++ 8 files changed, 76 insertions(+), 9 deletions(-) create mode 100644 src/main/java/com/cheeeese/photo/dto/response/PhotoBest4CutResponse.java diff --git a/src/main/java/com/cheeeese/album/application/AlbumService.java b/src/main/java/com/cheeeese/album/application/AlbumService.java index ef42218..f1d583a 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumService.java +++ b/src/main/java/com/cheeeese/album/application/AlbumService.java @@ -247,9 +247,4 @@ private List buildSortedParticipan ) .toList(); } - - - - - } diff --git a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java index 62d0f3f..e6b39e5 100644 --- a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java +++ b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java @@ -4,6 +4,7 @@ import com.cheeeese.album.domain.type.AlbumJoinStatus; import com.cheeeese.album.dto.response.*; import com.cheeeese.photo.domain.Photo; +import com.cheeeese.photo.dto.response.PhotoBest4CutResponse; import com.cheeeese.user.domain.User; import java.time.LocalDate; @@ -144,4 +145,12 @@ public static UploadAvailableCountResponse toAvailableCountResponse( .currentPhotoCount(currentCount) .build(); } + + public static PhotoBest4CutResponse toBest4CutResponse(Photo photo, boolean isLiked) { + return PhotoBest4CutResponse.builder() + .thumbnailUrl(photo.getThumbnailUrl()) + .likeCnt(photo.getLikesCnt()) + .isLiked(isLiked) + .build(); + } } \ No newline at end of file diff --git a/src/main/java/com/cheeeese/album/presentation/AlbumController.java b/src/main/java/com/cheeeese/album/presentation/AlbumController.java index 3a8c7b2..982d52f 100644 --- a/src/main/java/com/cheeeese/album/presentation/AlbumController.java +++ b/src/main/java/com/cheeeese/album/presentation/AlbumController.java @@ -69,5 +69,4 @@ public CommonResponse getAlbumParticipants( albumService.getAlbumParticipantList(authentication, code) ); } - } \ No newline at end of file diff --git a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java index f168743..c0f7374 100644 --- a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java +++ b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java @@ -38,6 +38,7 @@ public enum SuccessCode implements BaseCode { PHOTO_LIKES_DELETE_SUCCESS(HttpStatus.OK, "사진 좋아요 삭제가 완료되었습니다."), PHOTO_INFO_GET_SUCCESS(HttpStatus.OK, "사진 정보 조회가 성공적으로 완료되었습니다."), PHOTO_LIKERS_GET_SUCCESS(HttpStatus.OK, "띱한 사람 목록 조회가 성공적으로 완료되었습니다."), + PHOTO_BEST4CUT_GET_SUCCESS(HttpStatus.OK, "베스트 앨범컷 조회가 성공적으로 완료되었습니다."), // cheese4cut CHEESE4CUT_GET_SUCCESS(HttpStatus.OK, "치즈네컷 조회가 성공적으로 완료되었습니다."), diff --git a/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java b/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java index 32f15ae..56672a2 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java @@ -1,9 +1,14 @@ package com.cheeeese.photo.application; +import com.cheeeese.album.application.validator.AlbumValidator; +import com.cheeeese.album.domain.Album; import com.cheeeese.album.domain.type.AlbumSorting; +import com.cheeeese.photo.dto.response.PhotoBest4CutResponse; +import com.cheeeese.album.infrastructure.mapper.AlbumMapper; import com.cheeeese.global.util.RedisCacheUtil; import com.cheeeese.global.util.resolver.CdnUrlResolver; import com.cheeeese.photo.domain.Photo; +import com.cheeeese.photo.domain.PhotoStatus; import com.cheeeese.photo.dto.response.*; import com.cheeeese.photo.exception.PhotoException; import com.cheeeese.photo.exception.code.PhotoErrorCode; @@ -20,7 +25,6 @@ import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; -import java.util.Comparator; import java.util.List; import java.util.Optional; import java.util.Set; @@ -33,6 +37,7 @@ public class PhotoQueryService { private final PhotoRepository photoRepository; private final PhotoLikesRepository photoLikesRepository; private final PhotoHistoryRepository photoHistoryRepository; + private final AlbumValidator albumValidator; private final RedisCacheUtil redisCacheUtil; private final CdnUrlResolver cdnUrlResolver; @@ -109,6 +114,25 @@ public PhotoDetailResponse getPhotoDetail(User user, String code, Long photoId) return PhotoMapper.toPhotoDetailResponse(photo, resolveOriginalUrl, resolveThumbnailUrl, isLiked, isDownloaded, isRecentlyDownloaded); } + public List getAlbumBest4Cut(User user, String code) { + Album album = albumValidator.validateAlbumCode(code); + + albumValidator.validateAlbumParticipant(album, user); + + List topPhotos = photoRepository.findTop4CompletedPhotosByLikes( + album.getId(), + PhotoStatus.COMPLETED, + PageRequest.of(0, 4) + ); + + return topPhotos.stream() + .map(photo -> { + boolean isLiked = photoLikesRepository.existsByUserIdAndPhotoId(user.getId(), photo.getId()); + return AlbumMapper.toBest4CutResponse(photo, isLiked); + }) + .toList(); + } + private PhotoPageResponse getPhotoPageFromDB(String code, int page, int size, AlbumSorting albumSorting) { PageRequest pageRequest = PageRequest.of(page, size, getPhotoSortingOption(albumSorting)); Slice photos = photoRepository.findAllByAlbumCode(code, pageRequest); diff --git a/src/main/java/com/cheeeese/photo/dto/response/PhotoBest4CutResponse.java b/src/main/java/com/cheeeese/photo/dto/response/PhotoBest4CutResponse.java new file mode 100644 index 0000000..47c13a9 --- /dev/null +++ b/src/main/java/com/cheeeese/photo/dto/response/PhotoBest4CutResponse.java @@ -0,0 +1,11 @@ +package com.cheeeese.photo.dto.response; + +import lombok.Builder; + +@Builder +public record PhotoBest4CutResponse( + String thumbnailUrl, + int likeCnt, + boolean isLiked +) { +} diff --git a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java index c92f6ad..f74da1a 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java @@ -59,8 +59,8 @@ Slice findLikedPhotosByAlbumAndUser( SELECT p FROM Photo p JOIN FETCH p.user - WHERE p.album.id = :albumId - AND p.isDeleted = FALSE + WHERE p.album.id = :albumId + AND p.isDeleted = FALSE AND p.status = :status ORDER BY p.createdAt DESC """) @@ -104,5 +104,19 @@ List findTop4CompletedPhotoIdsByLikes( Pageable pageable ); + @Query(""" + SELECT p.id + FROM Photo p + WHERE p.album.id = :albumId + AND p.isDeleted = FALSE + AND p.status = :status + ORDER BY p.likesCnt DESC, p.createdAt DESC + """) + List findTop4CompletedPhotosByLikes( + @Param("albumId") Long albumId, + @Param("status") PhotoStatus status, + Pageable pageable + ); + List findAllByIdIn(List photoIds); } diff --git a/src/main/java/com/cheeeese/photo/presentation/PhotoQueryController.java b/src/main/java/com/cheeeese/photo/presentation/PhotoQueryController.java index 00c9c7b..4afae3f 100644 --- a/src/main/java/com/cheeeese/photo/presentation/PhotoQueryController.java +++ b/src/main/java/com/cheeeese/photo/presentation/PhotoQueryController.java @@ -1,6 +1,7 @@ package com.cheeeese.photo.presentation; import com.cheeeese.album.domain.type.AlbumSorting; +import com.cheeeese.photo.dto.response.PhotoBest4CutResponse; import com.cheeeese.global.common.CommonResponse; import com.cheeeese.global.util.CurrentUser; import com.cheeeese.photo.application.PhotoInfoService; @@ -11,6 +12,8 @@ import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; +import java.util.List; + import static com.cheeeese.global.common.code.SuccessCode.*; @RestController @@ -86,4 +89,15 @@ public CommonResponse getPhotoLikers( photoInfoService.getPhotoLikers(user, code, photoId) ); } + + @GetMapping("/{code}/best-4cut") + public CommonResponse> getAlbumBest4Cut( + @CurrentUser User user, + @PathVariable String code + ) { + return CommonResponse.success( + PHOTO_BEST4CUT_GET_SUCCESS, + photoQueryService.getAlbumBest4Cut(user, code) + ); + } } From 0e9d083d8a05c3523ba943c3e9c465c0c645026d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Thu, 13 Nov 2025 02:11:13 +0900 Subject: [PATCH 254/402] =?UTF-8?q?#57=20fix:=20=EC=B5=9C=EC=8B=A0?= =?UTF-8?q?=EC=88=9C=20=EC=A1=B0=ED=9A=8C=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../photo/infrastructure/persistence/PhotoRepository.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java index 09e97cd..0b3fd91 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java @@ -96,7 +96,7 @@ int updateStatusByIdsAndUserIdAndExpectedStatus( WHERE p.album.id = :albumId AND p.isDeleted = FALSE AND p.status = :status - ORDER BY p.likesCnt DESC, p.createdAt ASC + ORDER BY p.likesCnt DESC, p.createdAt DESC """) List findTop4CompletedPhotoIdsByLikes( @Param("albumId") Long albumId, From 9371136b3ff1d9fcc132ce6825f4698524afcfd3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Thu, 13 Nov 2025 02:14:01 +0900 Subject: [PATCH 255/402] =?UTF-8?q?#57=20feat:=20Cheese4cutPhoto=20?= =?UTF-8?q?=EC=97=94=ED=8B=B0=ED=8B=B0=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cheese4cut/domain/Cheese4cutPhoto.java | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 src/main/java/com/cheeeese/cheese4cut/domain/Cheese4cutPhoto.java diff --git a/src/main/java/com/cheeeese/cheese4cut/domain/Cheese4cutPhoto.java b/src/main/java/com/cheeeese/cheese4cut/domain/Cheese4cutPhoto.java new file mode 100644 index 0000000..274998c --- /dev/null +++ b/src/main/java/com/cheeeese/cheese4cut/domain/Cheese4cutPhoto.java @@ -0,0 +1,48 @@ +package com.cheeeese.cheese4cut.domain; + +import com.cheeeese.global.domain.BaseEntity; +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Getter +@Table(name = "cheese4cut_photo") +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class Cheese4cutPhoto extends BaseEntity { + + @Id + @Column(name = "cheese4cut_photo_id", nullable = false) + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "cheese4cut_id", nullable = false) + private Cheese4cut cheese4cut; + + @Column(name = "photo_id", nullable = false) + private Long photoId; + + @Column(name = "image_url", columnDefinition = "TEXT", nullable = false) + private String imageUrl; + + @Column(name = "thumbnail_image_url", columnDefinition = "TEXT") + private String thumbnailImageUrl; + + @Column(name = "photo_rank", nullable = false) + private int photoRank; + + @Builder + private Cheese4cutPhoto(Long photoId, String imageUrl, String thumbnailImageUrl, int photoRank) { + this.photoId = photoId; + this.imageUrl = imageUrl; + this.thumbnailImageUrl = thumbnailImageUrl; + this.photoRank = photoRank; + } + + void assignToCheese4cut(Cheese4cut cheese4cut) { + this.cheese4cut = cheese4cut; + } +} From b31dd4da832d31c7b36423ed9b3463e0cca66685 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Thu, 13 Nov 2025 02:15:17 +0900 Subject: [PATCH 256/402] =?UTF-8?q?#57=20fix:=20redis=20repository=20?= =?UTF-8?q?=EB=A7=8C=EB=A3=8C=20=EA=B0=90=EC=A7=80=20=EC=84=A4=EA=B3=84=20?= =?UTF-8?q?sorted=20set=20=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AlbumExpirationRedisRepository.java | 65 ++++++++++--------- 1 file changed, 33 insertions(+), 32 deletions(-) diff --git a/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumExpirationRedisRepository.java b/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumExpirationRedisRepository.java index 4962348..936afa3 100644 --- a/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumExpirationRedisRepository.java +++ b/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumExpirationRedisRepository.java @@ -5,61 +5,62 @@ import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; -import java.time.Duration; +import java.time.LocalDateTime; +import java.time.ZoneOffset; import java.util.Collections; import java.util.Set; -import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @Component @RequiredArgsConstructor public class AlbumExpirationRedisRepository { - private static final String TRACKING_KEY = "expired:album:tracking"; - private static final Duration ALBUM_TTL = Duration.ofDays(7); + private static final String EXPIRATION_ZSET_KEY = "expired:album:zset"; + private static final ZoneOffset KST_ZONE = ZoneOffset.of("+09:00"); @Qualifier("cacheRedisTemplate") private final RedisTemplate cacheRedisTemplate; - public void registerAlbum(Long albumId) { - String key = buildAlbumKey(albumId); - cacheRedisTemplate.opsForValue().set(key, albumId.toString(), ALBUM_TTL); - cacheRedisTemplate.opsForSet().add(TRACKING_KEY, albumId.toString()); + /** + * ZSET에 앨범 ID와 만료 시간을 Score로 등록 + * Score는 Unix Timestamp(밀리초)로 사용 + * @param albumId 앨범 고유 ID + * @param expiredAt 앨범 만료 시각 (LocalDateTime) + */ + public void registerAlbum(Long albumId, LocalDateTime expiredAt) { + // LocalDateTime을 Unix Timestamp (ms)로 변환 + long expirationMillis = expiredAt.toInstant(KST_ZONE).toEpochMilli(); + + // ZADD key score member + cacheRedisTemplate.opsForZSet().add(EXPIRATION_ZSET_KEY, albumId.toString(), (double) expirationMillis); } - public Set getTrackedAlbumIds() { - Set members = cacheRedisTemplate.opsForSet().members(TRACKING_KEY); + /** + * 현재 시각을 기준으로 만료된 앨범 ID 목록만 ZSET에서 조회 (O(log N + k)) + * @return 만료된 앨범 ID Set + */ + public Set getExpiredAlbumIds() { + // 현재 시각의 Unix Timestamp (밀리초) + long currentTimestamp = LocalDateTime.now().toInstant(KST_ZONE).toEpochMilli(); + + // ZRANGEBYSCORE key min max: Score가 0부터 현재 시각까지인 모든 Member를 조회 + Set members = cacheRedisTemplate.opsForZSet().rangeByScore(EXPIRATION_ZSET_KEY, 0, currentTimestamp); + if (members == null || members.isEmpty()) { return Collections.emptySet(); } + return members.stream() .map(Object::toString) .map(Long::valueOf) .collect(Collectors.toSet()); } - public boolean isExpired(Long albumId) { - Long ttl = cacheRedisTemplate.getExpire(buildAlbumKey(albumId), TimeUnit.SECONDS); - if (ttl == null) { - return true; - } - - if (ttl == -2) { - return true; - } - - if (ttl == -1) { - return false; - } - - return ttl <= 0; - } - + /** + * ZSET에서 만료 처리된 앨범을 제거 (O(log N)) + * @param albumId 앨범 고유 ID + */ public void unregister(Long albumId) { - cacheRedisTemplate.opsForSet().remove(TRACKING_KEY, albumId.toString()); - } - - private String buildAlbumKey(Long albumId) { - return "expired:album:" + albumId; + cacheRedisTemplate.opsForZSet().remove(EXPIRATION_ZSET_KEY, albumId.toString()); } } From 4a06c1e35a3c45fbd3b164c3d6a3f11aa89501e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Thu, 13 Nov 2025 02:16:33 +0900 Subject: [PATCH 257/402] =?UTF-8?q?#57=20fix:=20=EC=8A=A4=EC=BC=80?= =?UTF-8?q?=EC=A4=84=EB=9F=AC=2010=EC=B4=88=20=EB=B3=80=EA=B2=BD=20?= =?UTF-8?q?=EB=B0=8F=20redis=20=EC=84=A4=EC=A0=95=20=EB=B3=80=EA=B2=BD?= =?UTF-8?q?=EC=97=90=20=EB=94=B0=EB=A5=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../album/application/AlbumExpirationScheduler.java | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/cheeeese/album/application/AlbumExpirationScheduler.java b/src/main/java/com/cheeeese/album/application/AlbumExpirationScheduler.java index 97af695..f0af29a 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumExpirationScheduler.java +++ b/src/main/java/com/cheeeese/album/application/AlbumExpirationScheduler.java @@ -16,19 +16,15 @@ public class AlbumExpirationScheduler { private final AlbumExpirationRedisRepository albumExpirationRedisRepository; private final AlbumExpirationService albumExpirationService; - @Scheduled(fixedDelay = 1000L) + @Scheduled(fixedDelay = 10000L) public void handleAlbumExpirations() { - Set trackedAlbumIds = albumExpirationRedisRepository.getTrackedAlbumIds(); + Set expiredAlbumIds = albumExpirationRedisRepository.getExpiredAlbumIds(); - if (trackedAlbumIds.isEmpty()) { + if (expiredAlbumIds.isEmpty()) { return; } - for (Long albumId : trackedAlbumIds) { - if (!albumExpirationRedisRepository.isExpired(albumId)) { - continue; - } - + for (Long albumId : expiredAlbumIds) { try { albumExpirationService.expireAlbum(albumId); albumExpirationRedisRepository.unregister(albumId); From 6a123e9f1cc3263eb5c370fcbc0dc4b83b352932 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Thu, 13 Nov 2025 02:18:19 +0900 Subject: [PATCH 258/402] =?UTF-8?q?#57=20fix:=20Cheese4cut=20=EC=97=94?= =?UTF-8?q?=ED=8B=B0=ED=8B=B0=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cheese4cut/domain/Cheese4cut.java | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/cheeeese/cheese4cut/domain/Cheese4cut.java b/src/main/java/com/cheeeese/cheese4cut/domain/Cheese4cut.java index f97a6f9..b169ed9 100644 --- a/src/main/java/com/cheeeese/cheese4cut/domain/Cheese4cut.java +++ b/src/main/java/com/cheeeese/cheese4cut/domain/Cheese4cut.java @@ -3,12 +3,12 @@ import com.cheeeese.album.domain.Album; import com.cheeeese.global.domain.BaseEntity; import jakarta.persistence.*; -import jakarta.validation.constraints.Size; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; +import java.util.ArrayList; import java.util.List; @Entity @@ -26,17 +26,22 @@ public class Cheese4cut extends BaseEntity { @JoinColumn(name = "album_id", nullable = false, unique = true) private Album album; - @ElementCollection - @CollectionTable(name = "cheese4cut_photos", joinColumns = @JoinColumn(name = "cheese4cut_id")) - @Column(name = "photo_id", nullable = false) - @Size(min = 4, max = 4) - private List photoIds; + @OneToMany(mappedBy = "cheese4cut", cascade = CascadeType.ALL, orphanRemoval = true) + @OrderBy("photoRank ASC") + private List photos = new ArrayList<>(); @Builder - private Cheese4cut(Album album, List photoIds) { + private Cheese4cut(Album album, List photos) { this.album = album; - this.photoIds = photoIds; + if (photos != null) { + photos.forEach(this::addPhoto); + } + } + + private void addPhoto(Cheese4cutPhoto photo) { + photo.assignToCheese4cut(this); + this.photos.add(photo); } } From 8a831afa7b049fe38c6b83a9539ba8f40d2c96c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Thu, 13 Nov 2025 02:19:06 +0900 Subject: [PATCH 259/402] =?UTF-8?q?#57=20fix:=20Cheese4cutFinalResponse=20?= =?UTF-8?q?=EA=B5=AC=EC=A1=B0=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 확정된 사진 4장 제공 --- .../dto/response/Cheese4cutFinalResponse.java | 25 +++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/cheeeese/cheese4cut/dto/response/Cheese4cutFinalResponse.java b/src/main/java/com/cheeeese/cheese4cut/dto/response/Cheese4cutFinalResponse.java index d07204a..602d1c0 100644 --- a/src/main/java/com/cheeeese/cheese4cut/dto/response/Cheese4cutFinalResponse.java +++ b/src/main/java/com/cheeeese/cheese4cut/dto/response/Cheese4cutFinalResponse.java @@ -3,10 +3,31 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Builder; +import java.util.List; + @Builder -@Schema(description = "치즈네컷 확정 완료 응답 DTO (최종 프레임 이미지)") +@Schema(description = "치즈네컷 확정 완료 응답 DTO (선정된 사진 4장)") public record Cheese4cutFinalResponse( @Schema(description = "확정 여부 (항상 true)", example = "true") - boolean isFinalized + boolean isFinalized, + + @Schema(description = "확정된 사진 정보 목록 (정확히 4개)") + List photos ) implements Cheese4cutResponse { + + @Builder + @Schema(description = "확정된 사진 정보") + public record FinalPhotoInfo( + @Schema(description = "원본 사진 ID", example = "101") + Long photoId, + + @Schema(description = "사진 원본 URL", example = "https://cdn.cheeeese.com/album/1/original/101.jpg") + String imageUrl, + + @Schema(description = "사진 썸네일 URL", example = "https://cdn.cheeeese.com/album/1/thumbnail/101.jpg") + String thumbnailImageUrl, + + @Schema(description = "선정 순위 (1~4)", example = "1") + int photoRank + ) {} } From 5fdd1fc565629e77ff0d0021450a3cd5c4bb2ae3 Mon Sep 17 00:00:00 2001 From: zyovn Date: Thu, 13 Nov 2025 02:39:13 +0900 Subject: [PATCH 260/402] =?UTF-8?q?#54=20fix:=20=EC=8D=B8=EB=84=A4?= =?UTF-8?q?=EC=9D=BC=20=EC=83=9D=EC=84=B1=20=EC=8B=9C,=20=EC=BA=90?= =?UTF-8?q?=EC=8B=9C=20=EB=AC=B4=ED=9A=A8=ED=99=94=EB=A1=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../photo/application/PhotoCallbackService.java | 4 ++++ .../photo/application/PhotoQueryService.java | 2 +- .../cheeeese/photo/application/PhotoService.java | 2 -- .../persistence/PhotoRepository.java | 15 ++++++++++++++- 4 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/cheeeese/photo/application/PhotoCallbackService.java b/src/main/java/com/cheeeese/photo/application/PhotoCallbackService.java index b0ecd7e..6f20975 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoCallbackService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoCallbackService.java @@ -15,6 +15,7 @@ public class PhotoCallbackService { private final PhotoRepository photoRepository; + private final PhotoQueryService photoQueryService; public void markUploadCompleted(PhotoCompleteRequest request) { int updated = photoRepository.updateStatusAndUrl( @@ -27,5 +28,8 @@ public void markUploadCompleted(PhotoCompleteRequest request) { if (updated == 0) { throw new PhotoException(PhotoErrorCode.THUMBNAIL_UPDATE_FAILED); } + + String albumCode = photoRepository.findAlbumCodeByPhotoId(request.photoId()); + photoQueryService.invalidatePhotoCache(albumCode); } } diff --git a/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java b/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java index 56672a2..8779f80 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java @@ -135,7 +135,7 @@ public List getAlbumBest4Cut(User user, String code) { private PhotoPageResponse getPhotoPageFromDB(String code, int page, int size, AlbumSorting albumSorting) { PageRequest pageRequest = PageRequest.of(page, size, getPhotoSortingOption(albumSorting)); - Slice photos = photoRepository.findAllByAlbumCode(code, pageRequest); + Slice photos = photoRepository.findAllByAlbumCodeAndStatus(code, PhotoStatus.COMPLETED, pageRequest); return PhotoMapper.toPhotoPageResponse(photos, cdnUrlResolver); } diff --git a/src/main/java/com/cheeeese/photo/application/PhotoService.java b/src/main/java/com/cheeeese/photo/application/PhotoService.java index 99f5b3f..6859011 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoService.java @@ -79,8 +79,6 @@ public PhotoPresignedUrlResponse createPresignedUrls(User user, PhotoPresignedUr List presignedUrls = generatePresignedUrls(user, album, request.fileInfos()); - photoQueryService.invalidatePhotoCache(album.getCode()); - return PhotoMapper.toPresignedUrlResponse(presignedUrls); } diff --git a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java index f74da1a..544829f 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java @@ -21,8 +21,14 @@ public interface PhotoRepository extends JpaRepository { FROM Photo p JOIN p.album a WHERE a.code = :code + AND p.isDeleted = FALSE + AND p.status = :status """) - Slice findAllByAlbumCode(@Param("code") String code, Pageable pageable); + Slice findAllByAlbumCodeAndStatus( + @Param("code") String code, + @Param("status") PhotoStatus status, + Pageable pageable + ); @Query(""" SELECT p @@ -119,4 +125,11 @@ List findTop4CompletedPhotosByLikes( ); List findAllByIdIn(List photoIds); + + @Query(""" + SELECT p.album.code + FROM Photo p + WHERE p.id = :photoId + """) + String findAlbumCodeByPhotoId(@Param("photoId") Long photoId); } From 6caa5dd4a9c796073097926569af30f840714d8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Thu, 13 Nov 2025 02:41:55 +0900 Subject: [PATCH 261/402] =?UTF-8?q?#57=20feat:=20=EC=B9=98=EC=A6=88?= =?UTF-8?q?=EB=84=A4=EC=BB=B7=20=EC=A1=B0=ED=9A=8C=EC=8B=9C=20=EC=9D=BC?= =?UTF-8?q?=EA=B4=84=20=EC=82=AC=EC=A7=84=204=EC=9E=A5=20=EC=A0=9C?= =?UTF-8?q?=EA=B3=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/AlbumExpirationService.java | 23 +++++++-- .../album/application/AlbumService.java | 8 ++-- .../application/Cheese4cutService.java | 48 ++++++++++++------- .../mapper/Cheese4cutMapper.java | 40 +++++++++------- .../persistence/PhotoRepository.java | 9 ++++ 5 files changed, 87 insertions(+), 41 deletions(-) diff --git a/src/main/java/com/cheeeese/album/application/AlbumExpirationService.java b/src/main/java/com/cheeeese/album/application/AlbumExpirationService.java index a75d7c3..7090773 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumExpirationService.java +++ b/src/main/java/com/cheeeese/album/application/AlbumExpirationService.java @@ -4,9 +4,9 @@ import com.cheeeese.album.exception.AlbumException; import com.cheeeese.album.exception.code.AlbumErrorCode; import com.cheeeese.album.infrastructure.persistence.AlbumRepository; -import com.cheeeese.cheese4cut.domain.Cheese4cut; import com.cheeeese.cheese4cut.infrastructure.mapper.Cheese4cutMapper; import com.cheeeese.cheese4cut.infrastructure.persistence.Cheese4cutRepository; +import com.cheeeese.photo.domain.Photo; import com.cheeeese.photo.domain.PhotoStatus; import com.cheeeese.photo.infrastructure.persistence.PhotoRepository; import lombok.RequiredArgsConstructor; @@ -16,6 +16,10 @@ import org.springframework.transaction.annotation.Transactional; import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.function.Function; +import java.util.stream.Collectors; @Slf4j @Service @@ -23,7 +27,6 @@ public class AlbumExpirationService { private static final int CHEESE4CUT_PHOTO_COUNT = 4; - // TODO: 최종 프레임 백엔드에서 저장안함에 따라 photo 4장만 저장 private final AlbumRepository albumRepository; private final PhotoRepository photoRepository; @@ -58,9 +61,21 @@ public void expireAlbum(Long albumId) { return; } - Cheese4cut cheese4cut = Cheese4cutMapper.toEntity(album, topPhotoIds); + List photos = photoRepository.findAllByIdIn(topPhotoIds); + Map photoMap = photos.stream() + .collect(Collectors.toMap(Photo::getId, Function.identity())); + + List orderedPhotos = topPhotoIds.stream() + .map(photoMap::get) + .collect(Collectors.toList()); + + if (orderedPhotos.stream().anyMatch(Objects::isNull)) { + log.warn("[AlbumExpiration] Album id={} has missing photos for cheese4cut creation", albumId); + return; + } + + cheese4cutRepository.save(Cheese4cutMapper.toEntity(album, orderedPhotos)); - cheese4cutRepository.save(cheese4cut); log.info("[AlbumExpiration] Cheese4cut created automatically for album id={}", albumId); } } \ No newline at end of file diff --git a/src/main/java/com/cheeeese/album/application/AlbumService.java b/src/main/java/com/cheeeese/album/application/AlbumService.java index d7d2364..9860ab9 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumService.java +++ b/src/main/java/com/cheeeese/album/application/AlbumService.java @@ -10,8 +10,8 @@ import com.cheeeese.album.exception.code.AlbumErrorCode; import com.cheeeese.album.infrastructure.mapper.AlbumMapper; import com.cheeeese.album.infrastructure.mapper.UserAlbumMapper; -import com.cheeeese.album.infrastructure.persistence.AlbumRepository; import com.cheeeese.album.infrastructure.persistence.AlbumExpirationRedisRepository; +import com.cheeeese.album.infrastructure.persistence.AlbumRepository; import com.cheeeese.global.security.CustomUserDetails; import com.cheeeese.photo.application.PhotoService; import com.cheeeese.album.domain.UserAlbum; @@ -59,6 +59,8 @@ public AlbumCreationResponse createAlbum(User user, AlbumCreationRequest request albumValidator.validateAlbumCreation(request); + LocalDateTime expiredAt = LocalDateTime.now().plusDays(7); + Album album = AlbumMapper.toEntity( user.getId(), request.title(), @@ -67,7 +69,7 @@ public AlbumCreationResponse createAlbum(User user, AlbumCreationRequest request request.participant(), request.eventDate(), true, - LocalDateTime.now().plusDays(7) + expiredAt ); albumRepository.save(album); @@ -77,7 +79,7 @@ public AlbumCreationResponse createAlbum(User user, AlbumCreationRequest request Role.MAKER )); - albumExpirationRedisRepository.registerAlbum(album.getId()); + albumExpirationRedisRepository.registerAlbum(album.getId(), expiredAt); return AlbumMapper.toCreationResponse(album); } diff --git a/src/main/java/com/cheeeese/cheese4cut/application/Cheese4cutService.java b/src/main/java/com/cheeeese/cheese4cut/application/Cheese4cutService.java index ef22431..38b720d 100644 --- a/src/main/java/com/cheeeese/cheese4cut/application/Cheese4cutService.java +++ b/src/main/java/com/cheeeese/cheese4cut/application/Cheese4cutService.java @@ -51,9 +51,8 @@ public Cheese4cutResponse getCheese4cutByAlbumCode(String code) { Optional cheese4cutOptional = cheese4cutRepository.findByAlbumId(album.getId()); - // TODO: 최종 확정된 4장의 photo 제공으로 변경 if (cheese4cutOptional.isPresent()) { - return Cheese4cutMapper.toFinalResponse(); + return Cheese4cutMapper.toFinalResponse(cheese4cutOptional.get()); } return getPreviewResponse(album.getId(), album.getParticipant()); @@ -70,20 +69,7 @@ private Cheese4cutResponse getPreviewResponse(Long albumId, int participant) { throw new Cheese4cutException(Cheese4cutErrorCode.INSUFFICIENT_COUNT_FOR_CHEESE4CUT); } - List topPhotos = photoRepository.findAllById(topPhotoIds); - - Map photoMap = topPhotos.stream() - .collect(Collectors.toMap(Photo::getId, Function.identity())); - - List orderedPhotos = topPhotoIds.stream() - .map(photoId -> { - Photo photo = photoMap.get(photoId); - if (photo == null) { - throw new Cheese4cutException(Cheese4cutErrorCode.INSUFFICIENT_COUNT_FOR_CHEESE4CUT); - } - return photo; - }) - .toList(); + List orderedPhotos = getOrderedPhotos(topPhotoIds); long uniqueLikesCount = photoLikesRepository.countDistinctUserIdsByPhotoIds(topPhotoIds); @@ -115,8 +101,34 @@ public void finalizeCheese4cut(User user, String code, Cheese4cutFixedRequest re cheese4cutValidator.validateFinalizePhotos(album, request.photoIds()); - Cheese4cut cheese4cut = Cheese4cutMapper.toEntity(album, request); + List orderedPhotos = + photoRepository.findAllByIdInOrderByLikesDescCreatedDesc(request.photoIds()); + + if (orderedPhotos.size() != request.photoIds().size()) + throw new Cheese4cutException(Cheese4cutErrorCode.INSUFFICIENT_COUNT_FOR_CHEESE4CUT); + + cheese4cutRepository.save(Cheese4cutMapper.toEntity(album, orderedPhotos)); + } - cheese4cutRepository.save(cheese4cut); + private List getOrderedPhotos(List photoIds) { + List photos = photoRepository.findAllByIdIn(photoIds); + + Map photoMap = photos.stream() + .collect(Collectors.toMap(Photo::getId, Function.identity())); + + List orderedPhotos = photoIds.stream() + .map(photoId -> { + Photo photo = photoMap.get(photoId); + if (photo == null) { + throw new Cheese4cutException(Cheese4cutErrorCode.INSUFFICIENT_COUNT_FOR_CHEESE4CUT); + } + return photo; + }) + .toList(); + + if (orderedPhotos.size() != photoIds.size()) { + throw new Cheese4cutException(Cheese4cutErrorCode.INSUFFICIENT_COUNT_FOR_CHEESE4CUT); + } + return orderedPhotos; } } diff --git a/src/main/java/com/cheeeese/cheese4cut/infrastructure/mapper/Cheese4cutMapper.java b/src/main/java/com/cheeeese/cheese4cut/infrastructure/mapper/Cheese4cutMapper.java index ecfcd01..5416843 100644 --- a/src/main/java/com/cheeeese/cheese4cut/infrastructure/mapper/Cheese4cutMapper.java +++ b/src/main/java/com/cheeeese/cheese4cut/infrastructure/mapper/Cheese4cutMapper.java @@ -2,7 +2,7 @@ import com.cheeeese.album.domain.Album; import com.cheeeese.cheese4cut.domain.Cheese4cut; -import com.cheeeese.cheese4cut.dto.request.Cheese4cutFixedRequest; +import com.cheeeese.cheese4cut.domain.Cheese4cutPhoto; import com.cheeeese.cheese4cut.dto.response.Cheese4cutFinalResponse; import com.cheeeese.cheese4cut.dto.response.Cheese4cutPresignedUrlResponse; import com.cheeeese.cheese4cut.dto.response.Cheese4cutPreviewResponse; @@ -10,6 +10,7 @@ import java.util.List; import java.util.stream.Collectors; +import java.util.stream.IntStream; public class Cheese4cutMapper { @@ -18,10 +19,17 @@ private Cheese4cutMapper() {} /** * 확정 후 응답 (Cheese4cut 엔티티 기반) */ - // TODO: 프레임 이미지 제거에 따른 응답 형식 수정하기 - public static Cheese4cutFinalResponse toFinalResponse() { + public static Cheese4cutFinalResponse toFinalResponse(Cheese4cut cheese4cut) { return Cheese4cutFinalResponse.builder() .isFinalized(true) + .photos(cheese4cut.getPhotos().stream() + .map(photo -> Cheese4cutFinalResponse.FinalPhotoInfo.builder() + .photoId(photo.getPhotoId()) + .imageUrl(photo.getImageUrl()) + .thumbnailImageUrl(photo.getThumbnailImageUrl()) + .photoRank(photo.getPhotoRank()) + .build()) + .collect(Collectors.toList())) .build(); } @@ -49,22 +57,22 @@ public static Cheese4cutPreviewResponse toPreviewResponse( } /** - * 사용자가 직접 확정할 때 요청 DTO 기반 엔티티 변환 + * 확정 시 (좋아요 TOP4 또는 사용자가 선택한 사진 목록 기반) */ - public static Cheese4cut toEntity(Album album, Cheese4cutFixedRequest request) { + public static Cheese4cut toEntity(Album album, List orderedPhotos) { return Cheese4cut.builder() .album(album) - .photoIds(request.photoIds()) - .build(); - } - - /** - * 만료 자동 확정 시 (top4 사진 및 기본 프레임 기반) - */ - public static Cheese4cut toEntity(Album album, List photoIds) { - return Cheese4cut.builder() - .album(album) - .photoIds(photoIds) + .photos(IntStream.range(0, orderedPhotos.size()) + .mapToObj(index -> { + Photo photo = orderedPhotos.get(index); + return Cheese4cutPhoto.builder() + .photoId(photo.getId()) + .imageUrl(photo.getImageUrl()) + .thumbnailImageUrl(photo.getThumbnailUrl()) + .photoRank(index + 1) + .build(); + }) + .collect(Collectors.toList())) .build(); } diff --git a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java index 0b3fd91..81d1399 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java @@ -105,4 +105,13 @@ List findTop4CompletedPhotoIdsByLikes( ); List findAllByIdIn(List photoIds); + + @Query(""" + SELECT p + FROM Photo p + WHERE p.id IN :photoIds + AND p.isDeleted = FALSE + ORDER BY p.likesCnt DESC, p.createdAt DESC, p.id DESC + """) + List findAllByIdInOrderByLikesDescCreatedDesc(@Param("photoIds") List photoIds); } From 0989d80110f75c4a1f7eebe001077a5a0ad68fbb Mon Sep 17 00:00:00 2001 From: zyovn Date: Thu, 13 Nov 2025 10:25:23 +0900 Subject: [PATCH 262/402] =?UTF-8?q?#54=20fix:=20cdn=20url=20=ED=8C=8C?= =?UTF-8?q?=EC=8B=B1=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cheeeese/global/util/resolver/CdnUrlResolver.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/com/cheeeese/global/util/resolver/CdnUrlResolver.java b/src/main/java/com/cheeeese/global/util/resolver/CdnUrlResolver.java index f59d9cb..39cbfd8 100644 --- a/src/main/java/com/cheeeese/global/util/resolver/CdnUrlResolver.java +++ b/src/main/java/com/cheeeese/global/util/resolver/CdnUrlResolver.java @@ -30,6 +30,9 @@ public String resolveCut(String path) { private String resolve(String domain, String path) { if (path == null || path.isBlank()) return null; if (path.startsWith("http")) return path; + if (path.startsWith("say-cheeeese/")) { + path = path.substring("say-cheeeese/".length()); + } if (path.startsWith("/")) path = path.substring(1); return domain + "/" + path; } From 112468027a75d99fc1cb4f68b1468441fc0b2355 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Thu, 13 Nov 2025 10:33:35 +0900 Subject: [PATCH 263/402] =?UTF-8?q?#57=20fix:=20=EC=B9=98=EC=A6=88?= =?UTF-8?q?=EB=84=A4=EC=BB=B7=20=EC=A1=B0=ED=9A=8C=20response=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cheese4cut/dto/response/Cheese4cutFinalResponse.java | 3 --- .../cheese4cut/dto/response/Cheese4cutPreviewResponse.java | 5 ++++- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/cheeeese/cheese4cut/dto/response/Cheese4cutFinalResponse.java b/src/main/java/com/cheeeese/cheese4cut/dto/response/Cheese4cutFinalResponse.java index 602d1c0..86a052c 100644 --- a/src/main/java/com/cheeeese/cheese4cut/dto/response/Cheese4cutFinalResponse.java +++ b/src/main/java/com/cheeeese/cheese4cut/dto/response/Cheese4cutFinalResponse.java @@ -24,9 +24,6 @@ public record FinalPhotoInfo( @Schema(description = "사진 원본 URL", example = "https://cdn.cheeeese.com/album/1/original/101.jpg") String imageUrl, - @Schema(description = "사진 썸네일 URL", example = "https://cdn.cheeeese.com/album/1/thumbnail/101.jpg") - String thumbnailImageUrl, - @Schema(description = "선정 순위 (1~4)", example = "1") int photoRank ) {} diff --git a/src/main/java/com/cheeeese/cheese4cut/dto/response/Cheese4cutPreviewResponse.java b/src/main/java/com/cheeeese/cheese4cut/dto/response/Cheese4cutPreviewResponse.java index d13827c..f077a04 100644 --- a/src/main/java/com/cheeeese/cheese4cut/dto/response/Cheese4cutPreviewResponse.java +++ b/src/main/java/com/cheeeese/cheese4cut/dto/response/Cheese4cutPreviewResponse.java @@ -28,6 +28,9 @@ public record PreviewPhotoInfo( Long photoId, @Schema(description = "사진 원본 URL", example = "https://cdn.cheeeese.com/album/1/original/101.jpg") - String imageUrl + String imageUrl, + + @Schema(description = "선정 순위 (1~4)", example = "1") + int photoRank ) {} } From 91a16213cd8e6ce25a907e8dbf0d9a02b58cbf22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Thu, 13 Nov 2025 10:34:24 +0900 Subject: [PATCH 264/402] =?UTF-8?q?#57=20feat:=20cdnResolver=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/Cheese4cutService.java | 29 +++++++++++++- .../mapper/Cheese4cutMapper.java | 40 +++++++++++-------- 2 files changed, 50 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/cheeeese/cheese4cut/application/Cheese4cutService.java b/src/main/java/com/cheeeese/cheese4cut/application/Cheese4cutService.java index 38b720d..5e58a7f 100644 --- a/src/main/java/com/cheeeese/cheese4cut/application/Cheese4cutService.java +++ b/src/main/java/com/cheeeese/cheese4cut/application/Cheese4cutService.java @@ -8,12 +8,15 @@ import com.cheeeese.cheese4cut.application.validator.Cheese4cutValidator; import com.cheeeese.cheese4cut.domain.Cheese4cut; import com.cheeeese.cheese4cut.dto.request.Cheese4cutFixedRequest; +import com.cheeeese.cheese4cut.dto.response.Cheese4cutFinalResponse; import com.cheeeese.cheese4cut.dto.response.Cheese4cutPresignedUrlResponse; +import com.cheeeese.cheese4cut.dto.response.Cheese4cutPreviewResponse; import com.cheeeese.cheese4cut.dto.response.Cheese4cutResponse; import com.cheeeese.cheese4cut.exception.Cheese4cutException; import com.cheeeese.cheese4cut.exception.code.Cheese4cutErrorCode; import com.cheeeese.cheese4cut.infrastructure.mapper.Cheese4cutMapper; import com.cheeeese.cheese4cut.infrastructure.persistence.Cheese4cutRepository; +import com.cheeeese.global.util.resolver.CdnUrlResolver; import com.cheeeese.photo.application.PresignedUrlService; import com.cheeeese.photo.domain.Photo; import com.cheeeese.photo.domain.PhotoStatus; @@ -30,6 +33,7 @@ import java.util.Optional; import java.util.function.Function; import java.util.stream.Collectors; +import java.util.stream.IntStream; @Service @RequiredArgsConstructor @@ -43,6 +47,7 @@ public class Cheese4cutService { private final AlbumValidator albumValidator; private final PresignedUrlService presignedUrlService; private final Cheese4cutValidator cheese4cutValidator; + private final CdnUrlResolver cdnUrlResolver; @Transactional(readOnly = true) public Cheese4cutResponse getCheese4cutByAlbumCode(String code) { @@ -52,7 +57,17 @@ public Cheese4cutResponse getCheese4cutByAlbumCode(String code) { Optional cheese4cutOptional = cheese4cutRepository.findByAlbumId(album.getId()); if (cheese4cutOptional.isPresent()) { - return Cheese4cutMapper.toFinalResponse(cheese4cutOptional.get()); + Cheese4cut cheese4cut = cheese4cutOptional.get(); + + List photos = cheese4cut.getPhotos().stream() + .map(p -> Cheese4cutMapper.toFinalPhotoInfo( + p.getPhotoId(), + cdnUrlResolver.resolveOriginal(p.getImageUrl()), + p.getPhotoRank() + )) + .toList(); + + return Cheese4cutMapper.toFinalResponse(photos); } return getPreviewResponse(album.getId(), album.getParticipant()); @@ -73,7 +88,17 @@ private Cheese4cutResponse getPreviewResponse(Long albumId, int participant) { long uniqueLikesCount = photoLikesRepository.countDistinctUserIdsByPhotoIds(topPhotoIds); - return Cheese4cutMapper.toPreviewResponse(orderedPhotos, uniqueLikesCount, participant); + List resolvedPhotoInfos = + IntStream.range(0, orderedPhotos.size()) + .mapToObj(index -> { + Photo p = orderedPhotos.get(index); + return Cheese4cutMapper.toPreviewPhotoInfo( + p.getId(), cdnUrlResolver.resolveOriginal(p.getImageUrl()), index+1 + ); + }) + .toList(); + + return Cheese4cutMapper.toPreviewResponse(resolvedPhotoInfos, uniqueLikesCount, participant); } @Transactional(readOnly = true) diff --git a/src/main/java/com/cheeeese/cheese4cut/infrastructure/mapper/Cheese4cutMapper.java b/src/main/java/com/cheeeese/cheese4cut/infrastructure/mapper/Cheese4cutMapper.java index 5416843..68afe02 100644 --- a/src/main/java/com/cheeeese/cheese4cut/infrastructure/mapper/Cheese4cutMapper.java +++ b/src/main/java/com/cheeeese/cheese4cut/infrastructure/mapper/Cheese4cutMapper.java @@ -19,17 +19,10 @@ private Cheese4cutMapper() {} /** * 확정 후 응답 (Cheese4cut 엔티티 기반) */ - public static Cheese4cutFinalResponse toFinalResponse(Cheese4cut cheese4cut) { + public static Cheese4cutFinalResponse toFinalResponse(List photos) { return Cheese4cutFinalResponse.builder() .isFinalized(true) - .photos(cheese4cut.getPhotos().stream() - .map(photo -> Cheese4cutFinalResponse.FinalPhotoInfo.builder() - .photoId(photo.getPhotoId()) - .imageUrl(photo.getImageUrl()) - .thumbnailImageUrl(photo.getThumbnailImageUrl()) - .photoRank(photo.getPhotoRank()) - .build()) - .collect(Collectors.toList())) + .photos(photos) .build(); } @@ -37,17 +30,10 @@ public static Cheese4cutFinalResponse toFinalResponse(Cheese4cut cheese4cut) { * 확정 전 응답 (좋아요 TOP 4 사진 목록 기반) */ public static Cheese4cutPreviewResponse toPreviewResponse( - List topPhotos, + List photoInfos, long uniqueLikesCount, int participant ) { - List photoInfos = topPhotos.stream() - .map(photo -> Cheese4cutPreviewResponse.PreviewPhotoInfo.builder() - .photoId(photo.getId()) - .imageUrl(photo.getImageUrl()) - .build()) - .collect(Collectors.toList()); - return Cheese4cutPreviewResponse.builder() .isFinalized(false) .previewPhotos(photoInfos) @@ -80,4 +66,24 @@ public static Cheese4cutPresignedUrlResponse toPresignedUrlResponse(String uploa return Cheese4cutPresignedUrlResponse.builder() .uploadUrl(uploadUrl).build(); } + + public static Cheese4cutFinalResponse.FinalPhotoInfo toFinalPhotoInfo( + Long photoId, String imageUrl, int rank) { + + return Cheese4cutFinalResponse.FinalPhotoInfo.builder() + .photoId(photoId) + .imageUrl(imageUrl) + .photoRank(rank) + .build(); + } + + public static Cheese4cutPreviewResponse.PreviewPhotoInfo toPreviewPhotoInfo( + Long photoId, String imageUrl, int rank) { + return Cheese4cutPreviewResponse.PreviewPhotoInfo.builder() + .photoId(photoId) + .imageUrl(imageUrl) + .photoRank(rank) + .build(); + } + } From 0134ae42eee75135d78a35acb1b4eb9e66114f20 Mon Sep 17 00:00:00 2001 From: zyovn Date: Thu, 13 Nov 2025 10:46:29 +0900 Subject: [PATCH 265/402] =?UTF-8?q?#54=20refactor:=20=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20API=20response=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cheeeese/photo/dto/response/PhotoLikedResponse.java | 6 ++++++ .../com/cheeeese/photo/dto/response/PhotoListResponse.java | 6 ++++++ .../cheeeese/photo/infrastructure/mapper/PhotoMapper.java | 6 +++++- 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/cheeeese/photo/dto/response/PhotoLikedResponse.java b/src/main/java/com/cheeeese/photo/dto/response/PhotoLikedResponse.java index 3254348..ff6b1ae 100644 --- a/src/main/java/com/cheeeese/photo/dto/response/PhotoLikedResponse.java +++ b/src/main/java/com/cheeeese/photo/dto/response/PhotoLikedResponse.java @@ -6,9 +6,15 @@ @Builder @Schema(description = "내가 띱한 사진 목록 조회 API") public record PhotoLikedResponse( + @Schema(description = "사진 업로더 이름", example = "주정빈") + String name, + @Schema(description = "사진 ID", example = "1") Long photoId, + @Schema(description = "사진 원본 url", example = "example.jpg") + String imageUrl, + @Schema(description = "사진 썸네일 url", example = "example.jpg") String thumbnailUrl, diff --git a/src/main/java/com/cheeeese/photo/dto/response/PhotoListResponse.java b/src/main/java/com/cheeeese/photo/dto/response/PhotoListResponse.java index 351a5cf..10378bc 100644 --- a/src/main/java/com/cheeeese/photo/dto/response/PhotoListResponse.java +++ b/src/main/java/com/cheeeese/photo/dto/response/PhotoListResponse.java @@ -6,9 +6,15 @@ @Builder(toBuilder = true) @Schema(description = "사진 목록 조회 API") public record PhotoListResponse( + @Schema(description = "사진 업로더 이름", example = "주정빈") + String name, + @Schema(description = "사진 ID", example = "1") Long photoId, + @Schema(description = "사진 원본 url", example = "example.jpg") + String imageUrl, + @Schema(description = "사진 썸네일 url", example = "example.jpg") String thumbnailUrl, diff --git a/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java b/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java index 21c0311..6c174fd 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java @@ -70,7 +70,9 @@ public static PhotoListResponse toPhotoListResponse( boolean isDownloaded ) { return PhotoListResponse.builder() + .name(photo.getUser().getName()) .photoId(photo.getId()) + .imageUrl(photo.getImageUrl()) .thumbnailUrl(thumbnailUrl) .likeCnt(photo.getLikesCnt()) .isLiked(isLiked) @@ -85,7 +87,9 @@ public static PhotoLikedResponse toPhotoLikedResponse( boolean isRecentlyDownloaded ) { return PhotoLikedResponse.builder() + .name(photo.getUser().getName()) .photoId(photo.getId()) + .imageUrl(photo.getImageUrl()) .thumbnailUrl(thumbnailUrl) .isDownloaded(isDownloaded) .isRecentlyDownloaded(isRecentlyDownloaded) @@ -95,7 +99,7 @@ public static PhotoLikedResponse toPhotoLikedResponse( public static PhotoPageResponse toPhotoPageResponse(Slice photos, CdnUrlResolver cdnUrlResolver) { List responses = photos.getContent().stream() .map(photo -> { - String resolvedUrl = cdnUrlResolver.resolveThumbnail(photo.getThumbnailUrl()); + String resolvedUrl = cdnUrlResolver.resolveThumbnail(photo.getThumbnailUrl()); // TODO: SRP 위반 return PhotoMapper.toPhotoListResponse(photo, resolvedUrl, false, false); }) .toList(); From 0358caa4819c70bdd7d852a8dca061d307bdc355 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Thu, 13 Nov 2025 11:01:41 +0900 Subject: [PATCH 266/402] =?UTF-8?q?#57=20fix:=20album=20=EC=83=81=ED=83=9C?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD=20=EB=B0=A9=EC=8B=9D=EC=9D=84=20update=20?= =?UTF-8?q?=EC=BF=BC=EB=A6=AC=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cheeeese/album/application/AlbumExpirationService.java | 2 +- src/main/java/com/cheeeese/album/domain/Album.java | 4 ---- .../album/infrastructure/persistence/AlbumRepository.java | 5 +++++ 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/cheeeese/album/application/AlbumExpirationService.java b/src/main/java/com/cheeeese/album/application/AlbumExpirationService.java index 7090773..6d6772e 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumExpirationService.java +++ b/src/main/java/com/cheeeese/album/application/AlbumExpirationService.java @@ -38,7 +38,7 @@ public void expireAlbum(Long albumId) { .orElseThrow(() -> new AlbumException(AlbumErrorCode.ALBUM_NOT_FOUND)); if (album.getStatus() != Album.AlbumStatus.EXPIRED) { - album.expire(); + albumRepository.updateStatus(albumId, Album.AlbumStatus.EXPIRED); log.info("[AlbumExpiration] Album id={} status updated to EXPIRED", albumId); } diff --git a/src/main/java/com/cheeeese/album/domain/Album.java b/src/main/java/com/cheeeese/album/domain/Album.java index 9fb9ece..c236aea 100644 --- a/src/main/java/com/cheeeese/album/domain/Album.java +++ b/src/main/java/com/cheeeese/album/domain/Album.java @@ -66,10 +66,6 @@ public boolean isExpired() { return this.expiredAt.isBefore(LocalDateTime.now()) || this.status == AlbumStatus.EXPIRED; } - public void expire() { - this.status = AlbumStatus.EXPIRED; - } - @Builder private Album( Long makerId, diff --git a/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumRepository.java b/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumRepository.java index 631c589..0e45073 100644 --- a/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumRepository.java +++ b/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumRepository.java @@ -38,4 +38,9 @@ long countByUserAndCreatedAtBetween( @Modifying(clearAutomatically = true, flushAutomatically = true) @Query("UPDATE Album a SET a.currentPhotoCount = a.currentPhotoCount - :count WHERE a.id = :albumId AND a.currentPhotoCount >= :count") int decrementPhotoCount(@Param("albumId") Long albumId, @Param("count") int count); + + @Modifying + @Query("UPDATE Album a SET a.status = :status WHERE a.id = :id AND a.status <> :status") + void updateStatus(Long id, Album.AlbumStatus status); + } From e7f3324919d710d7b63825d39812c59cc479da62 Mon Sep 17 00:00:00 2001 From: zyovn Date: Thu, 13 Nov 2025 16:48:08 +0900 Subject: [PATCH 267/402] =?UTF-8?q?#54=20feat:=20=EC=95=A8=EB=B2=94=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../album/application/AlbumService.java | 11 +++++++++++ .../album/dto/response/AlbumInfoResponse.java | 19 +++++++++++++++++++ .../album/presentation/AlbumController.java | 12 ++++++++++++ .../presentation/swagger/AlbumSwagger.java | 19 +++++++++++++++++++ .../photo/application/PhotoInfoService.java | 13 +------------ .../photo/dto/response/PhotoInfoResponse.java | 13 ------------- .../infrastructure/mapper/PhotoMapper.java | 15 ++++++++++----- .../presentation/PhotoQueryController.java | 13 +------------ 8 files changed, 73 insertions(+), 42 deletions(-) create mode 100644 src/main/java/com/cheeeese/album/dto/response/AlbumInfoResponse.java delete mode 100644 src/main/java/com/cheeeese/photo/dto/response/PhotoInfoResponse.java diff --git a/src/main/java/com/cheeeese/album/application/AlbumService.java b/src/main/java/com/cheeeese/album/application/AlbumService.java index f1d583a..39c6057 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumService.java +++ b/src/main/java/com/cheeeese/album/application/AlbumService.java @@ -17,6 +17,9 @@ import com.cheeeese.album.domain.UserAlbum; import com.cheeeese.album.infrastructure.persistence.UserAlbumRepository; import com.cheeeese.photo.domain.Photo; +import com.cheeeese.photo.exception.PhotoException; +import com.cheeeese.photo.exception.code.PhotoErrorCode; +import com.cheeeese.photo.infrastructure.mapper.PhotoMapper; import com.cheeeese.user.domain.User; import com.cheeeese.user.exception.UserException; import com.cheeeese.user.exception.code.UserErrorCode; @@ -180,6 +183,14 @@ public AlbumParticipantResponse getAlbumParticipantList(Authentication authentic ); } + public AlbumInfoResponse getAlbumInfo(User user, String code) { + Album album = albumValidator.validateAlbumCode(code); + + albumValidator.validateAlbumParticipant(album, user); + + return PhotoMapper.toAlbumInfoResponse(album); + } + private User extractUser(Authentication authentication) { if (authentication == null || authentication instanceof AnonymousAuthenticationToken) { return null; diff --git a/src/main/java/com/cheeeese/album/dto/response/AlbumInfoResponse.java b/src/main/java/com/cheeeese/album/dto/response/AlbumInfoResponse.java new file mode 100644 index 0000000..9f913e9 --- /dev/null +++ b/src/main/java/com/cheeeese/album/dto/response/AlbumInfoResponse.java @@ -0,0 +1,19 @@ +package com.cheeeese.album.dto.response; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Builder; + +import java.time.LocalDate; + +@Builder +@Schema(description = "앨범 정보 API") +public record AlbumInfoResponse( + Long makerId, + String title, + String themeEmoji, + int participant, + int currentParticipant, + LocalDate eventDate, + int currentPhotoCnt +) { +} diff --git a/src/main/java/com/cheeeese/album/presentation/AlbumController.java b/src/main/java/com/cheeeese/album/presentation/AlbumController.java index 982d52f..4cf4529 100644 --- a/src/main/java/com/cheeeese/album/presentation/AlbumController.java +++ b/src/main/java/com/cheeeese/album/presentation/AlbumController.java @@ -69,4 +69,16 @@ public CommonResponse getAlbumParticipants( albumService.getAlbumParticipantList(authentication, code) ); } + + @Override + @GetMapping("/{code}/info") + public CommonResponse getAlbumInfo( + @CurrentUser User user, + @PathVariable String code + ) { + return CommonResponse.success( + PHOTO_INFO_GET_SUCCESS, + albumService.getAlbumInfo(user, code) + ); + } } \ No newline at end of file diff --git a/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java b/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java index e15b42e..d6304bf 100644 --- a/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java +++ b/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java @@ -254,4 +254,23 @@ CommonResponse getAlbumParticipants( Authentication authentication, @PathVariable String code ); + + @Operation( + summary = "앨범 정보 조회 API", + description = """ + ### PathVariable + --- + - `code`: 앨범 코드 + """ + ) + @ApiResponses(value = { + @ApiResponse( + responseCode = "200", + description = "앨범 정보 조회가 성공적으로 실행되었습니다." + ) + }) + CommonResponse getAlbumInfo( + @CurrentUser User user, + @PathVariable String code + ); } \ No newline at end of file diff --git a/src/main/java/com/cheeeese/photo/application/PhotoInfoService.java b/src/main/java/com/cheeeese/photo/application/PhotoInfoService.java index 9e54636..7dda953 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoInfoService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoInfoService.java @@ -5,7 +5,7 @@ import com.cheeeese.album.domain.type.Role; import com.cheeeese.global.security.CurrentUserProvider; import com.cheeeese.photo.domain.Photo; -import com.cheeeese.photo.dto.response.PhotoInfoResponse; +import com.cheeeese.album.dto.response.AlbumInfoResponse; import com.cheeeese.photo.dto.response.PhotoLikerResponse; import com.cheeeese.photo.exception.PhotoException; import com.cheeeese.photo.exception.code.PhotoErrorCode; @@ -29,17 +29,6 @@ public class PhotoInfoService { private final PhotoLikesRepository photoLikesRepository; private final AlbumValidator albumValidator; - public PhotoInfoResponse getPhotoInfo(User user, String code, Long photoId) { - Album album = albumValidator.validateAlbumCode(code); - - albumValidator.validateAlbumParticipant(album, user); - - Photo photo = photoRepository.findById(photoId) - .orElseThrow(() -> new PhotoException(PhotoErrorCode.PHOTO_NOT_FOUND)); - - return PhotoMapper.toPhotoInfoResponse(photo); - } - public PhotoLikerResponse getPhotoLikers(User user, String code, Long photoId) { Album album = albumValidator.validateAlbumCode(code); diff --git a/src/main/java/com/cheeeese/photo/dto/response/PhotoInfoResponse.java b/src/main/java/com/cheeeese/photo/dto/response/PhotoInfoResponse.java deleted file mode 100644 index 049d317..0000000 --- a/src/main/java/com/cheeeese/photo/dto/response/PhotoInfoResponse.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.cheeeese.photo.dto.response; - -import lombok.Builder; - -import java.time.LocalDateTime; - -@Builder -public record PhotoInfoResponse( - String name, - LocalDateTime captureTime, - LocalDateTime createdAt -) { -} diff --git a/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java b/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java index 6c174fd..1d25af8 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java @@ -2,6 +2,7 @@ import com.cheeeese.album.domain.Album; import com.cheeeese.album.domain.type.Role; +import com.cheeeese.album.dto.response.AlbumInfoResponse; import com.cheeeese.global.util.resolver.CdnUrlResolver; import com.cheeeese.photo.domain.Photo; import com.cheeeese.photo.domain.PhotoStatus; @@ -153,11 +154,15 @@ public static PhotoDetailResponse toPhotoDetailResponse( .build(); } - public static PhotoInfoResponse toPhotoInfoResponse(Photo photo) { - return PhotoInfoResponse.builder() - .name(photo.getUser().getName()) - .captureTime(photo.getCaptureTime()) - .createdAt(photo.getCreatedAt()) + public static AlbumInfoResponse toAlbumInfoResponse(Album album) { + return AlbumInfoResponse.builder() + .title(album.getTitle()) + .makerId(album.getMakerId()) + .themeEmoji(album.getThemeEmoji()) + .participant(album.getParticipant()) + .currentParticipant(album.getCurrentParticipant()) + .eventDate(album.getEventDate()) + .currentPhotoCnt(album.getCurrentPhotoCount()) .build(); } diff --git a/src/main/java/com/cheeeese/photo/presentation/PhotoQueryController.java b/src/main/java/com/cheeeese/photo/presentation/PhotoQueryController.java index 4afae3f..ecfcef9 100644 --- a/src/main/java/com/cheeeese/photo/presentation/PhotoQueryController.java +++ b/src/main/java/com/cheeeese/photo/presentation/PhotoQueryController.java @@ -1,6 +1,7 @@ package com.cheeeese.photo.presentation; import com.cheeeese.album.domain.type.AlbumSorting; +import com.cheeeese.album.dto.response.AlbumInfoResponse; import com.cheeeese.photo.dto.response.PhotoBest4CutResponse; import com.cheeeese.global.common.CommonResponse; import com.cheeeese.global.util.CurrentUser; @@ -66,18 +67,6 @@ public CommonResponse getPhotoDetail( ); } - @GetMapping("/{code}/photos/{photoId}/info") - public CommonResponse getPhotoInfo( - @CurrentUser User user, - @PathVariable String code, - @PathVariable Long photoId - ) { - return CommonResponse.success( - PHOTO_INFO_GET_SUCCESS, - photoInfoService.getPhotoInfo(user, code, photoId) - ); - } - @GetMapping("/{code}/photos/{photoId}/liker") public CommonResponse getPhotoLikers( @CurrentUser User user, From f39f8154267dde75a5718962652f72e68f3a6648 Mon Sep 17 00:00:00 2001 From: zyovn Date: Thu, 13 Nov 2025 16:52:50 +0900 Subject: [PATCH 268/402] =?UTF-8?q?#54=20chore:=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20import=EB=AC=B8=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/cheeeese/album/application/AlbumService.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/com/cheeeese/album/application/AlbumService.java b/src/main/java/com/cheeeese/album/application/AlbumService.java index 39c6057..e7456ef 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumService.java +++ b/src/main/java/com/cheeeese/album/application/AlbumService.java @@ -17,8 +17,6 @@ import com.cheeeese.album.domain.UserAlbum; import com.cheeeese.album.infrastructure.persistence.UserAlbumRepository; import com.cheeeese.photo.domain.Photo; -import com.cheeeese.photo.exception.PhotoException; -import com.cheeeese.photo.exception.code.PhotoErrorCode; import com.cheeeese.photo.infrastructure.mapper.PhotoMapper; import com.cheeeese.user.domain.User; import com.cheeeese.user.exception.UserException; From c5f17d5688f59872d587785a0924fe762694f8f2 Mon Sep 17 00:00:00 2001 From: zyovn Date: Thu, 13 Nov 2025 17:13:19 +0900 Subject: [PATCH 269/402] =?UTF-8?q?#54=20docs:=20swagger=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../album/dto/response/AlbumInfoResponse.java | 13 ++++++ .../presentation/swagger/AlbumSwagger.java | 2 +- .../dto/response/PhotoBest4CutResponse.java | 7 +++ .../dto/response/PhotoLikerResponse.java | 37 +++++++++++++++ .../presentation/PhotoQueryController.java | 2 + .../swagger/PhotoQuerySwagger.java | 46 +++++++++++++++++-- 6 files changed, 103 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/cheeeese/album/dto/response/AlbumInfoResponse.java b/src/main/java/com/cheeeese/album/dto/response/AlbumInfoResponse.java index 9f913e9..25ecb9e 100644 --- a/src/main/java/com/cheeeese/album/dto/response/AlbumInfoResponse.java +++ b/src/main/java/com/cheeeese/album/dto/response/AlbumInfoResponse.java @@ -8,12 +8,25 @@ @Builder @Schema(description = "앨범 정보 API") public record AlbumInfoResponse( + @Schema(description = "생성자 ID", example = "1") Long makerId, + + @Schema(description = "앨범 제목", example = "김수한무거북이") String title, + + @Schema(description = "테마 이모지", example = "이모이모") String themeEmoji, + + @Schema(description = "참여 가능 인원 수", example = "64") int participant, + + @Schema(description = "현재 참여자 수", example = "30") int currentParticipant, + + @Schema(description = "이벤트 날짜", example = "2025-02-01") LocalDate eventDate, + + @Schema(description = "현재 사진 수", example = "1212") int currentPhotoCnt ) { } diff --git a/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java b/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java index d6304bf..5003f4d 100644 --- a/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java +++ b/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java @@ -260,7 +260,7 @@ CommonResponse getAlbumParticipants( description = """ ### PathVariable --- - - `code`: 앨범 코드 + `code`: 앨범 코드 """ ) @ApiResponses(value = { diff --git a/src/main/java/com/cheeeese/photo/dto/response/PhotoBest4CutResponse.java b/src/main/java/com/cheeeese/photo/dto/response/PhotoBest4CutResponse.java index 47c13a9..18f7d75 100644 --- a/src/main/java/com/cheeeese/photo/dto/response/PhotoBest4CutResponse.java +++ b/src/main/java/com/cheeeese/photo/dto/response/PhotoBest4CutResponse.java @@ -1,11 +1,18 @@ package com.cheeeese.photo.dto.response; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Builder; @Builder +@Schema(description = "베스트 앨범컷 조회 API") public record PhotoBest4CutResponse( + @Schema(description = "썸네일 이미지 url", example = "https://cdn.say-cheese.me/...") String thumbnailUrl, + + @Schema(description = "좋아요 수", example = "1") int likeCnt, + + @Schema(description = "좋아요 여부", example = "true") boolean isLiked ) { } diff --git a/src/main/java/com/cheeeese/photo/dto/response/PhotoLikerResponse.java b/src/main/java/com/cheeeese/photo/dto/response/PhotoLikerResponse.java index adb40d8..4ec2db1 100644 --- a/src/main/java/com/cheeeese/photo/dto/response/PhotoLikerResponse.java +++ b/src/main/java/com/cheeeese/photo/dto/response/PhotoLikerResponse.java @@ -1,21 +1,58 @@ package com.cheeeese.photo.dto.response; import com.cheeeese.album.domain.type.Role; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Builder; import java.util.List; @Builder +@Schema(description = "띱한 사람 목록 API") public record PhotoLikerResponse( + @Schema(description = "사진 좋아요 총 개수", example = "12") int likeCnt, + + @Schema( + description = "사진을 좋아한 사용자 목록", + example = """ + [ + { + "name": "홍길동", + "profileImageUrl": "https://cdn.cheeeese.me/profile/hong.jpg", + "isMe": false, + "role": "GUEST" + }, + { + "name": "정빈", + "profileImageUrl": "https://cdn.cheeeese.me/profile/jb.jpg", + "isMe": true, + "role": "MAKER" + } + ] + """ + ) List photoLikers ) { @Builder + @Schema(description = "띱한 사용자 정보") public record PhotoLiker( + @Schema(description = "사용자 이름", example = "홍길동") String name, + + @Schema( + description = "사용자 프로필 이미지 URL", + example = "https://cdn.cheeeese.me/profile/hong.jpg" + ) String profileImageUrl, + + @Schema(description = "현재 로그인한 사용자 여부", example = "false") boolean isMe, + + @Schema( + description = "해당 사진이 속한 앨범에서의 역할", + example = "GUEST" + ) Role role ) {} } diff --git a/src/main/java/com/cheeeese/photo/presentation/PhotoQueryController.java b/src/main/java/com/cheeeese/photo/presentation/PhotoQueryController.java index ecfcef9..0c1c024 100644 --- a/src/main/java/com/cheeeese/photo/presentation/PhotoQueryController.java +++ b/src/main/java/com/cheeeese/photo/presentation/PhotoQueryController.java @@ -67,6 +67,7 @@ public CommonResponse getPhotoDetail( ); } + @Override @GetMapping("/{code}/photos/{photoId}/liker") public CommonResponse getPhotoLikers( @CurrentUser User user, @@ -79,6 +80,7 @@ public CommonResponse getPhotoLikers( ); } + @Override @GetMapping("/{code}/best-4cut") public CommonResponse> getAlbumBest4Cut( @CurrentUser User user, diff --git a/src/main/java/com/cheeeese/photo/presentation/swagger/PhotoQuerySwagger.java b/src/main/java/com/cheeeese/photo/presentation/swagger/PhotoQuerySwagger.java index 3751bff..d79a7e7 100644 --- a/src/main/java/com/cheeeese/photo/presentation/swagger/PhotoQuerySwagger.java +++ b/src/main/java/com/cheeeese/photo/presentation/swagger/PhotoQuerySwagger.java @@ -3,9 +3,7 @@ import com.cheeeese.album.domain.type.AlbumSorting; import com.cheeeese.global.common.CommonResponse; import com.cheeeese.global.util.CurrentUser; -import com.cheeeese.photo.dto.response.PhotoDetailResponse; -import com.cheeeese.photo.dto.response.PhotoLikedPageResponse; -import com.cheeeese.photo.dto.response.PhotoPageResponse; +import com.cheeeese.photo.dto.response.*; import com.cheeeese.user.domain.User; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.responses.ApiResponse; @@ -14,6 +12,8 @@ import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestParam; +import java.util.List; + @Tag(name = "[사진 조회]", description = "사진 조회 관련 API") public interface PhotoQuerySwagger { @Operation( @@ -90,4 +90,44 @@ CommonResponse getPhotoDetail( @PathVariable String code, @PathVariable Long photoId ); + + @Operation( + summary = "띱한 사용자 목록 조회 API", + description = """ + ### PathVariable + --- + `code`: 앨범 코드 (String) \n + `photoId`: 사진 고유 ID (Long) + """ + ) + @ApiResponses(value = { + @ApiResponse( + responseCode = "200", + description = "띱한 사용자 목록 조회가 성공적으로 실행되었습니다." + ) + }) + CommonResponse getPhotoLikers( + @CurrentUser User user, + @PathVariable String code, + @PathVariable Long photoId + ); + + @Operation( + summary = "앨범 내 베스트컷 (좋아요순 사진 4개) 조회 API", + description = """ + ### PathVariable + --- + `code`: 앨범 코드 (String) + """ + ) + @ApiResponses(value = { + @ApiResponse( + responseCode = "200", + description = "앨범 내 베스트컷 조회가 성공적으로 실행되었습니다." + ) + }) + CommonResponse> getAlbumBest4Cut( + @CurrentUser User user, + @PathVariable String code + ); } From 6aef2e35b6a4cce943d1c3917b1507be0e9c72ba Mon Sep 17 00:00:00 2001 From: zyovn Date: Thu, 13 Nov 2025 17:13:57 +0900 Subject: [PATCH 270/402] =?UTF-8?q?#54=20fix:=20=EC=95=A8=EB=B2=94=20?= =?UTF-8?q?=EC=B5=9C=EB=8C=80=20=EC=82=AC=EC=A7=84=20=EA=B0=9C=EC=88=98=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cheeeese/album/infrastructure/mapper/AlbumMapper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java index e6b39e5..208fb95 100644 --- a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java +++ b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java @@ -34,7 +34,7 @@ public static Album toEntity( .participant(participant) .currentParticipant(1) .eventDate(eventDate) - .maxPhotoCount(10) + .maxPhotoCount(100) .currentPhotoCount(0) .isInfoAvailable(isInfoAvailable) .expiredAt(expiredAt) From 32ed3d405df2e020c8a0c82286addebf044f3a37 Mon Sep 17 00:00:00 2001 From: zyovn Date: Thu, 13 Nov 2025 17:17:40 +0900 Subject: [PATCH 271/402] =?UTF-8?q?#54=20chore:=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20import=EB=AC=B8=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cheeeese/photo/application/PhotoInfoService.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/cheeeese/photo/application/PhotoInfoService.java b/src/main/java/com/cheeeese/photo/application/PhotoInfoService.java index 7dda953..75a17db 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoInfoService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoInfoService.java @@ -5,7 +5,6 @@ import com.cheeeese.album.domain.type.Role; import com.cheeeese.global.security.CurrentUserProvider; import com.cheeeese.photo.domain.Photo; -import com.cheeeese.album.dto.response.AlbumInfoResponse; import com.cheeeese.photo.dto.response.PhotoLikerResponse; import com.cheeeese.photo.exception.PhotoException; import com.cheeeese.photo.exception.code.PhotoErrorCode; From 87e5f23452803fcc92128136d93ebb01dc4acb57 Mon Sep 17 00:00:00 2001 From: zyovn Date: Thu, 13 Nov 2025 17:29:39 +0900 Subject: [PATCH 272/402] =?UTF-8?q?#54=20fix:=20=EC=82=AC=EC=A7=84=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=20=EC=A0=95=EB=B3=B4=20response=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20=EB=B0=8F=20=EC=8A=A4=ED=82=A4=EB=A7=88=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../photo/dto/response/PhotoDetailResponse.java | 12 ++++++++++-- .../photo/dto/response/PhotoLikedPageResponse.java | 2 ++ .../photo/dto/response/PhotoPageResponse.java | 2 ++ .../photo/infrastructure/mapper/PhotoMapper.java | 2 ++ 4 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/cheeeese/photo/dto/response/PhotoDetailResponse.java b/src/main/java/com/cheeeese/photo/dto/response/PhotoDetailResponse.java index 15df716..2d1ba69 100644 --- a/src/main/java/com/cheeeese/photo/dto/response/PhotoDetailResponse.java +++ b/src/main/java/com/cheeeese/photo/dto/response/PhotoDetailResponse.java @@ -3,10 +3,12 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Builder; +import java.time.LocalDateTime; + @Builder @Schema(description = "사진 상세 조회 API") public record PhotoDetailResponse( - @Schema(description = "사용자 이름", example = "주정빈") + @Schema(description = "업로더 이름", example = "주정빈") String name, @Schema(description = "사진 ID", example = "1") @@ -28,6 +30,12 @@ public record PhotoDetailResponse( boolean isDownloaded, @Schema(description = "1시간 이내 다운로드 여부", example = "false") - boolean isRecentlyDownloaded + boolean isRecentlyDownloaded, + + @Schema(description = "촬영 시각", example = "2025-01-13T14:23:45") + LocalDateTime captureTime, + + @Schema(description = "업로드 시각", example = "2025-01-13T14:23:45") + LocalDateTime createdAt ) { } diff --git a/src/main/java/com/cheeeese/photo/dto/response/PhotoLikedPageResponse.java b/src/main/java/com/cheeeese/photo/dto/response/PhotoLikedPageResponse.java index ee299cb..dbe84d7 100644 --- a/src/main/java/com/cheeeese/photo/dto/response/PhotoLikedPageResponse.java +++ b/src/main/java/com/cheeeese/photo/dto/response/PhotoLikedPageResponse.java @@ -13,7 +13,9 @@ public record PhotoLikedPageResponse( example = """ [ { + "name" 주정빈 "photoId": 1, + "imageUrl": "https://cdn.cheeeese.me/original.jpg", "thumbnailUrl": "https://cdn.cheeeese.me/thumb1.jpg", "isDownloaded": false, "isRecentlyDownloaded": false diff --git a/src/main/java/com/cheeeese/photo/dto/response/PhotoPageResponse.java b/src/main/java/com/cheeeese/photo/dto/response/PhotoPageResponse.java index 3bb482a..f52e5ed 100644 --- a/src/main/java/com/cheeeese/photo/dto/response/PhotoPageResponse.java +++ b/src/main/java/com/cheeeese/photo/dto/response/PhotoPageResponse.java @@ -13,7 +13,9 @@ public record PhotoPageResponse( example = """ [ { + "name" 주정빈, "photoId": 1, + "imageUrl": "https://cdn.cheeeese.me/original.jpg", "thumbnailUrl": "https://cdn.cheeeese.me/thumb1.jpg", "likesCnt": 1, "isLiked": true, diff --git a/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java b/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java index 1d25af8..3b5e88d 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java @@ -151,6 +151,8 @@ public static PhotoDetailResponse toPhotoDetailResponse( .isLiked(isLiked) .isDownloaded(isDownloaded) .isRecentlyDownloaded(isRecentlyDownloaded) + .captureTime(photo.getCaptureTime()) + .createdAt(photo.getCreatedAt()) .build(); } From ff55261f4e1a7d74af9d323b37dccda283d32564 Mon Sep 17 00:00:00 2001 From: zyovn Date: Thu, 13 Nov 2025 17:34:30 +0900 Subject: [PATCH 273/402] =?UTF-8?q?#54=20fix:=20response=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cheeeese/album/dto/response/AlbumInfoResponse.java | 2 +- .../java/com/cheeeese/photo/dto/response/PhotoPageResponse.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/cheeeese/album/dto/response/AlbumInfoResponse.java b/src/main/java/com/cheeeese/album/dto/response/AlbumInfoResponse.java index 25ecb9e..d7bc69e 100644 --- a/src/main/java/com/cheeeese/album/dto/response/AlbumInfoResponse.java +++ b/src/main/java/com/cheeeese/album/dto/response/AlbumInfoResponse.java @@ -14,7 +14,7 @@ public record AlbumInfoResponse( @Schema(description = "앨범 제목", example = "김수한무거북이") String title, - @Schema(description = "테마 이모지", example = "이모이모") + @Schema(description = "테마 이모지", example = "U+1F9C0") String themeEmoji, @Schema(description = "참여 가능 인원 수", example = "64") diff --git a/src/main/java/com/cheeeese/photo/dto/response/PhotoPageResponse.java b/src/main/java/com/cheeeese/photo/dto/response/PhotoPageResponse.java index f52e5ed..8d7efed 100644 --- a/src/main/java/com/cheeeese/photo/dto/response/PhotoPageResponse.java +++ b/src/main/java/com/cheeeese/photo/dto/response/PhotoPageResponse.java @@ -13,7 +13,7 @@ public record PhotoPageResponse( example = """ [ { - "name" 주정빈, + "name": "주정빈", "photoId": 1, "imageUrl": "https://cdn.cheeeese.me/original.jpg", "thumbnailUrl": "https://cdn.cheeeese.me/thumb1.jpg", From 88ae482d8a1de99d0c063e6329c727116986f328 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Thu, 13 Nov 2025 21:35:24 +0900 Subject: [PATCH 274/402] =?UTF-8?q?#57=20feat:=20=EC=B9=98=EC=A6=88?= =?UTF-8?q?=EB=84=A4=EC=BB=B7=20=EC=A1=B0=ED=9A=8C=EC=8B=9C=20=EC=95=A8?= =?UTF-8?q?=EB=B2=94=20=EB=82=B4=20=EC=82=AC=EC=9A=A9=EC=9E=90=EC=9D=98=20?= =?UTF-8?q?role=20=EC=A0=9C=EA=B3=B5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/Cheese4cutService.java | 39 +++++++++++++++++-- .../response/Cheese4cutPreviewResponse.java | 6 ++- .../mapper/Cheese4cutMapper.java | 5 ++- .../presentation/Cheese4cutController.java | 4 +- .../swagger/Cheese4cutSwagger.java | 3 +- 5 files changed, 49 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/cheeeese/cheese4cut/application/Cheese4cutService.java b/src/main/java/com/cheeeese/cheese4cut/application/Cheese4cutService.java index 5e58a7f..5b577fb 100644 --- a/src/main/java/com/cheeeese/cheese4cut/application/Cheese4cutService.java +++ b/src/main/java/com/cheeeese/cheese4cut/application/Cheese4cutService.java @@ -2,9 +2,12 @@ import com.cheeeese.album.application.validator.AlbumValidator; import com.cheeeese.album.domain.Album; +import com.cheeeese.album.domain.UserAlbum; +import com.cheeeese.album.domain.type.Role; import com.cheeeese.album.exception.AlbumException; import com.cheeeese.album.exception.code.AlbumErrorCode; import com.cheeeese.album.infrastructure.persistence.AlbumRepository; +import com.cheeeese.album.infrastructure.persistence.UserAlbumRepository; import com.cheeeese.cheese4cut.application.validator.Cheese4cutValidator; import com.cheeeese.cheese4cut.domain.Cheese4cut; import com.cheeeese.cheese4cut.dto.request.Cheese4cutFixedRequest; @@ -16,6 +19,7 @@ import com.cheeeese.cheese4cut.exception.code.Cheese4cutErrorCode; import com.cheeeese.cheese4cut.infrastructure.mapper.Cheese4cutMapper; import com.cheeeese.cheese4cut.infrastructure.persistence.Cheese4cutRepository; +import com.cheeeese.global.security.CustomUserDetails; import com.cheeeese.global.util.resolver.CdnUrlResolver; import com.cheeeese.photo.application.PresignedUrlService; import com.cheeeese.photo.domain.Photo; @@ -25,6 +29,8 @@ import com.cheeeese.user.domain.User; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.PageRequest; +import org.springframework.security.authentication.AnonymousAuthenticationToken; +import org.springframework.security.core.Authentication; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -44,13 +50,14 @@ public class Cheese4cutService { private final AlbumRepository albumRepository; private final PhotoRepository photoRepository; private final PhotoLikesRepository photoLikesRepository; + private final UserAlbumRepository userAlbumRepository; private final AlbumValidator albumValidator; private final PresignedUrlService presignedUrlService; private final Cheese4cutValidator cheese4cutValidator; private final CdnUrlResolver cdnUrlResolver; @Transactional(readOnly = true) - public Cheese4cutResponse getCheese4cutByAlbumCode(String code) { + public Cheese4cutResponse getCheese4cutByAlbumCode(Authentication authentication, String code) { Album album = albumRepository.findByCode(code) .orElseThrow(() -> new AlbumException(AlbumErrorCode.ALBUM_NOT_FOUND)); @@ -70,10 +77,23 @@ public Cheese4cutResponse getCheese4cutByAlbumCode(String code) { return Cheese4cutMapper.toFinalResponse(photos); } - return getPreviewResponse(album.getId(), album.getParticipant()); + User currentUser = extractUser(authentication); + + Role myRole = null; + Long currentUserId = currentUser != null ? currentUser.getId() : null; + + if (currentUserId != null) { + Optional myUserAlbumOptional = userAlbumRepository.findByUserIdAndAlbumId(currentUserId, album.getId()); + + if (myUserAlbumOptional.isPresent()) { + myRole = myUserAlbumOptional.get().getRole(); + } + } + + return getPreviewResponse(album.getId(), album.getParticipant(), myRole); } - private Cheese4cutResponse getPreviewResponse(Long albumId, int participant) { + private Cheese4cutResponse getPreviewResponse(Long albumId, int participant, Role myRole) { List topPhotoIds = photoRepository.findTop4CompletedPhotoIdsByLikes( albumId, PhotoStatus.COMPLETED, @@ -98,7 +118,7 @@ private Cheese4cutResponse getPreviewResponse(Long albumId, int participant) { }) .toList(); - return Cheese4cutMapper.toPreviewResponse(resolvedPhotoInfos, uniqueLikesCount, participant); + return Cheese4cutMapper.toPreviewResponse(resolvedPhotoInfos, uniqueLikesCount, participant, myRole); } @Transactional(readOnly = true) @@ -156,4 +176,15 @@ private List getOrderedPhotos(List photoIds) { } return orderedPhotos; } + + private User extractUser(Authentication authentication) { + if (authentication == null || authentication instanceof AnonymousAuthenticationToken) { + return null; + } + Object principal = authentication.getPrincipal(); + if (principal instanceof CustomUserDetails customUserDetails) { + return customUserDetails.getUser(); + } + return null; + } } diff --git a/src/main/java/com/cheeeese/cheese4cut/dto/response/Cheese4cutPreviewResponse.java b/src/main/java/com/cheeeese/cheese4cut/dto/response/Cheese4cutPreviewResponse.java index f077a04..de964e8 100644 --- a/src/main/java/com/cheeeese/cheese4cut/dto/response/Cheese4cutPreviewResponse.java +++ b/src/main/java/com/cheeeese/cheese4cut/dto/response/Cheese4cutPreviewResponse.java @@ -1,5 +1,6 @@ package com.cheeeese.cheese4cut.dto.response; +import com.cheeeese.album.domain.type.Role; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Builder; @@ -18,7 +19,10 @@ public record Cheese4cutPreviewResponse( int uniqueLikesCount, @Schema(description = "전체 참여자 수", example = "6") - int participant + int participant, + + @Schema(description = "사용자 역할", example = "MAKER") + Role myRole ) implements Cheese4cutResponse { @Builder diff --git a/src/main/java/com/cheeeese/cheese4cut/infrastructure/mapper/Cheese4cutMapper.java b/src/main/java/com/cheeeese/cheese4cut/infrastructure/mapper/Cheese4cutMapper.java index 68afe02..608ef73 100644 --- a/src/main/java/com/cheeeese/cheese4cut/infrastructure/mapper/Cheese4cutMapper.java +++ b/src/main/java/com/cheeeese/cheese4cut/infrastructure/mapper/Cheese4cutMapper.java @@ -1,6 +1,7 @@ package com.cheeeese.cheese4cut.infrastructure.mapper; import com.cheeeese.album.domain.Album; +import com.cheeeese.album.domain.type.Role; import com.cheeeese.cheese4cut.domain.Cheese4cut; import com.cheeeese.cheese4cut.domain.Cheese4cutPhoto; import com.cheeeese.cheese4cut.dto.response.Cheese4cutFinalResponse; @@ -32,13 +33,15 @@ public static Cheese4cutFinalResponse toFinalResponse(List photoInfos, long uniqueLikesCount, - int participant + int participant, + Role myRole ) { return Cheese4cutPreviewResponse.builder() .isFinalized(false) .previewPhotos(photoInfos) .uniqueLikesCount((int) uniqueLikesCount) .participant(participant) + .myRole(myRole) .build(); } diff --git a/src/main/java/com/cheeeese/cheese4cut/presentation/Cheese4cutController.java b/src/main/java/com/cheeeese/cheese4cut/presentation/Cheese4cutController.java index 1019e8a..74b843b 100644 --- a/src/main/java/com/cheeeese/cheese4cut/presentation/Cheese4cutController.java +++ b/src/main/java/com/cheeeese/cheese4cut/presentation/Cheese4cutController.java @@ -12,6 +12,7 @@ import jakarta.validation.Valid; import jakarta.validation.constraints.NotBlank; import lombok.RequiredArgsConstructor; +import org.springframework.security.core.Authentication; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -29,10 +30,11 @@ public class Cheese4cutController implements Cheese4cutSwagger { @Override @GetMapping("/preview") public CommonResponse getCheese4cut( + Authentication authentication, @PathVariable @NotBlank String code ) { return CommonResponse.success(SuccessCode.CHEESE4CUT_GET_SUCCESS, - cheese4cutService.getCheese4cutByAlbumCode(code)); + cheese4cutService.getCheese4cutByAlbumCode(authentication, code)); } @Override diff --git a/src/main/java/com/cheeeese/cheese4cut/presentation/swagger/Cheese4cutSwagger.java b/src/main/java/com/cheeeese/cheese4cut/presentation/swagger/Cheese4cutSwagger.java index 03f3a77..d15f0ff 100644 --- a/src/main/java/com/cheeeese/cheese4cut/presentation/swagger/Cheese4cutSwagger.java +++ b/src/main/java/com/cheeeese/cheese4cut/presentation/swagger/Cheese4cutSwagger.java @@ -9,12 +9,12 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.ExampleObject; -import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import jakarta.validation.constraints.NotBlank; +import org.springframework.security.core.Authentication; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; @@ -75,6 +75,7 @@ public interface Cheese4cutSwagger { ) }) CommonResponse getCheese4cut( + Authentication authentication, @PathVariable @NotBlank String code ); From 70468baf90243d61f6f2974ab76fc492d33e5839 Mon Sep 17 00:00:00 2001 From: zyovn Date: Fri, 14 Nov 2025 01:24:34 +0900 Subject: [PATCH 275/402] =?UTF-8?q?#54=20fix:=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=EB=AA=85,=20validate=EA=B4=80=EB=A0=A8=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81,=20imageUrl=20cdn=20url=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../photo/application/PhotoInfoService.java | 8 +++--- .../photo/application/PhotoQueryService.java | 16 +++++++++--- ...ponse.java => PhotoLikedUserResponse.java} | 2 +- .../infrastructure/mapper/PhotoMapper.java | 26 +++++++------------ .../persistence/PhotoRepository.java | 2 +- .../presentation/PhotoQueryController.java | 7 +++-- .../swagger/PhotoQuerySwagger.java | 2 +- 7 files changed, 33 insertions(+), 30 deletions(-) rename src/main/java/com/cheeeese/photo/dto/response/{PhotoLikerResponse.java => PhotoLikedUserResponse.java} (98%) diff --git a/src/main/java/com/cheeeese/photo/application/PhotoInfoService.java b/src/main/java/com/cheeeese/photo/application/PhotoInfoService.java index 75a17db..b4c7be5 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoInfoService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoInfoService.java @@ -5,7 +5,7 @@ import com.cheeeese.album.domain.type.Role; import com.cheeeese.global.security.CurrentUserProvider; import com.cheeeese.photo.domain.Photo; -import com.cheeeese.photo.dto.response.PhotoLikerResponse; +import com.cheeeese.photo.dto.response.PhotoLikedUserResponse; import com.cheeeese.photo.exception.PhotoException; import com.cheeeese.photo.exception.code.PhotoErrorCode; import com.cheeeese.photo.infrastructure.mapper.PhotoMapper; @@ -28,17 +28,17 @@ public class PhotoInfoService { private final PhotoLikesRepository photoLikesRepository; private final AlbumValidator albumValidator; - public PhotoLikerResponse getPhotoLikers(User user, String code, Long photoId) { + public PhotoLikedUserResponse getPhotoLikedUsers(User user, String code, Long photoId) { Album album = albumValidator.validateAlbumCode(code); albumValidator.validateAlbumParticipant(album, user); - Photo photo = photoRepository.findById(photoId) + Photo photo = photoRepository.findByIdAndAlbum_Code(photoId, code) .orElseThrow(() -> new PhotoException(PhotoErrorCode.PHOTO_NOT_FOUND)); List users = photoLikesRepository.findLikersByPhotoId(photo.getId()); - List likers = users.stream() + List likers = users.stream() .map(userList -> { boolean isMe = user.getId().equals(currentUserProvider.getCurrentUser().getId()); Role role = user.getId().equals(album.getMakerId()) ? Role.MAKER : Role.GUEST; diff --git a/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java b/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java index 8779f80..c4b0c34 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java @@ -136,7 +136,16 @@ public List getAlbumBest4Cut(User user, String code) { private PhotoPageResponse getPhotoPageFromDB(String code, int page, int size, AlbumSorting albumSorting) { PageRequest pageRequest = PageRequest.of(page, size, getPhotoSortingOption(albumSorting)); Slice photos = photoRepository.findAllByAlbumCodeAndStatus(code, PhotoStatus.COMPLETED, pageRequest); - return PhotoMapper.toPhotoPageResponse(photos, cdnUrlResolver); + + List responses = photos.getContent().stream() + .map(photo -> { + String imageUrl = cdnUrlResolver.resolveOriginal(photo.getImageUrl()); + String thumbnailUrl = cdnUrlResolver.resolveThumbnail(photo.getThumbnailUrl()); + return PhotoMapper.toPhotoListResponse(photo, imageUrl, thumbnailUrl, false, false); + }) + .toList(); + + return PhotoMapper.toPhotoPageResponse(photos, responses); } private PhotoPageResponse attachUserStatus(User user, PhotoPageResponse response) { @@ -192,10 +201,11 @@ private List buildPhotoLikedResponses(List photos, Se return photos.stream() .map(photo -> { Long id = photo.getId(); - String resolvedThumbnailUrl = cdnUrlResolver.resolveThumbnail(photo.getThumbnailUrl()); + String imageUrl = cdnUrlResolver.resolveOriginal(photo.getImageUrl()); + String thumbnailUrl = cdnUrlResolver.resolveThumbnail(photo.getThumbnailUrl()); boolean isDownloaded = downloaded.contains(id); boolean isRecentlyDownloaded = recent.contains(id); - return PhotoMapper.toPhotoLikedResponse(photo, resolvedThumbnailUrl, isDownloaded, isRecentlyDownloaded); + return PhotoMapper.toPhotoLikedResponse(photo, imageUrl, thumbnailUrl, isDownloaded, isRecentlyDownloaded); }) .toList(); } diff --git a/src/main/java/com/cheeeese/photo/dto/response/PhotoLikerResponse.java b/src/main/java/com/cheeeese/photo/dto/response/PhotoLikedUserResponse.java similarity index 98% rename from src/main/java/com/cheeeese/photo/dto/response/PhotoLikerResponse.java rename to src/main/java/com/cheeeese/photo/dto/response/PhotoLikedUserResponse.java index 4ec2db1..9b5f35a 100644 --- a/src/main/java/com/cheeeese/photo/dto/response/PhotoLikerResponse.java +++ b/src/main/java/com/cheeeese/photo/dto/response/PhotoLikedUserResponse.java @@ -8,7 +8,7 @@ @Builder @Schema(description = "띱한 사람 목록 API") -public record PhotoLikerResponse( +public record PhotoLikedUserResponse( @Schema(description = "사진 좋아요 총 개수", example = "12") int likeCnt, diff --git a/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java b/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java index 3b5e88d..52b9db3 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java @@ -3,7 +3,6 @@ import com.cheeeese.album.domain.Album; import com.cheeeese.album.domain.type.Role; import com.cheeeese.album.dto.response.AlbumInfoResponse; -import com.cheeeese.global.util.resolver.CdnUrlResolver; import com.cheeeese.photo.domain.Photo; import com.cheeeese.photo.domain.PhotoStatus; import com.cheeeese.photo.dto.response.*; @@ -66,6 +65,7 @@ public static PhotoDownloadResponse toPhotoDownloadResponse(List photos, CdnUrlResolver cdnUrlResolver) { - List responses = photos.getContent().stream() - .map(photo -> { - String resolvedUrl = cdnUrlResolver.resolveThumbnail(photo.getThumbnailUrl()); // TODO: SRP 위반 - return PhotoMapper.toPhotoListResponse(photo, resolvedUrl, false, false); - }) - .toList(); - + public static PhotoPageResponse toPhotoPageResponse(Slice photos, List responses) { return PhotoPageResponse.builder() .responses(responses) .listSize(responses.size()) @@ -168,8 +162,8 @@ public static AlbumInfoResponse toAlbumInfoResponse(Album album) { .build(); } - public static PhotoLikerResponse.PhotoLiker toPhotoLiker(User user, boolean isMe, Role role) { - return PhotoLikerResponse.PhotoLiker.builder() + public static PhotoLikedUserResponse.PhotoLiker toPhotoLiker(User user, boolean isMe, Role role) { + return PhotoLikedUserResponse.PhotoLiker.builder() .name(user.getName()) .profileImageUrl(user.getProfileImage()) .isMe(isMe) @@ -177,11 +171,11 @@ public static PhotoLikerResponse.PhotoLiker toPhotoLiker(User user, boolean isMe .build(); } - public static PhotoLikerResponse toPhotoLikerResponse( + public static PhotoLikedUserResponse toPhotoLikerResponse( Photo photo, - List likers + List likers ) { - return PhotoLikerResponse.builder() + return PhotoLikedUserResponse.builder() .likeCnt(photo.getLikesCnt()) .photoLikers(likers) .build(); diff --git a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java index 544829f..1ab78c1 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java @@ -111,7 +111,7 @@ List findTop4CompletedPhotoIdsByLikes( ); @Query(""" - SELECT p.id + SELECT p FROM Photo p WHERE p.album.id = :albumId AND p.isDeleted = FALSE diff --git a/src/main/java/com/cheeeese/photo/presentation/PhotoQueryController.java b/src/main/java/com/cheeeese/photo/presentation/PhotoQueryController.java index 0c1c024..091c7ee 100644 --- a/src/main/java/com/cheeeese/photo/presentation/PhotoQueryController.java +++ b/src/main/java/com/cheeeese/photo/presentation/PhotoQueryController.java @@ -1,7 +1,6 @@ package com.cheeeese.photo.presentation; import com.cheeeese.album.domain.type.AlbumSorting; -import com.cheeeese.album.dto.response.AlbumInfoResponse; import com.cheeeese.photo.dto.response.PhotoBest4CutResponse; import com.cheeeese.global.common.CommonResponse; import com.cheeeese.global.util.CurrentUser; @@ -68,15 +67,15 @@ public CommonResponse getPhotoDetail( } @Override - @GetMapping("/{code}/photos/{photoId}/liker") - public CommonResponse getPhotoLikers( + @GetMapping("/{code}/photos/{photoId}/likers") + public CommonResponse getPhotoLikedUsers( @CurrentUser User user, @PathVariable String code, @PathVariable Long photoId ) { return CommonResponse.success( PHOTO_LIKERS_GET_SUCCESS, - photoInfoService.getPhotoLikers(user, code, photoId) + photoInfoService.getPhotoLikedUsers(user, code, photoId) ); } diff --git a/src/main/java/com/cheeeese/photo/presentation/swagger/PhotoQuerySwagger.java b/src/main/java/com/cheeeese/photo/presentation/swagger/PhotoQuerySwagger.java index d79a7e7..9f219b4 100644 --- a/src/main/java/com/cheeeese/photo/presentation/swagger/PhotoQuerySwagger.java +++ b/src/main/java/com/cheeeese/photo/presentation/swagger/PhotoQuerySwagger.java @@ -106,7 +106,7 @@ CommonResponse getPhotoDetail( description = "띱한 사용자 목록 조회가 성공적으로 실행되었습니다." ) }) - CommonResponse getPhotoLikers( + CommonResponse getPhotoLikedUsers( @CurrentUser User user, @PathVariable String code, @PathVariable Long photoId From fb233c0a1544076465545eb7237ce14542918645 Mon Sep 17 00:00:00 2001 From: zyovn Date: Fri, 14 Nov 2025 01:25:18 +0900 Subject: [PATCH 276/402] =?UTF-8?q?#54=20docs:=20schema=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cheeeese/photo/dto/response/PhotoLikedPageResponse.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/cheeeese/photo/dto/response/PhotoLikedPageResponse.java b/src/main/java/com/cheeeese/photo/dto/response/PhotoLikedPageResponse.java index dbe84d7..c992308 100644 --- a/src/main/java/com/cheeeese/photo/dto/response/PhotoLikedPageResponse.java +++ b/src/main/java/com/cheeeese/photo/dto/response/PhotoLikedPageResponse.java @@ -13,7 +13,7 @@ public record PhotoLikedPageResponse( example = """ [ { - "name" 주정빈 + "name" "주정빈", "photoId": 1, "imageUrl": "https://cdn.cheeeese.me/original.jpg", "thumbnailUrl": "https://cdn.cheeeese.me/thumb1.jpg", From 449a66461586e5b1e5912aa59988220d2efe9f5f Mon Sep 17 00:00:00 2001 From: zyovn Date: Fri, 14 Nov 2025 01:26:38 +0900 Subject: [PATCH 277/402] =?UTF-8?q?#54=20refactor:=20=EC=84=B1=EA=B3=B5=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cheeeese/album/presentation/AlbumController.java | 2 +- src/main/java/com/cheeeese/global/common/code/SuccessCode.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/cheeeese/album/presentation/AlbumController.java b/src/main/java/com/cheeeese/album/presentation/AlbumController.java index 4cf4529..795db0e 100644 --- a/src/main/java/com/cheeeese/album/presentation/AlbumController.java +++ b/src/main/java/com/cheeeese/album/presentation/AlbumController.java @@ -77,7 +77,7 @@ public CommonResponse getAlbumInfo( @PathVariable String code ) { return CommonResponse.success( - PHOTO_INFO_GET_SUCCESS, + ALBUM_INFO_GET_SUCCESS, albumService.getAlbumInfo(user, code) ); } diff --git a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java index c0f7374..a3078fd 100644 --- a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java +++ b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java @@ -25,6 +25,7 @@ public enum SuccessCode implements BaseCode { ALBUM_ENTER_SUCCESS(HttpStatus.OK, "앨범 입장이 성공적으로 완료되었습니다."), ALBUM_CREATE_SUCCESS(HttpStatus.OK, "앨범 생성이 성공적으로 완료되었습니다."), ALBUM_PARTICIPANT_FETCH_SUCCESS(HttpStatus.OK, "앨범 참여자 조회가 성공적으로 완료되었습니다."), + ALBUM_INFO_GET_SUCCESS(HttpStatus.OK, "앨범 정보 조회가 성공적으로 완료되었습니다."), // photo PHOTO_AVAILABLE_COUNT_FETCH_SUCCESS(HttpStatus.OK, "업로드 가능 사진 수 조회가 성공적으로 완료되었습니다."), @@ -36,7 +37,6 @@ public enum SuccessCode implements BaseCode { PHOTO_DETAIL_GET_SUCCESS(HttpStatus.OK, "앨범 내 사진 상세 조회가 성공적으로 완료되었습니다."), PHOTO_LIKES_CREATE_SUCCESS(HttpStatus.OK, "사진 좋아요 생성이 완료되었습니다."), PHOTO_LIKES_DELETE_SUCCESS(HttpStatus.OK, "사진 좋아요 삭제가 완료되었습니다."), - PHOTO_INFO_GET_SUCCESS(HttpStatus.OK, "사진 정보 조회가 성공적으로 완료되었습니다."), PHOTO_LIKERS_GET_SUCCESS(HttpStatus.OK, "띱한 사람 목록 조회가 성공적으로 완료되었습니다."), PHOTO_BEST4CUT_GET_SUCCESS(HttpStatus.OK, "베스트 앨범컷 조회가 성공적으로 완료되었습니다."), From ffa4741858fb48aac051a7381d5dd37928f2974b Mon Sep 17 00:00:00 2001 From: zyovn Date: Fri, 14 Nov 2025 01:47:53 +0900 Subject: [PATCH 278/402] =?UTF-8?q?#54=20fix:=20=EC=95=A8=EB=B2=94=20?= =?UTF-8?q?=EB=B2=A0=EC=8A=A4=ED=8A=B8=EC=BB=B7=20=EC=A1=B0=ED=9A=8C=20API?= =?UTF-8?q?=20thumbnailUrl=20=EC=88=98=EC=A0=95=20=EB=B0=8F=20=ED=8C=A8?= =?UTF-8?q?=ED=82=A4=EC=A7=80=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../album/application/AlbumService.java | 29 +++++++++++++++++++ .../dto/response/AlbumBest4CutResponse.java} | 4 +-- .../infrastructure/mapper/AlbumMapper.java | 8 ++--- .../album/presentation/AlbumController.java | 15 ++++++++++ .../presentation/swagger/AlbumSwagger.java | 22 ++++++++++++++ .../global/common/code/SuccessCode.java | 2 +- .../photo/application/PhotoQueryService.java | 24 --------------- .../presentation/PhotoQueryController.java | 15 ---------- .../swagger/PhotoQuerySwagger.java | 21 -------------- 9 files changed, 73 insertions(+), 67 deletions(-) rename src/main/java/com/cheeeese/{photo/dto/response/PhotoBest4CutResponse.java => album/dto/response/AlbumBest4CutResponse.java} (85%) diff --git a/src/main/java/com/cheeeese/album/application/AlbumService.java b/src/main/java/com/cheeeese/album/application/AlbumService.java index e7456ef..89dbb78 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumService.java +++ b/src/main/java/com/cheeeese/album/application/AlbumService.java @@ -13,11 +13,16 @@ import com.cheeeese.album.infrastructure.persistence.AlbumRepository; import com.cheeeese.album.infrastructure.persistence.AlbumExpirationRedisRepository; import com.cheeeese.global.security.CustomUserDetails; +import com.cheeeese.global.util.resolver.CdnUrlResolver; import com.cheeeese.photo.application.PhotoService; import com.cheeeese.album.domain.UserAlbum; import com.cheeeese.album.infrastructure.persistence.UserAlbumRepository; import com.cheeeese.photo.domain.Photo; +import com.cheeeese.photo.domain.PhotoStatus; +import com.cheeeese.album.dto.response.AlbumBest4CutResponse; import com.cheeeese.photo.infrastructure.mapper.PhotoMapper; +import com.cheeeese.photo.infrastructure.persistence.PhotoLikesRepository; +import com.cheeeese.photo.infrastructure.persistence.PhotoRepository; import com.cheeeese.user.domain.User; import com.cheeeese.user.exception.UserException; import com.cheeeese.user.exception.code.UserErrorCode; @@ -25,6 +30,7 @@ import com.github.f4b6a3.uuid.UuidCreator; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.PageRequest; import org.springframework.security.authentication.AnonymousAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.stereotype.Service; @@ -49,8 +55,11 @@ public class AlbumService { private final AlbumRepository albumRepository; private final UserAlbumRepository userAlbumRepository; private final UserRepository userRepository; + private final PhotoRepository photoRepository; + private final PhotoLikesRepository photoLikesRepository; private final PhotoService photoService; private final AlbumExpirationRedisRepository albumExpirationRedisRepository; + private final CdnUrlResolver cdnUrlResolver; @Transactional public AlbumCreationResponse createAlbum(User user, AlbumCreationRequest request) { @@ -189,6 +198,26 @@ public AlbumInfoResponse getAlbumInfo(User user, String code) { return PhotoMapper.toAlbumInfoResponse(album); } + public List getAlbumBest4Cut(User user, String code) { + Album album = albumValidator.validateAlbumCode(code); + + albumValidator.validateAlbumParticipant(album, user); + + List topPhotos = photoRepository.findTop4CompletedPhotosByLikes( + album.getId(), + PhotoStatus.COMPLETED, + PageRequest.of(0, 4) + ); + + return topPhotos.stream() + .map(photo -> { + String thumbnailUrl = cdnUrlResolver.resolveThumbnail(photo.getThumbnailUrl()); + boolean isLiked = photoLikesRepository.existsByUserIdAndPhotoId(user.getId(), photo.getId()); + return AlbumMapper.toBest4CutResponse(photo, thumbnailUrl, isLiked); + }) + .toList(); + } + private User extractUser(Authentication authentication) { if (authentication == null || authentication instanceof AnonymousAuthenticationToken) { return null; diff --git a/src/main/java/com/cheeeese/photo/dto/response/PhotoBest4CutResponse.java b/src/main/java/com/cheeeese/album/dto/response/AlbumBest4CutResponse.java similarity index 85% rename from src/main/java/com/cheeeese/photo/dto/response/PhotoBest4CutResponse.java rename to src/main/java/com/cheeeese/album/dto/response/AlbumBest4CutResponse.java index 18f7d75..1b896ec 100644 --- a/src/main/java/com/cheeeese/photo/dto/response/PhotoBest4CutResponse.java +++ b/src/main/java/com/cheeeese/album/dto/response/AlbumBest4CutResponse.java @@ -1,11 +1,11 @@ -package com.cheeeese.photo.dto.response; +package com.cheeeese.album.dto.response; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Builder; @Builder @Schema(description = "베스트 앨범컷 조회 API") -public record PhotoBest4CutResponse( +public record AlbumBest4CutResponse( @Schema(description = "썸네일 이미지 url", example = "https://cdn.say-cheese.me/...") String thumbnailUrl, diff --git a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java index 208fb95..0076b5b 100644 --- a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java +++ b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java @@ -4,7 +4,7 @@ import com.cheeeese.album.domain.type.AlbumJoinStatus; import com.cheeeese.album.dto.response.*; import com.cheeeese.photo.domain.Photo; -import com.cheeeese.photo.dto.response.PhotoBest4CutResponse; +import com.cheeeese.album.dto.response.AlbumBest4CutResponse; import com.cheeeese.user.domain.User; import java.time.LocalDate; @@ -146,9 +146,9 @@ public static UploadAvailableCountResponse toAvailableCountResponse( .build(); } - public static PhotoBest4CutResponse toBest4CutResponse(Photo photo, boolean isLiked) { - return PhotoBest4CutResponse.builder() - .thumbnailUrl(photo.getThumbnailUrl()) + public static AlbumBest4CutResponse toBest4CutResponse(Photo photo, String thumbnailUrl, boolean isLiked) { + return AlbumBest4CutResponse.builder() + .thumbnailUrl(thumbnailUrl) .likeCnt(photo.getLikesCnt()) .isLiked(isLiked) .build(); diff --git a/src/main/java/com/cheeeese/album/presentation/AlbumController.java b/src/main/java/com/cheeeese/album/presentation/AlbumController.java index 795db0e..7e58662 100644 --- a/src/main/java/com/cheeeese/album/presentation/AlbumController.java +++ b/src/main/java/com/cheeeese/album/presentation/AlbumController.java @@ -6,12 +6,15 @@ import com.cheeeese.album.presentation.swagger.AlbumSwagger; import com.cheeeese.global.common.CommonResponse; import com.cheeeese.global.util.CurrentUser; +import com.cheeeese.album.dto.response.AlbumBest4CutResponse; import com.cheeeese.user.domain.User; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.security.core.Authentication; import org.springframework.web.bind.annotation.*; +import java.util.List; + import static com.cheeeese.global.common.code.SuccessCode.*; @RestController @@ -81,4 +84,16 @@ public CommonResponse getAlbumInfo( albumService.getAlbumInfo(user, code) ); } + + @Override + @GetMapping("/{code}/best-4cut") + public CommonResponse> getAlbumBest4Cut( + @CurrentUser User user, + @PathVariable String code + ) { + return CommonResponse.success( + ALBUM_BEST4CUT_GET_SUCCESS, + albumService.getAlbumBest4Cut(user, code) + ); + } } \ No newline at end of file diff --git a/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java b/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java index 5003f4d..246ef20 100644 --- a/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java +++ b/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java @@ -4,6 +4,7 @@ import com.cheeeese.album.dto.response.*; import com.cheeeese.global.common.CommonResponse; import com.cheeeese.global.util.CurrentUser; +import com.cheeeese.album.dto.response.AlbumBest4CutResponse; import com.cheeeese.user.domain.User; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.media.Content; @@ -16,6 +17,8 @@ import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; +import java.util.List; + @Tag(name = "[앨범]", description = "앨범 관련 API") public interface AlbumSwagger { @Operation( @@ -273,4 +276,23 @@ CommonResponse getAlbumInfo( @CurrentUser User user, @PathVariable String code ); + + @Operation( + summary = "앨범 내 베스트컷 (좋아요순 사진 4개) 조회 API", + description = """ + ### PathVariable + --- + `code`: 앨범 코드 (String) + """ + ) + @ApiResponses(value = { + @ApiResponse( + responseCode = "200", + description = "앨범 내 베스트컷 조회가 성공적으로 실행되었습니다." + ) + }) + CommonResponse> getAlbumBest4Cut( + @CurrentUser User user, + @PathVariable String code + ); } \ No newline at end of file diff --git a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java index a3078fd..3a3ce49 100644 --- a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java +++ b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java @@ -26,6 +26,7 @@ public enum SuccessCode implements BaseCode { ALBUM_CREATE_SUCCESS(HttpStatus.OK, "앨범 생성이 성공적으로 완료되었습니다."), ALBUM_PARTICIPANT_FETCH_SUCCESS(HttpStatus.OK, "앨범 참여자 조회가 성공적으로 완료되었습니다."), ALBUM_INFO_GET_SUCCESS(HttpStatus.OK, "앨범 정보 조회가 성공적으로 완료되었습니다."), + ALBUM_BEST4CUT_GET_SUCCESS(HttpStatus.OK, "베스트 앨범컷 조회가 성공적으로 완료되었습니다."), // photo PHOTO_AVAILABLE_COUNT_FETCH_SUCCESS(HttpStatus.OK, "업로드 가능 사진 수 조회가 성공적으로 완료되었습니다."), @@ -38,7 +39,6 @@ public enum SuccessCode implements BaseCode { PHOTO_LIKES_CREATE_SUCCESS(HttpStatus.OK, "사진 좋아요 생성이 완료되었습니다."), PHOTO_LIKES_DELETE_SUCCESS(HttpStatus.OK, "사진 좋아요 삭제가 완료되었습니다."), PHOTO_LIKERS_GET_SUCCESS(HttpStatus.OK, "띱한 사람 목록 조회가 성공적으로 완료되었습니다."), - PHOTO_BEST4CUT_GET_SUCCESS(HttpStatus.OK, "베스트 앨범컷 조회가 성공적으로 완료되었습니다."), // cheese4cut CHEESE4CUT_GET_SUCCESS(HttpStatus.OK, "치즈네컷 조회가 성공적으로 완료되었습니다."), diff --git a/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java b/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java index c4b0c34..8e2aa07 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java @@ -1,10 +1,6 @@ package com.cheeeese.photo.application; -import com.cheeeese.album.application.validator.AlbumValidator; -import com.cheeeese.album.domain.Album; import com.cheeeese.album.domain.type.AlbumSorting; -import com.cheeeese.photo.dto.response.PhotoBest4CutResponse; -import com.cheeeese.album.infrastructure.mapper.AlbumMapper; import com.cheeeese.global.util.RedisCacheUtil; import com.cheeeese.global.util.resolver.CdnUrlResolver; import com.cheeeese.photo.domain.Photo; @@ -37,7 +33,6 @@ public class PhotoQueryService { private final PhotoRepository photoRepository; private final PhotoLikesRepository photoLikesRepository; private final PhotoHistoryRepository photoHistoryRepository; - private final AlbumValidator albumValidator; private final RedisCacheUtil redisCacheUtil; private final CdnUrlResolver cdnUrlResolver; @@ -114,25 +109,6 @@ public PhotoDetailResponse getPhotoDetail(User user, String code, Long photoId) return PhotoMapper.toPhotoDetailResponse(photo, resolveOriginalUrl, resolveThumbnailUrl, isLiked, isDownloaded, isRecentlyDownloaded); } - public List getAlbumBest4Cut(User user, String code) { - Album album = albumValidator.validateAlbumCode(code); - - albumValidator.validateAlbumParticipant(album, user); - - List topPhotos = photoRepository.findTop4CompletedPhotosByLikes( - album.getId(), - PhotoStatus.COMPLETED, - PageRequest.of(0, 4) - ); - - return topPhotos.stream() - .map(photo -> { - boolean isLiked = photoLikesRepository.existsByUserIdAndPhotoId(user.getId(), photo.getId()); - return AlbumMapper.toBest4CutResponse(photo, isLiked); - }) - .toList(); - } - private PhotoPageResponse getPhotoPageFromDB(String code, int page, int size, AlbumSorting albumSorting) { PageRequest pageRequest = PageRequest.of(page, size, getPhotoSortingOption(albumSorting)); Slice photos = photoRepository.findAllByAlbumCodeAndStatus(code, PhotoStatus.COMPLETED, pageRequest); diff --git a/src/main/java/com/cheeeese/photo/presentation/PhotoQueryController.java b/src/main/java/com/cheeeese/photo/presentation/PhotoQueryController.java index 091c7ee..2b2e829 100644 --- a/src/main/java/com/cheeeese/photo/presentation/PhotoQueryController.java +++ b/src/main/java/com/cheeeese/photo/presentation/PhotoQueryController.java @@ -1,7 +1,6 @@ package com.cheeeese.photo.presentation; import com.cheeeese.album.domain.type.AlbumSorting; -import com.cheeeese.photo.dto.response.PhotoBest4CutResponse; import com.cheeeese.global.common.CommonResponse; import com.cheeeese.global.util.CurrentUser; import com.cheeeese.photo.application.PhotoInfoService; @@ -12,8 +11,6 @@ import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; -import java.util.List; - import static com.cheeeese.global.common.code.SuccessCode.*; @RestController @@ -78,16 +75,4 @@ public CommonResponse getPhotoLikedUsers( photoInfoService.getPhotoLikedUsers(user, code, photoId) ); } - - @Override - @GetMapping("/{code}/best-4cut") - public CommonResponse> getAlbumBest4Cut( - @CurrentUser User user, - @PathVariable String code - ) { - return CommonResponse.success( - PHOTO_BEST4CUT_GET_SUCCESS, - photoQueryService.getAlbumBest4Cut(user, code) - ); - } } diff --git a/src/main/java/com/cheeeese/photo/presentation/swagger/PhotoQuerySwagger.java b/src/main/java/com/cheeeese/photo/presentation/swagger/PhotoQuerySwagger.java index 9f219b4..94f168d 100644 --- a/src/main/java/com/cheeeese/photo/presentation/swagger/PhotoQuerySwagger.java +++ b/src/main/java/com/cheeeese/photo/presentation/swagger/PhotoQuerySwagger.java @@ -12,8 +12,6 @@ import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestParam; -import java.util.List; - @Tag(name = "[사진 조회]", description = "사진 조회 관련 API") public interface PhotoQuerySwagger { @Operation( @@ -111,23 +109,4 @@ CommonResponse getPhotoLikedUsers( @PathVariable String code, @PathVariable Long photoId ); - - @Operation( - summary = "앨범 내 베스트컷 (좋아요순 사진 4개) 조회 API", - description = """ - ### PathVariable - --- - `code`: 앨범 코드 (String) - """ - ) - @ApiResponses(value = { - @ApiResponse( - responseCode = "200", - description = "앨범 내 베스트컷 조회가 성공적으로 실행되었습니다." - ) - }) - CommonResponse> getAlbumBest4Cut( - @CurrentUser User user, - @PathVariable String code - ); } From 6971ce1b237ff7b275ad1eaa1683d090ce56786f Mon Sep 17 00:00:00 2001 From: zyovn Date: Fri, 14 Nov 2025 01:58:44 +0900 Subject: [PATCH 279/402] =?UTF-8?q?#54=20fix:=20=ED=94=BC=EB=93=9C?= =?UTF-8?q?=EB=B0=B1=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cheeeese/photo/application/PhotoCallbackService.java | 4 +++- .../com/cheeeese/photo/application/PhotoInfoService.java | 8 ++++---- .../photo/dto/response/PhotoLikedPageResponse.java | 2 +- .../user/infrastructure/persistence/UserRepository.java | 2 +- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/cheeeese/photo/application/PhotoCallbackService.java b/src/main/java/com/cheeeese/photo/application/PhotoCallbackService.java index 6f20975..7c6424b 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoCallbackService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoCallbackService.java @@ -30,6 +30,8 @@ public void markUploadCompleted(PhotoCompleteRequest request) { } String albumCode = photoRepository.findAlbumCodeByPhotoId(request.photoId()); - photoQueryService.invalidatePhotoCache(albumCode); + if (albumCode != null) { + photoQueryService.invalidatePhotoCache(albumCode); + } } } diff --git a/src/main/java/com/cheeeese/photo/application/PhotoInfoService.java b/src/main/java/com/cheeeese/photo/application/PhotoInfoService.java index b4c7be5..0af5bf0 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoInfoService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoInfoService.java @@ -39,10 +39,10 @@ public PhotoLikedUserResponse getPhotoLikedUsers(User user, String code, Long ph List users = photoLikesRepository.findLikersByPhotoId(photo.getId()); List likers = users.stream() - .map(userList -> { - boolean isMe = user.getId().equals(currentUserProvider.getCurrentUser().getId()); - Role role = user.getId().equals(album.getMakerId()) ? Role.MAKER : Role.GUEST; - return PhotoMapper.toPhotoLiker(user, isMe, role); + .map(liker -> { + boolean isMe = liker.getId().equals(user.getId()); + Role role = liker.getId().equals(album.getMakerId()) ? Role.MAKER : Role.GUEST; + return PhotoMapper.toPhotoLiker(liker, isMe, role); }) .toList(); diff --git a/src/main/java/com/cheeeese/photo/dto/response/PhotoLikedPageResponse.java b/src/main/java/com/cheeeese/photo/dto/response/PhotoLikedPageResponse.java index c992308..0107690 100644 --- a/src/main/java/com/cheeeese/photo/dto/response/PhotoLikedPageResponse.java +++ b/src/main/java/com/cheeeese/photo/dto/response/PhotoLikedPageResponse.java @@ -13,7 +13,7 @@ public record PhotoLikedPageResponse( example = """ [ { - "name" "주정빈", + "name": "주정빈", "photoId": 1, "imageUrl": "https://cdn.cheeeese.me/original.jpg", "thumbnailUrl": "https://cdn.cheeeese.me/thumb1.jpg", diff --git a/src/main/java/com/cheeeese/user/infrastructure/persistence/UserRepository.java b/src/main/java/com/cheeeese/user/infrastructure/persistence/UserRepository.java index 4a4c3f3..f37515c 100644 --- a/src/main/java/com/cheeeese/user/infrastructure/persistence/UserRepository.java +++ b/src/main/java/com/cheeeese/user/infrastructure/persistence/UserRepository.java @@ -19,7 +19,7 @@ public interface UserRepository extends JpaRepository { @Query("UPDATE User u SET u.photoCnt = u.photoCnt - :count WHERE u.id = :userId AND u.photoCnt >= :count") int decrementPhotoCount(@Param("userId") Long userId, @Param("count") int count); - @Modifying + @Modifying(clearAutomatically = true, flushAutomatically = true) @Query(""" UPDATE User u SET u.albumCnt = u.albumCnt + 1 From 6e4d3eb970964cff420f163bf44fce9593689f18 Mon Sep 17 00:00:00 2001 From: zyovn Date: Fri, 14 Nov 2025 02:42:30 +0900 Subject: [PATCH 280/402] =?UTF-8?q?#54=20fix:=20=ED=94=BC=EB=93=9C?= =?UTF-8?q?=EB=B0=B1=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cheeeese/album/application/AlbumService.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/cheeeese/album/application/AlbumService.java b/src/main/java/com/cheeeese/album/application/AlbumService.java index 89dbb78..7c9f1f3 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumService.java +++ b/src/main/java/com/cheeeese/album/application/AlbumService.java @@ -43,6 +43,7 @@ import java.util.Comparator; import java.util.List; import java.util.Optional; +import java.util.Set; import java.util.stream.Collectors; @Slf4j @@ -209,10 +210,16 @@ public List getAlbumBest4Cut(User user, String code) { PageRequest.of(0, 4) ); + List photoIds = topPhotos.stream() + .map(Photo::getId) + .toList(); + + Set likedPhotoIds = photoLikesRepository.findAllLikedPhotoIds(user.getId(), photoIds); + return topPhotos.stream() .map(photo -> { String thumbnailUrl = cdnUrlResolver.resolveThumbnail(photo.getThumbnailUrl()); - boolean isLiked = photoLikesRepository.existsByUserIdAndPhotoId(user.getId(), photo.getId()); + boolean isLiked = likedPhotoIds.contains(photo.getId()); return AlbumMapper.toBest4CutResponse(photo, thumbnailUrl, isLiked); }) .toList(); From 9f2fe3ca2be1c264f0fb9fb7dc11baaa563f4758 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Fri, 14 Nov 2025 21:51:18 +0900 Subject: [PATCH 281/402] =?UTF-8?q?#59=20feat:=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=9E=90=20=EC=A0=95=EB=B3=B4=20=EC=A0=9C=EA=B3=B5=20API=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../user/application/UserService.java | 24 +++++++++++++++++++ .../user/dto/response/UserInfoResponse.java | 24 +++++++++++++++++++ .../infrastructure/mapper/UserMapper.java | 11 +++++++++ .../user/presentation/UserController.java | 10 ++++++-- .../presentation/swagger/UserSwagger.java | 13 ++++++++++ 5 files changed, 80 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/cheeeese/user/dto/response/UserInfoResponse.java diff --git a/src/main/java/com/cheeeese/user/application/UserService.java b/src/main/java/com/cheeeese/user/application/UserService.java index 69bb542..e8f0cdd 100644 --- a/src/main/java/com/cheeeese/user/application/UserService.java +++ b/src/main/java/com/cheeeese/user/application/UserService.java @@ -1,16 +1,25 @@ package com.cheeeese.user.application; +import com.cheeeese.album.domain.Album; +import com.cheeeese.album.infrastructure.persistence.UserAlbumRepository; +import com.cheeeese.photo.domain.PhotoStatus; +import com.cheeeese.photo.infrastructure.persistence.PhotoRepository; import com.cheeeese.user.application.validator.UserValidator; import com.cheeeese.user.domain.User; import com.cheeeese.user.dto.request.UserAgreementRequest; import com.cheeeese.user.dto.request.UserProfileRequest; +import com.cheeeese.user.dto.response.UserInfoResponse; import com.cheeeese.user.exception.UserException; import com.cheeeese.user.exception.code.UserErrorCode; +import com.cheeeese.user.infrastructure.mapper.UserMapper; import com.cheeeese.user.infrastructure.persistence.UserRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.List; +import java.util.Optional; + @Service @RequiredArgsConstructor @Transactional(readOnly = true) @@ -18,6 +27,8 @@ public class UserService { private final UserValidator userValidator; private final UserRepository userRepository; + private final UserAlbumRepository userAlbumRepository; + private final PhotoRepository photoRepository; @Transactional public void updateUserProfile(User user, UserProfileRequest request) { @@ -38,6 +49,19 @@ public void saveUserAgreement(User user, UserAgreementRequest request) { ); } + public UserInfoResponse getUserInfo(User user) { + long albumCount = userAlbumRepository.countByUserIdAndAlbumStatusIn( + user.getId(), + List.of(Album.AlbumStatus.ACTIVE, Album.AlbumStatus.EXPIRED) + ); + + long likesCount = Optional.ofNullable( + photoRepository.sumLikesByUserIdAndStatus(user.getId(), PhotoStatus.COMPLETED) + ).orElse(0L); + + return UserMapper.toUserInfoResponse(user, albumCount, likesCount); + } + @Transactional public void incrementPhotoCount(Long userId, int count) { int updated = userRepository.incrementPhotoCount(userId, count); diff --git a/src/main/java/com/cheeeese/user/dto/response/UserInfoResponse.java b/src/main/java/com/cheeeese/user/dto/response/UserInfoResponse.java new file mode 100644 index 0000000..841f2a2 --- /dev/null +++ b/src/main/java/com/cheeeese/user/dto/response/UserInfoResponse.java @@ -0,0 +1,24 @@ +package com.cheeeese.user.dto.response; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Builder; + +@Builder +@Schema(description = "사용자 기본 정보 응답") +public record UserInfoResponse( + @Schema(description = "사용자 프로필 이미지 URL", example = "https://cdn.cheeeese.me/profile.png") + String profileImage, + + @Schema(description = "사용자 이름", example = "치즈러버") + String name, + + @Schema(description = "사용자가 속한 앨범 수", example = "5") + long albumCount, + + @Schema(description = "사용자가 업로드한 사진 수", example = "42") + long photoCount, + + @Schema(description = "사용자가 받은 총 좋아요 수", example = "128") + long likesCount +) { +} diff --git a/src/main/java/com/cheeeese/user/infrastructure/mapper/UserMapper.java b/src/main/java/com/cheeeese/user/infrastructure/mapper/UserMapper.java index 87e3489..6cb5a30 100644 --- a/src/main/java/com/cheeeese/user/infrastructure/mapper/UserMapper.java +++ b/src/main/java/com/cheeeese/user/infrastructure/mapper/UserMapper.java @@ -2,6 +2,7 @@ import com.cheeeese.oauth2.domain.OAuth2UserInfo; import com.cheeeese.user.domain.User; +import com.cheeeese.user.dto.response.UserInfoResponse; public class UserMapper { @@ -13,4 +14,14 @@ public static User toEntity(OAuth2UserInfo oAuth2UserInfo) { .providerId(oAuth2UserInfo.getProviderId()) .build(); } + + public static UserInfoResponse toUserInfoResponse(User user, long albumCount, long likesCount) { + return UserInfoResponse.builder() + .profileImage(user.getProfileImage()) + .name(user.getName()) + .albumCount(albumCount) + .photoCount(user.getPhotoCnt()) + .likesCount(likesCount) + .build(); + } } diff --git a/src/main/java/com/cheeeese/user/presentation/UserController.java b/src/main/java/com/cheeeese/user/presentation/UserController.java index 6d89341..e19fa0d 100644 --- a/src/main/java/com/cheeeese/user/presentation/UserController.java +++ b/src/main/java/com/cheeeese/user/presentation/UserController.java @@ -6,13 +6,13 @@ import com.cheeeese.user.domain.User; import com.cheeeese.user.dto.request.UserAgreementRequest; import com.cheeeese.user.dto.request.UserProfileRequest; +import com.cheeeese.user.dto.response.UserInfoResponse; import com.cheeeese.user.presentation.swagger.UserSwagger; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; -import static com.cheeeese.global.common.code.SuccessCode.USER_AGREEMENT_ACCEPT_SUCCESS; -import static com.cheeeese.global.common.code.SuccessCode.USER_PROFILE_UPDATE_SUCCESS; +import static com.cheeeese.global.common.code.SuccessCode.*; @RestController @RequiredArgsConstructor @@ -21,6 +21,12 @@ public class UserController implements UserSwagger { private final UserService userService; + @Override + @GetMapping("/me") + public CommonResponse getUserInfo(@CurrentUser User user) { + return CommonResponse.success(USER_INFO_FETCH_SUCCESS, userService.getUserInfo(user)); + } + @Override @PatchMapping("/me/profile") public CommonResponse updateUserProfile( diff --git a/src/main/java/com/cheeeese/user/presentation/swagger/UserSwagger.java b/src/main/java/com/cheeeese/user/presentation/swagger/UserSwagger.java index 8a69a2a..8292940 100644 --- a/src/main/java/com/cheeeese/user/presentation/swagger/UserSwagger.java +++ b/src/main/java/com/cheeeese/user/presentation/swagger/UserSwagger.java @@ -5,6 +5,7 @@ import com.cheeeese.user.domain.User; import com.cheeeese.user.dto.request.UserAgreementRequest; import com.cheeeese.user.dto.request.UserProfileRequest; +import com.cheeeese.user.dto.response.UserInfoResponse; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; @@ -14,6 +15,18 @@ @Tag(name = "[사용자]", description = "사용자 관련 API") public interface UserSwagger { + @Operation( + summary = "사용자 기본 정보 조회 API", + description = "사용자의 프로필 이미지, 이름, 참여 앨범 수, 업로드한 사진 수, 받은 좋아요 수를 조회합니다." + ) + @ApiResponses(value = { + @ApiResponse( + responseCode = "200", + description = "사용자 정보 조회가 성공적으로 완료되었습니다." + ) + }) + CommonResponse getUserInfo(@CurrentUser User user); + @Operation( summary = "사용자 프로필 수정 API", description = """ From a2c95b8a44cf97f326660b46e429bf2e19f7be13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Fri, 14 Nov 2025 21:52:13 +0900 Subject: [PATCH 282/402] =?UTF-8?q?#59=20feat:=20=EB=A7=88=EC=9D=B4?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20=EA=B4=80=EB=A0=A8=20=EC=84=B1?= =?UTF-8?q?=EA=B3=B5=20=EC=BD=94=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cheeeese/global/common/code/SuccessCode.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java index 62ec241..82531ce 100644 --- a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java +++ b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java @@ -17,10 +17,14 @@ public enum SuccessCode implements BaseCode { LOGOUT_SUCCESS(HttpStatus.OK, "로그아웃이 성공적으로 완료되었습니다."), // user + USER_INFO_FETCH_SUCCESS(HttpStatus.OK, "사용자 정보 조회가 성공적으로 완료되었습니다."), USER_PROFILE_UPDATE_SUCCESS(HttpStatus.OK, "사용자 프로필 업데이트가 성공적으로 완료되었습니다."), USER_AGREEMENT_ACCEPT_SUCCESS(HttpStatus.OK, "사용자 이용 약관 동의가 성공적으로 완료되었습니다."), // album + ALBUM_OPEN_LIST_FETCH_SUCCESS(HttpStatus.OK, "열린 앨범 목록 조회가 성공적으로 완료되었습니다."), + ALBUM_MY_OPEN_LIST_FETCH_SUCCESS(HttpStatus.OK, "내가 만든 열린 앨범 목록 조회가 성공적으로 완료되었습니다."), + ALBUM_CLOSED_LIST_FETCH_SUCCESS(HttpStatus.OK, "닫힌 앨범 목록 조회가 성공적으로 완료되었습니다."), ALBUM_INVITATION_FETCH_SUCCESS(HttpStatus.OK, "앨범 초대장 정보 조회가 성공적으로 완료되었습니다."), ALBUM_ENTER_SUCCESS(HttpStatus.OK, "앨범 입장이 성공적으로 완료되었습니다."), ALBUM_CREATE_SUCCESS(HttpStatus.OK, "앨범 생성이 성공적으로 완료되었습니다."), From 6aebc2cca4acd5f1a9c4f35d5899781c6f2e8fbf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Fri, 14 Nov 2025 22:03:50 +0900 Subject: [PATCH 283/402] =?UTF-8?q?#59=20fix:=20=EC=9C=A0=EC=A0=80=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=20=EC=A0=9C=EA=B3=B5=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cheeeese/user/application/UserService.java | 11 +---------- .../user/infrastructure/mapper/UserMapper.java | 6 +++--- 2 files changed, 4 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/cheeeese/user/application/UserService.java b/src/main/java/com/cheeeese/user/application/UserService.java index e8f0cdd..3018129 100644 --- a/src/main/java/com/cheeeese/user/application/UserService.java +++ b/src/main/java/com/cheeeese/user/application/UserService.java @@ -50,16 +50,7 @@ public void saveUserAgreement(User user, UserAgreementRequest request) { } public UserInfoResponse getUserInfo(User user) { - long albumCount = userAlbumRepository.countByUserIdAndAlbumStatusIn( - user.getId(), - List.of(Album.AlbumStatus.ACTIVE, Album.AlbumStatus.EXPIRED) - ); - - long likesCount = Optional.ofNullable( - photoRepository.sumLikesByUserIdAndStatus(user.getId(), PhotoStatus.COMPLETED) - ).orElse(0L); - - return UserMapper.toUserInfoResponse(user, albumCount, likesCount); + return UserMapper.toUserInfoResponse(user); } @Transactional diff --git a/src/main/java/com/cheeeese/user/infrastructure/mapper/UserMapper.java b/src/main/java/com/cheeeese/user/infrastructure/mapper/UserMapper.java index 6cb5a30..00fbf73 100644 --- a/src/main/java/com/cheeeese/user/infrastructure/mapper/UserMapper.java +++ b/src/main/java/com/cheeeese/user/infrastructure/mapper/UserMapper.java @@ -15,13 +15,13 @@ public static User toEntity(OAuth2UserInfo oAuth2UserInfo) { .build(); } - public static UserInfoResponse toUserInfoResponse(User user, long albumCount, long likesCount) { + public static UserInfoResponse toUserInfoResponse(User user) { return UserInfoResponse.builder() .profileImage(user.getProfileImage()) .name(user.getName()) - .albumCount(albumCount) + .albumCount(user.getAlbumCnt()) .photoCount(user.getPhotoCnt()) - .likesCount(likesCount) + .likesCount(user.getLikesCnt()) .build(); } } From 44255e646e20742ec57b615cee524fc74840847a Mon Sep 17 00:00:00 2001 From: zyovn Date: Fri, 14 Nov 2025 23:40:18 +0900 Subject: [PATCH 284/402] =?UTF-8?q?#54=20chore:=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20import=EB=AC=B8=20=EC=A0=9C=EA=B1=B0=20?= =?UTF-8?q?=EB=B0=8F=20=EC=84=B1=EA=B3=B5=20=EC=BD=94=EB=93=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cheese4cut/presentation/Cheese4cutController.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/cheeeese/cheese4cut/presentation/Cheese4cutController.java b/src/main/java/com/cheeeese/cheese4cut/presentation/Cheese4cutController.java index 74b843b..c7162db 100644 --- a/src/main/java/com/cheeeese/cheese4cut/presentation/Cheese4cutController.java +++ b/src/main/java/com/cheeeese/cheese4cut/presentation/Cheese4cutController.java @@ -6,7 +6,6 @@ import com.cheeeese.cheese4cut.dto.response.Cheese4cutResponse; import com.cheeeese.cheese4cut.presentation.swagger.Cheese4cutSwagger; import com.cheeeese.global.common.CommonResponse; -import com.cheeeese.global.common.code.SuccessCode; import com.cheeeese.global.util.CurrentUser; import com.cheeeese.user.domain.User; import jakarta.validation.Valid; @@ -16,8 +15,7 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; -import static com.cheeeese.global.common.code.SuccessCode.CHEESE4CUT_FINALIZE_SUCCESS; -import static com.cheeeese.global.common.code.SuccessCode.PRESIGNED_URL_ISSUE_SUCCESS; +import static com.cheeeese.global.common.code.SuccessCode.*; @Validated @RestController @@ -33,7 +31,7 @@ public CommonResponse getCheese4cut( Authentication authentication, @PathVariable @NotBlank String code ) { - return CommonResponse.success(SuccessCode.CHEESE4CUT_GET_SUCCESS, + return CommonResponse.success(CHEESE4CUT_GET_SUCCESS, cheese4cutService.getCheese4cutByAlbumCode(authentication, code)); } From 661eb6918781b40ccca7e988451dcd51e0f9ba2c Mon Sep 17 00:00:00 2001 From: zyovn Date: Sat, 15 Nov 2025 00:37:57 +0900 Subject: [PATCH 285/402] =?UTF-8?q?#61=20fix:=20=EC=82=AC=EC=A7=84=20size?= =?UTF-8?q?=20=EB=AF=B8=EB=B0=98=EC=98=81=20=EC=98=A4=EB=A5=98=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cheeeese/photo/application/PhotoQueryService.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java b/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java index 8e2aa07..93174a2 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java @@ -36,14 +36,14 @@ public class PhotoQueryService { private final RedisCacheUtil redisCacheUtil; private final CdnUrlResolver cdnUrlResolver; - private static final String PHOTO_KEY = "cache:album:%s:photos:sort:%s:page:%d:version:%d"; + private static final String PHOTO_KEY = "cache:album:%s:photos:sort:%s:page:%d:size:%d:version:%d"; private static final String VERSION_KEY = "cache:album:%s:version"; public PhotoPageResponse getPhotoPage(User user, String code, int page, int size, AlbumSorting albumSorting) { String versionKey = String.format(VERSION_KEY, code); Long curVersion = Optional.ofNullable(redisCacheUtil.getValue(versionKey)).orElse(0L); - String photoKey = String.format(PHOTO_KEY, code, albumSorting.getParam(), page, curVersion); + String photoKey = String.format(PHOTO_KEY, code, albumSorting.getParam(), page, size, curVersion); PhotoPageResponse cachedList = redisCacheUtil.getObject(photoKey, PhotoPageResponse.class); // redis에 존재할 경우, db 접근 X + 바로 반환 From d6aedcc3232bd2348d7c9ace90d9efd478c8b0f2 Mon Sep 17 00:00:00 2001 From: zyovn Date: Sat, 15 Nov 2025 13:18:23 +0900 Subject: [PATCH 286/402] =?UTF-8?q?#61=20feat:=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=9E=90=20=EC=98=A8=EB=B3=B4=EB=94=A9=20API=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../album/application/AlbumService.java | 28 +++++++++++++---- .../infrastructure/mapper/AlbumMapper.java | 12 +++---- .../mapper/UserAlbumMapper.java | 4 +-- .../global/config/SecurityConfig.java | 3 +- .../global/util/ProfileImageUtil.java | 13 ++++++++ .../global/util/resolver/CdnUrlResolver.java | 8 ++--- .../photo/application/PhotoInfoService.java | 10 ++++-- .../infrastructure/mapper/PhotoMapper.java | 4 +-- .../user/application/UserService.java | 31 +++++++++++++++++-- .../java/com/cheeeese/user/domain/User.java | 6 +++- .../user/domain/type/ProfileImageType.java | 28 +++++++++++++++++ .../dto/request/UserProfileImageRequest.java | 9 ++++++ .../response/UserProfileImageResponse.java | 17 ++++++++++ .../infrastructure/mapper/UserMapper.java | 17 ++++++++++ .../user/presentation/UserController.java | 18 ++++++++++- 15 files changed, 179 insertions(+), 29 deletions(-) create mode 100644 src/main/java/com/cheeeese/global/util/ProfileImageUtil.java create mode 100644 src/main/java/com/cheeeese/user/domain/type/ProfileImageType.java create mode 100644 src/main/java/com/cheeeese/user/dto/request/UserProfileImageRequest.java create mode 100644 src/main/java/com/cheeeese/user/dto/response/UserProfileImageResponse.java diff --git a/src/main/java/com/cheeeese/album/application/AlbumService.java b/src/main/java/com/cheeeese/album/application/AlbumService.java index 3ee9474..9b40707 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumService.java +++ b/src/main/java/com/cheeeese/album/application/AlbumService.java @@ -13,6 +13,7 @@ import com.cheeeese.album.infrastructure.persistence.AlbumExpirationRedisRepository; import com.cheeeese.album.infrastructure.persistence.AlbumRepository; import com.cheeeese.global.security.CustomUserDetails; +import com.cheeeese.global.util.ProfileImageUtil; import com.cheeeese.global.util.resolver.CdnUrlResolver; import com.cheeeese.photo.application.PhotoService; import com.cheeeese.album.domain.UserAlbum; @@ -24,6 +25,7 @@ import com.cheeeese.photo.infrastructure.persistence.PhotoLikesRepository; import com.cheeeese.photo.infrastructure.persistence.PhotoRepository; import com.cheeeese.user.domain.User; +import com.cheeeese.user.domain.type.ProfileImageType; import com.cheeeese.user.exception.UserException; import com.cheeeese.user.exception.code.UserErrorCode; import com.cheeeese.user.infrastructure.persistence.UserRepository; @@ -103,8 +105,9 @@ public AlbumInvitationResponse getInvitationInfo(String code) { return AlbumMapper.toExpiredInvitationResponse(album); } User maker = getMaker(album.getMakerId()); + String makerProfileUrl = ProfileImageUtil.resolveProfileImage(maker, cdnUrlResolver); - return AlbumMapper.toInvitationResponse(album, maker); + return AlbumMapper.toInvitationResponse(album, maker, makerProfileUrl); } @Transactional @@ -113,7 +116,10 @@ public AlbumEnterResponse enterAlbum(String code, User currentUser) { albumValidator.validateAlbumEntry(album, currentUser); Optional existing = userAlbumRepository.findByUserIdAndAlbumId(currentUser.getId(), album.getId()); - AlbumMakerInfo makerInfo = AlbumMapper.toMakerInfo(getMaker(album.getMakerId())); + + User maker = getMaker(album.getMakerId()); + String makerProfileUrl = ProfileImageUtil.resolveProfileImage(maker, cdnUrlResolver); + AlbumMakerInfo makerInfo = AlbumMapper.toMakerInfo(maker, makerProfileUrl); // Case 1: 기존 참여 이력 존재 if (existing.isPresent()) { @@ -267,13 +273,20 @@ private List getRecentPhotosWithUploaderIn // 1~4개인 경우, 1개만 반환하는 비즈니스 로직 적용 if (photos.size() < 5) { Photo photo = photos.get(0); - return List.of(AlbumMapper.toRecentPhotoResponse(photo)); + String profileUrl = ProfileImageUtil.resolveProfileImage(photo.getUser(), cdnUrlResolver); + return List.of(AlbumMapper.toRecentPhotoResponse(photo, profileUrl)); } // 5개인 경우, 5개 모두 반환 return photos.stream() - .map(AlbumMapper::toRecentPhotoResponse) - .collect(Collectors.toList()); + .map(photo -> { + String profileUrl = ProfileImageUtil.resolveProfileImage( + photo.getUser(), + cdnUrlResolver + ); + return AlbumMapper.toRecentPhotoResponse(photo, profileUrl); + }) + .toList(); } private List buildSortedParticipantInfos( @@ -284,8 +297,11 @@ private List buildSortedParticipan .map(userAlbum -> { User user = userAlbum.getUser(); Role role = userAlbum.getRole(); + ProfileImageType type = ProfileImageType.fromName(user.getProfileImage()); + String profileImageUrl = cdnUrlResolver.resolveProfile(type.getPath()); boolean isMe = currentUserId != null && user.getId().equals(currentUserId); - return UserAlbumMapper.toParticipantInfo(user, role, isMe); + + return UserAlbumMapper.toParticipantInfo(user, profileImageUrl, role, isMe); }) .sorted(Comparator .comparing(AlbumParticipantListResponse.ParticipantInfo::isMe, Comparator.reverseOrder()) diff --git a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java index 0076b5b..75fe543 100644 --- a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java +++ b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java @@ -58,14 +58,14 @@ public static AlbumCreationResponse toCreationResponse(Album album) { /** * Album 엔티티와 Maker User 정보를 초대장 응답 DTO로 변환합니다. */ - public static AlbumInvitationResponse toInvitationResponse(Album album, User user) { + public static AlbumInvitationResponse toInvitationResponse(Album album, User user, String profileImage) { return AlbumInvitationResponse.builder() .title(album.getTitle()) .themeEmoji(album.getThemeEmoji()) .eventDate(album.getEventDate().toString()) .expiredAt(album.getExpiredAt()) .makerName(user.getName()) - .makerProfileImage(user.getProfileImage()) + .makerProfileImage(profileImage) .isExpired(false) .build(); } @@ -114,23 +114,23 @@ public static NewEnterResponse toNewResponse( .build(); } - public static NewEnterResponse.RecentPhotoResponse toRecentPhotoResponse(Photo photo) { + public static NewEnterResponse.RecentPhotoResponse toRecentPhotoResponse(Photo photo, String profileImage) { User uploader = photo.getUser(); return NewEnterResponse.RecentPhotoResponse.builder() .thumbnailUrl(photo.getThumbnailUrl()) .uploaderName(uploader.getName()) - .uploaderProfileImage(uploader.getProfileImage()) + .uploaderProfileImage(profileImage) .build(); } /** * 메이커 User 엔티티를 호스트 정보 응답 DTO로 변환합니다. */ - public static AlbumMakerInfo toMakerInfo(User user) { + public static AlbumMakerInfo toMakerInfo(User user, String profileImage) { return AlbumMakerInfo.builder() .makerName(user.getName()) - .makerProfileImage(user.getProfileImage()) + .makerProfileImage(profileImage) .build(); } diff --git a/src/main/java/com/cheeeese/album/infrastructure/mapper/UserAlbumMapper.java b/src/main/java/com/cheeeese/album/infrastructure/mapper/UserAlbumMapper.java index b67b178..7ee737e 100644 --- a/src/main/java/com/cheeeese/album/infrastructure/mapper/UserAlbumMapper.java +++ b/src/main/java/com/cheeeese/album/infrastructure/mapper/UserAlbumMapper.java @@ -20,11 +20,11 @@ public static UserAlbum toEntity(User user, Album album, Role role) { .build(); } - public static AlbumParticipantListResponse.ParticipantInfo toParticipantInfo(User user, Role role, boolean isMe) { + public static AlbumParticipantListResponse.ParticipantInfo toParticipantInfo(User user, String profileImage, Role role, boolean isMe) { return AlbumParticipantListResponse.ParticipantInfo.builder() .name(user.getName()) .role(role) - .profileImage(user.getProfileImage()) + .profileImage(profileImage) .isMe(isMe) .build(); } diff --git a/src/main/java/com/cheeeese/global/config/SecurityConfig.java b/src/main/java/com/cheeeese/global/config/SecurityConfig.java index b840950..256e85c 100644 --- a/src/main/java/com/cheeeese/global/config/SecurityConfig.java +++ b/src/main/java/com/cheeeese/global/config/SecurityConfig.java @@ -39,7 +39,8 @@ public class SecurityConfig { "/v1/album/*/invitation", "/v1/cheese4cut/*/preview", "/v1/album/*/participants", - "/internal/thumbnail/complete" + "/internal/thumbnail/complete", + "/v1/user/profile-images" }; @Bean diff --git a/src/main/java/com/cheeeese/global/util/ProfileImageUtil.java b/src/main/java/com/cheeeese/global/util/ProfileImageUtil.java new file mode 100644 index 0000000..8435bb5 --- /dev/null +++ b/src/main/java/com/cheeeese/global/util/ProfileImageUtil.java @@ -0,0 +1,13 @@ +package com.cheeeese.global.util; + +import com.cheeeese.global.util.resolver.CdnUrlResolver; +import com.cheeeese.user.domain.User; +import com.cheeeese.user.domain.type.ProfileImageType; + +public class ProfileImageUtil { + + public static String resolveProfileImage(User user, CdnUrlResolver resolver) { + ProfileImageType type = ProfileImageType.fromName(user.getProfileImage()); + return resolver.resolveProfile(type.getPath()); + } +} diff --git a/src/main/java/com/cheeeese/global/util/resolver/CdnUrlResolver.java b/src/main/java/com/cheeeese/global/util/resolver/CdnUrlResolver.java index 39cbfd8..f542afa 100644 --- a/src/main/java/com/cheeeese/global/util/resolver/CdnUrlResolver.java +++ b/src/main/java/com/cheeeese/global/util/resolver/CdnUrlResolver.java @@ -12,8 +12,8 @@ public class CdnUrlResolver { @Value("${cdn.thumbnail-domain}") private String thumbnailDomain; - @Value("${cdn.4cut-domain}") - private String cutDomain; + @Value("${cdn.profile-domain}") + private String profileDomain; public String resolveOriginal(String path) { return resolve(originalDomain, path); @@ -23,8 +23,8 @@ public String resolveThumbnail(String path) { return resolve(thumbnailDomain, path); } - public String resolveCut(String path) { - return resolve(cutDomain, path); + public String resolveProfile(String path) { + return resolve(profileDomain, path); } private String resolve(String domain, String path) { diff --git a/src/main/java/com/cheeeese/photo/application/PhotoInfoService.java b/src/main/java/com/cheeeese/photo/application/PhotoInfoService.java index 0af5bf0..0c99f2a 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoInfoService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoInfoService.java @@ -3,7 +3,7 @@ import com.cheeeese.album.application.validator.AlbumValidator; import com.cheeeese.album.domain.Album; import com.cheeeese.album.domain.type.Role; -import com.cheeeese.global.security.CurrentUserProvider; +import com.cheeeese.global.util.resolver.CdnUrlResolver; import com.cheeeese.photo.domain.Photo; import com.cheeeese.photo.dto.response.PhotoLikedUserResponse; import com.cheeeese.photo.exception.PhotoException; @@ -12,6 +12,7 @@ import com.cheeeese.photo.infrastructure.persistence.PhotoLikesRepository; import com.cheeeese.photo.infrastructure.persistence.PhotoRepository; import com.cheeeese.user.domain.User; +import com.cheeeese.user.domain.type.ProfileImageType; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -23,10 +24,10 @@ @Transactional(readOnly = true) public class PhotoInfoService { - private final CurrentUserProvider currentUserProvider; private final PhotoRepository photoRepository; private final PhotoLikesRepository photoLikesRepository; private final AlbumValidator albumValidator; + private final CdnUrlResolver cdnUrlResolver; public PhotoLikedUserResponse getPhotoLikedUsers(User user, String code, Long photoId) { Album album = albumValidator.validateAlbumCode(code); @@ -40,9 +41,12 @@ public PhotoLikedUserResponse getPhotoLikedUsers(User user, String code, Long ph List likers = users.stream() .map(liker -> { + ProfileImageType type = ProfileImageType.fromName(user.getProfileImage()); + String profileImageUrl = cdnUrlResolver.resolveProfile(type.getPath()); boolean isMe = liker.getId().equals(user.getId()); Role role = liker.getId().equals(album.getMakerId()) ? Role.MAKER : Role.GUEST; - return PhotoMapper.toPhotoLiker(liker, isMe, role); + + return PhotoMapper.toPhotoLiker(liker, profileImageUrl, isMe, role); }) .toList(); diff --git a/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java b/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java index 52b9db3..56631d1 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java @@ -162,10 +162,10 @@ public static AlbumInfoResponse toAlbumInfoResponse(Album album) { .build(); } - public static PhotoLikedUserResponse.PhotoLiker toPhotoLiker(User user, boolean isMe, Role role) { + public static PhotoLikedUserResponse.PhotoLiker toPhotoLiker(User user, String profileImageUrl, boolean isMe, Role role) { return PhotoLikedUserResponse.PhotoLiker.builder() .name(user.getName()) - .profileImageUrl(user.getProfileImage()) + .profileImageUrl(profileImageUrl) .isMe(isMe) .role(role) .build(); diff --git a/src/main/java/com/cheeeese/user/application/UserService.java b/src/main/java/com/cheeeese/user/application/UserService.java index 69bb542..4786cf6 100644 --- a/src/main/java/com/cheeeese/user/application/UserService.java +++ b/src/main/java/com/cheeeese/user/application/UserService.java @@ -1,16 +1,24 @@ package com.cheeeese.user.application; +import com.cheeeese.global.util.resolver.CdnUrlResolver; import com.cheeeese.user.application.validator.UserValidator; import com.cheeeese.user.domain.User; +import com.cheeeese.user.domain.type.ProfileImageType; import com.cheeeese.user.dto.request.UserAgreementRequest; +import com.cheeeese.user.dto.request.UserProfileImageRequest; import com.cheeeese.user.dto.request.UserProfileRequest; +import com.cheeeese.user.dto.response.UserProfileImageResponse; import com.cheeeese.user.exception.UserException; import com.cheeeese.user.exception.code.UserErrorCode; +import com.cheeeese.user.infrastructure.mapper.UserMapper; import com.cheeeese.user.infrastructure.persistence.UserRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.Arrays; +import java.util.List; + @Service @RequiredArgsConstructor @Transactional(readOnly = true) @@ -18,11 +26,28 @@ public class UserService { private final UserValidator userValidator; private final UserRepository userRepository; + private final CdnUrlResolver cdnUrlResolver;; + + @Transactional + public void updateUserName(User user, UserProfileRequest request) { + user.updateUserName(request.name()); + } + + public UserProfileImageResponse getUserProfileImageOpt() { + List opts = + Arrays.stream(ProfileImageType.values()) + .map(type -> { + String resolvedUrl = cdnUrlResolver.resolveProfile(type.getPath()); + return UserMapper.toProfileImageOpt(type, resolvedUrl); + }) + .toList(); + + return UserMapper.toProfileImageResponse(opts); + } @Transactional - public void updateUserProfile(User user, UserProfileRequest request) { - // TODO: 이미지 수정 추후 추가 - user.updateUserProfile(request.name()); + public void updateUserProfileImage(User user, UserProfileImageRequest request) { + user.updateUserProfileImage(request.imageCode()); } @Transactional diff --git a/src/main/java/com/cheeeese/user/domain/User.java b/src/main/java/com/cheeeese/user/domain/User.java index 316d5ee..d878cc4 100644 --- a/src/main/java/com/cheeeese/user/domain/User.java +++ b/src/main/java/com/cheeeese/user/domain/User.java @@ -82,10 +82,14 @@ private User( this.likesCnt = likesCnt; } - public void updateUserProfile(String name) { + public void updateUserName(String name) { this.name = name; } + public void updateUserProfileImage(String profileImage) { + this.profileImage = profileImage; + } + public void saveUserAgreement( boolean isOnboarded, boolean isServiceAgreement, diff --git a/src/main/java/com/cheeeese/user/domain/type/ProfileImageType.java b/src/main/java/com/cheeeese/user/domain/type/ProfileImageType.java new file mode 100644 index 0000000..a2066ff --- /dev/null +++ b/src/main/java/com/cheeeese/user/domain/type/ProfileImageType.java @@ -0,0 +1,28 @@ +package com.cheeeese.user.domain.type; + +import lombok.Getter; + +@Getter +public enum ProfileImageType { + + P1("signup_profile_1.jpg"), + P2("signup_profile_2.jpg"), + P3("signup_profile_3.jpg"), + P4("signup_profile_4.jpg"), + P5("signup_profile_5.jpg"), + P6("signup_profile_6.jpg"), + P7("signup_profile_7.jpg"), + P8("signup_profile_8.jpg"), + P9("signup_profile_9.jpg"), + P10("signup_profile_10.jpg"); + + private final String path; + + ProfileImageType(String path) { + this.path = path; + } + + public static ProfileImageType fromName(String name) { + return ProfileImageType.valueOf(name); + } +} diff --git a/src/main/java/com/cheeeese/user/dto/request/UserProfileImageRequest.java b/src/main/java/com/cheeeese/user/dto/request/UserProfileImageRequest.java new file mode 100644 index 0000000..44a7a58 --- /dev/null +++ b/src/main/java/com/cheeeese/user/dto/request/UserProfileImageRequest.java @@ -0,0 +1,9 @@ +package com.cheeeese.user.dto.request; + +import lombok.Builder; + +@Builder +public record UserProfileImageRequest( + String imageCode +) { +} diff --git a/src/main/java/com/cheeeese/user/dto/response/UserProfileImageResponse.java b/src/main/java/com/cheeeese/user/dto/response/UserProfileImageResponse.java new file mode 100644 index 0000000..53c29a1 --- /dev/null +++ b/src/main/java/com/cheeeese/user/dto/response/UserProfileImageResponse.java @@ -0,0 +1,17 @@ +package com.cheeeese.user.dto.response; + +import lombok.Builder; + +import java.util.List; + +@Builder +public record UserProfileImageResponse( + List opts +) { + + @Builder + public record ProfileImageOpt( + String imageCode, + String profileImageUrl + ) {} +} diff --git a/src/main/java/com/cheeeese/user/infrastructure/mapper/UserMapper.java b/src/main/java/com/cheeeese/user/infrastructure/mapper/UserMapper.java index 87e3489..956b20a 100644 --- a/src/main/java/com/cheeeese/user/infrastructure/mapper/UserMapper.java +++ b/src/main/java/com/cheeeese/user/infrastructure/mapper/UserMapper.java @@ -2,6 +2,10 @@ import com.cheeeese.oauth2.domain.OAuth2UserInfo; import com.cheeeese.user.domain.User; +import com.cheeeese.user.domain.type.ProfileImageType; +import com.cheeeese.user.dto.response.UserProfileImageResponse; + +import java.util.List; public class UserMapper { @@ -13,4 +17,17 @@ public static User toEntity(OAuth2UserInfo oAuth2UserInfo) { .providerId(oAuth2UserInfo.getProviderId()) .build(); } + + public static UserProfileImageResponse.ProfileImageOpt toProfileImageOpt(ProfileImageType type, String imageUrl) { + return UserProfileImageResponse.ProfileImageOpt.builder() + .imageCode(type.name()) + .profileImageUrl(imageUrl) + .build(); + } + + public static UserProfileImageResponse toProfileImageResponse(List opts) { + return UserProfileImageResponse.builder() + .opts(opts) + .build(); + } } diff --git a/src/main/java/com/cheeeese/user/presentation/UserController.java b/src/main/java/com/cheeeese/user/presentation/UserController.java index 6d89341..e88ced1 100644 --- a/src/main/java/com/cheeeese/user/presentation/UserController.java +++ b/src/main/java/com/cheeeese/user/presentation/UserController.java @@ -5,7 +5,9 @@ import com.cheeeese.user.application.UserService; import com.cheeeese.user.domain.User; import com.cheeeese.user.dto.request.UserAgreementRequest; +import com.cheeeese.user.dto.request.UserProfileImageRequest; import com.cheeeese.user.dto.request.UserProfileRequest; +import com.cheeeese.user.dto.response.UserProfileImageResponse; import com.cheeeese.user.presentation.swagger.UserSwagger; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; @@ -27,7 +29,21 @@ public CommonResponse updateUserProfile( @CurrentUser User user, @RequestBody @Valid UserProfileRequest request ) { - userService.updateUserProfile(user, request); + userService.updateUserName(user, request); + return CommonResponse.success(USER_PROFILE_UPDATE_SUCCESS); + } + + @GetMapping("/profile-images") + public CommonResponse getUserProfileImage() { + return CommonResponse.success(USER_PROFILE_UPDATE_SUCCESS, userService.getUserProfileImageOpt()); + } + + @PatchMapping("/me/profile-image") + public CommonResponse updateUserProfileImage( + @CurrentUser User user, + @RequestBody @Valid UserProfileImageRequest request + ) { + userService.updateUserProfileImage(user, request); return CommonResponse.success(USER_PROFILE_UPDATE_SUCCESS); } From 5f6c3dd7422cc4ef7a4625aded2b24f9c28fcac3 Mon Sep 17 00:00:00 2001 From: zyovn Date: Sat, 15 Nov 2025 13:50:31 +0900 Subject: [PATCH 287/402] =?UTF-8?q?#61=20feat:=20=EC=97=85=EB=A1=9C?= =?UTF-8?q?=EB=8D=94=20likeCnt++=20=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=20=EB=B0=8F=20=ED=94=84=EB=A1=9C=ED=95=84=20=EC=9D=B4=EB=AF=B8?= =?UTF-8?q?=EC=A7=80=20url=20=ED=8C=8C=EC=8B=B1=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../photo/application/PhotoService.java | 6 ++++++ .../user/domain/type/ProfileImageType.java | 20 +++++++++---------- .../persistence/UserRepository.java | 17 ++++++++++++++++ 3 files changed, 33 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/cheeeese/photo/application/PhotoService.java b/src/main/java/com/cheeeese/photo/application/PhotoService.java index 6859011..b55eaf7 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoService.java @@ -24,6 +24,7 @@ import com.cheeeese.photo.infrastructure.persistence.PhotoRepository; import com.cheeeese.user.application.UserService; import com.cheeeese.user.domain.User; +import com.cheeeese.user.infrastructure.persistence.UserRepository; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.domain.PageRequest; @@ -41,6 +42,7 @@ public class PhotoService { private final UserService userService; + private final UserRepository userRepository; private final PhotoRepository photoRepository; private final PhotoLikesRepository photoLikesRepository; private final PhotoHistoryRepository photoHistoryRepository; @@ -134,6 +136,8 @@ public void createPhotoLikes(User user, Long photoId) { photoRepository.incrementLikeCnt(photo.getId()); photoLikesRepository.save(photoLikes); + userRepository.incrementLikeCnt(photo.getUser().getId()); + photoQueryService.invalidatePhotoCache(photo.getAlbum().getCode()); } @@ -148,6 +152,8 @@ public void deletePhotoLikes(User user, Long photoId) { photoRepository.decrementLikeCnt(photo.getId()); photoLikesRepository.delete(photoLikes); + userRepository.decrementLikeCnt(photo.getUser().getId()); + photoQueryService.invalidatePhotoCache(photo.getAlbum().getCode()); } diff --git a/src/main/java/com/cheeeese/user/domain/type/ProfileImageType.java b/src/main/java/com/cheeeese/user/domain/type/ProfileImageType.java index a2066ff..ad4b4ec 100644 --- a/src/main/java/com/cheeeese/user/domain/type/ProfileImageType.java +++ b/src/main/java/com/cheeeese/user/domain/type/ProfileImageType.java @@ -5,16 +5,16 @@ @Getter public enum ProfileImageType { - P1("signup_profile_1.jpg"), - P2("signup_profile_2.jpg"), - P3("signup_profile_3.jpg"), - P4("signup_profile_4.jpg"), - P5("signup_profile_5.jpg"), - P6("signup_profile_6.jpg"), - P7("signup_profile_7.jpg"), - P8("signup_profile_8.jpg"), - P9("signup_profile_9.jpg"), - P10("signup_profile_10.jpg"); + P1("profile/signup_profile_1.jpg"), + P2("profile/signup_profile_2.jpg"), + P3("profile/signup_profile_3.jpg"), + P4("profile/signup_profile_4.jpg"), + P5("profile/signup_profile_5.jpg"), + P6("profile/signup_profile_6.jpg"), + P7("profile/signup_profile_7.jpg"), + P8("profile/signup_profile_8.jpg"), + P9("profile/signup_profile_9.jpg"), + P10("profile/signup_profile_10.jpg"); private final String path; diff --git a/src/main/java/com/cheeeese/user/infrastructure/persistence/UserRepository.java b/src/main/java/com/cheeeese/user/infrastructure/persistence/UserRepository.java index f37515c..4c3cfc0 100644 --- a/src/main/java/com/cheeeese/user/infrastructure/persistence/UserRepository.java +++ b/src/main/java/com/cheeeese/user/infrastructure/persistence/UserRepository.java @@ -26,4 +26,21 @@ public interface UserRepository extends JpaRepository { WHERE u.id = :userId """) void incrementAlbumCnt(@Param("userId") Long userId); + + @Modifying + @Query(""" + UPDATE User u + SET u.likesCnt = u.likesCnt + 1 + WHERE u.id = :userId + """) + void incrementLikeCnt(@Param("userId") Long userId); + + @Modifying + @Query(""" + UPDATE User u + SET u.likesCnt = u.likesCnt - 1 + WHERE u.id = :userId + AND u.likesCnt > 0 + """) + void decrementLikeCnt(@Param("userId") Long userId); } From 1cf3e66071d11bf07f161039e58b4c167860c9ec Mon Sep 17 00:00:00 2001 From: zyovn Date: Sat, 15 Nov 2025 14:10:49 +0900 Subject: [PATCH 288/402] =?UTF-8?q?#61=20feat:=20expiredAt=20response?= =?UTF-8?q?=EC=97=90=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cheeeese/album/dto/response/AlbumInfoResponse.java | 6 +++++- .../cheeeese/photo/infrastructure/mapper/PhotoMapper.java | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/cheeeese/album/dto/response/AlbumInfoResponse.java b/src/main/java/com/cheeeese/album/dto/response/AlbumInfoResponse.java index d7bc69e..d7f2498 100644 --- a/src/main/java/com/cheeeese/album/dto/response/AlbumInfoResponse.java +++ b/src/main/java/com/cheeeese/album/dto/response/AlbumInfoResponse.java @@ -4,6 +4,7 @@ import lombok.Builder; import java.time.LocalDate; +import java.time.LocalDateTime; @Builder @Schema(description = "앨범 정보 API") @@ -27,6 +28,9 @@ public record AlbumInfoResponse( LocalDate eventDate, @Schema(description = "현재 사진 수", example = "1212") - int currentPhotoCnt + int currentPhotoCnt, + + @Schema(description = "앨범 만료일자", example = "2025-11-17 16:53:35.430336") + LocalDateTime expiredAt ) { } diff --git a/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java b/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java index 56631d1..74b52cf 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java @@ -159,6 +159,7 @@ public static AlbumInfoResponse toAlbumInfoResponse(Album album) { .currentParticipant(album.getCurrentParticipant()) .eventDate(album.getEventDate()) .currentPhotoCnt(album.getCurrentPhotoCount()) + .expiredAt(album.getExpiredAt()) .build(); } From 089dd768eb9752fd27b1e176379feccb738e4325 Mon Sep 17 00:00:00 2001 From: zyovn Date: Sat, 15 Nov 2025 14:32:51 +0900 Subject: [PATCH 289/402] =?UTF-8?q?#61=20docs:=20swagger=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../global/common/code/SuccessCode.java | 4 +- .../dto/request/UserProfileImageRequest.java | 3 ++ .../response/UserProfileImageResponse.java | 26 +++++++++++++ .../user/presentation/UserController.java | 14 ++++--- .../presentation/swagger/UserSwagger.java | 39 +++++++++++++++++-- 5 files changed, 76 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java index 3a3ce49..ca3b412 100644 --- a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java +++ b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java @@ -17,7 +17,9 @@ public enum SuccessCode implements BaseCode { LOGOUT_SUCCESS(HttpStatus.OK, "로그아웃이 성공적으로 완료되었습니다."), // user - USER_PROFILE_UPDATE_SUCCESS(HttpStatus.OK, "사용자 프로필 업데이트가 성공적으로 완료되었습니다."), + USER_NAME_UPDATE_SUCCESS(HttpStatus.OK, "사용자 이름 업데이트가 성공적으로 완료되었습니다."), + USER_PROFILE_IMAGE_OPT_GET_SUCCESS(HttpStatus.OK, "사용자 프로필 이미지 선택 옵션 목록 조회가 성공적으로 완료되었습니다."), + USER_PROFILE_IMAGE_UPDATE_SUCCESS(HttpStatus.OK, "사용자 프로필 이미지 업데이트가 성공적으로 완료되었습니다."), USER_AGREEMENT_ACCEPT_SUCCESS(HttpStatus.OK, "사용자 이용 약관 동의가 성공적으로 완료되었습니다."), // album diff --git a/src/main/java/com/cheeeese/user/dto/request/UserProfileImageRequest.java b/src/main/java/com/cheeeese/user/dto/request/UserProfileImageRequest.java index 44a7a58..3742013 100644 --- a/src/main/java/com/cheeeese/user/dto/request/UserProfileImageRequest.java +++ b/src/main/java/com/cheeeese/user/dto/request/UserProfileImageRequest.java @@ -1,9 +1,12 @@ package com.cheeeese.user.dto.request; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Builder; @Builder +@Schema(description = "사용자 프로필 이미지 수정 API") public record UserProfileImageRequest( + @Schema(description = "프로필 이미지 코드", example = "P1") String imageCode ) { } diff --git a/src/main/java/com/cheeeese/user/dto/response/UserProfileImageResponse.java b/src/main/java/com/cheeeese/user/dto/response/UserProfileImageResponse.java index 53c29a1..537f6dc 100644 --- a/src/main/java/com/cheeeese/user/dto/response/UserProfileImageResponse.java +++ b/src/main/java/com/cheeeese/user/dto/response/UserProfileImageResponse.java @@ -1,17 +1,43 @@ package com.cheeeese.user.dto.response; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Builder; import java.util.List; @Builder +@Schema(description = "사용자가 선택할 수 있는 프로필 이미지 목록 API") public record UserProfileImageResponse( + @Schema( + description = "프로필 이미지 옵션 목록", + example = """ + [ + { + "imageCode": "P5", + "profileImageUrl": "https://say-cheese-profile.edge.naverncp.com/profile/signup_profile_5.jpg" + }, + { + "imageCode": "P6", + "profileImageUrl": "https://say-cheese-profile.edge.naverncp.com/profile/signup_profile_6.jpg" + } + ] + """ + ) List opts ) { @Builder public record ProfileImageOpt( + @Schema( + description = "프로필 이미지 코드", + example = "P5" + ) String imageCode, + + @Schema( + description = "프로필 이미지의 CDN URL", + example = "https://say-cheese-profile.edge.naverncp.com/profile/signup_profile_5.jpg" + ) String profileImageUrl ) {} } diff --git a/src/main/java/com/cheeeese/user/presentation/UserController.java b/src/main/java/com/cheeeese/user/presentation/UserController.java index e88ced1..aca8ddd 100644 --- a/src/main/java/com/cheeeese/user/presentation/UserController.java +++ b/src/main/java/com/cheeeese/user/presentation/UserController.java @@ -11,10 +11,10 @@ import com.cheeeese.user.presentation.swagger.UserSwagger; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.*; -import static com.cheeeese.global.common.code.SuccessCode.USER_AGREEMENT_ACCEPT_SUCCESS; -import static com.cheeeese.global.common.code.SuccessCode.USER_PROFILE_UPDATE_SUCCESS; +import static com.cheeeese.global.common.code.SuccessCode.*; @RestController @RequiredArgsConstructor @@ -25,26 +25,28 @@ public class UserController implements UserSwagger { @Override @PatchMapping("/me/profile") - public CommonResponse updateUserProfile( + public CommonResponse updateUserName( @CurrentUser User user, @RequestBody @Valid UserProfileRequest request ) { userService.updateUserName(user, request); - return CommonResponse.success(USER_PROFILE_UPDATE_SUCCESS); + return CommonResponse.success(USER_NAME_UPDATE_SUCCESS); } + @Override @GetMapping("/profile-images") public CommonResponse getUserProfileImage() { - return CommonResponse.success(USER_PROFILE_UPDATE_SUCCESS, userService.getUserProfileImageOpt()); + return CommonResponse.success(USER_PROFILE_IMAGE_OPT_GET_SUCCESS, userService.getUserProfileImageOpt()); } + @Override @PatchMapping("/me/profile-image") public CommonResponse updateUserProfileImage( @CurrentUser User user, @RequestBody @Valid UserProfileImageRequest request ) { userService.updateUserProfileImage(user, request); - return CommonResponse.success(USER_PROFILE_UPDATE_SUCCESS); + return CommonResponse.success(USER_PROFILE_IMAGE_UPDATE_SUCCESS); } @Override diff --git a/src/main/java/com/cheeeese/user/presentation/swagger/UserSwagger.java b/src/main/java/com/cheeeese/user/presentation/swagger/UserSwagger.java index 8a69a2a..d81bae7 100644 --- a/src/main/java/com/cheeeese/user/presentation/swagger/UserSwagger.java +++ b/src/main/java/com/cheeeese/user/presentation/swagger/UserSwagger.java @@ -4,7 +4,9 @@ import com.cheeeese.global.util.CurrentUser; import com.cheeeese.user.domain.User; import com.cheeeese.user.dto.request.UserAgreementRequest; +import com.cheeeese.user.dto.request.UserProfileImageRequest; import com.cheeeese.user.dto.request.UserProfileRequest; +import com.cheeeese.user.dto.response.UserProfileImageResponse; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; @@ -15,7 +17,7 @@ @Tag(name = "[사용자]", description = "사용자 관련 API") public interface UserSwagger { @Operation( - summary = "사용자 프로필 수정 API", + summary = "사용자 이름 수정 API", description = """ ### RequestBody --- @@ -25,14 +27,45 @@ public interface UserSwagger { @ApiResponses(value = { @ApiResponse( responseCode = "200", - description = "사용자 프로필이 성공적으로 수정되었습니다." + description = "사용자 이름이 성공적으로 수정되었습니다." ) }) - CommonResponse updateUserProfile( + CommonResponse updateUserName( @CurrentUser User user, @RequestBody @Valid UserProfileRequest request ); + @Operation( + summary = "프로필 이미지 조회 API", + description = "사용자가 선택할 수 있는 프로필 이미지를 조회합니다." + ) + @ApiResponses(value = { + @ApiResponse( + responseCode = "200", + description = "프로필 이미지 목록 조회가 성공적으로 수행되었습니다." + ) + }) + CommonResponse getUserProfileImage(); + + @Operation( + summary = "사용자 프로필 이미지 수정 API", + description = """ + ### RequestBody + --- + `imageCode`: 프로필 이미지 코드 (String) + """ + ) + @ApiResponses(value = { + @ApiResponse( + responseCode = "200", + description = "사용자 프로필 이미지 수정이 성공적으로 수행되었습니다." + ) + }) + CommonResponse updateUserProfileImage( + @CurrentUser User user, + @RequestBody @Valid UserProfileImageRequest request + ); + @Operation( summary = "사용자 이용 약관 동의 API", description = """ From 581dec9ed846fd945cd47be1294ae1c47c31c138 Mon Sep 17 00:00:00 2001 From: zyovn Date: Sat, 15 Nov 2025 14:51:39 +0900 Subject: [PATCH 290/402] =?UTF-8?q?#61=20refactor:=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=9E=90=20=EC=9D=B4=EB=A6=84=20=EC=88=98=EC=A0=95=20API=20url?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cheeeese/user/presentation/UserController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/cheeeese/user/presentation/UserController.java b/src/main/java/com/cheeeese/user/presentation/UserController.java index aca8ddd..39093d9 100644 --- a/src/main/java/com/cheeeese/user/presentation/UserController.java +++ b/src/main/java/com/cheeeese/user/presentation/UserController.java @@ -24,7 +24,7 @@ public class UserController implements UserSwagger { private final UserService userService; @Override - @PatchMapping("/me/profile") + @PatchMapping("/me/name") public CommonResponse updateUserName( @CurrentUser User user, @RequestBody @Valid UserProfileRequest request From f6955e137b7c7321c2c6af4dc962c4d5139da9c0 Mon Sep 17 00:00:00 2001 From: zyovn Date: Sat, 15 Nov 2025 14:53:23 +0900 Subject: [PATCH 291/402] =?UTF-8?q?#61=20fix:=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=9E=90=20=EC=9D=B4=EC=9A=A9=20=EC=95=BD=EA=B4=80=20=EB=8F=99?= =?UTF-8?q?=EC=9D=98=20=EC=A0=9C3=EC=9E=90=20=EC=A0=9C=EA=B3=B5=20?= =?UTF-8?q?=EB=8F=99=EC=9D=98=20validate=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cheeeese/user/application/validator/UserValidator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/cheeeese/user/application/validator/UserValidator.java b/src/main/java/com/cheeeese/user/application/validator/UserValidator.java index 2f931a7..5114c79 100644 --- a/src/main/java/com/cheeeese/user/application/validator/UserValidator.java +++ b/src/main/java/com/cheeeese/user/application/validator/UserValidator.java @@ -9,7 +9,7 @@ public class UserValidator { public void validateUserAgreement(UserAgreementRequest request) { - if (!request.isServiceAgreement() || !request.isUserInfoAgreement()) { + if (!request.isServiceAgreement() || !request.isUserInfoAgreement() || !request.isThirdPartyAgreement()) { throw new UserException(UserErrorCode.REQUIRED_TERMS_NOT_AGREED); } } From db69786f79acdc907c5fd88124e268ebe0f934a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Sat, 15 Nov 2025 15:17:08 +0900 Subject: [PATCH 292/402] =?UTF-8?q?#59=20feat:=20=EB=8B=AB=ED=9E=8C=20?= =?UTF-8?q?=EC=95=A8=EB=B2=94=20=EC=A1=B0=ED=9A=8C=20response?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/response/ClosedAlbumPageResponse.java | 26 +++++++++++++++++ .../response/ClosedAlbumSummaryResponse.java | 28 +++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 src/main/java/com/cheeeese/album/dto/response/ClosedAlbumPageResponse.java create mode 100644 src/main/java/com/cheeeese/album/dto/response/ClosedAlbumSummaryResponse.java diff --git a/src/main/java/com/cheeeese/album/dto/response/ClosedAlbumPageResponse.java b/src/main/java/com/cheeeese/album/dto/response/ClosedAlbumPageResponse.java new file mode 100644 index 0000000..cd9082b --- /dev/null +++ b/src/main/java/com/cheeeese/album/dto/response/ClosedAlbumPageResponse.java @@ -0,0 +1,26 @@ +package com.cheeeese.album.dto.response; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Builder; + +import java.util.List; + +@Builder +@Schema(description = "닫힌 앨범 목록 페이지 응답") +public record ClosedAlbumPageResponse( + @Schema(description = "닫힌 앨범 목록") + List responses, + + @Schema(description = "현재 페이지의 앨범 수", example = "2") + int listSize, + + @Schema(description = "첫 페이지 여부", example = "true") + boolean isFirst, + + @Schema(description = "마지막 페이지 여부", example = "false") + boolean isLast, + + @Schema(description = "다음 페이지 존재 여부", example = "true") + boolean hasNext +) { +} diff --git a/src/main/java/com/cheeeese/album/dto/response/ClosedAlbumSummaryResponse.java b/src/main/java/com/cheeeese/album/dto/response/ClosedAlbumSummaryResponse.java new file mode 100644 index 0000000..d7d12ab --- /dev/null +++ b/src/main/java/com/cheeeese/album/dto/response/ClosedAlbumSummaryResponse.java @@ -0,0 +1,28 @@ +package com.cheeeese.album.dto.response; + +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Builder; + +import java.time.LocalDate; +import java.util.List; + +@Builder +@Schema(description = "닫힌 앨범 요약 정보") +public record ClosedAlbumSummaryResponse( + @Schema(description = "앨범 코드", example = "786ccd09-...") + String code, + + @Schema(description = "앨범 제목", example = "봄 소풍") + String title, + + @Schema(description = "앨범 생성자 이름", example = "치즈메이커") + String makerName, + + @Schema(description = "이벤트 날짜", example = "2025-05-01") + LocalDate eventDate, + + @JsonInclude(JsonInclude.Include.ALWAYS) + @Schema(description = "치즈네컷 썸네일 목록 (4개)") + List thumbnails +) {} From 2692cb6bdf5c4a8cf6c8e98f9cab16a168823832 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Sat, 15 Nov 2025 15:17:21 +0900 Subject: [PATCH 293/402] =?UTF-8?q?#59=20feat:=20=EC=97=B4=EB=A6=B0=20?= =?UTF-8?q?=EC=95=A8=EB=B2=94=20=EC=A1=B0=ED=9A=8C=20response?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/response/OpenAlbumPageResponse.java | 26 +++++++++++ .../response/OpenAlbumSummaryResponse.java | 43 +++++++++++++++++++ 2 files changed, 69 insertions(+) create mode 100644 src/main/java/com/cheeeese/album/dto/response/OpenAlbumPageResponse.java create mode 100644 src/main/java/com/cheeeese/album/dto/response/OpenAlbumSummaryResponse.java diff --git a/src/main/java/com/cheeeese/album/dto/response/OpenAlbumPageResponse.java b/src/main/java/com/cheeeese/album/dto/response/OpenAlbumPageResponse.java new file mode 100644 index 0000000..616dd2d --- /dev/null +++ b/src/main/java/com/cheeeese/album/dto/response/OpenAlbumPageResponse.java @@ -0,0 +1,26 @@ +package com.cheeeese.album.dto.response; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Builder; + +import java.util.List; + +@Builder +@Schema(description = "열린 앨범 목록 페이지 응답") +public record OpenAlbumPageResponse( + @Schema(description = "열린 앨범 목록") + List responses, + + @Schema(description = "현재 페이지의 앨범 수", example = "2") + int listSize, + + @Schema(description = "첫 페이지 여부", example = "true") + boolean isFirst, + + @Schema(description = "마지막 페이지 여부", example = "false") + boolean isLast, + + @Schema(description = "다음 페이지 존재 여부", example = "true") + boolean hasNext +) { +} diff --git a/src/main/java/com/cheeeese/album/dto/response/OpenAlbumSummaryResponse.java b/src/main/java/com/cheeeese/album/dto/response/OpenAlbumSummaryResponse.java new file mode 100644 index 0000000..d2c3eee --- /dev/null +++ b/src/main/java/com/cheeeese/album/dto/response/OpenAlbumSummaryResponse.java @@ -0,0 +1,43 @@ +package com.cheeeese.album.dto.response; + +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Builder; + +import java.awt.*; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.List; + +@Builder +@Schema(description = "열린 앨범 요약 정보") +public record OpenAlbumSummaryResponse( + @Schema(description = "앨범 코드", example = "1f0ba577-39f3-69b6-abab-455897f404fe") + String code, + + @Schema(description = "앨범 테마 이모지", example = "U+1F36F") + String themeEmoji, + + @Schema(description = "앨범 제목", example = "봄 소풍") + String title, + + @Schema(description = "이벤트 날짜", example = "2025-05-01") + LocalDate eventDate, + + @Schema(description = "앨범 생성자 이름", example = "치즈메이커") + String makerName, + + @Schema(description = "현재 참여자 수", example = "8") + int currentParticipant, + + @Schema(description = "전체 참여자 수", example = "10") + int participant, + + @Schema(description = "앨범 만료 예정 일시", example = "2025-05-05T12:00:00") + LocalDateTime expiredAt, + + @JsonInclude(JsonInclude.Include.ALWAYS) + @Schema(description = "최근 업로드된 사진 썸네일 3장") + List recentPhotoThumbnails +) { +} From d615694f26d59c9ea2676cd405efee02a05abff7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Sat, 15 Nov 2025 15:20:07 +0900 Subject: [PATCH 294/402] =?UTF-8?q?#59=20feat:=20=EB=A7=88=EC=9D=B4?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80-=EC=95=A8=EB=B2=94=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20API=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../album/application/AlbumQueryService.java | 154 ++++++++++++++++++ .../mapper/AlbumQueryMapper.java | 73 +++++++++ .../persistence/UserAlbumRepository.java | 56 +++++++ .../presentation/AlbumQueryController.java | 65 ++++++++ .../swagger/AlbumQuerySwagger.java | 69 ++++++++ .../Cheese4cutPhotoRepository.java | 19 +++ 6 files changed, 436 insertions(+) create mode 100644 src/main/java/com/cheeeese/album/application/AlbumQueryService.java create mode 100644 src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumQueryMapper.java create mode 100644 src/main/java/com/cheeeese/album/presentation/AlbumQueryController.java create mode 100644 src/main/java/com/cheeeese/album/presentation/swagger/AlbumQuerySwagger.java create mode 100644 src/main/java/com/cheeeese/cheese4cut/infrastructure/persistence/Cheese4cutPhotoRepository.java diff --git a/src/main/java/com/cheeeese/album/application/AlbumQueryService.java b/src/main/java/com/cheeeese/album/application/AlbumQueryService.java new file mode 100644 index 0000000..eb0b73b --- /dev/null +++ b/src/main/java/com/cheeeese/album/application/AlbumQueryService.java @@ -0,0 +1,154 @@ +package com.cheeeese.album.application; + +import com.cheeeese.album.domain.Album; +import com.cheeeese.album.domain.type.Role; +import com.cheeeese.album.dto.response.ClosedAlbumPageResponse; +import com.cheeeese.album.dto.response.ClosedAlbumSummaryResponse; +import com.cheeeese.album.dto.response.OpenAlbumPageResponse; +import com.cheeeese.album.dto.response.OpenAlbumSummaryResponse; +import com.cheeeese.album.infrastructure.mapper.AlbumQueryMapper; +import com.cheeeese.album.infrastructure.persistence.UserAlbumRepository; +import com.cheeeese.cheese4cut.domain.Cheese4cutPhoto; +import com.cheeeese.cheese4cut.infrastructure.persistence.Cheese4cutPhotoRepository; +import com.cheeeese.global.util.resolver.CdnUrlResolver; +import com.cheeeese.photo.domain.Photo; +import com.cheeeese.photo.domain.PhotoStatus; +import com.cheeeese.photo.infrastructure.persistence.PhotoRepository; +import com.cheeeese.user.domain.User; +import com.cheeeese.user.exception.UserException; +import com.cheeeese.user.exception.code.UserErrorCode; +import com.cheeeese.user.infrastructure.persistence.UserRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Slice; +import org.springframework.data.domain.Sort; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.*; +import java.util.stream.Collectors; + +@Service +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class AlbumQueryService { + + private static final int RECENT_THUMBNAIL_COUNT = 3; + + private final UserAlbumRepository userAlbumRepository; + private final UserRepository userRepository; + private final PhotoRepository photoRepository; + private final Cheese4cutPhotoRepository cheese4cutPhotoRepository; + private final CdnUrlResolver cdnUrlResolver; + + public OpenAlbumPageResponse getOpenAlbums(User user, int page, int size) { + Pageable pageable = PageRequest.of(page, size); + + Slice albums = userAlbumRepository.findOpenAlbumsByUserId( + user.getId(), + Album.AlbumStatus.ACTIVE, + LocalDateTime.now(), + pageable + ); + + List responses = buildOpenAlbumResponses(albums.getContent()); + + return AlbumQueryMapper.toOpenAlbumPageResponse(responses, albums); + } + + public OpenAlbumPageResponse getMyOpenAlbums(User user, int page, int size) { + Pageable pageable = PageRequest.of(page, size); + Slice albums = userAlbumRepository.findOpenAlbumsByUserIdAndRole( + user.getId(), + Role.MAKER, + Album.AlbumStatus.ACTIVE, + LocalDateTime.now(), + pageable + ); + + List responses = buildOpenAlbumResponses(albums.getContent()); + + return AlbumQueryMapper.toOpenAlbumPageResponse(responses, albums); + } + + public ClosedAlbumPageResponse getClosedAlbums(User user, int page, int size) { + Pageable pageable = PageRequest.of(page, size); + + Slice expiredAlbums = userAlbumRepository.findClosedAlbumsByUserId( + user.getId(), + Album.AlbumStatus.EXPIRED, + pageable + ); + + List albumIds = expiredAlbums.getContent().stream() + .map(Album::getId) + .toList(); + + if (albumIds.isEmpty()) { + return AlbumQueryMapper.toClosedAlbumPageResponse(List.of(), expiredAlbums); + } + + List allCheese4cutPhotos = cheese4cutPhotoRepository.findAllCheese4cutPhotosByAlbumIds(albumIds); + + Map> cheese4cutPhotoMap = allCheese4cutPhotos.stream() + .collect(Collectors.groupingBy( + c4p -> c4p.getCheese4cut().getAlbum().getId(), + Collectors.toList() + )); + + List responses = expiredAlbums.getContent().stream() + .map(album -> { + List c4pList = cheese4cutPhotoMap.getOrDefault(album.getId(), List.of()); + + User maker = getMaker(album.getMakerId()); + + List thumbnails = c4pList.stream() + .sorted(Comparator.comparingInt(Cheese4cutPhoto::getPhotoRank)) // photoRank 순으로 정렬 + .map(Cheese4cutPhoto::getThumbnailImageUrl) + .map(cdnUrlResolver::resolveThumbnail) + .collect(Collectors.toList()); + + return AlbumQueryMapper.toClosedAlbumSummaryResponse(album, maker, thumbnails); + }) + .collect(Collectors.toList()); + + return AlbumQueryMapper.toClosedAlbumPageResponse(responses, expiredAlbums); + } + + private List buildOpenAlbumResponses(List albums) { + return albums.stream() + .map(album -> { + User maker = getMaker(album.getMakerId()); + List recentThumbnails = getRecentThumbnails(album.getId()); + return AlbumQueryMapper.toOpenAlbumSummaryResponse(album, maker, recentThumbnails); + }) + .toList(); + } + + private User getMaker(Long makerId) { + return userRepository.findById(makerId) + .orElseThrow(() -> new UserException(UserErrorCode.USER_NOT_FOUND)); + } + + private List getRecentThumbnails(Long albumId) { + Pageable pageable = PageRequest.of(0, RECENT_THUMBNAIL_COUNT, Sort.by(Sort.Direction.DESC, "createdAt")); + + List photos = photoRepository.findRecentPhotosByAlbumIdAndStatus( + albumId, + PhotoStatus.COMPLETED, + pageable + ); + + // 3개 미만이면 아예 제공 안 함 + if (photos.size() < RECENT_THUMBNAIL_COUNT) { + return List.of(); + } + + return photos.stream() + .map(Photo::getThumbnailUrl) + .map(cdnUrlResolver::resolveThumbnail) + .toList(); + } +} diff --git a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumQueryMapper.java b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumQueryMapper.java new file mode 100644 index 0000000..2ca9947 --- /dev/null +++ b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumQueryMapper.java @@ -0,0 +1,73 @@ +package com.cheeeese.album.infrastructure.mapper; + +import com.cheeeese.album.domain.Album; +import com.cheeeese.album.dto.response.ClosedAlbumPageResponse; +import com.cheeeese.album.dto.response.ClosedAlbumSummaryResponse; +import com.cheeeese.album.dto.response.OpenAlbumPageResponse; +import com.cheeeese.album.dto.response.OpenAlbumSummaryResponse; +import com.cheeeese.user.domain.User; +import org.springframework.data.domain.Slice; + +import java.util.List; + +public class AlbumQueryMapper { + + public static OpenAlbumPageResponse toOpenAlbumPageResponse( + List responses, + Slice albums + ){ + return OpenAlbumPageResponse.builder() + .responses(responses) + .listSize(responses.size()) + .isFirst(albums.isFirst()) + .isLast(albums.isLast()) + .hasNext(albums.hasNext()) + .build(); + } + + public static ClosedAlbumPageResponse toClosedAlbumPageResponse( + List responses, + Slice albums + ){ + return ClosedAlbumPageResponse.builder() + .responses(responses) + .listSize(responses.size()) + .isFirst(albums.isFirst()) + .isLast(albums.isLast()) + .hasNext(albums.hasNext()) + .build(); + } + + public static OpenAlbumSummaryResponse toOpenAlbumSummaryResponse( + Album album, + User maker, + List thumbnails + ){ + return OpenAlbumSummaryResponse.builder() + .code(album.getCode()) + .themeEmoji(album.getThemeEmoji()) + .title(album.getTitle()) + .eventDate(album.getEventDate()) + .makerName(maker != null ? maker.getName() : null) + .currentParticipant(album.getCurrentParticipant()) + .participant(album.getParticipant()) + .expiredAt(album.getExpiredAt()) + .recentPhotoThumbnails(thumbnails.isEmpty() ? null : thumbnails) + .build(); + } + + public static ClosedAlbumSummaryResponse toClosedAlbumSummaryResponse( + Album album, + User maker, + List thumbnails + ) { + return ClosedAlbumSummaryResponse.builder() + .code(album.getCode()) + .title(album.getTitle()) + .makerName(maker != null ? maker.getName() : null) + .eventDate(album.getEventDate()) + .thumbnails(thumbnails.isEmpty() ? null : thumbnails) + .build(); + } + +} diff --git a/src/main/java/com/cheeeese/album/infrastructure/persistence/UserAlbumRepository.java b/src/main/java/com/cheeeese/album/infrastructure/persistence/UserAlbumRepository.java index c1eb92d..b32800a 100644 --- a/src/main/java/com/cheeeese/album/infrastructure/persistence/UserAlbumRepository.java +++ b/src/main/java/com/cheeeese/album/infrastructure/persistence/UserAlbumRepository.java @@ -1,11 +1,15 @@ package com.cheeeese.album.infrastructure.persistence; +import com.cheeeese.album.domain.Album; import com.cheeeese.album.domain.UserAlbum; import com.cheeeese.album.domain.type.Role; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Slice; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; +import java.time.LocalDateTime; import java.util.List; import java.util.Optional; @@ -18,4 +22,56 @@ public interface UserAlbumRepository extends JpaRepository { @Query("SELECT ua FROM UserAlbum ua WHERE ua.album.id = :albumId AND ua.user.id = :userId AND ua.role = :role") Optional findByAlbumIdAndUserIdAndRole(@Param("albumId") Long albumId, @Param("userId") Long userId, @Param("role") Role role); + + long countByUserIdAndAlbumStatusIn(Long userId, List statuses); + + @Query(""" + SELECT a + FROM UserAlbum ua + JOIN ua.album a + WHERE ua.user.id = :userId + AND ua.isVisible = TRUE + AND a.status = :status + AND a.expiredAt > :now + ORDER BY a.expiredAt ASC + """) + Slice findOpenAlbumsByUserId( + @Param("userId") Long userId, + @Param("status") Album.AlbumStatus status, + @Param("now") LocalDateTime now, + Pageable pageable + ); + + @Query(""" + SELECT a + FROM UserAlbum ua + JOIN ua.album a + WHERE ua.user.id = :userId + AND ua.role = :role + AND ua.isVisible = TRUE + AND a.status = :status + AND a.expiredAt > :now + """) + Slice findOpenAlbumsByUserIdAndRole( + @Param("userId") Long userId, + @Param("role") Role role, + @Param("status") Album.AlbumStatus status, + @Param("now") LocalDateTime now, + Pageable pageable + ); + + @Query(""" + SELECT a + FROM UserAlbum ua + JOIN ua.album a + WHERE ua.user.id = :userId + AND ua.isVisible = TRUE + AND a.status = :status + ORDER BY a.createdAt DESC + """) + Slice findClosedAlbumsByUserId( + @Param("userId") Long userId, + @Param("status") Album.AlbumStatus status, + Pageable pageable + ); } diff --git a/src/main/java/com/cheeeese/album/presentation/AlbumQueryController.java b/src/main/java/com/cheeeese/album/presentation/AlbumQueryController.java new file mode 100644 index 0000000..153bbfd --- /dev/null +++ b/src/main/java/com/cheeeese/album/presentation/AlbumQueryController.java @@ -0,0 +1,65 @@ +package com.cheeeese.album.presentation; + +import com.cheeeese.album.application.AlbumQueryService; +import com.cheeeese.album.dto.response.ClosedAlbumPageResponse; +import com.cheeeese.album.dto.response.OpenAlbumPageResponse; +import com.cheeeese.album.presentation.swagger.AlbumQuerySwagger; +import com.cheeeese.global.common.CommonResponse; +import com.cheeeese.global.util.CurrentUser; +import com.cheeeese.user.domain.User; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import static com.cheeeese.global.common.code.SuccessCode.ALBUM_CLOSED_LIST_FETCH_SUCCESS; +import static com.cheeeese.global.common.code.SuccessCode.ALBUM_MY_OPEN_LIST_FETCH_SUCCESS; +import static com.cheeeese.global.common.code.SuccessCode.ALBUM_OPEN_LIST_FETCH_SUCCESS; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/v1/album") +public class AlbumQueryController implements AlbumQuerySwagger { + + private final AlbumQueryService albumQueryService; + + @Override + @GetMapping("/open") + public CommonResponse getOpenAlbums( + @CurrentUser User user, + @RequestParam(defaultValue = "0") int page, + @RequestParam(defaultValue = "2") int size + ) { + return CommonResponse.success( + ALBUM_OPEN_LIST_FETCH_SUCCESS, + albumQueryService.getOpenAlbums(user, page, size) + ); + } + + @Override + @GetMapping("/open/me") + public CommonResponse getMyOpenAlbums( + @CurrentUser User user, + @RequestParam(defaultValue = "0") int page, + @RequestParam(defaultValue = "2") int size + ) { + return CommonResponse.success( + ALBUM_MY_OPEN_LIST_FETCH_SUCCESS, + albumQueryService.getMyOpenAlbums(user, page, size) + ); + } + + @Override + @GetMapping("/closed") + public CommonResponse getClosedAlbums( + @CurrentUser User user, + @RequestParam(defaultValue = "0") int page, + @RequestParam(defaultValue = "6") int size + ) { + return CommonResponse.success( + ALBUM_CLOSED_LIST_FETCH_SUCCESS, + albumQueryService.getClosedAlbums(user, page, size) + ); + } +} diff --git a/src/main/java/com/cheeeese/album/presentation/swagger/AlbumQuerySwagger.java b/src/main/java/com/cheeeese/album/presentation/swagger/AlbumQuerySwagger.java new file mode 100644 index 0000000..937dd42 --- /dev/null +++ b/src/main/java/com/cheeeese/album/presentation/swagger/AlbumQuerySwagger.java @@ -0,0 +1,69 @@ +package com.cheeeese.album.presentation.swagger; + +import com.cheeeese.album.dto.response.ClosedAlbumPageResponse; +import com.cheeeese.album.dto.response.OpenAlbumPageResponse; +import com.cheeeese.global.common.CommonResponse; +import com.cheeeese.global.util.CurrentUser; +import com.cheeeese.user.domain.User; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; + +@Tag(name = "[마이페이지-앨범-조회]", description = "앨범 목록 조회 API") +@RequestMapping("/v1/album") +public interface AlbumQuerySwagger { + + @Operation( + summary = "열린 앨범 전체 조회", + description = "사용자가 참여 중인 모든 열린 앨범을 만료 임박 순으로 조회합니다." + ) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "열린 앨범 목록 조회 성공") + }) + @GetMapping("/open") + CommonResponse getOpenAlbums( + @CurrentUser User user, + @Parameter(description = "페이지 번호", schema = @Schema(defaultValue = "0")) + @RequestParam(defaultValue = "0") int page, + @Parameter(description = "페이지 크기", schema = @Schema(defaultValue = "2")) + @RequestParam(defaultValue = "2") int size + ); + + @Operation( + summary = "열린 앨범 중 내가 만든 앨범 조회", + description = "사용자가 메이커인 열린 앨범을 만료 임박 순으로 조회합니다." + ) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "내가 만든 열린 앨범 목록 조회 성공") + }) + @GetMapping("/open/me") + CommonResponse getMyOpenAlbums( + @CurrentUser User user, + @Parameter(description = "페이지 번호", schema = @Schema(defaultValue = "0")) + @RequestParam(defaultValue = "0") int page, + @Parameter(description = "페이지 크기", schema = @Schema(defaultValue = "2")) + @RequestParam(defaultValue = "2") int size + ); + + @Operation( + summary = "닫힌 앨범 목록 조회", + description = "사용자가 참여했던 닫힌 앨범을 생성일 최신 순으로 조회합니다." + ) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "닫힌 앨범 목록 조회 성공") + }) + @GetMapping("/closed") + CommonResponse getClosedAlbums( + @CurrentUser User user, + @Parameter(description = "페이지 번호", schema = @Schema(defaultValue = "0")) + @RequestParam(defaultValue = "0") int page, + @Parameter(description = "페이지 크기", schema = @Schema(defaultValue = "6")) + @RequestParam(defaultValue = "6") int size + ); +} diff --git a/src/main/java/com/cheeeese/cheese4cut/infrastructure/persistence/Cheese4cutPhotoRepository.java b/src/main/java/com/cheeeese/cheese4cut/infrastructure/persistence/Cheese4cutPhotoRepository.java new file mode 100644 index 0000000..6a40250 --- /dev/null +++ b/src/main/java/com/cheeeese/cheese4cut/infrastructure/persistence/Cheese4cutPhotoRepository.java @@ -0,0 +1,19 @@ +package com.cheeeese.cheese4cut.infrastructure.persistence; + +import com.cheeeese.cheese4cut.domain.Cheese4cutPhoto; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +import java.util.List; + +public interface Cheese4cutPhotoRepository extends JpaRepository { + @Query(""" + SELECT c4p + FROM Cheese4cutPhoto c4p + JOIN FETCH c4p.cheese4cut c4c + WHERE c4c.album.id IN :albumIds + ORDER BY c4c.album.createdAt DESC, c4p.photoRank ASC +""") + List findAllCheese4cutPhotosByAlbumIds(@Param("albumIds") List albumIds); +} From a0d0407041b0b7feb4ea2475d021b44fd56daf68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Sat, 15 Nov 2025 15:22:16 +0900 Subject: [PATCH 295/402] =?UTF-8?q?#59=20remove:=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=ED=95=98=EC=A7=80=20=EC=95=8A=EB=8A=94=20import=EB=AC=B8=20?= =?UTF-8?q?=EB=B0=8F=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cheeeese/album/dto/response/OpenAlbumSummaryResponse.java | 1 - .../album/infrastructure/persistence/UserAlbumRepository.java | 2 -- 2 files changed, 3 deletions(-) diff --git a/src/main/java/com/cheeeese/album/dto/response/OpenAlbumSummaryResponse.java b/src/main/java/com/cheeeese/album/dto/response/OpenAlbumSummaryResponse.java index d2c3eee..6770316 100644 --- a/src/main/java/com/cheeeese/album/dto/response/OpenAlbumSummaryResponse.java +++ b/src/main/java/com/cheeeese/album/dto/response/OpenAlbumSummaryResponse.java @@ -4,7 +4,6 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Builder; -import java.awt.*; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.List; diff --git a/src/main/java/com/cheeeese/album/infrastructure/persistence/UserAlbumRepository.java b/src/main/java/com/cheeeese/album/infrastructure/persistence/UserAlbumRepository.java index b32800a..b622e7b 100644 --- a/src/main/java/com/cheeeese/album/infrastructure/persistence/UserAlbumRepository.java +++ b/src/main/java/com/cheeeese/album/infrastructure/persistence/UserAlbumRepository.java @@ -23,8 +23,6 @@ public interface UserAlbumRepository extends JpaRepository { @Query("SELECT ua FROM UserAlbum ua WHERE ua.album.id = :albumId AND ua.user.id = :userId AND ua.role = :role") Optional findByAlbumIdAndUserIdAndRole(@Param("albumId") Long albumId, @Param("userId") Long userId, @Param("role") Role role); - long countByUserIdAndAlbumStatusIn(Long userId, List statuses); - @Query(""" SELECT a FROM UserAlbum ua From c167d5b67825e9ebfcae33855ea543b6f3f3bd8f Mon Sep 17 00:00:00 2001 From: zyovn Date: Sat, 15 Nov 2025 15:36:41 +0900 Subject: [PATCH 296/402] =?UTF-8?q?#61=20fix:=20=ED=94=BC=EB=93=9C?= =?UTF-8?q?=EB=B0=B1=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cheeeese/global/util/ProfileImageUtil.java | 1 + .../com/cheeeese/photo/application/PhotoInfoService.java | 2 +- .../java/com/cheeeese/user/application/UserService.java | 3 ++- .../com/cheeeese/user/domain/type/ProfileImageType.java | 9 +++++++-- .../cheeeese/user/dto/request/UserAgreementRequest.java | 1 + .../user/infrastructure/persistence/UserRepository.java | 4 ++-- 6 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/cheeeese/global/util/ProfileImageUtil.java b/src/main/java/com/cheeeese/global/util/ProfileImageUtil.java index 8435bb5..152a205 100644 --- a/src/main/java/com/cheeeese/global/util/ProfileImageUtil.java +++ b/src/main/java/com/cheeeese/global/util/ProfileImageUtil.java @@ -8,6 +8,7 @@ public class ProfileImageUtil { public static String resolveProfileImage(User user, CdnUrlResolver resolver) { ProfileImageType type = ProfileImageType.fromName(user.getProfileImage()); + if (type == null) return null; return resolver.resolveProfile(type.getPath()); } } diff --git a/src/main/java/com/cheeeese/photo/application/PhotoInfoService.java b/src/main/java/com/cheeeese/photo/application/PhotoInfoService.java index 0c99f2a..ac9efc1 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoInfoService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoInfoService.java @@ -41,7 +41,7 @@ public PhotoLikedUserResponse getPhotoLikedUsers(User user, String code, Long ph List likers = users.stream() .map(liker -> { - ProfileImageType type = ProfileImageType.fromName(user.getProfileImage()); + ProfileImageType type = ProfileImageType.fromName(liker.getProfileImage()); String profileImageUrl = cdnUrlResolver.resolveProfile(type.getPath()); boolean isMe = liker.getId().equals(user.getId()); Role role = liker.getId().equals(album.getMakerId()) ? Role.MAKER : Role.GUEST; diff --git a/src/main/java/com/cheeeese/user/application/UserService.java b/src/main/java/com/cheeeese/user/application/UserService.java index 4786cf6..d8191a6 100644 --- a/src/main/java/com/cheeeese/user/application/UserService.java +++ b/src/main/java/com/cheeeese/user/application/UserService.java @@ -47,7 +47,8 @@ public UserProfileImageResponse getUserProfileImageOpt() { @Transactional public void updateUserProfileImage(User user, UserProfileImageRequest request) { - user.updateUserProfileImage(request.imageCode()); + ProfileImageType type = ProfileImageType.fromName(request.imageCode()); + user.updateUserProfileImage(type.name()); } @Transactional diff --git a/src/main/java/com/cheeeese/user/domain/type/ProfileImageType.java b/src/main/java/com/cheeeese/user/domain/type/ProfileImageType.java index ad4b4ec..e2a5544 100644 --- a/src/main/java/com/cheeeese/user/domain/type/ProfileImageType.java +++ b/src/main/java/com/cheeeese/user/domain/type/ProfileImageType.java @@ -4,7 +4,6 @@ @Getter public enum ProfileImageType { - P1("profile/signup_profile_1.jpg"), P2("profile/signup_profile_2.jpg"), P3("profile/signup_profile_3.jpg"), @@ -23,6 +22,12 @@ public enum ProfileImageType { } public static ProfileImageType fromName(String name) { - return ProfileImageType.valueOf(name); + if (name == null || name.isBlank()) return null; + + try { + return ProfileImageType.valueOf(name); + } catch (IllegalArgumentException e) { + return null; + } } } diff --git a/src/main/java/com/cheeeese/user/dto/request/UserAgreementRequest.java b/src/main/java/com/cheeeese/user/dto/request/UserAgreementRequest.java index 5b7f8cb..2139d87 100644 --- a/src/main/java/com/cheeeese/user/dto/request/UserAgreementRequest.java +++ b/src/main/java/com/cheeeese/user/dto/request/UserAgreementRequest.java @@ -27,6 +27,7 @@ public record UserAgreementRequest( ) boolean isMarketingAgreement, + @NotNull @Schema( description = "제3자 제공 동의", example = "false" diff --git a/src/main/java/com/cheeeese/user/infrastructure/persistence/UserRepository.java b/src/main/java/com/cheeeese/user/infrastructure/persistence/UserRepository.java index 4c3cfc0..e013037 100644 --- a/src/main/java/com/cheeeese/user/infrastructure/persistence/UserRepository.java +++ b/src/main/java/com/cheeeese/user/infrastructure/persistence/UserRepository.java @@ -27,7 +27,7 @@ public interface UserRepository extends JpaRepository { """) void incrementAlbumCnt(@Param("userId") Long userId); - @Modifying + @Modifying(flushAutomatically = true) @Query(""" UPDATE User u SET u.likesCnt = u.likesCnt + 1 @@ -35,7 +35,7 @@ public interface UserRepository extends JpaRepository { """) void incrementLikeCnt(@Param("userId") Long userId); - @Modifying + @Modifying(flushAutomatically = true) @Query(""" UPDATE User u SET u.likesCnt = u.likesCnt - 1 From 2f4d6ab85e4e4087fa0fa737fe93f52266b3e809 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Sat, 15 Nov 2025 15:41:33 +0900 Subject: [PATCH 297/402] =?UTF-8?q?#59=20remove:=20=EC=B9=98=EC=A6=88?= =?UTF-8?q?=EB=84=A4=EC=BB=B7=20presigned=20url=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/Cheese4cutService.java | 13 ------------ .../presentation/Cheese4cutController.java | 10 --------- .../swagger/Cheese4cutSwagger.java | 20 ------------------ .../application/PresignedUrlService.java | 21 ------------------- 4 files changed, 64 deletions(-) diff --git a/src/main/java/com/cheeeese/cheese4cut/application/Cheese4cutService.java b/src/main/java/com/cheeeese/cheese4cut/application/Cheese4cutService.java index 5b577fb..df614d7 100644 --- a/src/main/java/com/cheeeese/cheese4cut/application/Cheese4cutService.java +++ b/src/main/java/com/cheeeese/cheese4cut/application/Cheese4cutService.java @@ -12,7 +12,6 @@ import com.cheeeese.cheese4cut.domain.Cheese4cut; import com.cheeeese.cheese4cut.dto.request.Cheese4cutFixedRequest; import com.cheeeese.cheese4cut.dto.response.Cheese4cutFinalResponse; -import com.cheeeese.cheese4cut.dto.response.Cheese4cutPresignedUrlResponse; import com.cheeeese.cheese4cut.dto.response.Cheese4cutPreviewResponse; import com.cheeeese.cheese4cut.dto.response.Cheese4cutResponse; import com.cheeeese.cheese4cut.exception.Cheese4cutException; @@ -21,7 +20,6 @@ import com.cheeeese.cheese4cut.infrastructure.persistence.Cheese4cutRepository; import com.cheeeese.global.security.CustomUserDetails; import com.cheeeese.global.util.resolver.CdnUrlResolver; -import com.cheeeese.photo.application.PresignedUrlService; import com.cheeeese.photo.domain.Photo; import com.cheeeese.photo.domain.PhotoStatus; import com.cheeeese.photo.infrastructure.persistence.PhotoLikesRepository; @@ -52,7 +50,6 @@ public class Cheese4cutService { private final PhotoLikesRepository photoLikesRepository; private final UserAlbumRepository userAlbumRepository; private final AlbumValidator albumValidator; - private final PresignedUrlService presignedUrlService; private final Cheese4cutValidator cheese4cutValidator; private final CdnUrlResolver cdnUrlResolver; @@ -121,16 +118,6 @@ private Cheese4cutResponse getPreviewResponse(Long albumId, int participant, Rol return Cheese4cutMapper.toPreviewResponse(resolvedPhotoInfos, uniqueLikesCount, participant, myRole); } - @Transactional(readOnly = true) - public Cheese4cutPresignedUrlResponse createCheese4cutPresignedUrl(User user, String code) { - Album album = albumValidator.validateAlbumCode(code); - albumValidator.validateUploadPermission(album, user); - - String uploadUrl = presignedUrlService.generateCheese4cutPresignedPutUrl(code); - - return Cheese4cutMapper.toPresignedUrlResponse(uploadUrl); - } - public void finalizeCheese4cut(User user, String code, Cheese4cutFixedRequest request) { Album album = albumValidator.validateAlbumCode(code); diff --git a/src/main/java/com/cheeeese/cheese4cut/presentation/Cheese4cutController.java b/src/main/java/com/cheeeese/cheese4cut/presentation/Cheese4cutController.java index 74b843b..3d5dff1 100644 --- a/src/main/java/com/cheeeese/cheese4cut/presentation/Cheese4cutController.java +++ b/src/main/java/com/cheeeese/cheese4cut/presentation/Cheese4cutController.java @@ -37,16 +37,6 @@ public CommonResponse getCheese4cut( cheese4cutService.getCheese4cutByAlbumCode(authentication, code)); } - @Override - @PostMapping("/presigned-url") - public CommonResponse createCheese4cutPresignedUrl( - @CurrentUser User user, - @PathVariable @NotBlank String code - ) { - return CommonResponse.success(PRESIGNED_URL_ISSUE_SUCCESS, - cheese4cutService.createCheese4cutPresignedUrl(user, code)); - } - @Override @PostMapping("/fixed") public CommonResponse finalizeCheese4cut( diff --git a/src/main/java/com/cheeeese/cheese4cut/presentation/swagger/Cheese4cutSwagger.java b/src/main/java/com/cheeeese/cheese4cut/presentation/swagger/Cheese4cutSwagger.java index d15f0ff..8eeeda7 100644 --- a/src/main/java/com/cheeeese/cheese4cut/presentation/swagger/Cheese4cutSwagger.java +++ b/src/main/java/com/cheeeese/cheese4cut/presentation/swagger/Cheese4cutSwagger.java @@ -79,26 +79,6 @@ CommonResponse getCheese4cut( @PathVariable @NotBlank String code ); - @Operation( - summary = "치즈네컷 최종 이미지 업로드용 Presigned URL 발급 API", - description = """ - ### 로직 상세 - --- - 1. 사용자 권한 확인 (MAKER 혹은 참여자만 가능) - 2. **치즈네컷 전용 버킷**에 저장할 Presigned URL을 발급하여 반환 - """ - ) - @ApiResponses(value = { - @ApiResponse( - responseCode = "200", - description = "Presigned URL 발급이 성공적으로 완료되었습니다." - ) - }) - CommonResponse createCheese4cutPresignedUrl( - @CurrentUser User user, - @PathVariable @NotBlank String code - ); - @Operation( summary = "치즈네컷 수동 확정 API", description = """ diff --git a/src/main/java/com/cheeeese/photo/application/PresignedUrlService.java b/src/main/java/com/cheeeese/photo/application/PresignedUrlService.java index 0ca7993..f37854d 100644 --- a/src/main/java/com/cheeeese/photo/application/PresignedUrlService.java +++ b/src/main/java/com/cheeeese/photo/application/PresignedUrlService.java @@ -21,9 +21,6 @@ public class PresignedUrlService { @Value("${ncp.object-storage.bucket}") private String bucket; - @Value("${ncp.object-storage.cheese4cut-bucket}") - private String cheese4cutBucket; - public String generatePresignedPutUrl(String uniqueKey, String contentType) { PutObjectRequest putObjectRequest = PutObjectRequest.builder() .bucket(bucket) @@ -40,24 +37,6 @@ public String generatePresignedPutUrl(String uniqueKey, String contentType) { return presignedRequest.url().toString(); } - public String generateCheese4cutPresignedPutUrl(String albumCode) { - String uniqueFileName = String.format("%s.png", UUID.randomUUID()); - String objectKey = String.format("album/%s/%s", albumCode, uniqueFileName); - - PutObjectRequest putObjectRequest = PutObjectRequest.builder() - .bucket(cheese4cutBucket) - .key(objectKey) - .build(); - - PresignedPutObjectRequest presignedRequest = - s3Presigner.presignPutObject(p -> p - .signatureDuration(Duration.ofMinutes(10)) - .putObjectRequest(putObjectRequest) - ); - - return presignedRequest.url().toString(); - } - public String generatePresignedGetUrl(String uniqueKey) { GetObjectRequest getObjectRequest = GetObjectRequest.builder() .bucket(bucket) From d7ff10991bec95b52baa060b2d21bbf341ea08d3 Mon Sep 17 00:00:00 2001 From: zyovn Date: Sat, 15 Nov 2025 15:43:31 +0900 Subject: [PATCH 298/402] =?UTF-8?q?#61=20fix:=20=ED=94=BC=EB=93=9C?= =?UTF-8?q?=EB=B0=B1=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/cheeeese/user/application/UserService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/cheeeese/user/application/UserService.java b/src/main/java/com/cheeeese/user/application/UserService.java index d8191a6..4d63556 100644 --- a/src/main/java/com/cheeeese/user/application/UserService.java +++ b/src/main/java/com/cheeeese/user/application/UserService.java @@ -26,7 +26,7 @@ public class UserService { private final UserValidator userValidator; private final UserRepository userRepository; - private final CdnUrlResolver cdnUrlResolver;; + private final CdnUrlResolver cdnUrlResolver; @Transactional public void updateUserName(User user, UserProfileRequest request) { From f167e1d9fe6a62fc7f5f9235fbdc20b479410e47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Sat, 15 Nov 2025 15:45:35 +0900 Subject: [PATCH 299/402] =?UTF-8?q?#59=20fix:=20=ED=94=BC=EB=93=9C?= =?UTF-8?q?=EB=B0=B1=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../persistence/UserAlbumRepository.java | 1 + .../album/presentation/AlbumQueryController.java | 14 ++++++++------ .../com/cheeeese/user/application/UserService.java | 9 --------- 3 files changed, 9 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/cheeeese/album/infrastructure/persistence/UserAlbumRepository.java b/src/main/java/com/cheeeese/album/infrastructure/persistence/UserAlbumRepository.java index b622e7b..3573b59 100644 --- a/src/main/java/com/cheeeese/album/infrastructure/persistence/UserAlbumRepository.java +++ b/src/main/java/com/cheeeese/album/infrastructure/persistence/UserAlbumRepository.java @@ -49,6 +49,7 @@ Slice findOpenAlbumsByUserId( AND ua.isVisible = TRUE AND a.status = :status AND a.expiredAt > :now + ORDER BY a.expiredAt ASC """) Slice findOpenAlbumsByUserIdAndRole( @Param("userId") Long userId, diff --git a/src/main/java/com/cheeeese/album/presentation/AlbumQueryController.java b/src/main/java/com/cheeeese/album/presentation/AlbumQueryController.java index 153bbfd..2994c0f 100644 --- a/src/main/java/com/cheeeese/album/presentation/AlbumQueryController.java +++ b/src/main/java/com/cheeeese/album/presentation/AlbumQueryController.java @@ -7,6 +7,8 @@ import com.cheeeese.global.common.CommonResponse; import com.cheeeese.global.util.CurrentUser; import com.cheeeese.user.domain.User; +import jakarta.validation.constraints.Max; +import jakarta.validation.constraints.Min; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -28,8 +30,8 @@ public class AlbumQueryController implements AlbumQuerySwagger { @GetMapping("/open") public CommonResponse getOpenAlbums( @CurrentUser User user, - @RequestParam(defaultValue = "0") int page, - @RequestParam(defaultValue = "2") int size + @RequestParam(defaultValue = "0") @Min(0) int page, + @RequestParam(defaultValue = "2") @Min(1) @Max(10) int size ) { return CommonResponse.success( ALBUM_OPEN_LIST_FETCH_SUCCESS, @@ -41,8 +43,8 @@ public CommonResponse getOpenAlbums( @GetMapping("/open/me") public CommonResponse getMyOpenAlbums( @CurrentUser User user, - @RequestParam(defaultValue = "0") int page, - @RequestParam(defaultValue = "2") int size + @RequestParam(defaultValue = "0") @Min(0) int page, + @RequestParam(defaultValue = "2") @Min(1) @Max(10) int size ) { return CommonResponse.success( ALBUM_MY_OPEN_LIST_FETCH_SUCCESS, @@ -54,8 +56,8 @@ public CommonResponse getMyOpenAlbums( @GetMapping("/closed") public CommonResponse getClosedAlbums( @CurrentUser User user, - @RequestParam(defaultValue = "0") int page, - @RequestParam(defaultValue = "6") int size + @RequestParam(defaultValue = "0") @Min(0) int page, + @RequestParam(defaultValue = "6") @Min(1) @Max(20) int size ) { return CommonResponse.success( ALBUM_CLOSED_LIST_FETCH_SUCCESS, diff --git a/src/main/java/com/cheeeese/user/application/UserService.java b/src/main/java/com/cheeeese/user/application/UserService.java index 3018129..6464734 100644 --- a/src/main/java/com/cheeeese/user/application/UserService.java +++ b/src/main/java/com/cheeeese/user/application/UserService.java @@ -1,9 +1,5 @@ package com.cheeeese.user.application; -import com.cheeeese.album.domain.Album; -import com.cheeeese.album.infrastructure.persistence.UserAlbumRepository; -import com.cheeeese.photo.domain.PhotoStatus; -import com.cheeeese.photo.infrastructure.persistence.PhotoRepository; import com.cheeeese.user.application.validator.UserValidator; import com.cheeeese.user.domain.User; import com.cheeeese.user.dto.request.UserAgreementRequest; @@ -17,9 +13,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.List; -import java.util.Optional; - @Service @RequiredArgsConstructor @Transactional(readOnly = true) @@ -27,8 +20,6 @@ public class UserService { private final UserValidator userValidator; private final UserRepository userRepository; - private final UserAlbumRepository userAlbumRepository; - private final PhotoRepository photoRepository; @Transactional public void updateUserProfile(User user, UserProfileRequest request) { From 8677cd40f4fa7c9dbcd70b8ad10243fc7396c6a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Sat, 15 Nov 2025 21:56:01 +0900 Subject: [PATCH 300/402] =?UTF-8?q?#59=20fix:=20controller=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=EC=97=90=20=EB=94=B0=EB=A5=B8=20swagger=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/swagger/AlbumQuerySwagger.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/cheeeese/album/presentation/swagger/AlbumQuerySwagger.java b/src/main/java/com/cheeeese/album/presentation/swagger/AlbumQuerySwagger.java index 937dd42..7dada79 100644 --- a/src/main/java/com/cheeeese/album/presentation/swagger/AlbumQuerySwagger.java +++ b/src/main/java/com/cheeeese/album/presentation/swagger/AlbumQuerySwagger.java @@ -11,6 +11,8 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.constraints.Max; +import jakarta.validation.constraints.Min; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; @@ -30,9 +32,9 @@ public interface AlbumQuerySwagger { CommonResponse getOpenAlbums( @CurrentUser User user, @Parameter(description = "페이지 번호", schema = @Schema(defaultValue = "0")) - @RequestParam(defaultValue = "0") int page, + @RequestParam(defaultValue = "0") @Min(0) int page, @Parameter(description = "페이지 크기", schema = @Schema(defaultValue = "2")) - @RequestParam(defaultValue = "2") int size + @RequestParam(defaultValue = "2") @Min(1) @Max(10) int size ); @Operation( @@ -46,9 +48,9 @@ CommonResponse getOpenAlbums( CommonResponse getMyOpenAlbums( @CurrentUser User user, @Parameter(description = "페이지 번호", schema = @Schema(defaultValue = "0")) - @RequestParam(defaultValue = "0") int page, + @RequestParam(defaultValue = "0") @Min(0) int page, @Parameter(description = "페이지 크기", schema = @Schema(defaultValue = "2")) - @RequestParam(defaultValue = "2") int size + @RequestParam(defaultValue = "2") @Min(1) @Max(10) int size ); @Operation( @@ -62,8 +64,8 @@ CommonResponse getMyOpenAlbums( CommonResponse getClosedAlbums( @CurrentUser User user, @Parameter(description = "페이지 번호", schema = @Schema(defaultValue = "0")) - @RequestParam(defaultValue = "0") int page, + @RequestParam(defaultValue = "0") @Min(0) int page, @Parameter(description = "페이지 크기", schema = @Schema(defaultValue = "6")) - @RequestParam(defaultValue = "6") int size + @RequestParam(defaultValue = "6") @Min(1) @Max(20) int size ); } From 842df061b6a256fec97d450019ab4f7ee794c7c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Sat, 15 Nov 2025 21:56:49 +0900 Subject: [PATCH 301/402] =?UTF-8?q?#59=20remove:=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20import=EB=AC=B8=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cheeeese/cheese4cut/presentation/Cheese4cutController.java | 2 -- .../cheese4cut/presentation/swagger/Cheese4cutSwagger.java | 1 - .../com/cheeeese/photo/application/PresignedUrlService.java | 1 - 3 files changed, 4 deletions(-) diff --git a/src/main/java/com/cheeeese/cheese4cut/presentation/Cheese4cutController.java b/src/main/java/com/cheeeese/cheese4cut/presentation/Cheese4cutController.java index 3d5dff1..81b8bf3 100644 --- a/src/main/java/com/cheeeese/cheese4cut/presentation/Cheese4cutController.java +++ b/src/main/java/com/cheeeese/cheese4cut/presentation/Cheese4cutController.java @@ -2,7 +2,6 @@ import com.cheeeese.cheese4cut.application.Cheese4cutService; import com.cheeeese.cheese4cut.dto.request.Cheese4cutFixedRequest; -import com.cheeeese.cheese4cut.dto.response.Cheese4cutPresignedUrlResponse; import com.cheeeese.cheese4cut.dto.response.Cheese4cutResponse; import com.cheeeese.cheese4cut.presentation.swagger.Cheese4cutSwagger; import com.cheeeese.global.common.CommonResponse; @@ -17,7 +16,6 @@ import org.springframework.web.bind.annotation.*; import static com.cheeeese.global.common.code.SuccessCode.CHEESE4CUT_FINALIZE_SUCCESS; -import static com.cheeeese.global.common.code.SuccessCode.PRESIGNED_URL_ISSUE_SUCCESS; @Validated @RestController diff --git a/src/main/java/com/cheeeese/cheese4cut/presentation/swagger/Cheese4cutSwagger.java b/src/main/java/com/cheeeese/cheese4cut/presentation/swagger/Cheese4cutSwagger.java index 8eeeda7..1b53151 100644 --- a/src/main/java/com/cheeeese/cheese4cut/presentation/swagger/Cheese4cutSwagger.java +++ b/src/main/java/com/cheeeese/cheese4cut/presentation/swagger/Cheese4cutSwagger.java @@ -1,7 +1,6 @@ package com.cheeeese.cheese4cut.presentation.swagger; import com.cheeeese.cheese4cut.dto.request.Cheese4cutFixedRequest; -import com.cheeeese.cheese4cut.dto.response.Cheese4cutPresignedUrlResponse; import com.cheeeese.global.common.CommonResponse; import com.cheeeese.cheese4cut.dto.response.Cheese4cutResponse; import com.cheeeese.global.util.CurrentUser; diff --git a/src/main/java/com/cheeeese/photo/application/PresignedUrlService.java b/src/main/java/com/cheeeese/photo/application/PresignedUrlService.java index f37854d..b0f348d 100644 --- a/src/main/java/com/cheeeese/photo/application/PresignedUrlService.java +++ b/src/main/java/com/cheeeese/photo/application/PresignedUrlService.java @@ -10,7 +10,6 @@ import software.amazon.awssdk.services.s3.presigner.model.PresignedPutObjectRequest; import java.time.Duration; -import java.util.UUID; @Component @RequiredArgsConstructor From 1ccab8ba5303ffb48a215619ccfb6105e47e9af8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Sat, 15 Nov 2025 22:01:19 +0900 Subject: [PATCH 302/402] =?UTF-8?q?#59=20fix:=20AlbumQueryService=20N+1=20?= =?UTF-8?q?=EB=AC=B8=EC=A0=9C=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../album/application/AlbumQueryService.java | 73 ++++++++++++++----- .../persistence/PhotoRepository.java | 17 ++++- 2 files changed, 68 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/cheeeese/album/application/AlbumQueryService.java b/src/main/java/com/cheeeese/album/application/AlbumQueryService.java index eb0b73b..a7956a9 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumQueryService.java +++ b/src/main/java/com/cheeeese/album/application/AlbumQueryService.java @@ -22,12 +22,12 @@ import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Slice; -import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; import java.util.*; +import java.util.function.Function; import java.util.stream.Collectors; @Service @@ -90,6 +90,8 @@ public ClosedAlbumPageResponse getClosedAlbums(User user, int page, int size) { return AlbumQueryMapper.toClosedAlbumPageResponse(List.of(), expiredAlbums); } + Map makerMap = getMakers(expiredAlbums.getContent()); + List allCheese4cutPhotos = cheese4cutPhotoRepository.findAllCheese4cutPhotosByAlbumIds(albumIds); Map> cheese4cutPhotoMap = allCheese4cutPhotos.stream() @@ -102,7 +104,8 @@ public ClosedAlbumPageResponse getClosedAlbums(User user, int page, int size) { .map(album -> { List c4pList = cheese4cutPhotoMap.getOrDefault(album.getId(), List.of()); - User maker = getMaker(album.getMakerId()); + User maker = Optional.ofNullable(makerMap.get(album.getMakerId())) + .orElseThrow(() -> new UserException(UserErrorCode.USER_NOT_FOUND)); List thumbnails = c4pList.stream() .sorted(Comparator.comparingInt(Cheese4cutPhoto::getPhotoRank)) // photoRank 순으로 정렬 @@ -118,37 +121,67 @@ public ClosedAlbumPageResponse getClosedAlbums(User user, int page, int size) { } private List buildOpenAlbumResponses(List albums) { + if (albums.isEmpty()) { + return List.of(); + } + + Map makerMap = getMakers(albums); + Map> recentThumbnailsMap = getRecentThumbnailsMap(albums); + return albums.stream() .map(album -> { - User maker = getMaker(album.getMakerId()); - List recentThumbnails = getRecentThumbnails(album.getId()); + User maker = Optional.ofNullable(makerMap.get(album.getMakerId())) + .orElseThrow(() -> new UserException(UserErrorCode.USER_NOT_FOUND)); + + List recentThumbnails = recentThumbnailsMap.getOrDefault(album.getId(), List.of()); return AlbumQueryMapper.toOpenAlbumSummaryResponse(album, maker, recentThumbnails); }) .toList(); } - private User getMaker(Long makerId) { - return userRepository.findById(makerId) - .orElseThrow(() -> new UserException(UserErrorCode.USER_NOT_FOUND)); + private Map getMakers(List albums) { + List makerIds = albums.stream() + .map(Album::getMakerId) + .distinct() + .toList(); + Map makers = userRepository.findAllById(makerIds).stream() + .collect(Collectors.toMap(User::getId, Function.identity())); + if (makers.size() != makerIds.size()) { + throw new UserException(UserErrorCode.USER_NOT_FOUND); + } + return makers; } - private List getRecentThumbnails(Long albumId) { - Pageable pageable = PageRequest.of(0, RECENT_THUMBNAIL_COUNT, Sort.by(Sort.Direction.DESC, "createdAt")); + private Map> getRecentThumbnailsMap(List albums) { + List albumIds = albums.stream() + .map(Album::getId) + .toList(); - List photos = photoRepository.findRecentPhotosByAlbumIdAndStatus( - albumId, - PhotoStatus.COMPLETED, - pageable + if (albumIds.isEmpty()) { + return Map.of(); + } + + List photos = photoRepository.findRecentPhotosByAlbumIdsAndStatus( + albumIds, + PhotoStatus.COMPLETED ); - // 3개 미만이면 아예 제공 안 함 - if (photos.size() < RECENT_THUMBNAIL_COUNT) { - return List.of(); + Map> thumbnailsMap = new HashMap<>(); + + for (Photo photo : photos) { + Long albumId = photo.getAlbum().getId(); + List thumbnails = thumbnailsMap.computeIfAbsent(albumId, key -> new ArrayList<>()); + + if (thumbnails.size() < RECENT_THUMBNAIL_COUNT) { + thumbnails.add(cdnUrlResolver.resolveThumbnail(photo.getThumbnailUrl())); + } } - return photos.stream() - .map(Photo::getThumbnailUrl) - .map(cdnUrlResolver::resolveThumbnail) - .toList(); + return thumbnailsMap.entrySet().stream() + .filter(entry -> entry.getValue().size() == RECENT_THUMBNAIL_COUNT) + .collect(Collectors.toMap( + Map.Entry::getKey, + entry -> List.copyOf(entry.getValue()) + )); } } diff --git a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java index 81d1399..da23e39 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java @@ -59,8 +59,8 @@ Slice findLikedPhotosByAlbumAndUser( SELECT p FROM Photo p JOIN FETCH p.user - WHERE p.album.id = :albumId - AND p.isDeleted = FALSE + WHERE p.album.id = :albumId + AND p.isDeleted = FALSE AND p.status = :status ORDER BY p.createdAt DESC """) @@ -70,6 +70,19 @@ List findRecentPhotosByAlbumIdAndStatus( Pageable pageable ); + @Query(""" + SELECT p + FROM Photo p + WHERE p.album.id IN :albumIds + AND p.isDeleted = FALSE + AND p.status = :status + ORDER BY p.album.id ASC, p.createdAt DESC, p.id DESC + """) + List findRecentPhotosByAlbumIdsAndStatus( + @Param("albumIds") List albumIds, + @Param("status") PhotoStatus status + ); + @Modifying(clearAutomatically = true, flushAutomatically = true) @Query(""" UPDATE Photo p From 26a120b1b38390136affbb1f5385c4038e825ceb Mon Sep 17 00:00:00 2001 From: zyovn Date: Sat, 15 Nov 2025 22:05:16 +0900 Subject: [PATCH 303/402] =?UTF-8?q?#64=20fix:=20=EC=B9=B4=EC=B9=B4?= =?UTF-8?q?=EC=98=A4=20=ED=94=84=EB=A1=9C=ED=95=84=20=EC=9D=B4=EB=AF=B8?= =?UTF-8?q?=EC=A7=80=20=EC=A0=9C=EA=B1=B0=20=ED=9B=84,=20=EC=B9=98?= =?UTF-8?q?=EC=9D=B4=EC=9D=B4=EC=A6=88=20default=20=EC=9D=B4=EB=AF=B8?= =?UTF-8?q?=EC=A7=80=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/cheeeese/oauth2/domain/OAuth2UserInfo.java | 1 - .../oauth2/infrastructure/userinfo/KakaoUserInfo.java | 5 ----- .../com/cheeeese/user/infrastructure/mapper/UserMapper.java | 4 +++- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/cheeeese/oauth2/domain/OAuth2UserInfo.java b/src/main/java/com/cheeeese/oauth2/domain/OAuth2UserInfo.java index e03650c..f1f550b 100644 --- a/src/main/java/com/cheeeese/oauth2/domain/OAuth2UserInfo.java +++ b/src/main/java/com/cheeeese/oauth2/domain/OAuth2UserInfo.java @@ -4,5 +4,4 @@ public interface OAuth2UserInfo { String getProviderId(); String getEmail(); String getName(); - String getProfileImage(); } diff --git a/src/main/java/com/cheeeese/oauth2/infrastructure/userinfo/KakaoUserInfo.java b/src/main/java/com/cheeeese/oauth2/infrastructure/userinfo/KakaoUserInfo.java index e87b27d..b3a4184 100644 --- a/src/main/java/com/cheeeese/oauth2/infrastructure/userinfo/KakaoUserInfo.java +++ b/src/main/java/com/cheeeese/oauth2/infrastructure/userinfo/KakaoUserInfo.java @@ -26,11 +26,6 @@ public String getName() { return (String) getKakaoProfile().get("nickname"); } - @Override - public String getProfileImage() { - return (String) getKakaoProfile().get("profile_image_url"); - } - @SuppressWarnings("unchecked") private Map getKakaoAccount() { Object account = attributes.get("kakao_account"); diff --git a/src/main/java/com/cheeeese/user/infrastructure/mapper/UserMapper.java b/src/main/java/com/cheeeese/user/infrastructure/mapper/UserMapper.java index 956b20a..a2d426e 100644 --- a/src/main/java/com/cheeeese/user/infrastructure/mapper/UserMapper.java +++ b/src/main/java/com/cheeeese/user/infrastructure/mapper/UserMapper.java @@ -9,11 +9,13 @@ public class UserMapper { + private static final String DEFAULT_PROFILE_IMAGE = "P1"; + public static User toEntity(OAuth2UserInfo oAuth2UserInfo) { return User.builder() .email(oAuth2UserInfo.getEmail()) .name(oAuth2UserInfo.getName()) - .profileImage(oAuth2UserInfo.getProfileImage()) + .profileImage(DEFAULT_PROFILE_IMAGE) .providerId(oAuth2UserInfo.getProviderId()) .build(); } From 7f88dee7c168987d7d3e90a8c7d27ab653010a3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Sat, 15 Nov 2025 22:31:59 +0900 Subject: [PATCH 304/402] =?UTF-8?q?#59=20fix:=20=EC=95=A8=EB=B2=94?= =?UTF-8?q?=EB=8B=B9=20=EC=B5=9C=EB=8C=80=203=EA=B0=9C=EC=9D=98=20?= =?UTF-8?q?=EC=8D=B8=EB=84=A4=EC=9D=BC=EB=A7=8C=20=EC=A1=B0=ED=9A=8C?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=ED=94=BC=EB=93=9C=EB=B0=B1=20=EB=B0=98?= =?UTF-8?q?=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../album/application/AlbumQueryService.java | 2 +- .../persistence/PhotoRepository.java | 27 ++++++++++++------- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/cheeeese/album/application/AlbumQueryService.java b/src/main/java/com/cheeeese/album/application/AlbumQueryService.java index a7956a9..76f5079 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumQueryService.java +++ b/src/main/java/com/cheeeese/album/application/AlbumQueryService.java @@ -161,7 +161,7 @@ private Map> getRecentThumbnailsMap(List albums) { return Map.of(); } - List photos = photoRepository.findRecentPhotosByAlbumIdsAndStatus( + List photos = photoRepository.findTop3RecentPhotosInEachAlbum( albumIds, PhotoStatus.COMPLETED ); diff --git a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java index da23e39..9124c70 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java @@ -70,15 +70,24 @@ List findRecentPhotosByAlbumIdAndStatus( Pageable pageable ); - @Query(""" - SELECT p - FROM Photo p - WHERE p.album.id IN :albumIds - AND p.isDeleted = FALSE - AND p.status = :status - ORDER BY p.album.id ASC, p.createdAt DESC, p.id DESC - """) - List findRecentPhotosByAlbumIdsAndStatus( + @Query(value = """ + SELECT * + FROM ( + SELECT p.*, + ROW_NUMBER() OVER ( + PARTITION BY p.album_id + ORDER BY p.created_at DESC, p.photo_id DESC + ) AS rn + FROM photo p + WHERE p.album_id IN (:albumIds) + AND p.is_deleted = FALSE + AND p.status = :status + ) t + WHERE t.rn <= 3 + ORDER BY t.album_id ASC, t.rn ASC + """, + nativeQuery = true) + List findTop3RecentPhotosInEachAlbum( @Param("albumIds") List albumIds, @Param("status") PhotoStatus status ); From 5210175557ab119b038964e9ba36311073972047 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Sat, 15 Nov 2025 23:14:06 +0900 Subject: [PATCH 305/402] =?UTF-8?q?#59=20feat:=20album=20DTO=EC=97=90=20re?= =?UTF-8?q?quiredProperties=20=EB=B8=94=EB=A1=9D=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/request/AlbumCreationRequest.java | 10 +++++++- .../dto/response/AlbumCreationResponse.java | 12 ++++++++-- .../dto/response/AlbumInvitationResponse.java | 14 +++++++++-- .../album/dto/response/AlbumMakerInfo.java | 8 ++++++- .../AlbumParticipantListResponse.java | 17 ++++++++++++-- .../response/AlbumParticipantResponse.java | 14 ++++++++++- .../dto/response/ClosedAlbumPageResponse.java | 11 ++++++++- .../response/ClosedAlbumSummaryResponse.java | 10 +++++++- .../dto/response/ExistingEnterResponse.java | 12 +++++++++- .../album/dto/response/NewEnterResponse.java | 23 +++++++++++++++++-- .../dto/response/OpenAlbumPageResponse.java | 11 ++++++++- .../response/OpenAlbumSummaryResponse.java | 14 ++++++++++- .../UploadAvailableCountResponse.java | 9 +++++++- 13 files changed, 148 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/cheeeese/album/dto/request/AlbumCreationRequest.java b/src/main/java/com/cheeeese/album/dto/request/AlbumCreationRequest.java index 220f4a3..8cc8f21 100644 --- a/src/main/java/com/cheeeese/album/dto/request/AlbumCreationRequest.java +++ b/src/main/java/com/cheeeese/album/dto/request/AlbumCreationRequest.java @@ -6,7 +6,15 @@ import java.time.LocalDate; @Builder -@Schema(description = "앨범 생성 API") +@Schema( + description = "앨범 생성 요청", + requiredProperties = { + "themeEmoji", + "title", + "participant", + "eventDate" + } +) public record AlbumCreationRequest( @Schema(description = "앨범 테마 이모지", example = "U+1F9C0") String themeEmoji, diff --git a/src/main/java/com/cheeeese/album/dto/response/AlbumCreationResponse.java b/src/main/java/com/cheeeese/album/dto/response/AlbumCreationResponse.java index 5edbe7c..e151e19 100644 --- a/src/main/java/com/cheeeese/album/dto/response/AlbumCreationResponse.java +++ b/src/main/java/com/cheeeese/album/dto/response/AlbumCreationResponse.java @@ -6,8 +6,16 @@ import java.time.LocalDate; @Builder -@Schema(description = "앨범 생성 API") -public record AlbumCreationResponse( +@Schema( + description = "앨범 생성 응답", + requiredProperties = { + "themeEmoji", + "title", + "eventDate", + "currentPhotoCnt", + "code" + } +)public record AlbumCreationResponse( @Schema(description = "앨범 테마 이모지", example = "U+1F9C0") String themeEmoji, diff --git a/src/main/java/com/cheeeese/album/dto/response/AlbumInvitationResponse.java b/src/main/java/com/cheeeese/album/dto/response/AlbumInvitationResponse.java index 9fed092..068e854 100644 --- a/src/main/java/com/cheeeese/album/dto/response/AlbumInvitationResponse.java +++ b/src/main/java/com/cheeeese/album/dto/response/AlbumInvitationResponse.java @@ -6,8 +6,18 @@ import java.time.LocalDateTime; @Builder -@Schema(description = "앨범 초대장 확인 응답 DTO") -public record AlbumInvitationResponse( +@Schema( + description = "앨범 초대장 확인 응답 DTO", + requiredProperties = { + "title", + "themeEmoji", + "eventDate", + "expiredAt", + "makerName", + "makerProfileImage", + "isExpired" + } +)public record AlbumInvitationResponse( @Schema(description = "앨범 제목", example = "경영학부 졸업식") String title, diff --git a/src/main/java/com/cheeeese/album/dto/response/AlbumMakerInfo.java b/src/main/java/com/cheeeese/album/dto/response/AlbumMakerInfo.java index 18ba579..2c33888 100644 --- a/src/main/java/com/cheeeese/album/dto/response/AlbumMakerInfo.java +++ b/src/main/java/com/cheeeese/album/dto/response/AlbumMakerInfo.java @@ -3,7 +3,13 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Builder; -@Schema(description = "앨범 메이커 정보 응답 DTO") +@Schema( + description = "앨범 메이커 정보 응답 DTO", + requiredProperties = { + "makerName", + "makerProfileImage" + } +) @Builder public record AlbumMakerInfo( @Schema(description = "메이커 이름", example = "우다현") diff --git a/src/main/java/com/cheeeese/album/dto/response/AlbumParticipantListResponse.java b/src/main/java/com/cheeeese/album/dto/response/AlbumParticipantListResponse.java index 3eef646..b8a3175 100644 --- a/src/main/java/com/cheeeese/album/dto/response/AlbumParticipantListResponse.java +++ b/src/main/java/com/cheeeese/album/dto/response/AlbumParticipantListResponse.java @@ -7,13 +7,26 @@ import java.util.List; @Builder -@Schema(description = "앨범 참여자 공통 정보 구조") +@Schema( + description = "앨범 참여자 공통 정보 구조", + requiredProperties = { + "participants" + } +) public record AlbumParticipantListResponse( @Schema(description = "참가자 목록 (정렬 포함)") List participants ) { @Builder - @Schema(description = "참가자 개별 정보") + @Schema( + description = "참가자 개별 정보", + requiredProperties = { + "name", + "profileImage", + "role", + "isMe" + } + ) public record ParticipantInfo( @Schema(description = "이름", example = "우다현") String name, diff --git a/src/main/java/com/cheeeese/album/dto/response/AlbumParticipantResponse.java b/src/main/java/com/cheeeese/album/dto/response/AlbumParticipantResponse.java index ae54b69..d0d4c88 100644 --- a/src/main/java/com/cheeeese/album/dto/response/AlbumParticipantResponse.java +++ b/src/main/java/com/cheeeese/album/dto/response/AlbumParticipantResponse.java @@ -9,7 +9,19 @@ import java.util.List; @Builder -@Schema(description = "앨범 참여자 목록 응답 DTO (활성/만료 공용)") +@Schema( + description = "앨범 참여자 목록 응답 DTO (활성/만료 공용)", + requiredProperties = { + "isExpired", + "title", + "themeEmoji", + "eventDate", + "expiredAt", + "maxParticipantCount", + "currentParticipantCount", + "participants" + } +) public record AlbumParticipantResponse( @Schema(description = "만료 여부", example = "false") diff --git a/src/main/java/com/cheeeese/album/dto/response/ClosedAlbumPageResponse.java b/src/main/java/com/cheeeese/album/dto/response/ClosedAlbumPageResponse.java index cd9082b..ebfa295 100644 --- a/src/main/java/com/cheeeese/album/dto/response/ClosedAlbumPageResponse.java +++ b/src/main/java/com/cheeeese/album/dto/response/ClosedAlbumPageResponse.java @@ -6,7 +6,16 @@ import java.util.List; @Builder -@Schema(description = "닫힌 앨범 목록 페이지 응답") +@Schema( + description = "닫힌 앨범 목록 페이지 응답", + requiredProperties = { + "responses", + "listSize", + "isFirst", + "isLast", + "hasNext" + } +) public record ClosedAlbumPageResponse( @Schema(description = "닫힌 앨범 목록") List responses, diff --git a/src/main/java/com/cheeeese/album/dto/response/ClosedAlbumSummaryResponse.java b/src/main/java/com/cheeeese/album/dto/response/ClosedAlbumSummaryResponse.java index d7d12ab..48504d3 100644 --- a/src/main/java/com/cheeeese/album/dto/response/ClosedAlbumSummaryResponse.java +++ b/src/main/java/com/cheeeese/album/dto/response/ClosedAlbumSummaryResponse.java @@ -8,7 +8,15 @@ import java.util.List; @Builder -@Schema(description = "닫힌 앨범 요약 정보") +@Schema( + description = "닫힌 앨범 요약 정보", + requiredProperties = { + "code", + "title", + "makerName", + "eventDate" + } +) public record ClosedAlbumSummaryResponse( @Schema(description = "앨범 코드", example = "786ccd09-...") String code, diff --git a/src/main/java/com/cheeeese/album/dto/response/ExistingEnterResponse.java b/src/main/java/com/cheeeese/album/dto/response/ExistingEnterResponse.java index 15d78f0..e553007 100644 --- a/src/main/java/com/cheeeese/album/dto/response/ExistingEnterResponse.java +++ b/src/main/java/com/cheeeese/album/dto/response/ExistingEnterResponse.java @@ -6,7 +6,17 @@ import java.time.LocalDateTime; -@Schema(description = "앨범 재입장 또는 기존 참여자 응답 DTO") +@Schema( + description = "앨범 재입장 또는 기존 참여자 응답 DTO", + requiredProperties = { + "joinStatus", + "title", + "themeEmoji", + "eventDate", + "expiredAt", + "makerInfo" + } +) @Builder public record ExistingEnterResponse( @Schema(description = "참여 상태 (EXISTING | REJOINED)", example = "EXISTING") diff --git a/src/main/java/com/cheeeese/album/dto/response/NewEnterResponse.java b/src/main/java/com/cheeeese/album/dto/response/NewEnterResponse.java index faae53e..d652f80 100644 --- a/src/main/java/com/cheeeese/album/dto/response/NewEnterResponse.java +++ b/src/main/java/com/cheeeese/album/dto/response/NewEnterResponse.java @@ -8,7 +8,19 @@ import java.time.LocalDateTime; import java.util.List; -@Schema(description = "앨범 첫 입장(신규 참여자) 응답 DTO") +@Schema( + description = "앨범 첫 입장(신규 참여자) 응답 DTO", + requiredProperties = { + "joinStatus", + "title", + "themeEmoji", + "eventDate", + "expiredAt", + "makerInfo", + "remainingUploadSlots", + "recentPhotos" + } +) @Builder public record NewEnterResponse( @Schema(description = "참여 상태 (항상 NEW)", example = "NEW") @@ -36,7 +48,14 @@ public record NewEnterResponse( List recentPhotos ) implements AlbumEnterResponse { @Builder - @Schema(description = "최근 업로드 사진 정보 DTO") + @Schema( + description = "최근 업로드 사진 정보 DTO", + requiredProperties = { + "thumbnailUrl", + "uploaderName", + "uploaderProfileImage" + } + ) public record RecentPhotoResponse( @NotNull @Schema(description = "사진 썸네일 URL", example = "https://cdn.cheeeese.com/album/1/thumb1.jpg") diff --git a/src/main/java/com/cheeeese/album/dto/response/OpenAlbumPageResponse.java b/src/main/java/com/cheeeese/album/dto/response/OpenAlbumPageResponse.java index 616dd2d..4b524ce 100644 --- a/src/main/java/com/cheeeese/album/dto/response/OpenAlbumPageResponse.java +++ b/src/main/java/com/cheeeese/album/dto/response/OpenAlbumPageResponse.java @@ -6,7 +6,16 @@ import java.util.List; @Builder -@Schema(description = "열린 앨범 목록 페이지 응답") +@Schema( + description = "열린 앨범 목록 페이지 응답", + requiredProperties = { + "responses", + "listSize", + "isFirst", + "isLast", + "hasNext" + } +) public record OpenAlbumPageResponse( @Schema(description = "열린 앨범 목록") List responses, diff --git a/src/main/java/com/cheeeese/album/dto/response/OpenAlbumSummaryResponse.java b/src/main/java/com/cheeeese/album/dto/response/OpenAlbumSummaryResponse.java index 6770316..39aefd3 100644 --- a/src/main/java/com/cheeeese/album/dto/response/OpenAlbumSummaryResponse.java +++ b/src/main/java/com/cheeeese/album/dto/response/OpenAlbumSummaryResponse.java @@ -9,7 +9,19 @@ import java.util.List; @Builder -@Schema(description = "열린 앨범 요약 정보") +@Schema( + description = "열린 앨범 요약 정보", + requiredProperties = { + "code", + "themeEmoji", + "title", + "eventDate", + "makerName", + "currentParticipant", + "participant", + "expiredAt" + } +) public record OpenAlbumSummaryResponse( @Schema(description = "앨범 코드", example = "1f0ba577-39f3-69b6-abab-455897f404fe") String code, diff --git a/src/main/java/com/cheeeese/album/dto/response/UploadAvailableCountResponse.java b/src/main/java/com/cheeeese/album/dto/response/UploadAvailableCountResponse.java index f6296e9..614bf8e 100644 --- a/src/main/java/com/cheeeese/album/dto/response/UploadAvailableCountResponse.java +++ b/src/main/java/com/cheeeese/album/dto/response/UploadAvailableCountResponse.java @@ -4,7 +4,14 @@ import lombok.Builder; @Builder -@Schema(description = "앨범 업로드 가능 사진 수 응답 DTO") +@Schema( + description = "앨범 업로드 가능 사진 수 응답 DTO", + requiredProperties = { + "availableCount", + "maxPhotoCount", + "currentPhotoCount" + } +) public record UploadAvailableCountResponse( @Schema(description = "현재 앨범에 업로드 가능한 최대 사진 수", example = "850") int availableCount, From 746ebc8b8d343785b496430bb57eadf19e883182 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Sat, 15 Nov 2025 23:15:53 +0900 Subject: [PATCH 306/402] =?UTF-8?q?#59=20feat:=20auth=20DTO=EC=97=90=20req?= =?UTF-8?q?uiredProperties=20=EB=B8=94=EB=A1=9D=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../auth/dto/request/AuthReissueRequest.java | 7 ++++++- .../auth/dto/response/AuthExchangeResponse.java | 12 ++++++++++++ .../auth/dto/response/AuthReissueResponse.java | 8 +++++++- 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/cheeeese/auth/dto/request/AuthReissueRequest.java b/src/main/java/com/cheeeese/auth/dto/request/AuthReissueRequest.java index a4e65ce..7847205 100644 --- a/src/main/java/com/cheeeese/auth/dto/request/AuthReissueRequest.java +++ b/src/main/java/com/cheeeese/auth/dto/request/AuthReissueRequest.java @@ -4,7 +4,12 @@ import lombok.Builder; @Builder -@Schema(description = "token 재발급") +@Schema( + description = "token 재발급", + requiredProperties = { + "refreshToken" + } +) public record AuthReissueRequest( @Schema( description = "유효한 refreshToken", diff --git a/src/main/java/com/cheeeese/auth/dto/response/AuthExchangeResponse.java b/src/main/java/com/cheeeese/auth/dto/response/AuthExchangeResponse.java index ac25ea9..4c46721 100644 --- a/src/main/java/com/cheeeese/auth/dto/response/AuthExchangeResponse.java +++ b/src/main/java/com/cheeeese/auth/dto/response/AuthExchangeResponse.java @@ -4,6 +4,18 @@ import lombok.Builder; @Builder +@Schema( + description = "token 교환 응답", + requiredProperties = { + "accessToken", + "refreshToken", + "isOnboarded", + "userId", + "name", + "email" + } +) + public record AuthExchangeResponse( @Schema( description = "accessToken", diff --git a/src/main/java/com/cheeeese/auth/dto/response/AuthReissueResponse.java b/src/main/java/com/cheeeese/auth/dto/response/AuthReissueResponse.java index 13ef6ea..c105f94 100644 --- a/src/main/java/com/cheeeese/auth/dto/response/AuthReissueResponse.java +++ b/src/main/java/com/cheeeese/auth/dto/response/AuthReissueResponse.java @@ -4,7 +4,13 @@ import lombok.Builder; @Builder -@Schema(description = "token 재발급") +@Schema( + description = "token 재발급", + requiredProperties = { + "accessToken", + "refreshToken" + } +) public record AuthReissueResponse( @Schema( description = "새로 발급된 accessToken", From ea6df9ed5c3bc5e8b9a9d345be0d9b25bde8d453 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Sat, 15 Nov 2025 23:17:57 +0900 Subject: [PATCH 307/402] =?UTF-8?q?#59=20remove:=20=EC=B9=98=EC=A6=88?= =?UTF-8?q?=EB=84=A4=EC=BB=B7=20=EC=97=85=EB=A1=9C=EB=93=9C=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20response=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/response/Cheese4cutPresignedUrlResponse.java | 11 ----------- .../infrastructure/mapper/Cheese4cutMapper.java | 6 ------ 2 files changed, 17 deletions(-) delete mode 100644 src/main/java/com/cheeeese/cheese4cut/dto/response/Cheese4cutPresignedUrlResponse.java diff --git a/src/main/java/com/cheeeese/cheese4cut/dto/response/Cheese4cutPresignedUrlResponse.java b/src/main/java/com/cheeeese/cheese4cut/dto/response/Cheese4cutPresignedUrlResponse.java deleted file mode 100644 index b76c090..0000000 --- a/src/main/java/com/cheeeese/cheese4cut/dto/response/Cheese4cutPresignedUrlResponse.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.cheeeese.cheese4cut.dto.response; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Builder; - -@Builder -@Schema(description = "Presigned URL 발급 응답") -public record Cheese4cutPresignedUrlResponse ( - @Schema(description = "클라우드 스토리지에 업로드할 URL", example = "https://bucket.s3.ap-northeast-2.amazonaws.com/...") - String uploadUrl -){} \ No newline at end of file diff --git a/src/main/java/com/cheeeese/cheese4cut/infrastructure/mapper/Cheese4cutMapper.java b/src/main/java/com/cheeeese/cheese4cut/infrastructure/mapper/Cheese4cutMapper.java index 608ef73..bb67e89 100644 --- a/src/main/java/com/cheeeese/cheese4cut/infrastructure/mapper/Cheese4cutMapper.java +++ b/src/main/java/com/cheeeese/cheese4cut/infrastructure/mapper/Cheese4cutMapper.java @@ -5,7 +5,6 @@ import com.cheeeese.cheese4cut.domain.Cheese4cut; import com.cheeeese.cheese4cut.domain.Cheese4cutPhoto; import com.cheeeese.cheese4cut.dto.response.Cheese4cutFinalResponse; -import com.cheeeese.cheese4cut.dto.response.Cheese4cutPresignedUrlResponse; import com.cheeeese.cheese4cut.dto.response.Cheese4cutPreviewResponse; import com.cheeeese.photo.domain.Photo; @@ -65,11 +64,6 @@ public static Cheese4cut toEntity(Album album, List orderedPhotos) { .build(); } - public static Cheese4cutPresignedUrlResponse toPresignedUrlResponse(String uploadUrl) { - return Cheese4cutPresignedUrlResponse.builder() - .uploadUrl(uploadUrl).build(); - } - public static Cheese4cutFinalResponse.FinalPhotoInfo toFinalPhotoInfo( Long photoId, String imageUrl, int rank) { From 22a7cfa70dc1461c9b8cdbc27a050df96366acba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Sat, 15 Nov 2025 23:27:58 +0900 Subject: [PATCH 308/402] =?UTF-8?q?#59=20feat:=20cheese4cut=20DTO=EC=97=90?= =?UTF-8?q?=20requiredProperties=20=EB=B8=94=EB=A1=9D=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/response/Cheese4cutFinalResponse.java | 18 +++++++++++++++--- .../response/Cheese4cutPreviewResponse.java | 19 +++++++++++++++++-- 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/cheeeese/cheese4cut/dto/response/Cheese4cutFinalResponse.java b/src/main/java/com/cheeeese/cheese4cut/dto/response/Cheese4cutFinalResponse.java index 86a052c..e33b403 100644 --- a/src/main/java/com/cheeeese/cheese4cut/dto/response/Cheese4cutFinalResponse.java +++ b/src/main/java/com/cheeeese/cheese4cut/dto/response/Cheese4cutFinalResponse.java @@ -6,7 +6,13 @@ import java.util.List; @Builder -@Schema(description = "치즈네컷 확정 완료 응답 DTO (선정된 사진 4장)") +@Schema( + description = "치즈네컷 확정 완료 응답 DTO (선정된 사진 4장)", + requiredProperties = { + "isFinalized", + "photos" + } +) public record Cheese4cutFinalResponse( @Schema(description = "확정 여부 (항상 true)", example = "true") boolean isFinalized, @@ -14,9 +20,15 @@ public record Cheese4cutFinalResponse( @Schema(description = "확정된 사진 정보 목록 (정확히 4개)") List photos ) implements Cheese4cutResponse { - @Builder - @Schema(description = "확정된 사진 정보") + @Schema( + description = "확정된 사진 정보", + requiredProperties = { + "photoId", + "imageUrl", + "photoRank" + } + ) public record FinalPhotoInfo( @Schema(description = "원본 사진 ID", example = "101") Long photoId, diff --git a/src/main/java/com/cheeeese/cheese4cut/dto/response/Cheese4cutPreviewResponse.java b/src/main/java/com/cheeeese/cheese4cut/dto/response/Cheese4cutPreviewResponse.java index de964e8..fabbe20 100644 --- a/src/main/java/com/cheeeese/cheese4cut/dto/response/Cheese4cutPreviewResponse.java +++ b/src/main/java/com/cheeeese/cheese4cut/dto/response/Cheese4cutPreviewResponse.java @@ -7,7 +7,15 @@ import java.util.List; @Builder -@Schema(description = "치즈네컷 확정 전 미리보기 응답 DTO (좋아요 TOP 4)") +@Schema( + description = "치즈네컷 확정 전 미리보기 응답 DTO (좋아요 TOP 4)", + requiredProperties = { + "isFinalized", + "previewPhotos", + "uniqueLikesCount", + "participant" + } +) public record Cheese4cutPreviewResponse( @Schema(description = "확정 여부 (항상 false)", example = "false") boolean isFinalized, @@ -26,7 +34,14 @@ public record Cheese4cutPreviewResponse( ) implements Cheese4cutResponse { @Builder - @Schema(description = "미리보기 사진 정보 DTO") + @Schema( + description = "미리보기 사진 정보 DTO", + requiredProperties = { + "photoId", + "imageUrl", + "photoRank" + } + ) public record PreviewPhotoInfo( @Schema(description = "사진 ID", example = "101") Long photoId, From b1e63bbfab704c7058a0552d17def49cf568a539 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Sat, 15 Nov 2025 23:35:23 +0900 Subject: [PATCH 309/402] =?UTF-8?q?#59=20feat:=20photo=20DTO=EC=97=90=20re?= =?UTF-8?q?quiredProperties=20=EB=B8=94=EB=A1=9D=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../photo/dto/request/PhotoDownloadRequest.java | 8 +++++++- .../photo/dto/response/PhotoDetailResponse.java | 14 +++++++++++++- .../dto/response/PhotoDownloadResponse.java | 17 ++++++++++++++++- .../dto/response/PhotoLikedPageResponse.java | 11 ++++++++++- .../photo/dto/response/PhotoLikedResponse.java | 10 +++++++++- .../photo/dto/response/PhotoListResponse.java | 12 +++++++++++- .../photo/dto/response/PhotoPageResponse.java | 11 ++++++++++- .../dto/response/PhotoPresignedUrlResponse.java | 15 +++++++++++++-- 8 files changed, 89 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/cheeeese/photo/dto/request/PhotoDownloadRequest.java b/src/main/java/com/cheeeese/photo/dto/request/PhotoDownloadRequest.java index 357de44..731b987 100644 --- a/src/main/java/com/cheeeese/photo/dto/request/PhotoDownloadRequest.java +++ b/src/main/java/com/cheeeese/photo/dto/request/PhotoDownloadRequest.java @@ -6,7 +6,13 @@ import java.util.List; @Builder -@Schema(description = "사진 다운로드 presigned url 발급 API") +@Schema( + description = "사진 다운로드 presigned url 발급 API", + requiredProperties = { + "code", + "photoIds" + } +) public record PhotoDownloadRequest( @Schema(description = "앨범 코드", example = "1f0b7ea8-fab6-6581-95e3-0720bc07603e") String code, diff --git a/src/main/java/com/cheeeese/photo/dto/response/PhotoDetailResponse.java b/src/main/java/com/cheeeese/photo/dto/response/PhotoDetailResponse.java index 15df716..98c806d 100644 --- a/src/main/java/com/cheeeese/photo/dto/response/PhotoDetailResponse.java +++ b/src/main/java/com/cheeeese/photo/dto/response/PhotoDetailResponse.java @@ -4,7 +4,19 @@ import lombok.Builder; @Builder -@Schema(description = "사진 상세 조회 API") +@Schema( + description = "사진 상세 조회 API", + requiredProperties = { + "name", + "photoId", + "imageUrl", + "thumbnailUrl", + "likesCnt", + "isLiked", + "isDownloaded", + "isRecentlyDownloaded" + } +) public record PhotoDetailResponse( @Schema(description = "사용자 이름", example = "주정빈") String name, diff --git a/src/main/java/com/cheeeese/photo/dto/response/PhotoDownloadResponse.java b/src/main/java/com/cheeeese/photo/dto/response/PhotoDownloadResponse.java index 4efdcdc..6ba5252 100644 --- a/src/main/java/com/cheeeese/photo/dto/response/PhotoDownloadResponse.java +++ b/src/main/java/com/cheeeese/photo/dto/response/PhotoDownloadResponse.java @@ -7,7 +7,12 @@ import java.util.List; @Builder -@Schema(description = "") +@Schema( + description = "사진 다운로드 응답 DTO", + requiredProperties = { + "downloadFiles" + } +) public record PhotoDownloadResponse( @Schema( description = "다운로드 가능한 사진 파일 정보 목록", @@ -33,6 +38,16 @@ public record PhotoDownloadResponse( List downloadFiles ) { @Builder + @Schema( + description = "다운로드 가능한 사진 파일 정보", + requiredProperties = { + "photoId", + "downloadUrl", + "fileName", + "captureTime", + "createdAt" + } + ) public record DownloadFileInfo( @Schema(description = "사진 고유 ID", example = "1") Long photoId, diff --git a/src/main/java/com/cheeeese/photo/dto/response/PhotoLikedPageResponse.java b/src/main/java/com/cheeeese/photo/dto/response/PhotoLikedPageResponse.java index ee299cb..cf11325 100644 --- a/src/main/java/com/cheeeese/photo/dto/response/PhotoLikedPageResponse.java +++ b/src/main/java/com/cheeeese/photo/dto/response/PhotoLikedPageResponse.java @@ -6,7 +6,16 @@ import java.util.List; @Builder -@Schema(description = "내가 띱한 사진 조회 페이지네이션") +@Schema( + description = "내가 좋아요한 사진 조회 페이지네이션", + requiredProperties = { + "responses", + "listSize", + "isFirst", + "isLast", + "hasNext" + } +) public record PhotoLikedPageResponse( @Schema( description = "사진 목록", diff --git a/src/main/java/com/cheeeese/photo/dto/response/PhotoLikedResponse.java b/src/main/java/com/cheeeese/photo/dto/response/PhotoLikedResponse.java index 3254348..5f441de 100644 --- a/src/main/java/com/cheeeese/photo/dto/response/PhotoLikedResponse.java +++ b/src/main/java/com/cheeeese/photo/dto/response/PhotoLikedResponse.java @@ -4,7 +4,15 @@ import lombok.Builder; @Builder -@Schema(description = "내가 띱한 사진 목록 조회 API") +@Schema( + description = "내가 띱한 사진 목록 조회 API", + requiredProperties = { + "photoId", + "thumbnailUrl", + "isDownloaded", + "isRecentlyDownloaded" + } +) public record PhotoLikedResponse( @Schema(description = "사진 ID", example = "1") Long photoId, diff --git a/src/main/java/com/cheeeese/photo/dto/response/PhotoListResponse.java b/src/main/java/com/cheeeese/photo/dto/response/PhotoListResponse.java index 351a5cf..bf469d0 100644 --- a/src/main/java/com/cheeeese/photo/dto/response/PhotoListResponse.java +++ b/src/main/java/com/cheeeese/photo/dto/response/PhotoListResponse.java @@ -4,7 +4,17 @@ import lombok.Builder; @Builder(toBuilder = true) -@Schema(description = "사진 목록 조회 API") +@Schema( + description = "사진 목록 조회 API", + requiredProperties = { + "photoId", + "thumbnailUrl", + "likeCnt", + "isLiked", + "isDownloaded", + "isRecentlyDownloaded" + } +) public record PhotoListResponse( @Schema(description = "사진 ID", example = "1") Long photoId, diff --git a/src/main/java/com/cheeeese/photo/dto/response/PhotoPageResponse.java b/src/main/java/com/cheeeese/photo/dto/response/PhotoPageResponse.java index 3bb482a..da2e91e 100644 --- a/src/main/java/com/cheeeese/photo/dto/response/PhotoPageResponse.java +++ b/src/main/java/com/cheeeese/photo/dto/response/PhotoPageResponse.java @@ -6,7 +6,16 @@ import java.util.List; @Builder -@Schema(description = "사진 목록 조회 페이지네이션") +@Schema( + description = "사진 목록 조회 페이지네이션", + requiredProperties = { + "responses", + "listSize", + "isFirst", + "isLast", + "hasNext" + } +) public record PhotoPageResponse( @Schema( description = "사진 목록", diff --git a/src/main/java/com/cheeeese/photo/dto/response/PhotoPresignedUrlResponse.java b/src/main/java/com/cheeeese/photo/dto/response/PhotoPresignedUrlResponse.java index f3e28a0..411f203 100644 --- a/src/main/java/com/cheeeese/photo/dto/response/PhotoPresignedUrlResponse.java +++ b/src/main/java/com/cheeeese/photo/dto/response/PhotoPresignedUrlResponse.java @@ -6,13 +6,24 @@ import java.util.List; @Builder -@Schema(description = "Presigned URL 발급 응답") +@Schema( + description = "Presigned URL 발급 응답", + requiredProperties = { + "presignedUrlInfos" + } +) public record PhotoPresignedUrlResponse( @Schema(description = "발급된 Presigned URL 목록") List presignedUrlInfos ) { @Builder - @Schema(description = "Presigned URL 정보") + @Schema( + description = "Presigned URL 정보", + requiredProperties = { + "photoId", + "uploadUrl" + } + ) public record PresignedUrlInfo( @Schema(description = "저장된 사진 ID", example = "100") Long photoId, From 4c689fd0ada8d0a5842f2bbe61b33e2c0690cbe1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Sat, 15 Nov 2025 23:36:31 +0900 Subject: [PATCH 310/402] =?UTF-8?q?#59=20feat:=20user=20DTO=EC=97=90=20req?= =?UTF-8?q?uiredProperties=20=EB=B8=94=EB=A1=9D=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cheeeese/user/dto/response/UserInfoResponse.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/cheeeese/user/dto/response/UserInfoResponse.java b/src/main/java/com/cheeeese/user/dto/response/UserInfoResponse.java index 841f2a2..e6d61fd 100644 --- a/src/main/java/com/cheeeese/user/dto/response/UserInfoResponse.java +++ b/src/main/java/com/cheeeese/user/dto/response/UserInfoResponse.java @@ -4,8 +4,16 @@ import lombok.Builder; @Builder -@Schema(description = "사용자 기본 정보 응답") -public record UserInfoResponse( +@Schema( + description = "사용자 기본 정보 응답", + requiredProperties = { + "profileImage", + "name", + "albumCount", + "photoCount", + "likesCount" + } +)public record UserInfoResponse( @Schema(description = "사용자 프로필 이미지 URL", example = "https://cdn.cheeeese.me/profile.png") String profileImage, From e85990c15c645b44597dd92a784cd3037c50dec4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Sat, 15 Nov 2025 23:53:27 +0900 Subject: [PATCH 311/402] =?UTF-8?q?#59=20fix:=20=ED=94=BC=EB=93=9C?= =?UTF-8?q?=EB=B0=B1=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/response/ClosedAlbumSummaryResponse.java | 3 +-- .../album/dto/response/OpenAlbumSummaryResponse.java | 3 +-- .../album/infrastructure/mapper/AlbumQueryMapper.java | 4 ++-- .../photo/dto/request/PhotoDownloadRequest.java | 11 ++++------- 4 files changed, 8 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/cheeeese/album/dto/response/ClosedAlbumSummaryResponse.java b/src/main/java/com/cheeeese/album/dto/response/ClosedAlbumSummaryResponse.java index 48504d3..4e0e65d 100644 --- a/src/main/java/com/cheeeese/album/dto/response/ClosedAlbumSummaryResponse.java +++ b/src/main/java/com/cheeeese/album/dto/response/ClosedAlbumSummaryResponse.java @@ -30,7 +30,6 @@ public record ClosedAlbumSummaryResponse( @Schema(description = "이벤트 날짜", example = "2025-05-01") LocalDate eventDate, - @JsonInclude(JsonInclude.Include.ALWAYS) - @Schema(description = "치즈네컷 썸네일 목록 (4개)") + @Schema(description = "치즈네컷 썸네일 목록 (4개)", nullable = true) List thumbnails ) {} diff --git a/src/main/java/com/cheeeese/album/dto/response/OpenAlbumSummaryResponse.java b/src/main/java/com/cheeeese/album/dto/response/OpenAlbumSummaryResponse.java index 39aefd3..e94c989 100644 --- a/src/main/java/com/cheeeese/album/dto/response/OpenAlbumSummaryResponse.java +++ b/src/main/java/com/cheeeese/album/dto/response/OpenAlbumSummaryResponse.java @@ -47,8 +47,7 @@ public record OpenAlbumSummaryResponse( @Schema(description = "앨범 만료 예정 일시", example = "2025-05-05T12:00:00") LocalDateTime expiredAt, - @JsonInclude(JsonInclude.Include.ALWAYS) - @Schema(description = "최근 업로드된 사진 썸네일 3장") + @Schema(description = "최근 업로드된 사진 썸네일 3장", nullable = true) List recentPhotoThumbnails ) { } diff --git a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumQueryMapper.java b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumQueryMapper.java index 2ca9947..6e5ea4a 100644 --- a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumQueryMapper.java +++ b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumQueryMapper.java @@ -48,7 +48,7 @@ public static OpenAlbumSummaryResponse toOpenAlbumSummaryResponse( .themeEmoji(album.getThemeEmoji()) .title(album.getTitle()) .eventDate(album.getEventDate()) - .makerName(maker != null ? maker.getName() : null) + .makerName(maker.getName()) .currentParticipant(album.getCurrentParticipant()) .participant(album.getParticipant()) .expiredAt(album.getExpiredAt()) @@ -64,7 +64,7 @@ public static ClosedAlbumSummaryResponse toClosedAlbumSummaryResponse( return ClosedAlbumSummaryResponse.builder() .code(album.getCode()) .title(album.getTitle()) - .makerName(maker != null ? maker.getName() : null) + .makerName(maker.getName()) .eventDate(album.getEventDate()) .thumbnails(thumbnails.isEmpty() ? null : thumbnails) .build(); diff --git a/src/main/java/com/cheeeese/photo/dto/request/PhotoDownloadRequest.java b/src/main/java/com/cheeeese/photo/dto/request/PhotoDownloadRequest.java index 731b987..67c15f4 100644 --- a/src/main/java/com/cheeeese/photo/dto/request/PhotoDownloadRequest.java +++ b/src/main/java/com/cheeeese/photo/dto/request/PhotoDownloadRequest.java @@ -1,23 +1,20 @@ package com.cheeeese.photo.dto.request; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotEmpty; import lombok.Builder; import java.util.List; @Builder -@Schema( - description = "사진 다운로드 presigned url 발급 API", - requiredProperties = { - "code", - "photoIds" - } -) public record PhotoDownloadRequest( @Schema(description = "앨범 코드", example = "1f0b7ea8-fab6-6581-95e3-0720bc07603e") + @NotBlank(message = "앨범 코드는 필수입니다") String code, @Schema(description = "사진 고유 ID", example = "[1, 2, 3]") + @NotEmpty(message = "사진 ID 목록은 비어있을 수 없습니다") List photoIds ) { } From 0cd1281dedecc7472f83a44f237d4b20d1f696c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Sun, 16 Nov 2025 00:00:18 +0900 Subject: [PATCH 312/402] =?UTF-8?q?#59=20fix:=20=ED=94=BC=EB=93=9C?= =?UTF-8?q?=EB=B0=B1=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../album/dto/response/ClosedAlbumSummaryResponse.java | 1 - .../cheeeese/album/dto/response/OpenAlbumSummaryResponse.java | 1 - .../album/infrastructure/mapper/AlbumQueryMapper.java | 4 ++-- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/cheeeese/album/dto/response/ClosedAlbumSummaryResponse.java b/src/main/java/com/cheeeese/album/dto/response/ClosedAlbumSummaryResponse.java index 4e0e65d..8c8b255 100644 --- a/src/main/java/com/cheeeese/album/dto/response/ClosedAlbumSummaryResponse.java +++ b/src/main/java/com/cheeeese/album/dto/response/ClosedAlbumSummaryResponse.java @@ -13,7 +13,6 @@ requiredProperties = { "code", "title", - "makerName", "eventDate" } ) diff --git a/src/main/java/com/cheeeese/album/dto/response/OpenAlbumSummaryResponse.java b/src/main/java/com/cheeeese/album/dto/response/OpenAlbumSummaryResponse.java index e94c989..0134930 100644 --- a/src/main/java/com/cheeeese/album/dto/response/OpenAlbumSummaryResponse.java +++ b/src/main/java/com/cheeeese/album/dto/response/OpenAlbumSummaryResponse.java @@ -16,7 +16,6 @@ "themeEmoji", "title", "eventDate", - "makerName", "currentParticipant", "participant", "expiredAt" diff --git a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumQueryMapper.java b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumQueryMapper.java index 6e5ea4a..2ca9947 100644 --- a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumQueryMapper.java +++ b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumQueryMapper.java @@ -48,7 +48,7 @@ public static OpenAlbumSummaryResponse toOpenAlbumSummaryResponse( .themeEmoji(album.getThemeEmoji()) .title(album.getTitle()) .eventDate(album.getEventDate()) - .makerName(maker.getName()) + .makerName(maker != null ? maker.getName() : null) .currentParticipant(album.getCurrentParticipant()) .participant(album.getParticipant()) .expiredAt(album.getExpiredAt()) @@ -64,7 +64,7 @@ public static ClosedAlbumSummaryResponse toClosedAlbumSummaryResponse( return ClosedAlbumSummaryResponse.builder() .code(album.getCode()) .title(album.getTitle()) - .makerName(maker.getName()) + .makerName(maker != null ? maker.getName() : null) .eventDate(album.getEventDate()) .thumbnails(thumbnails.isEmpty() ? null : thumbnails) .build(); From 9f45bfc72829376cbeeea06334de90294f8ef11f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Sun, 16 Nov 2025 00:17:23 +0900 Subject: [PATCH 313/402] =?UTF-8?q?#59=20fix:=20=ED=94=BC=EB=93=9C?= =?UTF-8?q?=EB=B0=B1=20=EC=9E=AC=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../album/dto/response/ClosedAlbumSummaryResponse.java | 1 + .../cheeeese/album/dto/response/OpenAlbumSummaryResponse.java | 1 + .../album/infrastructure/mapper/AlbumQueryMapper.java | 4 ++-- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/cheeeese/album/dto/response/ClosedAlbumSummaryResponse.java b/src/main/java/com/cheeeese/album/dto/response/ClosedAlbumSummaryResponse.java index 8c8b255..4e0e65d 100644 --- a/src/main/java/com/cheeeese/album/dto/response/ClosedAlbumSummaryResponse.java +++ b/src/main/java/com/cheeeese/album/dto/response/ClosedAlbumSummaryResponse.java @@ -13,6 +13,7 @@ requiredProperties = { "code", "title", + "makerName", "eventDate" } ) diff --git a/src/main/java/com/cheeeese/album/dto/response/OpenAlbumSummaryResponse.java b/src/main/java/com/cheeeese/album/dto/response/OpenAlbumSummaryResponse.java index 0134930..e94c989 100644 --- a/src/main/java/com/cheeeese/album/dto/response/OpenAlbumSummaryResponse.java +++ b/src/main/java/com/cheeeese/album/dto/response/OpenAlbumSummaryResponse.java @@ -16,6 +16,7 @@ "themeEmoji", "title", "eventDate", + "makerName", "currentParticipant", "participant", "expiredAt" diff --git a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumQueryMapper.java b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumQueryMapper.java index 2ca9947..6e5ea4a 100644 --- a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumQueryMapper.java +++ b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumQueryMapper.java @@ -48,7 +48,7 @@ public static OpenAlbumSummaryResponse toOpenAlbumSummaryResponse( .themeEmoji(album.getThemeEmoji()) .title(album.getTitle()) .eventDate(album.getEventDate()) - .makerName(maker != null ? maker.getName() : null) + .makerName(maker.getName()) .currentParticipant(album.getCurrentParticipant()) .participant(album.getParticipant()) .expiredAt(album.getExpiredAt()) @@ -64,7 +64,7 @@ public static ClosedAlbumSummaryResponse toClosedAlbumSummaryResponse( return ClosedAlbumSummaryResponse.builder() .code(album.getCode()) .title(album.getTitle()) - .makerName(maker != null ? maker.getName() : null) + .makerName(maker.getName()) .eventDate(album.getEventDate()) .thumbnails(thumbnails.isEmpty() ? null : thumbnails) .build(); From 8b2d228ac373c86b09b9d2016b478828c760d36f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Sun, 16 Nov 2025 16:58:46 +0900 Subject: [PATCH 314/402] =?UTF-8?q?#59=20fix:=20=EC=A7=80=EC=9B=8C?= =?UTF-8?q?=EC=A7=84=20=EC=8A=A4=ED=82=A4=EB=A7=88=20=EB=B3=B5=EA=B5=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cheeeese/photo/dto/request/PhotoDownloadRequest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/cheeeese/photo/dto/request/PhotoDownloadRequest.java b/src/main/java/com/cheeeese/photo/dto/request/PhotoDownloadRequest.java index 67c15f4..018e232 100644 --- a/src/main/java/com/cheeeese/photo/dto/request/PhotoDownloadRequest.java +++ b/src/main/java/com/cheeeese/photo/dto/request/PhotoDownloadRequest.java @@ -8,6 +8,7 @@ import java.util.List; @Builder +@Schema(description = "사진 다운로드 presigned url 발급 API") public record PhotoDownloadRequest( @Schema(description = "앨범 코드", example = "1f0b7ea8-fab6-6581-95e3-0720bc07603e") @NotBlank(message = "앨범 코드는 필수입니다") From fb4c4c4d39a7ce38a6fd15401d8195139f492a62 Mon Sep 17 00:00:00 2001 From: zyovn Date: Mon, 17 Nov 2025 03:35:35 +0900 Subject: [PATCH 315/402] =?UTF-8?q?#68=20feat:=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=9E=90=20=EC=98=A8=EB=B3=B4=EB=94=A9=20API=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cheeeese/global/common/code/SuccessCode.java | 2 +- .../com/cheeeese/user/application/UserService.java | 11 +++++++---- .../user/application/validator/UserValidator.java | 12 ++++++++++-- src/main/java/com/cheeeese/user/domain/User.java | 6 +++++- ...ementRequest.java => UserOnboardingRequest.java} | 11 +++++++++-- .../cheeeese/user/exception/code/UserErrorCode.java | 2 ++ .../cheeeese/user/presentation/UserController.java | 13 ++++++------- .../user/presentation/swagger/UserSwagger.java | 6 +++--- 8 files changed, 43 insertions(+), 20 deletions(-) rename src/main/java/com/cheeeese/user/dto/request/{UserAgreementRequest.java => UserOnboardingRequest.java} (79%) diff --git a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java index 7bc6da8..214a62a 100644 --- a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java +++ b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java @@ -22,7 +22,7 @@ public enum SuccessCode implements BaseCode { USER_NAME_UPDATE_SUCCESS(HttpStatus.OK, "사용자 이름 업데이트가 성공적으로 완료되었습니다."), USER_PROFILE_IMAGE_OPT_GET_SUCCESS(HttpStatus.OK, "사용자 프로필 이미지 선택 옵션 목록 조회가 성공적으로 완료되었습니다."), USER_PROFILE_IMAGE_UPDATE_SUCCESS(HttpStatus.OK, "사용자 프로필 이미지 업데이트가 성공적으로 완료되었습니다."), - USER_AGREEMENT_ACCEPT_SUCCESS(HttpStatus.OK, "사용자 이용 약관 동의가 성공적으로 완료되었습니다."), + USER_ONBOARDING_SUCCESS(HttpStatus.OK, "사용자 온보딩이 성공적으로 완료되었습니다."), // album ALBUM_OPEN_LIST_FETCH_SUCCESS(HttpStatus.OK, "열린 앨범 목록 조회가 성공적으로 완료되었습니다."), diff --git a/src/main/java/com/cheeeese/user/application/UserService.java b/src/main/java/com/cheeeese/user/application/UserService.java index 8b968ff..6eebb7f 100644 --- a/src/main/java/com/cheeeese/user/application/UserService.java +++ b/src/main/java/com/cheeeese/user/application/UserService.java @@ -4,7 +4,7 @@ import com.cheeeese.user.application.validator.UserValidator; import com.cheeeese.user.domain.User; import com.cheeeese.user.domain.type.ProfileImageType; -import com.cheeeese.user.dto.request.UserAgreementRequest; +import com.cheeeese.user.dto.request.UserOnboardingRequest; import com.cheeeese.user.dto.request.UserProfileImageRequest; import com.cheeeese.user.dto.request.UserProfileRequest; import com.cheeeese.user.dto.response.UserInfoResponse; @@ -53,10 +53,13 @@ public void updateUserProfileImage(User user, UserProfileImageRequest request) { } @Transactional - public void saveUserAgreement(User user, UserAgreementRequest request) { - userValidator.validateUserAgreement(request); + public void saveUserOnboarding(User user, UserOnboardingRequest request) { + ProfileImageType type = ProfileImageType.fromName(request.imageCode()); + userValidator.validateUserOnboarding(request); - user.saveUserAgreement( + user.saveUserOnboarding( + request.name(), + type.name(), true, request.isServiceAgreement(), request.isUserInfoAgreement(), diff --git a/src/main/java/com/cheeeese/user/application/validator/UserValidator.java b/src/main/java/com/cheeeese/user/application/validator/UserValidator.java index 5114c79..090b100 100644 --- a/src/main/java/com/cheeeese/user/application/validator/UserValidator.java +++ b/src/main/java/com/cheeeese/user/application/validator/UserValidator.java @@ -1,6 +1,6 @@ package com.cheeeese.user.application.validator; -import com.cheeeese.user.dto.request.UserAgreementRequest; +import com.cheeeese.user.dto.request.UserOnboardingRequest; import com.cheeeese.user.exception.UserException; import com.cheeeese.user.exception.code.UserErrorCode; import org.springframework.stereotype.Component; @@ -8,7 +8,15 @@ @Component public class UserValidator { - public void validateUserAgreement(UserAgreementRequest request) { + public void validateUserOnboarding(UserOnboardingRequest request) { + if (request.name().isBlank()) { + throw new UserException(UserErrorCode.USER_NAME_REQUIRED); + } + + if (request.imageCode().isBlank()) { + throw new UserException(UserErrorCode.USER_PROFILE_IMAGE_CODE_REQUIRED); + } + if (!request.isServiceAgreement() || !request.isUserInfoAgreement() || !request.isThirdPartyAgreement()) { throw new UserException(UserErrorCode.REQUIRED_TERMS_NOT_AGREED); } diff --git a/src/main/java/com/cheeeese/user/domain/User.java b/src/main/java/com/cheeeese/user/domain/User.java index d878cc4..47c403b 100644 --- a/src/main/java/com/cheeeese/user/domain/User.java +++ b/src/main/java/com/cheeeese/user/domain/User.java @@ -90,13 +90,17 @@ public void updateUserProfileImage(String profileImage) { this.profileImage = profileImage; } - public void saveUserAgreement( + public void saveUserOnboarding( + String name, + String profileImage, boolean isOnboarded, boolean isServiceAgreement, boolean isUserInfoAgreement, boolean isMarketingAgreement, boolean isThirdPartyAgreement ) { + this.name = name; + this.profileImage = profileImage; this.isOnboarded = isOnboarded; this.isServiceAgreement = isServiceAgreement; this.isUserInfoAgreement = isUserInfoAgreement; diff --git a/src/main/java/com/cheeeese/user/dto/request/UserAgreementRequest.java b/src/main/java/com/cheeeese/user/dto/request/UserOnboardingRequest.java similarity index 79% rename from src/main/java/com/cheeeese/user/dto/request/UserAgreementRequest.java rename to src/main/java/com/cheeeese/user/dto/request/UserOnboardingRequest.java index 2139d87..3d38354 100644 --- a/src/main/java/com/cheeeese/user/dto/request/UserAgreementRequest.java +++ b/src/main/java/com/cheeeese/user/dto/request/UserOnboardingRequest.java @@ -1,12 +1,19 @@ package com.cheeeese.user.dto.request; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import lombok.Builder; @Builder -@Schema(description = "사용자 이용 약관 API") -public record UserAgreementRequest( +@Schema(description = "사용자 온보딩 API") +public record UserOnboardingRequest( + @NotBlank + String name, + + @NotBlank + String imageCode, + @NotNull @Schema( description = "서비스 이용 약관 동의", diff --git a/src/main/java/com/cheeeese/user/exception/code/UserErrorCode.java b/src/main/java/com/cheeeese/user/exception/code/UserErrorCode.java index 0349417..493ebe0 100644 --- a/src/main/java/com/cheeeese/user/exception/code/UserErrorCode.java +++ b/src/main/java/com/cheeeese/user/exception/code/UserErrorCode.java @@ -10,6 +10,8 @@ public enum UserErrorCode implements BaseCode { USER_NOT_FOUND(HttpStatus.NOT_FOUND, "존재하지 않는 사용자입니다."), + USER_NAME_REQUIRED(HttpStatus.BAD_REQUEST, "사용자 이름은 필수 입력 값입니다."), + USER_PROFILE_IMAGE_CODE_REQUIRED(HttpStatus.BAD_REQUEST, "프로필 이미지 코드는 필수 입력 값입니다."), REQUIRED_TERMS_NOT_AGREED(HttpStatus.BAD_REQUEST, "필수 약관에 동의하지 않았습니다."), USER_PHOTO_COUNT_INCREMENT_FAILED(HttpStatus.CONFLICT, "유저의 앨범 사진 개수 증가에 실패했습니다."), USER_PHOTO_COUNT_DECREMENT_FAILED(HttpStatus.CONFLICT, "유저의 앨범 사진 개수 감소에 실패했습니다."), diff --git a/src/main/java/com/cheeeese/user/presentation/UserController.java b/src/main/java/com/cheeeese/user/presentation/UserController.java index 934eb3b..93e365a 100644 --- a/src/main/java/com/cheeeese/user/presentation/UserController.java +++ b/src/main/java/com/cheeeese/user/presentation/UserController.java @@ -4,7 +4,7 @@ import com.cheeeese.global.util.CurrentUser; import com.cheeeese.user.application.UserService; import com.cheeeese.user.domain.User; -import com.cheeeese.user.dto.request.UserAgreementRequest; +import com.cheeeese.user.dto.request.UserOnboardingRequest; import com.cheeeese.user.dto.request.UserProfileImageRequest; import com.cheeeese.user.dto.request.UserProfileRequest; import com.cheeeese.user.dto.response.UserInfoResponse; @@ -12,7 +12,6 @@ import com.cheeeese.user.presentation.swagger.UserSwagger; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; -import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.*; import static com.cheeeese.global.common.code.SuccessCode.*; @@ -57,12 +56,12 @@ public CommonResponse updateUserProfileImage( } @Override - @PostMapping("/agreement") - public CommonResponse saveUserAgreement( + @PostMapping("/onboarding") + public CommonResponse saveUserOnboarding( @CurrentUser User user, - @RequestBody @Valid UserAgreementRequest request + @RequestBody @Valid UserOnboardingRequest request ) { - userService.saveUserAgreement(user, request); - return CommonResponse.success(USER_AGREEMENT_ACCEPT_SUCCESS); + userService.saveUserOnboarding(user, request); + return CommonResponse.success(USER_ONBOARDING_SUCCESS); } } diff --git a/src/main/java/com/cheeeese/user/presentation/swagger/UserSwagger.java b/src/main/java/com/cheeeese/user/presentation/swagger/UserSwagger.java index a510edb..bc3a092 100644 --- a/src/main/java/com/cheeeese/user/presentation/swagger/UserSwagger.java +++ b/src/main/java/com/cheeeese/user/presentation/swagger/UserSwagger.java @@ -3,7 +3,7 @@ import com.cheeeese.global.common.CommonResponse; import com.cheeeese.global.util.CurrentUser; import com.cheeeese.user.domain.User; -import com.cheeeese.user.dto.request.UserAgreementRequest; +import com.cheeeese.user.dto.request.UserOnboardingRequest; import com.cheeeese.user.dto.request.UserProfileImageRequest; import com.cheeeese.user.dto.request.UserProfileRequest; import com.cheeeese.user.dto.response.UserInfoResponse; @@ -97,8 +97,8 @@ CommonResponse updateUserProfileImage( description = "사용자 이용 약관 동의가 성공적으로 실행되었습니다." ) }) - CommonResponse saveUserAgreement( + CommonResponse saveUserOnboarding( @CurrentUser User user, - @RequestBody @Valid UserAgreementRequest request + @RequestBody @Valid UserOnboardingRequest request ); } From 0e5cd509932ab9d7c59d16dc9c795a0785346fda Mon Sep 17 00:00:00 2001 From: zyovn Date: Mon, 17 Nov 2025 03:41:33 +0900 Subject: [PATCH 316/402] =?UTF-8?q?#68=20docs:=20swagger=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cheeeese/user/dto/request/UserOnboardingRequest.java | 4 +++- .../com/cheeeese/user/presentation/swagger/UserSwagger.java | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/cheeeese/user/dto/request/UserOnboardingRequest.java b/src/main/java/com/cheeeese/user/dto/request/UserOnboardingRequest.java index 3d38354..7d56e16 100644 --- a/src/main/java/com/cheeeese/user/dto/request/UserOnboardingRequest.java +++ b/src/main/java/com/cheeeese/user/dto/request/UserOnboardingRequest.java @@ -9,9 +9,11 @@ @Schema(description = "사용자 온보딩 API") public record UserOnboardingRequest( @NotBlank + @Schema(description = "사용자 이름", example = "주") String name, @NotBlank + @Schema(description = "프로필 이미지 코드", example = "P2") String imageCode, @NotNull @@ -37,7 +39,7 @@ public record UserOnboardingRequest( @NotNull @Schema( description = "제3자 제공 동의", - example = "false" + example = "true" ) boolean isThirdPartyAgreement ) { diff --git a/src/main/java/com/cheeeese/user/presentation/swagger/UserSwagger.java b/src/main/java/com/cheeeese/user/presentation/swagger/UserSwagger.java index bc3a092..51b21ae 100644 --- a/src/main/java/com/cheeeese/user/presentation/swagger/UserSwagger.java +++ b/src/main/java/com/cheeeese/user/presentation/swagger/UserSwagger.java @@ -81,10 +81,12 @@ CommonResponse updateUserProfileImage( ); @Operation( - summary = "사용자 이용 약관 동의 API", + summary = "사용자 온보딩 API", description = """ ### RequestBody --- + `name`: 사용자 이름 (String) \n + `imageCode`: 프로필 이미지 코드 (String) \n `isServiceAgreement`: 서비스 이용 약관 동의 (boolean) \n `isUserInfoAgreement`: 사용자 정보 수집 동의 (boolean) \n `isMarketingAgreement`: 마케팅 수신 동의 (boolean) \n From a85818536493f30181ab2e7c280b6f41b38186db Mon Sep 17 00:00:00 2001 From: zyovn Date: Mon, 17 Nov 2025 03:47:13 +0900 Subject: [PATCH 317/402] =?UTF-8?q?#68=20fix:=20=ED=94=BC=EB=93=9C?= =?UTF-8?q?=EB=B0=B1=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/cheeeese/user/application/UserService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/cheeeese/user/application/UserService.java b/src/main/java/com/cheeeese/user/application/UserService.java index 6eebb7f..08e1118 100644 --- a/src/main/java/com/cheeeese/user/application/UserService.java +++ b/src/main/java/com/cheeeese/user/application/UserService.java @@ -54,8 +54,8 @@ public void updateUserProfileImage(User user, UserProfileImageRequest request) { @Transactional public void saveUserOnboarding(User user, UserOnboardingRequest request) { - ProfileImageType type = ProfileImageType.fromName(request.imageCode()); userValidator.validateUserOnboarding(request); + ProfileImageType type = ProfileImageType.fromName(request.imageCode()); user.saveUserOnboarding( request.name(), From c35b5914deb56f4c20b4be832c46f320b548d8cc Mon Sep 17 00:00:00 2001 From: zyovn Date: Mon, 17 Nov 2025 14:11:32 +0900 Subject: [PATCH 318/402] =?UTF-8?q?#67=20fix:=20=EB=A7=88=EC=9D=B4?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20=ED=94=84=EB=A1=9C=ED=95=84=20?= =?UTF-8?q?=EC=9D=B4=EB=AF=B8=EC=A7=80=20response=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/cheeeese/user/application/UserService.java | 4 +++- .../com/cheeeese/user/infrastructure/mapper/UserMapper.java | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/cheeeese/user/application/UserService.java b/src/main/java/com/cheeeese/user/application/UserService.java index 08e1118..b6da68e 100644 --- a/src/main/java/com/cheeeese/user/application/UserService.java +++ b/src/main/java/com/cheeeese/user/application/UserService.java @@ -1,5 +1,6 @@ package com.cheeeese.user.application; +import com.cheeeese.global.util.ProfileImageUtil; import com.cheeeese.global.util.resolver.CdnUrlResolver; import com.cheeeese.user.application.validator.UserValidator; import com.cheeeese.user.domain.User; @@ -69,7 +70,8 @@ public void saveUserOnboarding(User user, UserOnboardingRequest request) { } public UserInfoResponse getUserInfo(User user) { - return UserMapper.toUserInfoResponse(user); + String profileImage = ProfileImageUtil.resolveProfileImage(user, cdnUrlResolver); + return UserMapper.toUserInfoResponse(user, profileImage); } @Transactional diff --git a/src/main/java/com/cheeeese/user/infrastructure/mapper/UserMapper.java b/src/main/java/com/cheeeese/user/infrastructure/mapper/UserMapper.java index e6166ed..1ec3c40 100644 --- a/src/main/java/com/cheeeese/user/infrastructure/mapper/UserMapper.java +++ b/src/main/java/com/cheeeese/user/infrastructure/mapper/UserMapper.java @@ -21,9 +21,9 @@ public static User toEntity(OAuth2UserInfo oAuth2UserInfo) { .build(); } - public static UserInfoResponse toUserInfoResponse(User user) { + public static UserInfoResponse toUserInfoResponse(User user, String profileImage) { return UserInfoResponse.builder() - .profileImage(user.getProfileImage()) + .profileImage(profileImage) .name(user.getName()) .albumCount(user.getAlbumCnt()) .photoCount(user.getPhotoCnt()) From c66e269d20d494bb57b69bbd0c718077fd687141 Mon Sep 17 00:00:00 2001 From: zyovn Date: Mon, 17 Nov 2025 17:04:49 +0900 Subject: [PATCH 319/402] =?UTF-8?q?#67=20fix:=20=EB=8B=A4=EC=9A=B4?= =?UTF-8?q?=EB=A1=9C=EB=93=9C=20API=EC=97=90=20content-disposition=20?= =?UTF-8?q?=ED=97=A4=EB=8D=94=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/cheeeese/photo/application/PhotoService.java | 2 +- .../com/cheeeese/photo/application/PresignedUrlService.java | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/cheeeese/photo/application/PhotoService.java b/src/main/java/com/cheeeese/photo/application/PhotoService.java index b55eaf7..7a820c8 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoService.java @@ -223,7 +223,7 @@ private PhotoDownloadResponse.DownloadFileInfo createPresignedUrlForDownload(Pho } String objectKey = S3Util.extractObjectKey(photo.getImageUrl()); - String url = presignedUrlService.generatePresignedGetUrl(objectKey); + String url = presignedUrlService.generatePresignedGetUrl(objectKey, fileName); return PhotoMapper.toDownloadPresignedUrlInfo(photo, fileName, url); } diff --git a/src/main/java/com/cheeeese/photo/application/PresignedUrlService.java b/src/main/java/com/cheeeese/photo/application/PresignedUrlService.java index b0f348d..d1c4a49 100644 --- a/src/main/java/com/cheeeese/photo/application/PresignedUrlService.java +++ b/src/main/java/com/cheeeese/photo/application/PresignedUrlService.java @@ -36,10 +36,11 @@ public String generatePresignedPutUrl(String uniqueKey, String contentType) { return presignedRequest.url().toString(); } - public String generatePresignedGetUrl(String uniqueKey) { + public String generatePresignedGetUrl(String uniqueKey, String fileName) { GetObjectRequest getObjectRequest = GetObjectRequest.builder() .bucket(bucket) .key(uniqueKey) + .responseContentDisposition("attachment; filename=\"" + fileName + "\"") .build(); PresignedGetObjectRequest presignedRequest = From 54a6f2e9280d8aae5f5c525a87975a283876f9db Mon Sep 17 00:00:00 2001 From: zyovn Date: Mon, 17 Nov 2025 17:07:25 +0900 Subject: [PATCH 320/402] =?UTF-8?q?#67=20feat:=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=9E=90=20=EB=A7=88=EC=9D=B4=20=ED=8E=98=EC=9D=B4=EC=A7=80=20?= =?UTF-8?q?response=EC=97=90=20=EC=9D=B4=EB=A9=94=EC=9D=BC=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cheeeese/user/dto/response/UserInfoResponse.java | 4 ++++ .../com/cheeeese/user/infrastructure/mapper/UserMapper.java | 1 + 2 files changed, 5 insertions(+) diff --git a/src/main/java/com/cheeeese/user/dto/response/UserInfoResponse.java b/src/main/java/com/cheeeese/user/dto/response/UserInfoResponse.java index e6d61fd..5d30d9c 100644 --- a/src/main/java/com/cheeeese/user/dto/response/UserInfoResponse.java +++ b/src/main/java/com/cheeeese/user/dto/response/UserInfoResponse.java @@ -8,6 +8,7 @@ description = "사용자 기본 정보 응답", requiredProperties = { "profileImage", + "email", "name", "albumCount", "photoCount", @@ -17,6 +18,9 @@ @Schema(description = "사용자 프로필 이미지 URL", example = "https://cdn.cheeeese.me/profile.png") String profileImage, + @Schema(description = "사용자 이메일", example = "say.cheese@gmail.com") + String email, + @Schema(description = "사용자 이름", example = "치즈러버") String name, diff --git a/src/main/java/com/cheeeese/user/infrastructure/mapper/UserMapper.java b/src/main/java/com/cheeeese/user/infrastructure/mapper/UserMapper.java index 1ec3c40..cdc2230 100644 --- a/src/main/java/com/cheeeese/user/infrastructure/mapper/UserMapper.java +++ b/src/main/java/com/cheeeese/user/infrastructure/mapper/UserMapper.java @@ -25,6 +25,7 @@ public static UserInfoResponse toUserInfoResponse(User user, String profileImage return UserInfoResponse.builder() .profileImage(profileImage) .name(user.getName()) + .email(user.getEmail()) .albumCount(user.getAlbumCnt()) .photoCount(user.getPhotoCnt()) .likesCount(user.getLikesCnt()) From b20bd233f1209da1519b5387d2c840f45eaac1f8 Mon Sep 17 00:00:00 2001 From: zyovn Date: Mon, 17 Nov 2025 17:27:49 +0900 Subject: [PATCH 321/402] =?UTF-8?q?#67=20fix:=20cdn=20url=20prefix=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../global/util/resolver/CdnUrlResolver.java | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/cheeeese/global/util/resolver/CdnUrlResolver.java b/src/main/java/com/cheeeese/global/util/resolver/CdnUrlResolver.java index f542afa..f206f75 100644 --- a/src/main/java/com/cheeeese/global/util/resolver/CdnUrlResolver.java +++ b/src/main/java/com/cheeeese/global/util/resolver/CdnUrlResolver.java @@ -3,9 +3,17 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; +import java.util.List; + @Component public class CdnUrlResolver { + private static final List PREFIXES = List.of( + "say-cheeeese/", + "say-cheeeese-thumbnail/", + "say-cheeeese-profile/" + ); + @Value("${cdn.original-domain}") private String originalDomain; @@ -30,9 +38,14 @@ public String resolveProfile(String path) { private String resolve(String domain, String path) { if (path == null || path.isBlank()) return null; if (path.startsWith("http")) return path; - if (path.startsWith("say-cheeeese/")) { - path = path.substring("say-cheeeese/".length()); + + for (String prefix : PREFIXES) { + if (path.startsWith(prefix)) { + path = path.substring(prefix.length()); + break; + } } + if (path.startsWith("/")) path = path.substring(1); return domain + "/" + path; } From 4462cc74d213fffe65a5f3f909319c8042a2c4cf Mon Sep 17 00:00:00 2001 From: zyovn Date: Mon, 17 Nov 2025 17:32:42 +0900 Subject: [PATCH 322/402] =?UTF-8?q?#67=20docs:=20swagger=20title,=20descri?= =?UTF-8?q?ption=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/cheeeese/global/config/SwaggerConfig.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/cheeeese/global/config/SwaggerConfig.java b/src/main/java/com/cheeeese/global/config/SwaggerConfig.java index 3854817..ff164fa 100644 --- a/src/main/java/com/cheeeese/global/config/SwaggerConfig.java +++ b/src/main/java/com/cheeeese/global/config/SwaggerConfig.java @@ -15,8 +15,8 @@ @Configuration @OpenAPIDefinition( info = @Info( - title = "Cheeeese API 명세서", - description = "Cheeeese API 명세서", + title = "🧀 치이이즈 API 명세서", + description = "🧀 치이이즈 API 명세서", version = "v1.0.0" ), servers = { From cd1cde152aab292757d04230d6a2e109fce712bd Mon Sep 17 00:00:00 2001 From: zyovn Date: Mon, 17 Nov 2025 20:53:46 +0900 Subject: [PATCH 323/402] =?UTF-8?q?#71=20feat:=20=EC=82=AC=EC=A7=84=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C=20=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/validator/AlbumValidator.java | 9 ++++++ .../global/common/code/SuccessCode.java | 1 + .../photo/application/PhotoService.java | 16 ++++++++++ .../application/validator/PhotoValidator.java | 23 ++++++++++++++ .../java/com/cheeeese/photo/domain/Photo.java | 4 +++ .../photo/exception/code/PhotoErrorCode.java | 1 + .../presentation/PhotoCommandController.java | 31 +++++++++++++++++++ 7 files changed, 85 insertions(+) create mode 100644 src/main/java/com/cheeeese/photo/presentation/PhotoCommandController.java diff --git a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java index 45a4db4..9f17f21 100644 --- a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java +++ b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java @@ -1,6 +1,7 @@ package com.cheeeese.album.application.validator; import com.cheeeese.album.domain.Album; +import com.cheeeese.album.domain.UserAlbum; import com.cheeeese.album.domain.type.Role; import com.cheeeese.album.dto.request.AlbumCreationRequest; import com.cheeeese.album.exception.AlbumException; @@ -95,6 +96,14 @@ public void validateAlbumParticipant(Album album, User user) { .orElseThrow(() -> new AlbumException(AlbumErrorCode.USER_NOT_PARTICIPANT)); } + public UserAlbum getAlbumParticipant(Album album, User user) { + validateAlbumExpiration(album); + validateUserBlacklisted(album, user); + + return userAlbumRepository.findByUserIdAndAlbumId(user.getId(), album.getId()) + .orElseThrow(() -> new AlbumException(AlbumErrorCode.USER_NOT_PARTICIPANT)); + } + private void validateAlbumExpiration(Album album) { if (album.isExpired()) { throw new AlbumException(AlbumErrorCode.ALBUM_EXPIRED); diff --git a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java index 214a62a..4dcdb33 100644 --- a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java +++ b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java @@ -46,6 +46,7 @@ public enum SuccessCode implements BaseCode { PHOTO_LIKES_CREATE_SUCCESS(HttpStatus.OK, "사진 좋아요 생성이 완료되었습니다."), PHOTO_LIKES_DELETE_SUCCESS(HttpStatus.OK, "사진 좋아요 삭제가 완료되었습니다."), PHOTO_LIKERS_GET_SUCCESS(HttpStatus.OK, "띱한 사람 목록 조회가 성공적으로 완료되었습니다."), + PHOTO_DELETE_SUCCESS(HttpStatus.OK, "사진 삭제가 성공적으로 완료되었습니다."), // cheese4cut CHEESE4CUT_GET_SUCCESS(HttpStatus.OK, "치즈네컷 조회가 성공적으로 완료되었습니다."), diff --git a/src/main/java/com/cheeeese/photo/application/PhotoService.java b/src/main/java/com/cheeeese/photo/application/PhotoService.java index b55eaf7..df6857a 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoService.java @@ -2,6 +2,7 @@ import com.cheeeese.album.application.validator.AlbumValidator; import com.cheeeese.album.domain.Album; +import com.cheeeese.album.domain.UserAlbum; import com.cheeeese.album.infrastructure.persistence.AlbumRepository; import com.cheeeese.global.util.S3Util; import com.cheeeese.photo.application.validator.PhotoValidator; @@ -157,6 +158,21 @@ public void deletePhotoLikes(User user, Long photoId) { photoQueryService.invalidatePhotoCache(photo.getAlbum().getCode()); } + @Transactional + public void deletePhoto(User user, String code, Long photoId) { + Album album = albumValidator.validateAlbumCode(code); + UserAlbum userAlbum = albumValidator.getAlbumParticipant(album, user); + + Photo photo = photoRepository.findById(photoId) + .orElseThrow(() -> new PhotoException(PhotoErrorCode.PHOTO_NOT_FOUND)); + + photoValidator.validateDeletePermission(user, userAlbum, album, photo); + + photo.softDelete(); + + photoQueryService.invalidatePhotoCache(album.getCode()); + } + private Album validateAlbumAndPermission(User user, String albumCode) { Album album = albumValidator.validateAlbumCode(albumCode); albumValidator.validateUploadPermission(album, user); diff --git a/src/main/java/com/cheeeese/photo/application/validator/PhotoValidator.java b/src/main/java/com/cheeeese/photo/application/validator/PhotoValidator.java index 56ad048..7c61165 100644 --- a/src/main/java/com/cheeeese/photo/application/validator/PhotoValidator.java +++ b/src/main/java/com/cheeeese/photo/application/validator/PhotoValidator.java @@ -1,10 +1,14 @@ package com.cheeeese.photo.application.validator; +import com.cheeeese.album.domain.Album; +import com.cheeeese.album.domain.UserAlbum; +import com.cheeeese.album.domain.type.Role; import com.cheeeese.photo.domain.Photo; import com.cheeeese.photo.dto.request.PhotoPresignedUrlRequest; import com.cheeeese.photo.exception.PhotoException; import com.cheeeese.photo.exception.code.PhotoErrorCode; import com.cheeeese.photo.infrastructure.persistence.PhotoRepository; +import com.cheeeese.user.domain.User; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -130,4 +134,23 @@ private Long validateSingleAlbum(List photos) { * 검증 결과 객체: 앨범 ID + 사진 리스트 보관 */ public record ValidatedPhotos(List photos, Long albumId) {} + + /** + * 사진 삭제 권한 검증 + */ + public void validateDeletePermission(User user, UserAlbum userAlbum, Album album, Photo photo) { + if (userAlbum.getRole() == Role.MAKER) return; + + if (!photo.getUser().getId().equals(user.getId())) { + throw new PhotoException(PhotoErrorCode.PHOTO_OWNER_MISMATCH); + } + + if (!photo.getAlbum().getId().equals(album.getId())) { + throw new PhotoException(PhotoErrorCode.PHOTO_NOT_FOUND_IN_ALBUM); + } + + if (photo.isDeleted()) { + throw new PhotoException(PhotoErrorCode.PHOTO_ALREADY_DELETED); + } + } } diff --git a/src/main/java/com/cheeeese/photo/domain/Photo.java b/src/main/java/com/cheeeese/photo/domain/Photo.java index 89c2d10..ae2f7a5 100644 --- a/src/main/java/com/cheeeese/photo/domain/Photo.java +++ b/src/main/java/com/cheeeese/photo/domain/Photo.java @@ -71,4 +71,8 @@ private Photo( public void updateImageUrl(String imageUrl) { this.imageUrl = imageUrl; } + + public void softDelete() { + this.isDeleted = true; + } } diff --git a/src/main/java/com/cheeeese/photo/exception/code/PhotoErrorCode.java b/src/main/java/com/cheeeese/photo/exception/code/PhotoErrorCode.java index aad59b1..d57b137 100644 --- a/src/main/java/com/cheeeese/photo/exception/code/PhotoErrorCode.java +++ b/src/main/java/com/cheeeese/photo/exception/code/PhotoErrorCode.java @@ -30,6 +30,7 @@ public enum PhotoErrorCode implements BaseCode { PHOTO_NOT_FOUND(HttpStatus.NOT_FOUND, "해당 사진을 찾을 수 없습니다."), PHOTO_LIKES_NOT_FOUND(HttpStatus.NOT_FOUND, "사진에 대한 좋아요 내역이 존재하지 않습니다."), PHOTO_NOT_FOUND_IN_ALBUM(HttpStatus.NOT_FOUND, "해당 사진은 이 앨범에 포함되어 있지 않습니다."), + PHOTO_ALREADY_DELETED(HttpStatus.CONFLICT, "이미 삭제된 사진입니다."), ; private final HttpStatus httpStatus; diff --git a/src/main/java/com/cheeeese/photo/presentation/PhotoCommandController.java b/src/main/java/com/cheeeese/photo/presentation/PhotoCommandController.java new file mode 100644 index 0000000..9a4d8ed --- /dev/null +++ b/src/main/java/com/cheeeese/photo/presentation/PhotoCommandController.java @@ -0,0 +1,31 @@ +package com.cheeeese.photo.presentation; + +import com.cheeeese.global.common.CommonResponse; +import com.cheeeese.global.util.CurrentUser; +import com.cheeeese.photo.application.PhotoService; +import com.cheeeese.user.domain.User; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import static com.cheeeese.global.common.code.SuccessCode.PHOTO_DELETE_SUCCESS; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/v1/album/{code}/photo") +public class PhotoCommandController { + + private final PhotoService photoService; + + @DeleteMapping("/{photoId}") + public CommonResponse deletePhoto( + @CurrentUser User user, + @PathVariable String code, + @PathVariable Long photoId + ) { + photoService.deletePhoto(user, code, photoId); + return CommonResponse.success(PHOTO_DELETE_SUCCESS); + } +} From 807ee4e2573c2454336b83c56d95c6ca0cf6365d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Mon, 17 Nov 2025 23:05:09 +0900 Subject: [PATCH 324/402] =?UTF-8?q?#66=20fix:=20=EC=97=85=EB=A1=9C?= =?UTF-8?q?=EB=93=9C=20=EB=A1=9C=EC=A7=81=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/PhotoCallbackService.java | 21 +++++++++++++++++++ .../photo/application/PhotoService.java | 15 ++++--------- .../application/validator/PhotoValidator.java | 2 +- .../persistence/PhotoRepository.java | 9 ++++++++ 4 files changed, 35 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/cheeeese/photo/application/PhotoCallbackService.java b/src/main/java/com/cheeeese/photo/application/PhotoCallbackService.java index 7c6424b..902d157 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoCallbackService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoCallbackService.java @@ -1,10 +1,13 @@ package com.cheeeese.photo.application; +import com.cheeeese.album.infrastructure.persistence.AlbumRepository; +import com.cheeeese.photo.domain.Photo; import com.cheeeese.photo.domain.PhotoStatus; import com.cheeeese.photo.dto.request.PhotoCompleteRequest; import com.cheeeese.photo.exception.PhotoException; import com.cheeeese.photo.exception.code.PhotoErrorCode; import com.cheeeese.photo.infrastructure.persistence.PhotoRepository; +import com.cheeeese.user.application.UserService; import jakarta.transaction.Transactional; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -16,6 +19,8 @@ public class PhotoCallbackService { private final PhotoRepository photoRepository; private final PhotoQueryService photoQueryService; + private final AlbumRepository albumRepository; + private final UserService userService; public void markUploadCompleted(PhotoCompleteRequest request) { int updated = photoRepository.updateStatusAndUrl( @@ -29,6 +34,22 @@ public void markUploadCompleted(PhotoCompleteRequest request) { throw new PhotoException(PhotoErrorCode.THUMBNAIL_UPDATE_FAILED); } + Photo photo = photoRepository.findById(request.photoId()) + .orElseThrow(() -> new PhotoException(PhotoErrorCode.PHOTO_NOT_FOUND)); + + int albumUpdated = albumRepository.incrementPhotoCount(photo.getAlbum().getId(), 1); + if (albumUpdated == 0) { + photoRepository.updateStatusAndUrl( + photo.getId(), + PhotoStatus.COMPLETED, + PhotoStatus.FAILED, + photo.getThumbnailUrl() + ); + throw new PhotoException(PhotoErrorCode.PHOTO_COUNT_INCREMENT_FAILED); + } + + userService.incrementPhotoCount(photo.getUser().getId(), 1); + String albumCode = photoRepository.findAlbumCodeByPhotoId(request.photoId()); if (albumCode != null) { photoQueryService.invalidatePhotoCache(albumCode); diff --git a/src/main/java/com/cheeeese/photo/application/PhotoService.java b/src/main/java/com/cheeeese/photo/application/PhotoService.java index b55eaf7..438769b 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoService.java @@ -68,16 +68,10 @@ public List getRecentPhotosForNewEnter(Long albumId) { @Transactional public PhotoPresignedUrlResponse createPresignedUrls(User user, PhotoPresignedUrlRequest request) { Album album = validateAlbumAndPermission(user, request.albumCode()); - validateUploadRequest(album, request); - int uploadCount = request.fileInfos().size(); + long currentActiveCount = photoRepository.countActivePhotosByAlbumId(album.getId()); - int updatedRows = albumRepository.incrementPhotoCount(album.getId(), uploadCount); - if (updatedRows != 1) { - throw new PhotoException(PhotoErrorCode.PHOTO_COUNT_INCREMENT_FAILED); - } - - userService.incrementPhotoCount(user.getId(), uploadCount); + validateUploadRequest(album, request, currentActiveCount); List presignedUrls = generatePresignedUrls(user, album, request.fileInfos()); @@ -163,12 +157,11 @@ private Album validateAlbumAndPermission(User user, String albumCode) { return album; } - private void validateUploadRequest(Album album, PhotoPresignedUrlRequest request) { - int currentCount = album.getCurrentPhotoCount(); + private void validateUploadRequest(Album album, PhotoPresignedUrlRequest request, long currentActiveCount) { int maxCount = album.getMaxPhotoCount(); int requestedCount = request.fileInfos().size(); - photoValidator.validatePhotoCount(currentCount, requestedCount, maxCount); + photoValidator.validatePhotoCount(currentActiveCount, requestedCount, maxCount); photoValidator.validateFileInfos(request.fileInfos()); } diff --git a/src/main/java/com/cheeeese/photo/application/validator/PhotoValidator.java b/src/main/java/com/cheeeese/photo/application/validator/PhotoValidator.java index 56ad048..4cab4fb 100644 --- a/src/main/java/com/cheeeese/photo/application/validator/PhotoValidator.java +++ b/src/main/java/com/cheeeese/photo/application/validator/PhotoValidator.java @@ -50,7 +50,7 @@ public void validateFileInfos(List fileInfos) /** * 앨범 내 업로드 제한 검증 */ - public void validatePhotoCount(int currentCount, int uploadCount, int maxPhotoCount) { + public void validatePhotoCount(long currentCount, int uploadCount, int maxPhotoCount) { if (currentCount + uploadCount > maxPhotoCount) { throw new PhotoException(PhotoErrorCode.PHOTO_MAX_COUNT_EXCEEDED); } diff --git a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java index 5898ddf..12b704e 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java @@ -163,4 +163,13 @@ List findTop4CompletedPhotosByLikes( WHERE p.id = :photoId """) String findAlbumCodeByPhotoId(@Param("photoId") Long photoId); + + @Query(""" + SELECT COUNT(p) + FROM Photo p + WHERE p.album.id = :albumId + AND p.isDeleted = FALSE + AND p.status IN ('UPLOADING', 'COMPLETED') + """) + long countActivePhotosByAlbumId(@Param("albumId") Long albumId); } From 5caf429d4a15ab934329205abe8903a577f136d9 Mon Sep 17 00:00:00 2001 From: zyovn Date: Mon, 17 Nov 2025 23:52:03 +0900 Subject: [PATCH 325/402] =?UTF-8?q?#71=20feat:=20=EC=82=AC=EC=A7=84=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20API=EC=97=90=20deleted=20=EA=B2=80?= =?UTF-8?q?=EC=A6=9D=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../photo/application/PhotoInfoService.java | 5 ++- .../photo/application/PhotoQueryService.java | 7 ++-- .../photo/application/PhotoService.java | 11 +++--- .../application/support/PhotoReader.java | 37 +++++++++++++++++++ .../application/validator/PhotoValidator.java | 4 -- .../persistence/PhotoRepository.java | 3 ++ 6 files changed, 52 insertions(+), 15 deletions(-) create mode 100644 src/main/java/com/cheeeese/photo/application/support/PhotoReader.java diff --git a/src/main/java/com/cheeeese/photo/application/PhotoInfoService.java b/src/main/java/com/cheeeese/photo/application/PhotoInfoService.java index ac9efc1..a4cc930 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoInfoService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoInfoService.java @@ -4,6 +4,7 @@ import com.cheeeese.album.domain.Album; import com.cheeeese.album.domain.type.Role; import com.cheeeese.global.util.resolver.CdnUrlResolver; +import com.cheeeese.photo.application.support.PhotoReader; import com.cheeeese.photo.domain.Photo; import com.cheeeese.photo.dto.response.PhotoLikedUserResponse; import com.cheeeese.photo.exception.PhotoException; @@ -26,6 +27,7 @@ public class PhotoInfoService { private final PhotoRepository photoRepository; private final PhotoLikesRepository photoLikesRepository; + private final PhotoReader photoReader; private final AlbumValidator albumValidator; private final CdnUrlResolver cdnUrlResolver; @@ -34,8 +36,7 @@ public PhotoLikedUserResponse getPhotoLikedUsers(User user, String code, Long ph albumValidator.validateAlbumParticipant(album, user); - Photo photo = photoRepository.findByIdAndAlbum_Code(photoId, code) - .orElseThrow(() -> new PhotoException(PhotoErrorCode.PHOTO_NOT_FOUND)); + Photo photo = photoReader.getPhotoInAlbum(photoId, code); List users = photoLikesRepository.findLikersByPhotoId(photo.getId()); diff --git a/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java b/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java index 93174a2..15318b1 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java @@ -3,6 +3,7 @@ import com.cheeeese.album.domain.type.AlbumSorting; import com.cheeeese.global.util.RedisCacheUtil; import com.cheeeese.global.util.resolver.CdnUrlResolver; +import com.cheeeese.photo.application.support.PhotoReader; import com.cheeeese.photo.domain.Photo; import com.cheeeese.photo.domain.PhotoStatus; import com.cheeeese.photo.dto.response.*; @@ -33,6 +34,7 @@ public class PhotoQueryService { private final PhotoRepository photoRepository; private final PhotoLikesRepository photoLikesRepository; private final PhotoHistoryRepository photoHistoryRepository; + private final PhotoReader photoReader; private final RedisCacheUtil redisCacheUtil; private final CdnUrlResolver cdnUrlResolver; @@ -70,7 +72,7 @@ public void invalidatePhotoCache(String code) { // TODO: 사진 삭제, 업로 // TODO: 데이터 조회 로직을 Reader 클래스로 분리하는 것 고려 public PhotoLikedPageResponse getPhotoLiked(User user, String code, int page, int size) { PageRequest pageRequest = PageRequest.of(page, size); - Slice photos = photoRepository.findLikedPhotosByAlbumAndUser(code, user.getId(), pageRequest); + Slice photos = photoRepository.findLikedPhotosByAlbumAndUser(code, user.getId(), PhotoStatus.COMPLETED, pageRequest); List photoIds = photos.getContent().stream() .map(Photo::getId) @@ -94,8 +96,7 @@ public PhotoLikedPageResponse getPhotoLiked(User user, String code, int page, in } public PhotoDetailResponse getPhotoDetail(User user, String code, Long photoId) { - Photo photo = photoRepository.findByIdAndAlbum_Code(photoId, code) - .orElseThrow(() -> new PhotoException(PhotoErrorCode.PHOTO_NOT_FOUND)); + Photo photo = photoReader.getPhotoInAlbum(photoId, code); String resolveOriginalUrl = cdnUrlResolver.resolveOriginal(photo.getImageUrl()); String resolveThumbnailUrl = cdnUrlResolver.resolveThumbnail(photo.getThumbnailUrl()); diff --git a/src/main/java/com/cheeeese/photo/application/PhotoService.java b/src/main/java/com/cheeeese/photo/application/PhotoService.java index df6857a..ad5b5f8 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoService.java @@ -5,6 +5,7 @@ import com.cheeeese.album.domain.UserAlbum; import com.cheeeese.album.infrastructure.persistence.AlbumRepository; import com.cheeeese.global.util.S3Util; +import com.cheeeese.photo.application.support.PhotoReader; import com.cheeeese.photo.application.validator.PhotoValidator; import com.cheeeese.photo.domain.Photo; import com.cheeeese.photo.domain.PhotoHistory; @@ -47,6 +48,7 @@ public class PhotoService { private final PhotoRepository photoRepository; private final PhotoLikesRepository photoLikesRepository; private final PhotoHistoryRepository photoHistoryRepository; + private final PhotoReader photoReader; private final PhotoValidator photoValidator; private final AlbumValidator albumValidator; private final AlbumRepository albumRepository; @@ -129,8 +131,7 @@ public void reportUploadResult(User user, PhotoUploadReportRequest request) { @Transactional public void createPhotoLikes(User user, Long photoId) { - Photo photo = photoRepository.findById(photoId) - .orElseThrow(() -> new PhotoException(PhotoErrorCode.PHOTO_NOT_FOUND)); + Photo photo = photoReader.getPhoto(photoId); PhotoLikes photoLikes = PhotoLikesMapper.toEntity(user, photo); @@ -144,8 +145,7 @@ public void createPhotoLikes(User user, Long photoId) { @Transactional public void deletePhotoLikes(User user, Long photoId) { - Photo photo = photoRepository.findById(photoId) - .orElseThrow(() -> new PhotoException(PhotoErrorCode.PHOTO_NOT_FOUND)); + Photo photo = photoReader.getPhoto(photoId); PhotoLikes photoLikes = photoLikesRepository.findByUserIdAndPhotoId(user.getId(), photo.getId()) .orElseThrow(() -> new PhotoException(PhotoErrorCode.PHOTO_LIKES_NOT_FOUND)); @@ -163,8 +163,7 @@ public void deletePhoto(User user, String code, Long photoId) { Album album = albumValidator.validateAlbumCode(code); UserAlbum userAlbum = albumValidator.getAlbumParticipant(album, user); - Photo photo = photoRepository.findById(photoId) - .orElseThrow(() -> new PhotoException(PhotoErrorCode.PHOTO_NOT_FOUND)); + Photo photo = photoReader.getPhotoInAlbum(photoId, code); photoValidator.validateDeletePermission(user, userAlbum, album, photo); diff --git a/src/main/java/com/cheeeese/photo/application/support/PhotoReader.java b/src/main/java/com/cheeeese/photo/application/support/PhotoReader.java new file mode 100644 index 0000000..0208049 --- /dev/null +++ b/src/main/java/com/cheeeese/photo/application/support/PhotoReader.java @@ -0,0 +1,37 @@ +package com.cheeeese.photo.application.support; + +import com.cheeeese.photo.domain.Photo; +import com.cheeeese.photo.exception.PhotoException; +import com.cheeeese.photo.exception.code.PhotoErrorCode; +import com.cheeeese.photo.infrastructure.persistence.PhotoRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class PhotoReader { + + private final PhotoRepository photoRepository; + + public Photo getPhoto(Long photoId) { // TODO: 추후 삭제 + Photo photo = photoRepository.findById(photoId) + .orElseThrow(() -> new PhotoException(PhotoErrorCode.PHOTO_NOT_FOUND)); + + if (photo.isDeleted()) { + throw new PhotoException(PhotoErrorCode.PHOTO_ALREADY_DELETED); + } + + return photo; + } + + public Photo getPhotoInAlbum(Long photoId, String albumCode) { + Photo photo = photoRepository.findByIdAndAlbum_Code(photoId, albumCode) + .orElseThrow(() -> new PhotoException(PhotoErrorCode.PHOTO_NOT_FOUND)); + + if (photo.isDeleted()) { + throw new PhotoException(PhotoErrorCode.PHOTO_ALREADY_DELETED); + } + + return photo; + } +} diff --git a/src/main/java/com/cheeeese/photo/application/validator/PhotoValidator.java b/src/main/java/com/cheeeese/photo/application/validator/PhotoValidator.java index 7c61165..1e5d9a9 100644 --- a/src/main/java/com/cheeeese/photo/application/validator/PhotoValidator.java +++ b/src/main/java/com/cheeeese/photo/application/validator/PhotoValidator.java @@ -148,9 +148,5 @@ public void validateDeletePermission(User user, UserAlbum userAlbum, Album album if (!photo.getAlbum().getId().equals(album.getId())) { throw new PhotoException(PhotoErrorCode.PHOTO_NOT_FOUND_IN_ALBUM); } - - if (photo.isDeleted()) { - throw new PhotoException(PhotoErrorCode.PHOTO_ALREADY_DELETED); - } } } diff --git a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java index 5898ddf..c78b097 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java @@ -36,11 +36,14 @@ Slice findAllByAlbumCodeAndStatus( JOIN p.album a JOIN PhotoLikes pl ON pl.photo = p WHERE a.code = :albumCode + AND p.isDeleted = FALSE + AND p.status = :status AND pl.user.id = :userId """) Slice findLikedPhotosByAlbumAndUser( @Param("albumCode") String albumCode, @Param("userId") Long userId, + @Param("status") PhotoStatus status, Pageable pageable ); From 750112bd7529da189fd0920742f5315bc6081767 Mon Sep 17 00:00:00 2001 From: zyovn Date: Tue, 18 Nov 2025 00:16:07 +0900 Subject: [PATCH 326/402] =?UTF-8?q?#72=20feat:=20=EB=9D=B1=ED=95=9C=20?= =?UTF-8?q?=EC=82=AC=EC=A7=84=20=EB=AA=A9=EB=A1=9D=20=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?response=EC=97=90=20likeCnt,=20isLiked=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../photo/application/PhotoQueryService.java | 17 +++++++---------- .../photo/dto/response/PhotoLikedResponse.java | 6 ++++++ .../infrastructure/mapper/PhotoMapper.java | 3 +++ 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java b/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java index 93174a2..94e59ef 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java @@ -80,15 +80,11 @@ public PhotoLikedPageResponse getPhotoLiked(User user, String code, int page, in return PhotoMapper.toPhotoLikedPageResponse(photos, List.of()); } - Set downloaded = photoHistoryRepository.findDownloadedPhotoIds(user.getId(), photoIds); + Set liked = findUserLikedPhotoIds(user.getId(), photoIds); + Set downloaded = findUserLikedPhotoIds(user.getId(), photoIds); + Set recent = findUserRecentlyDownloadedPhotoIds(user.getId(), photoIds); - Set recent = photoHistoryRepository.findRecentlyDownloadedPhotoIds( - user.getId(), - photoIds, - LocalDateTime.now().minusHours(1) - ); - - List responses = buildPhotoLikedResponses(photos.getContent(), downloaded, recent); + List responses = buildPhotoLikedResponses(photos.getContent(), liked, downloaded, recent); return PhotoMapper.toPhotoLikedPageResponse(photos, responses); } @@ -173,15 +169,16 @@ private Sort getPhotoSortingOption(AlbumSorting albumSorting) { }; } - private List buildPhotoLikedResponses(List photos, Set downloaded, Set recent) { + private List buildPhotoLikedResponses(List photos, Set liked, Set downloaded, Set recent) { return photos.stream() .map(photo -> { Long id = photo.getId(); String imageUrl = cdnUrlResolver.resolveOriginal(photo.getImageUrl()); String thumbnailUrl = cdnUrlResolver.resolveThumbnail(photo.getThumbnailUrl()); + boolean isLiked = liked.contains(id); boolean isDownloaded = downloaded.contains(id); boolean isRecentlyDownloaded = recent.contains(id); - return PhotoMapper.toPhotoLikedResponse(photo, imageUrl, thumbnailUrl, isDownloaded, isRecentlyDownloaded); + return PhotoMapper.toPhotoLikedResponse(photo, imageUrl, thumbnailUrl, isLiked, isDownloaded, isRecentlyDownloaded); }) .toList(); } diff --git a/src/main/java/com/cheeeese/photo/dto/response/PhotoLikedResponse.java b/src/main/java/com/cheeeese/photo/dto/response/PhotoLikedResponse.java index 245622f..56aa985 100644 --- a/src/main/java/com/cheeeese/photo/dto/response/PhotoLikedResponse.java +++ b/src/main/java/com/cheeeese/photo/dto/response/PhotoLikedResponse.java @@ -26,6 +26,12 @@ public record PhotoLikedResponse( @Schema(description = "사진 썸네일 url", example = "example.jpg") String thumbnailUrl, + @Schema(description = "좋아요 수", example = "1") + int likeCnt, + + @Schema(description = "좋아요 여부", example = "true") + boolean isLiked, + @Schema(description = "다운로드 여부", example = "false") boolean isDownloaded, diff --git a/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java b/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java index 74b52cf..57ae53c 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java @@ -85,6 +85,7 @@ public static PhotoLikedResponse toPhotoLikedResponse( Photo photo, String imageUrl, String thumbnailUrl, + boolean isLiked, boolean isDownloaded, boolean isRecentlyDownloaded ) { @@ -93,6 +94,8 @@ public static PhotoLikedResponse toPhotoLikedResponse( .photoId(photo.getId()) .imageUrl(imageUrl) .thumbnailUrl(thumbnailUrl) + .likeCnt(photo.getLikesCnt()) + .isLiked(isLiked) .isDownloaded(isDownloaded) .isRecentlyDownloaded(isRecentlyDownloaded) .build(); From 970ea4ba21f817d32bafb0e3ab319c94c3caa9de Mon Sep 17 00:00:00 2001 From: zyovn Date: Tue, 18 Nov 2025 00:24:33 +0900 Subject: [PATCH 327/402] =?UTF-8?q?#72=20fix:=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cheeeese/photo/application/PhotoQueryService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java b/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java index 94e59ef..5b34438 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java @@ -81,7 +81,7 @@ public PhotoLikedPageResponse getPhotoLiked(User user, String code, int page, in } Set liked = findUserLikedPhotoIds(user.getId(), photoIds); - Set downloaded = findUserLikedPhotoIds(user.getId(), photoIds); + Set downloaded = findUserDownloadedPhotoIds(user.getId(), photoIds); Set recent = findUserRecentlyDownloadedPhotoIds(user.getId(), photoIds); List responses = buildPhotoLikedResponses(photos.getContent(), liked, downloaded, recent); From 11f4ca646561e4a60bde868bbbabbdfcaae05f36 Mon Sep 17 00:00:00 2001 From: zyovn Date: Tue, 18 Nov 2025 01:46:42 +0900 Subject: [PATCH 328/402] =?UTF-8?q?#74=20fix:=20qa=20=EC=98=A4=EB=A5=98=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/validator/AlbumValidator.java | 3 ++- .../user/domain/type/ProfileImageType.java | 20 +++++++++---------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java index 45a4db4..cbefe73 100644 --- a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java +++ b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java @@ -15,6 +15,7 @@ import org.springframework.stereotype.Component; import java.time.LocalDate; +import java.time.ZoneId; import java.util.List; @Component @@ -37,7 +38,7 @@ public void validateAlbumCreation(AlbumCreationRequest request) { throw new AlbumException(AlbumErrorCode.ALBUM_EVENT_DATE_REQUIRED); } - if (request.eventDate().isAfter(LocalDate.now())) { + if (request.eventDate().isAfter(LocalDate.now(ZoneId.of("Asia/Seoul")))) { throw new AlbumException(AlbumErrorCode.ALBUM_EVENT_DATE_INVALID); } diff --git a/src/main/java/com/cheeeese/user/domain/type/ProfileImageType.java b/src/main/java/com/cheeeese/user/domain/type/ProfileImageType.java index e2a5544..d6d6499 100644 --- a/src/main/java/com/cheeeese/user/domain/type/ProfileImageType.java +++ b/src/main/java/com/cheeeese/user/domain/type/ProfileImageType.java @@ -4,16 +4,16 @@ @Getter public enum ProfileImageType { - P1("profile/signup_profile_1.jpg"), - P2("profile/signup_profile_2.jpg"), - P3("profile/signup_profile_3.jpg"), - P4("profile/signup_profile_4.jpg"), - P5("profile/signup_profile_5.jpg"), - P6("profile/signup_profile_6.jpg"), - P7("profile/signup_profile_7.jpg"), - P8("profile/signup_profile_8.jpg"), - P9("profile/signup_profile_9.jpg"), - P10("profile/signup_profile_10.jpg"); + P1("profile/sign_up_profile_1.jpg"), + P2("profile/sign_up_profile_2.jpg"), + P3("profile/sign_up_profile_3.jpg"), + P4("profile/sign_up_profile_4.jpg"), + P5("profile/sign_up_profile_5.jpg"), + P6("profile/sign_up_profile_6.jpg"), + P7("profile/sign_up_profile_7.jpg"), + P8("profile/sign_up_profile_8.jpg"), + P9("profile/sign_up_profile_9.jpg"), + P10("profile/sign_up_profile_10.jpg"); private final String path; From 3733d95a3f96a67ad93e46b024319b7aaec9b30f Mon Sep 17 00:00:00 2001 From: zyovn Date: Tue, 18 Nov 2025 02:05:19 +0900 Subject: [PATCH 329/402] =?UTF-8?q?#74=20fix:=20=ED=94=BC=EB=93=9C?= =?UTF-8?q?=EB=B0=B1=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cheeeese/album/application/validator/AlbumValidator.java | 5 ++++- .../cheeeese/user/dto/response/UserProfileImageResponse.java | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java index cbefe73..b680bb8 100644 --- a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java +++ b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java @@ -15,13 +15,16 @@ import org.springframework.stereotype.Component; import java.time.LocalDate; +import java.time.LocalDateTime; import java.time.ZoneId; +import java.time.ZoneOffset; import java.util.List; @Component @RequiredArgsConstructor public class AlbumValidator { + private static final ZoneOffset KST_ZONE = ZoneOffset.of("+09:00"); private final AlbumRepository albumRepository; private final UserAlbumRepository userAlbumRepository; @@ -38,7 +41,7 @@ public void validateAlbumCreation(AlbumCreationRequest request) { throw new AlbumException(AlbumErrorCode.ALBUM_EVENT_DATE_REQUIRED); } - if (request.eventDate().isAfter(LocalDate.now(ZoneId.of("Asia/Seoul")))) { + if (request.eventDate().isAfter(LocalDate.now(KST_ZONE))) { throw new AlbumException(AlbumErrorCode.ALBUM_EVENT_DATE_INVALID); } diff --git a/src/main/java/com/cheeeese/user/dto/response/UserProfileImageResponse.java b/src/main/java/com/cheeeese/user/dto/response/UserProfileImageResponse.java index 537f6dc..294df06 100644 --- a/src/main/java/com/cheeeese/user/dto/response/UserProfileImageResponse.java +++ b/src/main/java/com/cheeeese/user/dto/response/UserProfileImageResponse.java @@ -14,11 +14,11 @@ public record UserProfileImageResponse( [ { "imageCode": "P5", - "profileImageUrl": "https://say-cheese-profile.edge.naverncp.com/profile/signup_profile_5.jpg" + "profileImageUrl": "https://say-cheese-profile.edge.naverncp.com/profile/sign_up_profile_5.jpg" }, { "imageCode": "P6", - "profileImageUrl": "https://say-cheese-profile.edge.naverncp.com/profile/signup_profile_6.jpg" + "profileImageUrl": "https://say-cheese-profile.edge.naverncp.com/profile/sign_up_profile_6.jpg" } ] """ From 9724618dfc10775c19d5f36a1444e65b75b349a4 Mon Sep 17 00:00:00 2001 From: zyovn Date: Tue, 18 Nov 2025 02:09:29 +0900 Subject: [PATCH 330/402] =?UTF-8?q?#74=20fix:=20=ED=94=BC=EB=93=9C?= =?UTF-8?q?=EB=B0=B1=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cheeeese/album/application/validator/AlbumValidator.java | 2 -- .../cheeeese/user/dto/response/UserProfileImageResponse.java | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java index b680bb8..5769ba6 100644 --- a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java +++ b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java @@ -15,8 +15,6 @@ import org.springframework.stereotype.Component; import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.ZoneId; import java.time.ZoneOffset; import java.util.List; diff --git a/src/main/java/com/cheeeese/user/dto/response/UserProfileImageResponse.java b/src/main/java/com/cheeeese/user/dto/response/UserProfileImageResponse.java index 294df06..12519de 100644 --- a/src/main/java/com/cheeeese/user/dto/response/UserProfileImageResponse.java +++ b/src/main/java/com/cheeeese/user/dto/response/UserProfileImageResponse.java @@ -36,7 +36,7 @@ public record ProfileImageOpt( @Schema( description = "프로필 이미지의 CDN URL", - example = "https://say-cheese-profile.edge.naverncp.com/profile/signup_profile_5.jpg" + example = "https://say-cheese-profile.edge.naverncp.com/profile/sign_up_profile_5.jpg" ) String profileImageUrl ) {} From b296f031215b830e8cafa2be0d8db6914785b731 Mon Sep 17 00:00:00 2001 From: zyovn Date: Tue, 18 Nov 2025 16:22:43 +0900 Subject: [PATCH 331/402] =?UTF-8?q?#74=20fix:=20=EB=8B=A4=EC=9A=B4?= =?UTF-8?q?=EB=A1=9C=EB=93=9C=20url=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cheeeese/global/util/S3Util.java | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/cheeeese/global/util/S3Util.java b/src/main/java/com/cheeeese/global/util/S3Util.java index e27d31a..6cba0f0 100644 --- a/src/main/java/com/cheeeese/global/util/S3Util.java +++ b/src/main/java/com/cheeeese/global/util/S3Util.java @@ -5,6 +5,8 @@ public class S3Util { + private static final String PREFIX = "say-cheeeese/"; + public static String extractObjectKey(String imageUrl) { if (imageUrl == null) { throw new NullPointerException("image url is null"); @@ -13,14 +15,19 @@ public static String extractObjectKey(String imageUrl) { try { URI uri = new URI(imageUrl); String path = uri.getPath(); + if (path != null && !path.isBlank()) { - return path.startsWith("/") ? path.substring(1) : path; - } - } catch (URISyntaxException e) { + if (path.startsWith("/")) { + path = path.substring(1); + } - } - if (imageUrl.startsWith("album/")) { - return imageUrl; + if (path.startsWith(PREFIX)) { + path = path.substring(PREFIX.length()); + } + + return path; + } + } catch (URISyntaxException ignored) { } return imageUrl; } @@ -40,7 +47,6 @@ public static String extractFileName(String imageUrl) { if (underscoreIdx >= 0 && underscoreIdx < fileName.length() - 1) { fileName = fileName.substring(underscoreIdx + 1); } - return fileName; } } From 9e499557316a4e3bb786273868af0feb88b615e3 Mon Sep 17 00:00:00 2001 From: zyovn Date: Tue, 18 Nov 2025 16:50:20 +0900 Subject: [PATCH 332/402] =?UTF-8?q?#74=20feat:=20=EC=95=A8=EB=B2=94=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=20response=EC=97=90=20maker=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cheeeese/album/application/AlbumService.java | 6 +++++- .../album/dto/response/AlbumInfoResponse.java | 3 +++ .../album/infrastructure/mapper/AlbumMapper.java | 14 ++++++++++++++ .../persistence/UserAlbumRepository.java | 10 ++++++++++ .../photo/infrastructure/mapper/PhotoMapper.java | 13 ------------- 5 files changed, 32 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/cheeeese/album/application/AlbumService.java b/src/main/java/com/cheeeese/album/application/AlbumService.java index 9b40707..0fdc479 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumService.java +++ b/src/main/java/com/cheeeese/album/application/AlbumService.java @@ -204,7 +204,11 @@ public AlbumInfoResponse getAlbumInfo(User user, String code) { albumValidator.validateAlbumParticipant(album, user); - return PhotoMapper.toAlbumInfoResponse(album); + User maker = userAlbumRepository.findMakerByAlbumId(album.getId(), Role.MAKER) + .map(UserAlbum::getUser) + .orElseThrow(() -> new AlbumException(AlbumErrorCode.USER_NOT_MAKER)); + + return AlbumMapper.toAlbumInfoResponse(album, maker); } public List getAlbumBest4Cut(User user, String code) { diff --git a/src/main/java/com/cheeeese/album/dto/response/AlbumInfoResponse.java b/src/main/java/com/cheeeese/album/dto/response/AlbumInfoResponse.java index d7f2498..de7bafa 100644 --- a/src/main/java/com/cheeeese/album/dto/response/AlbumInfoResponse.java +++ b/src/main/java/com/cheeeese/album/dto/response/AlbumInfoResponse.java @@ -12,6 +12,9 @@ public record AlbumInfoResponse( @Schema(description = "생성자 ID", example = "1") Long makerId, + @Schema(description = "생성자 이름", example = "주정빈") + String name, + @Schema(description = "앨범 제목", example = "김수한무거북이") String title, diff --git a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java index 75fe543..e4479f2 100644 --- a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java +++ b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java @@ -153,4 +153,18 @@ public static AlbumBest4CutResponse toBest4CutResponse(Photo photo, String thumb .isLiked(isLiked) .build(); } + + public static AlbumInfoResponse toAlbumInfoResponse(Album album, User user) { + return AlbumInfoResponse.builder() + .title(album.getTitle()) + .makerId(album.getMakerId()) + .name(user.getName()) + .themeEmoji(album.getThemeEmoji()) + .participant(album.getParticipant()) + .currentParticipant(album.getCurrentParticipant()) + .eventDate(album.getEventDate()) + .currentPhotoCnt(album.getCurrentPhotoCount()) + .expiredAt(album.getExpiredAt()) + .build(); + } } \ No newline at end of file diff --git a/src/main/java/com/cheeeese/album/infrastructure/persistence/UserAlbumRepository.java b/src/main/java/com/cheeeese/album/infrastructure/persistence/UserAlbumRepository.java index 3573b59..526591c 100644 --- a/src/main/java/com/cheeeese/album/infrastructure/persistence/UserAlbumRepository.java +++ b/src/main/java/com/cheeeese/album/infrastructure/persistence/UserAlbumRepository.java @@ -73,4 +73,14 @@ Slice findClosedAlbumsByUserId( @Param("status") Album.AlbumStatus status, Pageable pageable ); + + @Query(""" + SELECT ua + FROM UserAlbum ua + JOIN FETCH ua.user + WHERE ua.album.id = :albumId + AND ua.role = :role + """) + Optional findMakerByAlbumId(@Param("albumId") Long albumId, @Param("role") Role role); + } diff --git a/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java b/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java index 57ae53c..01d0017 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java @@ -153,19 +153,6 @@ public static PhotoDetailResponse toPhotoDetailResponse( .build(); } - public static AlbumInfoResponse toAlbumInfoResponse(Album album) { - return AlbumInfoResponse.builder() - .title(album.getTitle()) - .makerId(album.getMakerId()) - .themeEmoji(album.getThemeEmoji()) - .participant(album.getParticipant()) - .currentParticipant(album.getCurrentParticipant()) - .eventDate(album.getEventDate()) - .currentPhotoCnt(album.getCurrentPhotoCount()) - .expiredAt(album.getExpiredAt()) - .build(); - } - public static PhotoLikedUserResponse.PhotoLiker toPhotoLiker(User user, String profileImageUrl, boolean isMe, Role role) { return PhotoLikedUserResponse.PhotoLiker.builder() .name(user.getName()) From 1efa1f1d3e6cdad51b773b7826d235cb3199716d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Wed, 19 Nov 2025 00:18:43 +0900 Subject: [PATCH 333/402] =?UTF-8?q?#66=20fix:=20=EC=95=A8=EB=B2=94?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EC=82=AC=EC=A7=84=20=EA=B0=90=EC=86=8C=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../photo/application/PhotoService.java | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/cheeeese/photo/application/PhotoService.java b/src/main/java/com/cheeeese/photo/application/PhotoService.java index 438769b..ae7e2d7 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoService.java @@ -2,7 +2,6 @@ import com.cheeeese.album.application.validator.AlbumValidator; import com.cheeeese.album.domain.Album; -import com.cheeeese.album.infrastructure.persistence.AlbumRepository; import com.cheeeese.global.util.S3Util; import com.cheeeese.photo.application.validator.PhotoValidator; import com.cheeeese.photo.domain.Photo; @@ -22,7 +21,6 @@ import com.cheeeese.photo.infrastructure.persistence.PhotoHistoryRepository; import com.cheeeese.photo.infrastructure.persistence.PhotoLikesRepository; import com.cheeeese.photo.infrastructure.persistence.PhotoRepository; -import com.cheeeese.user.application.UserService; import com.cheeeese.user.domain.User; import com.cheeeese.user.infrastructure.persistence.UserRepository; import lombok.RequiredArgsConstructor; @@ -41,14 +39,12 @@ @Transactional(readOnly = true) public class PhotoService { - private final UserService userService; private final UserRepository userRepository; private final PhotoRepository photoRepository; private final PhotoLikesRepository photoLikesRepository; private final PhotoHistoryRepository photoHistoryRepository; private final PhotoValidator photoValidator; private final AlbumValidator albumValidator; - private final AlbumRepository albumRepository; private final PresignedUrlService presignedUrlService; private final PhotoQueryService photoQueryService; @@ -243,12 +239,14 @@ private void handleFailedUploads(User user, Long albumId, List failurePhot throw new PhotoException(PhotoErrorCode.PHOTO_STATUS_UPDATE_FAILED); } - if (updatedRows > 0) { - int decremented = albumRepository.decrementPhotoCount(albumId, updatedRows); - if (decremented == 0) { - throw new PhotoException(PhotoErrorCode.PHOTO_COUNT_DECREMENT_FAILED); - } - userService.decrementPhotoCount(user.getId(), updatedRows); - } + // 업로드 로직 재설계 (선제적으로 count를 올려놓지 않음 -> count 감소 로직 제거) + // 혹시 몰라서 나둠 +// if (updatedRows > 0) { +// int decremented = albumRepository.decrementPhotoCount(albumId, updatedRows); +// if (decremented == 0) { +// throw new PhotoException(PhotoErrorCode.PHOTO_COUNT_DECREMENT_FAILED); +// } +// userService.decrementPhotoCount(user.getId(), updatedRows); +// } } } From 606323b74d8664924f505a2298d07140e3c418f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Wed, 19 Nov 2025 00:35:55 +0900 Subject: [PATCH 334/402] =?UTF-8?q?#66=20feat:=20FAILED=20=EB=A0=88?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=A0=95=EB=A6=AC=20=EC=8A=A4=EC=BC=80?= =?UTF-8?q?=EC=A4=84=EB=9F=AC=20=EB=8F=84=EC=9E=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../photo/application/PhotoService.java | 10 ++++++++++ .../dto/request/PhotoCleanupScheduler.java | 18 ++++++++++++++++++ .../persistence/PhotoRepository.java | 14 ++++++++++++++ 3 files changed, 42 insertions(+) create mode 100644 src/main/java/com/cheeeese/photo/dto/request/PhotoCleanupScheduler.java diff --git a/src/main/java/com/cheeeese/photo/application/PhotoService.java b/src/main/java/com/cheeeese/photo/application/PhotoService.java index ae7e2d7..34df78f 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoService.java @@ -147,6 +147,16 @@ public void deletePhotoLikes(User user, Long photoId) { photoQueryService.invalidatePhotoCache(photo.getAlbum().getCode()); } + @Transactional + public void cleanupOldUploadingPhotos() { + LocalDateTime threshold = LocalDateTime.now().minusMinutes(30); + int updatedCount = photoRepository.updateOldUploadingPhotosStatus( + PhotoStatus.FAILED, + PhotoStatus.UPLOADING, + threshold + ); + } + private Album validateAlbumAndPermission(User user, String albumCode) { Album album = albumValidator.validateAlbumCode(albumCode); albumValidator.validateUploadPermission(album, user); diff --git a/src/main/java/com/cheeeese/photo/dto/request/PhotoCleanupScheduler.java b/src/main/java/com/cheeeese/photo/dto/request/PhotoCleanupScheduler.java new file mode 100644 index 0000000..257c2ee --- /dev/null +++ b/src/main/java/com/cheeeese/photo/dto/request/PhotoCleanupScheduler.java @@ -0,0 +1,18 @@ +package com.cheeeese.photo.dto.request; + +import com.cheeeese.photo.application.PhotoService; +import lombok.RequiredArgsConstructor; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class PhotoCleanupScheduler { + + private final PhotoService photoService; + + @Scheduled(fixedDelay = 600000L) + public void runCleanup() { + photoService.cleanupOldUploadingPhotos(); + } +} diff --git a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java index 12b704e..cb88df9 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java @@ -9,6 +9,7 @@ import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; +import java.time.LocalDateTime; import java.util.List; import java.util.Optional; @@ -172,4 +173,17 @@ SELECT COUNT(p) AND p.status IN ('UPLOADING', 'COMPLETED') """) long countActivePhotosByAlbumId(@Param("albumId") Long albumId); + + @Modifying + @Query(""" + UPDATE Photo p + SET p.status = :newStatus + WHERE p.status = :expectedStatus + AND p.createdAt < :threshold + """) + int updateOldUploadingPhotosStatus( + @Param("newStatus") PhotoStatus newStatus, + @Param("expectedStatus") PhotoStatus expectedStatus, + @Param("threshold") LocalDateTime threshold + ); } From 3ccba82264f2fc8eb16566bfe543124e6d72ab24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Wed, 19 Nov 2025 01:23:19 +0900 Subject: [PATCH 335/402] =?UTF-8?q?#66=20move:=20=ED=8C=8C=EC=9D=BC=20?= =?UTF-8?q?=EA=B2=BD=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{dto/request => application}/PhotoCleanupScheduler.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) rename src/main/java/com/cheeeese/photo/{dto/request => application}/PhotoCleanupScheduler.java (81%) diff --git a/src/main/java/com/cheeeese/photo/dto/request/PhotoCleanupScheduler.java b/src/main/java/com/cheeeese/photo/application/PhotoCleanupScheduler.java similarity index 81% rename from src/main/java/com/cheeeese/photo/dto/request/PhotoCleanupScheduler.java rename to src/main/java/com/cheeeese/photo/application/PhotoCleanupScheduler.java index 257c2ee..c76367d 100644 --- a/src/main/java/com/cheeeese/photo/dto/request/PhotoCleanupScheduler.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoCleanupScheduler.java @@ -1,6 +1,5 @@ -package com.cheeeese.photo.dto.request; +package com.cheeeese.photo.application; -import com.cheeeese.photo.application.PhotoService; import lombok.RequiredArgsConstructor; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; From 0b2974d3fe4e6bd53316b508f7f20defa34b0cec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Wed, 19 Nov 2025 01:27:53 +0900 Subject: [PATCH 336/402] =?UTF-8?q?#66=20fix:=20redis=20=EC=A0=80=EC=9E=A5?= =?UTF-8?q?=EC=8B=9C=20KST=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../persistence/AlbumExpirationRedisRepository.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumExpirationRedisRepository.java b/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumExpirationRedisRepository.java index 936afa3..e02b27c 100644 --- a/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumExpirationRedisRepository.java +++ b/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumExpirationRedisRepository.java @@ -16,7 +16,6 @@ public class AlbumExpirationRedisRepository { private static final String EXPIRATION_ZSET_KEY = "expired:album:zset"; - private static final ZoneOffset KST_ZONE = ZoneOffset.of("+09:00"); @Qualifier("cacheRedisTemplate") private final RedisTemplate cacheRedisTemplate; @@ -29,7 +28,7 @@ public class AlbumExpirationRedisRepository { */ public void registerAlbum(Long albumId, LocalDateTime expiredAt) { // LocalDateTime을 Unix Timestamp (ms)로 변환 - long expirationMillis = expiredAt.toInstant(KST_ZONE).toEpochMilli(); + long expirationMillis = expiredAt.toInstant(ZoneOffset.UTC).toEpochMilli(); // ZADD key score member cacheRedisTemplate.opsForZSet().add(EXPIRATION_ZSET_KEY, albumId.toString(), (double) expirationMillis); @@ -41,7 +40,7 @@ public void registerAlbum(Long albumId, LocalDateTime expiredAt) { */ public Set getExpiredAlbumIds() { // 현재 시각의 Unix Timestamp (밀리초) - long currentTimestamp = LocalDateTime.now().toInstant(KST_ZONE).toEpochMilli(); + long currentTimestamp = LocalDateTime.now().toInstant(ZoneOffset.UTC).toEpochMilli(); // ZRANGEBYSCORE key min max: Score가 0부터 현재 시각까지인 모든 Member를 조회 Set members = cacheRedisTemplate.opsForZSet().rangeByScore(EXPIRATION_ZSET_KEY, 0, currentTimestamp); From aca936d8a2be809a68861779810a155470eefb7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Wed, 19 Nov 2025 12:02:06 +0900 Subject: [PATCH 337/402] =?UTF-8?q?#66=20fix:=20=ED=94=BC=EB=93=9C?= =?UTF-8?q?=EB=B0=B1=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cheeeese/album/application/AlbumService.java | 2 +- .../application/validator/AlbumValidator.java | 4 ---- .../persistence/AlbumRepository.java | 6 ++++++ .../cheeeese/photo/application/PhotoService.java | 15 ++++++++++++--- .../persistence/PhotoRepository.java | 4 ++-- 5 files changed, 21 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/cheeeese/album/application/AlbumService.java b/src/main/java/com/cheeeese/album/application/AlbumService.java index 9b40707..48715ca 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumService.java +++ b/src/main/java/com/cheeeese/album/application/AlbumService.java @@ -156,7 +156,7 @@ public AlbumEnterResponse enterAlbum(String code, User currentUser) { public UploadAvailableCountResponse getAvailablePhotoCount(User user, String code) { Album album = albumValidator.validateAlbumCode(code); - albumValidator.validateUploadPermission(album, user); + albumValidator.validateAlbumParticipant(album, user); int availableCount = calculateRemainingUploadSlots(album); diff --git a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java index 45a4db4..7df4233 100644 --- a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java +++ b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java @@ -72,10 +72,6 @@ public void validateAlbumCapacity(Album album) { } } - public void validateUploadPermission(Album album, User user) { // [NEW] - validateAlbumParticipant(album, user); - } - public void validateDownloadPermission(Album album, User user, List photos) { validateAlbumParticipant(album, user); diff --git a/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumRepository.java b/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumRepository.java index 0e45073..dad030e 100644 --- a/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumRepository.java +++ b/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumRepository.java @@ -1,7 +1,9 @@ package com.cheeeese.album.infrastructure.persistence; import com.cheeeese.album.domain.Album; +import jakarta.persistence.LockModeType; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Lock; import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; @@ -43,4 +45,8 @@ long countByUserAndCreatedAtBetween( @Query("UPDATE Album a SET a.status = :status WHERE a.id = :id AND a.status <> :status") void updateStatus(Long id, Album.AlbumStatus status); + @Lock(LockModeType.PESSIMISTIC_WRITE) + @Query("SELECT a FROM Album a WHERE a.id = :id") + Album findByIdForUpdate(@Param("id") Long id); + } diff --git a/src/main/java/com/cheeeese/photo/application/PhotoService.java b/src/main/java/com/cheeeese/photo/application/PhotoService.java index 34df78f..3f7d72d 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoService.java @@ -2,6 +2,7 @@ import com.cheeeese.album.application.validator.AlbumValidator; import com.cheeeese.album.domain.Album; +import com.cheeeese.album.infrastructure.persistence.AlbumRepository; import com.cheeeese.global.util.S3Util; import com.cheeeese.photo.application.validator.PhotoValidator; import com.cheeeese.photo.domain.Photo; @@ -30,6 +31,7 @@ import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; +import java.util.Arrays; import java.util.List; import java.util.Set; import java.util.stream.Collectors; @@ -41,6 +43,7 @@ public class PhotoService { private final UserRepository userRepository; private final PhotoRepository photoRepository; + private final AlbumRepository albumRepository; private final PhotoLikesRepository photoLikesRepository; private final PhotoHistoryRepository photoHistoryRepository; private final PhotoValidator photoValidator; @@ -63,9 +66,15 @@ public List getRecentPhotosForNewEnter(Long albumId) { @Transactional public PhotoPresignedUrlResponse createPresignedUrls(User user, PhotoPresignedUrlRequest request) { - Album album = validateAlbumAndPermission(user, request.albumCode()); + Album album = albumRepository.findByIdForUpdate( + albumValidator.validateAlbumCode(request.albumCode()).getId() + ); + albumValidator.validateAlbumParticipant(album, user); - long currentActiveCount = photoRepository.countActivePhotosByAlbumId(album.getId()); + long currentActiveCount = photoRepository.countActivePhotosByAlbumId( + album.getId(), + Arrays.asList(PhotoStatus.UPLOADING, PhotoStatus.COMPLETED) + ); validateUploadRequest(album, request, currentActiveCount); @@ -159,7 +168,7 @@ public void cleanupOldUploadingPhotos() { private Album validateAlbumAndPermission(User user, String albumCode) { Album album = albumValidator.validateAlbumCode(albumCode); - albumValidator.validateUploadPermission(album, user); + albumValidator.validateAlbumParticipant(album, user); return album; } diff --git a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java index cb88df9..e9a6c61 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java @@ -170,9 +170,9 @@ SELECT COUNT(p) FROM Photo p WHERE p.album.id = :albumId AND p.isDeleted = FALSE - AND p.status IN ('UPLOADING', 'COMPLETED') + AND p.status IN :statuses """) - long countActivePhotosByAlbumId(@Param("albumId") Long albumId); + long countActivePhotosByAlbumId(@Param("albumId") Long albumId, @Param("statuses") List statuses); @Modifying @Query(""" From 2dcf8c2d8322b04a038cb70a0fbcac27e8880453 Mon Sep 17 00:00:00 2001 From: zyovn Date: Wed, 19 Nov 2025 14:25:08 +0900 Subject: [PATCH 338/402] =?UTF-8?q?#71=20feat:=20=EC=95=A8=EB=B2=94=20?= =?UTF-8?q?=EB=82=B4=20=EC=82=AC=EC=A7=84=20=EC=88=98=20=EA=B0=90=EC=86=8C?= =?UTF-8?q?,=20=EC=82=AC=EC=9A=A9=EC=9E=90=20=EC=82=AC=EC=A7=84=20?= =?UTF-8?q?=EC=88=98=EC=99=80=20=EB=9D=B1=20=EC=88=98=20=EA=B0=90=EC=86=8C?= =?UTF-8?q?=20=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../album/infrastructure/persistence/AlbumRepository.java | 4 ++-- .../java/com/cheeeese/photo/application/PhotoService.java | 8 ++++++++ .../infrastructure/persistence/PhotoLikesRepository.java | 2 ++ .../user/infrastructure/persistence/UserRepository.java | 4 ++-- 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumRepository.java b/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumRepository.java index 0e45073..4d33aed 100644 --- a/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumRepository.java +++ b/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumRepository.java @@ -31,11 +31,11 @@ long countByUserAndCreatedAtBetween( @Param("end") LocalDateTime end ); - @Modifying(clearAutomatically = true, flushAutomatically = true) + @Modifying(flushAutomatically = true) @Query("UPDATE Album a SET a.currentPhotoCount = a.currentPhotoCount + :count WHERE a.id = :albumId AND a.currentPhotoCount + :count <= a.maxPhotoCount") int incrementPhotoCount(@Param("albumId") Long albumId, @Param("count") int count); - @Modifying(clearAutomatically = true, flushAutomatically = true) + @Modifying(flushAutomatically = true) @Query("UPDATE Album a SET a.currentPhotoCount = a.currentPhotoCount - :count WHERE a.id = :albumId AND a.currentPhotoCount >= :count") int decrementPhotoCount(@Param("albumId") Long albumId, @Param("count") int count); diff --git a/src/main/java/com/cheeeese/photo/application/PhotoService.java b/src/main/java/com/cheeeese/photo/application/PhotoService.java index 3ecec1c..172fff4 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoService.java @@ -167,6 +167,14 @@ public void deletePhoto(User user, String code, Long photoId) { photoValidator.validateDeletePermission(user, userAlbum, album, photo); + albumRepository.decrementPhotoCount(album.getId(), 1); + + userRepository.decrementPhotoCount(photo.getUser().getId(), 1); + + userRepository.decrementLikeCnt(photo.getUser().getId()); + + photoLikesRepository.deleteAllByPhotoId(photo.getId()); + photo.softDelete(); photoQueryService.invalidatePhotoCache(album.getCode()); diff --git a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoLikesRepository.java b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoLikesRepository.java index 0c7ee47..c8fc233 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoLikesRepository.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoLikesRepository.java @@ -36,4 +36,6 @@ SELECT COUNT(DISTINCT pl.user.id) WHERE pl.photo.id = :photoId """) List findLikersByPhotoId(@Param("photoId") Long photoId); + + void deleteAllByPhotoId(Long photoId); } diff --git a/src/main/java/com/cheeeese/user/infrastructure/persistence/UserRepository.java b/src/main/java/com/cheeeese/user/infrastructure/persistence/UserRepository.java index e013037..b363826 100644 --- a/src/main/java/com/cheeeese/user/infrastructure/persistence/UserRepository.java +++ b/src/main/java/com/cheeeese/user/infrastructure/persistence/UserRepository.java @@ -11,11 +11,11 @@ public interface UserRepository extends JpaRepository { Optional findByProviderId(String providerId); - @Modifying(clearAutomatically = true, flushAutomatically = true) + @Modifying(flushAutomatically = true) @Query("UPDATE User u SET u.photoCnt = u.photoCnt + :count WHERE u.id = :userId") int incrementPhotoCount(@Param("userId") Long userId, @Param("count") int count); - @Modifying(clearAutomatically = true, flushAutomatically = true) + @Modifying(flushAutomatically = true) @Query("UPDATE User u SET u.photoCnt = u.photoCnt - :count WHERE u.id = :userId AND u.photoCnt >= :count") int decrementPhotoCount(@Param("userId") Long userId, @Param("count") int count); From 591e2034c95810da8cedff1e1bcfbc42c3fab52e Mon Sep 17 00:00:00 2001 From: zyovn Date: Wed, 19 Nov 2025 14:55:43 +0900 Subject: [PATCH 339/402] =?UTF-8?q?#71=20docs:=20swagger=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/PhotoCommandController.java | 4 ++- .../swagger/PhotoCommandSwagger.java | 34 +++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/cheeeese/photo/presentation/swagger/PhotoCommandSwagger.java diff --git a/src/main/java/com/cheeeese/photo/presentation/PhotoCommandController.java b/src/main/java/com/cheeeese/photo/presentation/PhotoCommandController.java index 9a4d8ed..320576a 100644 --- a/src/main/java/com/cheeeese/photo/presentation/PhotoCommandController.java +++ b/src/main/java/com/cheeeese/photo/presentation/PhotoCommandController.java @@ -3,6 +3,7 @@ import com.cheeeese.global.common.CommonResponse; import com.cheeeese.global.util.CurrentUser; import com.cheeeese.photo.application.PhotoService; +import com.cheeeese.photo.presentation.swagger.PhotoCommandSwagger; import com.cheeeese.user.domain.User; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.DeleteMapping; @@ -15,10 +16,11 @@ @RestController @RequiredArgsConstructor @RequestMapping("/v1/album/{code}/photo") -public class PhotoCommandController { +public class PhotoCommandController implements PhotoCommandSwagger { private final PhotoService photoService; + @Override @DeleteMapping("/{photoId}") public CommonResponse deletePhoto( @CurrentUser User user, diff --git a/src/main/java/com/cheeeese/photo/presentation/swagger/PhotoCommandSwagger.java b/src/main/java/com/cheeeese/photo/presentation/swagger/PhotoCommandSwagger.java new file mode 100644 index 0000000..8105098 --- /dev/null +++ b/src/main/java/com/cheeeese/photo/presentation/swagger/PhotoCommandSwagger.java @@ -0,0 +1,34 @@ +package com.cheeeese.photo.presentation.swagger; + +import com.cheeeese.global.common.CommonResponse; +import com.cheeeese.global.util.CurrentUser; +import com.cheeeese.user.domain.User; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.web.bind.annotation.PathVariable; + +@Tag(name = "[사진 - 관리]", description = "사진 관리 (삭제 등)에 대한 API") +public interface PhotoCommandSwagger { + @Operation( + summary = "사진 삭제 API", + description = """ + ### PathVariable + --- + `code`: 앨범 코드 (String) + `photoId`: 사진 ID (Long) + """ + ) + @ApiResponses(value = { + @ApiResponse( + responseCode = "200", + description = "사진 삭제가 성공적으로 실행되었습니다." + ) + }) + CommonResponse deletePhoto( + @CurrentUser User user, + @PathVariable String code, + @PathVariable Long photoId + ); +} From e98ae19e3bd58ba3cffe79ead47b4918562445d5 Mon Sep 17 00:00:00 2001 From: zyovn Date: Wed, 19 Nov 2025 17:03:51 +0900 Subject: [PATCH 340/402] =?UTF-8?q?#71=20fix:=20=EC=82=AC=EC=A7=84=20?= =?UTF-8?q?=EC=A2=8B=EC=95=84=EC=9A=94=20=EC=88=98=EC=97=90=20=EB=94=B0?= =?UTF-8?q?=EB=9D=BC=20=EC=82=AC=EC=9A=A9=EC=9E=90=20=EB=9D=B1=20=EC=88=98?= =?UTF-8?q?=20=EA=B0=90=EC=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cheeeese/photo/application/PhotoService.java | 4 +++- .../user/infrastructure/persistence/UserRepository.java | 9 +++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/cheeeese/photo/application/PhotoService.java b/src/main/java/com/cheeeese/photo/application/PhotoService.java index 172fff4..9e8b55d 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoService.java @@ -171,7 +171,9 @@ public void deletePhoto(User user, String code, Long photoId) { userRepository.decrementPhotoCount(photo.getUser().getId(), 1); - userRepository.decrementLikeCnt(photo.getUser().getId()); + if (photo.getLikesCnt() > 0) { + userRepository.decrementLikeCntBy(photo.getUser().getId(), photo.getLikesCnt()); + } photoLikesRepository.deleteAllByPhotoId(photo.getId()); diff --git a/src/main/java/com/cheeeese/user/infrastructure/persistence/UserRepository.java b/src/main/java/com/cheeeese/user/infrastructure/persistence/UserRepository.java index b363826..f8a29e3 100644 --- a/src/main/java/com/cheeeese/user/infrastructure/persistence/UserRepository.java +++ b/src/main/java/com/cheeeese/user/infrastructure/persistence/UserRepository.java @@ -43,4 +43,13 @@ public interface UserRepository extends JpaRepository { AND u.likesCnt > 0 """) void decrementLikeCnt(@Param("userId") Long userId); + + @Modifying + @Query(""" + UPDATE User u + SET u.likesCnt = u.likesCnt - :count + WHERE u.id = :userId + AND u.likesCnt >= :count + """) + void decrementLikeCntBy(@Param("userId") Long userId, @Param("count") int count); } From 1ca9c0e8b603dcb36cdd7afbb2bd3e402f73c11b Mon Sep 17 00:00:00 2001 From: zyovn Date: Wed, 19 Nov 2025 17:07:32 +0900 Subject: [PATCH 341/402] =?UTF-8?q?#71=20chore:=20=EC=82=AC=EC=A7=84=20?= =?UTF-8?q?=EC=A2=8B=EC=95=84=EC=9A=94,=20=EC=82=AD=EC=A0=9C=20=EC=84=A4?= =?UTF-8?q?=EB=AA=85=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cheeeese/photo/presentation/swagger/PhotoSwagger.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/cheeeese/photo/presentation/swagger/PhotoSwagger.java b/src/main/java/com/cheeeese/photo/presentation/swagger/PhotoSwagger.java index a169669..4eba24c 100644 --- a/src/main/java/com/cheeeese/photo/presentation/swagger/PhotoSwagger.java +++ b/src/main/java/com/cheeeese/photo/presentation/swagger/PhotoSwagger.java @@ -176,7 +176,7 @@ CommonResponse getDownloadPresignedUrls( ); @Operation( - summary = "사진 좋아요 생성 API", + summary = "사진 좋아요 생성 API - 추후 수정 필요 (Command로 이동 예정)", description = """ ### PathVariable --- @@ -195,7 +195,7 @@ CommonResponse createPhotoLikes( ); @Operation( - summary = "사진 좋아요 삭제 API", + summary = "사진 좋아요 삭제 API - 추후 수정 필요 (Command로 이동 예정)", description = """ ### PathVariable --- From f6a770d985c94150e5cb0588f472adb0943feffc Mon Sep 17 00:00:00 2001 From: zyovn Date: Wed, 19 Nov 2025 17:29:28 +0900 Subject: [PATCH 342/402] =?UTF-8?q?#71=20fix:=20=ED=94=BC=EB=93=9C?= =?UTF-8?q?=EB=B0=B1=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cheeeese/photo/application/PhotoService.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/cheeeese/photo/application/PhotoService.java b/src/main/java/com/cheeeese/photo/application/PhotoService.java index 9e8b55d..5f6c9aa 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoService.java @@ -169,11 +169,9 @@ public void deletePhoto(User user, String code, Long photoId) { albumRepository.decrementPhotoCount(album.getId(), 1); - userRepository.decrementPhotoCount(photo.getUser().getId(), 1); + userService.decrementPhotoCount(user.getId(), 1); - if (photo.getLikesCnt() > 0) { - userRepository.decrementLikeCntBy(photo.getUser().getId(), photo.getLikesCnt()); - } + userRepository.decrementLikeCntBy(photo.getUser().getId(), photo.getLikesCnt()); photoLikesRepository.deleteAllByPhotoId(photo.getId()); From 82e325c580367ec818ed2cc2869d6a67e4705b50 Mon Sep 17 00:00:00 2001 From: zyovn Date: Wed, 19 Nov 2025 17:33:07 +0900 Subject: [PATCH 343/402] =?UTF-8?q?#71=20fix:=20=ED=94=BC=EB=93=9C?= =?UTF-8?q?=EB=B0=B1=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/cheeeese/photo/application/PhotoService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/cheeeese/photo/application/PhotoService.java b/src/main/java/com/cheeeese/photo/application/PhotoService.java index 5f6c9aa..f91a137 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoService.java @@ -169,7 +169,7 @@ public void deletePhoto(User user, String code, Long photoId) { albumRepository.decrementPhotoCount(album.getId(), 1); - userService.decrementPhotoCount(user.getId(), 1); + userService.decrementPhotoCount(photo.getUser().getId(), 1); userRepository.decrementLikeCntBy(photo.getUser().getId(), photo.getLikesCnt()); From 8c3bb073af95155eb9c6e4090b580aef7c291d31 Mon Sep 17 00:00:00 2001 From: zyovn Date: Wed, 19 Nov 2025 17:42:21 +0900 Subject: [PATCH 344/402] =?UTF-8?q?#71=20fix:=20=ED=94=BC=EB=93=9C?= =?UTF-8?q?=EB=B0=B1=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cheeeese/photo/application/PhotoService.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/cheeeese/photo/application/PhotoService.java b/src/main/java/com/cheeeese/photo/application/PhotoService.java index f91a137..96e4bee 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoService.java @@ -167,7 +167,10 @@ public void deletePhoto(User user, String code, Long photoId) { photoValidator.validateDeletePermission(user, userAlbum, album, photo); - albumRepository.decrementPhotoCount(album.getId(), 1); + int updatedRows = albumRepository.decrementPhotoCount(album.getId(), 1); + if (updatedRows == 0) { + throw new PhotoException(PhotoErrorCode.PHOTO_COUNT_DECREMENT_FAILED); + } userService.decrementPhotoCount(photo.getUser().getId(), 1); From 3fa85913444320dc217eabbf44c51332377bbf00 Mon Sep 17 00:00:00 2001 From: zyovn Date: Thu, 20 Nov 2025 01:08:15 +0900 Subject: [PATCH 345/402] =?UTF-8?q?#71=20fix:=20getAlbumParticipant=20albu?= =?UTF-8?q?mReader=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/support/AlbumReader.java | 22 +++++++++++++++++++ .../application/validator/AlbumValidator.java | 13 +---------- .../photo/application/PhotoService.java | 6 ++++- 3 files changed, 28 insertions(+), 13 deletions(-) create mode 100644 src/main/java/com/cheeeese/album/application/support/AlbumReader.java diff --git a/src/main/java/com/cheeeese/album/application/support/AlbumReader.java b/src/main/java/com/cheeeese/album/application/support/AlbumReader.java new file mode 100644 index 0000000..d3093c0 --- /dev/null +++ b/src/main/java/com/cheeeese/album/application/support/AlbumReader.java @@ -0,0 +1,22 @@ +package com.cheeeese.album.application.support; + +import com.cheeeese.album.domain.Album; +import com.cheeeese.album.domain.UserAlbum; +import com.cheeeese.album.exception.AlbumException; +import com.cheeeese.album.exception.code.AlbumErrorCode; +import com.cheeeese.album.infrastructure.persistence.UserAlbumRepository; +import com.cheeeese.user.domain.User; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class AlbumReader { + + private final UserAlbumRepository userAlbumRepository; + + public UserAlbum getAlbumParticipant(Album album, User user) { + return userAlbumRepository.findByUserIdAndAlbumId(user.getId(), album.getId()) + .orElseThrow(() -> new AlbumException(AlbumErrorCode.USER_NOT_PARTICIPANT)); + } +} diff --git a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java index 989e66f..fb948d1 100644 --- a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java +++ b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java @@ -1,7 +1,6 @@ package com.cheeeese.album.application.validator; import com.cheeeese.album.domain.Album; -import com.cheeeese.album.domain.UserAlbum; import com.cheeeese.album.domain.type.Role; import com.cheeeese.album.dto.request.AlbumCreationRequest; import com.cheeeese.album.exception.AlbumException; @@ -90,22 +89,12 @@ public void validateDownloadPermission(Album album, User user, List photo } public void validateAlbumParticipant(Album album, User user) { - validateAlbumExpiration(album); - - validateUserBlacklisted(album, user); + validateAlbumEntry(album, user); userAlbumRepository.findByUserIdAndAlbumId(user.getId(), album.getId()) .orElseThrow(() -> new AlbumException(AlbumErrorCode.USER_NOT_PARTICIPANT)); } - public UserAlbum getAlbumParticipant(Album album, User user) { - validateAlbumExpiration(album); - validateUserBlacklisted(album, user); - - return userAlbumRepository.findByUserIdAndAlbumId(user.getId(), album.getId()) - .orElseThrow(() -> new AlbumException(AlbumErrorCode.USER_NOT_PARTICIPANT)); - } - private void validateAlbumExpiration(Album album) { if (album.isExpired()) { throw new AlbumException(AlbumErrorCode.ALBUM_EXPIRED); diff --git a/src/main/java/com/cheeeese/photo/application/PhotoService.java b/src/main/java/com/cheeeese/photo/application/PhotoService.java index 96e4bee..c65c78b 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoService.java @@ -1,5 +1,6 @@ package com.cheeeese.photo.application; +import com.cheeeese.album.application.support.AlbumReader; import com.cheeeese.album.application.validator.AlbumValidator; import com.cheeeese.album.domain.Album; import com.cheeeese.album.domain.UserAlbum; @@ -52,6 +53,7 @@ public class PhotoService { private final PhotoValidator photoValidator; private final AlbumValidator albumValidator; private final AlbumRepository albumRepository; + private final AlbumReader albumReader; private final PresignedUrlService presignedUrlService; private final PhotoQueryService photoQueryService; @@ -161,7 +163,9 @@ public void deletePhotoLikes(User user, Long photoId) { @Transactional public void deletePhoto(User user, String code, Long photoId) { Album album = albumValidator.validateAlbumCode(code); - UserAlbum userAlbum = albumValidator.getAlbumParticipant(album, user); + albumValidator.validateAlbumEntry(album, user); + + UserAlbum userAlbum = albumReader.getAlbumParticipant(album, user); Photo photo = photoReader.getPhotoInAlbum(photoId, code); From 2c74530294116af4b7973bc5a7134f497dd2d5e1 Mon Sep 17 00:00:00 2001 From: zyovn Date: Thu, 20 Nov 2025 02:02:49 +0900 Subject: [PATCH 346/402] =?UTF-8?q?#80=20feat:=20=EC=82=AC=EC=A7=84=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=20=EC=A1=B0=ED=9A=8C=20response=20=EC=97=85?= =?UTF-8?q?=EB=A1=9C=EB=8D=94=20=ED=94=84=EB=A1=9C=ED=95=84=20=EC=9D=B4?= =?UTF-8?q?=EB=AF=B8=EC=A7=80=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cheeeese/photo/application/PhotoQueryService.java | 4 +++- .../com/cheeeese/photo/dto/response/PhotoDetailResponse.java | 4 ++++ .../com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java | 2 ++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java b/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java index d551640..e32b1b5 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java @@ -1,6 +1,7 @@ package com.cheeeese.photo.application; import com.cheeeese.album.domain.type.AlbumSorting; +import com.cheeeese.global.util.ProfileImageUtil; import com.cheeeese.global.util.RedisCacheUtil; import com.cheeeese.global.util.resolver.CdnUrlResolver; import com.cheeeese.photo.application.support.PhotoReader; @@ -94,6 +95,7 @@ public PhotoLikedPageResponse getPhotoLiked(User user, String code, int page, in public PhotoDetailResponse getPhotoDetail(User user, String code, Long photoId) { Photo photo = photoReader.getPhotoInAlbum(photoId, code); + String profileImage = ProfileImageUtil.resolveProfileImage(user, cdnUrlResolver); String resolveOriginalUrl = cdnUrlResolver.resolveOriginal(photo.getImageUrl()); String resolveThumbnailUrl = cdnUrlResolver.resolveThumbnail(photo.getThumbnailUrl()); @@ -103,7 +105,7 @@ public PhotoDetailResponse getPhotoDetail(User user, String code, Long photoId) user.getId(), photo.getId(), LocalDateTime.now().minusHours(1) ); - return PhotoMapper.toPhotoDetailResponse(photo, resolveOriginalUrl, resolveThumbnailUrl, isLiked, isDownloaded, isRecentlyDownloaded); + return PhotoMapper.toPhotoDetailResponse(photo, profileImage, resolveOriginalUrl, resolveThumbnailUrl, isLiked, isDownloaded, isRecentlyDownloaded); } private PhotoPageResponse getPhotoPageFromDB(String code, int page, int size, AlbumSorting albumSorting) { diff --git a/src/main/java/com/cheeeese/photo/dto/response/PhotoDetailResponse.java b/src/main/java/com/cheeeese/photo/dto/response/PhotoDetailResponse.java index 8234b04..92ef228 100644 --- a/src/main/java/com/cheeeese/photo/dto/response/PhotoDetailResponse.java +++ b/src/main/java/com/cheeeese/photo/dto/response/PhotoDetailResponse.java @@ -10,6 +10,7 @@ description = "사진 상세 조회 API", requiredProperties = { "name", + "profileImage", "photoId", "imageUrl", "thumbnailUrl", @@ -23,6 +24,9 @@ public record PhotoDetailResponse( @Schema(description = "업로더 이름", example = "주정빈") String name, + @Schema(description = "업로더 프로필 이미지", example = "https://say-cheese...") + String profileImage, + @Schema(description = "사진 ID", example = "1") Long photoId, diff --git a/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java b/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java index 01d0017..a74384c 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java @@ -133,6 +133,7 @@ public static PhotoPageResponse toRebuildPhotoPageResponse(PhotoPageResponse res public static PhotoDetailResponse toPhotoDetailResponse( Photo photo, + String profileImage, String imageUrl, String thumbnailUrl, boolean isLiked, @@ -142,6 +143,7 @@ public static PhotoDetailResponse toPhotoDetailResponse( return PhotoDetailResponse.builder() .name(photo.getUser().getName()) .photoId(photo.getId()) + .profileImage(profileImage) .imageUrl(imageUrl) .thumbnailUrl(thumbnailUrl) .likesCnt(photo.getLikesCnt()) From 3faa475dca166e2db4e9304f8e844ceaeaa4ea5e Mon Sep 17 00:00:00 2001 From: zyovn Date: Thu, 20 Nov 2025 02:05:50 +0900 Subject: [PATCH 347/402] =?UTF-8?q?#80=20fix:=20=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EC=9D=B8=ED=95=9C=20=EC=82=AC=EC=9A=A9=EC=9E=90=EA=B0=80=20?= =?UTF-8?q?=EC=95=84=EB=8B=8C=20=EC=97=85=EB=A1=9C=EB=8D=94=20=ED=94=84?= =?UTF-8?q?=EB=A1=9C=ED=95=84=20=EC=9D=B4=EB=AF=B8=EC=A7=80=EB=A1=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cheeeese/photo/application/PhotoQueryService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java b/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java index e32b1b5..2027d87 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java @@ -95,7 +95,7 @@ public PhotoLikedPageResponse getPhotoLiked(User user, String code, int page, in public PhotoDetailResponse getPhotoDetail(User user, String code, Long photoId) { Photo photo = photoReader.getPhotoInAlbum(photoId, code); - String profileImage = ProfileImageUtil.resolveProfileImage(user, cdnUrlResolver); + String profileImage = ProfileImageUtil.resolveProfileImage(photo.getUser(), cdnUrlResolver); String resolveOriginalUrl = cdnUrlResolver.resolveOriginal(photo.getImageUrl()); String resolveThumbnailUrl = cdnUrlResolver.resolveThumbnail(photo.getThumbnailUrl()); From fc5a23d93c727b127abff9e9205c9d239b690faa Mon Sep 17 00:00:00 2001 From: zyovn Date: Thu, 20 Nov 2025 02:31:44 +0900 Subject: [PATCH 348/402] =?UTF-8?q?#80=20fix:=20=EC=95=A8=EB=B2=94=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=20=EC=A1=B0=ED=9A=8C=20API=20=EA=B2=80?= =?UTF-8?q?=EC=A6=9D=20=EC=A0=9C=EA=B1=B0=20=EB=B0=8F=20=EB=B9=84=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=EC=9D=B8=20=EC=83=81=ED=83=9C=EC=97=90=EB=8F=84=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20=EA=B0=80=EB=8A=A5=ED=95=98=EA=B2=8C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cheeeese/album/application/AlbumService.java | 4 +--- .../cheeeese/album/presentation/AlbumController.java | 10 ++-------- .../album/presentation/swagger/AlbumSwagger.java | 1 - .../com/cheeeese/global/config/SecurityConfig.java | 3 ++- 4 files changed, 5 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/cheeeese/album/application/AlbumService.java b/src/main/java/com/cheeeese/album/application/AlbumService.java index b689546..1841781 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumService.java +++ b/src/main/java/com/cheeeese/album/application/AlbumService.java @@ -199,11 +199,9 @@ public AlbumParticipantResponse getAlbumParticipantList(Authentication authentic ); } - public AlbumInfoResponse getAlbumInfo(User user, String code) { + public AlbumInfoResponse getAlbumInfo(String code) { Album album = albumValidator.validateAlbumCode(code); - albumValidator.validateAlbumParticipant(album, user); - User maker = userAlbumRepository.findMakerByAlbumId(album.getId(), Role.MAKER) .map(UserAlbum::getUser) .orElseThrow(() -> new AlbumException(AlbumErrorCode.USER_NOT_MAKER)); diff --git a/src/main/java/com/cheeeese/album/presentation/AlbumController.java b/src/main/java/com/cheeeese/album/presentation/AlbumController.java index 7e58662..88249ed 100644 --- a/src/main/java/com/cheeeese/album/presentation/AlbumController.java +++ b/src/main/java/com/cheeeese/album/presentation/AlbumController.java @@ -75,14 +75,8 @@ public CommonResponse getAlbumParticipants( @Override @GetMapping("/{code}/info") - public CommonResponse getAlbumInfo( - @CurrentUser User user, - @PathVariable String code - ) { - return CommonResponse.success( - ALBUM_INFO_GET_SUCCESS, - albumService.getAlbumInfo(user, code) - ); + public CommonResponse getAlbumInfo(@PathVariable String code) { + return CommonResponse.success(ALBUM_INFO_GET_SUCCESS, albumService.getAlbumInfo(code)); } @Override diff --git a/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java b/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java index 246ef20..0964a49 100644 --- a/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java +++ b/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java @@ -273,7 +273,6 @@ CommonResponse getAlbumParticipants( ) }) CommonResponse getAlbumInfo( - @CurrentUser User user, @PathVariable String code ); diff --git a/src/main/java/com/cheeeese/global/config/SecurityConfig.java b/src/main/java/com/cheeeese/global/config/SecurityConfig.java index 256e85c..3617816 100644 --- a/src/main/java/com/cheeeese/global/config/SecurityConfig.java +++ b/src/main/java/com/cheeeese/global/config/SecurityConfig.java @@ -40,7 +40,8 @@ public class SecurityConfig { "/v1/cheese4cut/*/preview", "/v1/album/*/participants", "/internal/thumbnail/complete", - "/v1/user/profile-images" + "/v1/user/profile-images", + "/v1/album/*/info" }; @Bean From 163b92e3aa8da8428c55a9888df127bad09ec960 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Fri, 21 Nov 2025 01:29:45 +0900 Subject: [PATCH 349/402] =?UTF-8?q?#82=20fix:=20swagger=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cheeeese/photo/presentation/swagger/PhotoSwagger.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/cheeeese/photo/presentation/swagger/PhotoSwagger.java b/src/main/java/com/cheeeese/photo/presentation/swagger/PhotoSwagger.java index 4eba24c..09498a2 100644 --- a/src/main/java/com/cheeeese/photo/presentation/swagger/PhotoSwagger.java +++ b/src/main/java/com/cheeeese/photo/presentation/swagger/PhotoSwagger.java @@ -26,7 +26,7 @@ public interface PhotoSwagger { ### RequestBody --- `albumCode`: 사진을 업로드할 앨범의 코드 \n - `fileInfos`: 업로드할 파일 정보 목록 (파일명, 크기, Content-Type) \n + `fileInfos`: 업로드할 파일 정보 목록 (파일명, captureTime, 크기, Content-Type) \n ### 로직 상세 --- From add7a79a53bc6b9db85f0ddfaa9c758df7ce6575 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Fri, 21 Nov 2025 01:30:10 +0900 Subject: [PATCH 350/402] =?UTF-8?q?#82=20feat:=20captureTime=20=ED=95=84?= =?UTF-8?q?=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cheeeese/photo/application/PhotoService.java | 2 +- .../cheeeese/photo/dto/request/PhotoPresignedUrlRequest.java | 5 +++++ .../cheeeese/photo/infrastructure/mapper/PhotoMapper.java | 4 ++-- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/cheeeese/photo/application/PhotoService.java b/src/main/java/com/cheeeese/photo/application/PhotoService.java index 0bb9b05..c6238ee 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoService.java @@ -236,7 +236,7 @@ private PhotoPresignedUrlResponse.PresignedUrlInfo createPresignedUrlForFile( Album album, PhotoPresignedUrlRequest.FileInfo file ) { - Photo photo = PhotoMapper.toEntity(user, album); + Photo photo = PhotoMapper.toEntity(user, album, file.captureTime()); photoRepository.save(photo); String safeFileName = sanitizeFileName(file.fileName()); diff --git a/src/main/java/com/cheeeese/photo/dto/request/PhotoPresignedUrlRequest.java b/src/main/java/com/cheeeese/photo/dto/request/PhotoPresignedUrlRequest.java index bbe6609..9ed9230 100644 --- a/src/main/java/com/cheeeese/photo/dto/request/PhotoPresignedUrlRequest.java +++ b/src/main/java/com/cheeeese/photo/dto/request/PhotoPresignedUrlRequest.java @@ -5,6 +5,7 @@ import jakarta.validation.constraints.NotNull; import lombok.Builder; +import java.time.LocalDateTime; import java.util.List; @Builder @@ -25,6 +26,10 @@ public record FileInfo( @Schema(description = "원본 파일명", example = "my_holiday_pic.jpg") String fileName, + @NotBlank + @Schema(description = "촬영 시간 (없을 경우 현재 시간)", example = "2025-02-01T14:30:00") + LocalDateTime captureTime, + @Schema(description = "파일 크기 (Byte)", example = "3000000") long fileSize, diff --git a/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java b/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java index a74384c..6396730 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java @@ -14,13 +14,13 @@ public class PhotoMapper { - public static Photo toEntity(User user, Album album) { + public static Photo toEntity(User user, Album album, LocalDateTime captureTime) { return Photo.builder() .user(user) .album(album) .imageUrl(null) // presigned URL 생성 후 updateImageUrl()로 세팅됨 .thumbnailUrl(null) - .captureTime(LocalDateTime.now()) + .captureTime(captureTime != null ? captureTime : LocalDateTime.now()) .status(PhotoStatus.UPLOADING) .build(); } From 1ff0a2aa977857c3f4f78f9a4da10518ad034144 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Fri, 21 Nov 2025 01:30:23 +0900 Subject: [PATCH 351/402] =?UTF-8?q?#82=20feat:=20captureTime=20=EA=B2=80?= =?UTF-8?q?=EC=A6=9D=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cheeeese/photo/application/validator/PhotoValidator.java | 4 ++++ .../com/cheeeese/photo/exception/code/PhotoErrorCode.java | 1 + 2 files changed, 5 insertions(+) diff --git a/src/main/java/com/cheeeese/photo/application/validator/PhotoValidator.java b/src/main/java/com/cheeeese/photo/application/validator/PhotoValidator.java index f8d1297..d35c104 100644 --- a/src/main/java/com/cheeeese/photo/application/validator/PhotoValidator.java +++ b/src/main/java/com/cheeeese/photo/application/validator/PhotoValidator.java @@ -41,6 +41,10 @@ public void validateFileInfos(List fileInfos) throw new PhotoException(PhotoErrorCode.PHOTO_FILE_NAME_REQUIRED); } + if (file.captureTime() == null) { + throw new PhotoException(PhotoErrorCode.PHOTO_CAPTURE_TIME_REQUIRED); + } + if (file.fileSize() > MAX_FILE_SIZE) { throw new PhotoException(PhotoErrorCode.PHOTO_FILE_SIZE_EXCEEDED); } diff --git a/src/main/java/com/cheeeese/photo/exception/code/PhotoErrorCode.java b/src/main/java/com/cheeeese/photo/exception/code/PhotoErrorCode.java index d57b137..51df56a 100644 --- a/src/main/java/com/cheeeese/photo/exception/code/PhotoErrorCode.java +++ b/src/main/java/com/cheeeese/photo/exception/code/PhotoErrorCode.java @@ -28,6 +28,7 @@ public enum PhotoErrorCode implements BaseCode { // 사진 도메인 관련 오류 PHOTO_NOT_FOUND(HttpStatus.NOT_FOUND, "해당 사진을 찾을 수 없습니다."), + PHOTO_CAPTURE_TIME_REQUIRED(HttpStatus.BAD_REQUEST, "촬영 시간이 누락되었습니다."), PHOTO_LIKES_NOT_FOUND(HttpStatus.NOT_FOUND, "사진에 대한 좋아요 내역이 존재하지 않습니다."), PHOTO_NOT_FOUND_IN_ALBUM(HttpStatus.NOT_FOUND, "해당 사진은 이 앨범에 포함되어 있지 않습니다."), PHOTO_ALREADY_DELETED(HttpStatus.CONFLICT, "이미 삭제된 사진입니다."), From b0b50db8f407ab7c695c4395a07c50934240e50f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Fri, 21 Nov 2025 01:34:57 +0900 Subject: [PATCH 352/402] =?UTF-8?q?#82=20fix:=20=ED=94=BC=EB=93=9C?= =?UTF-8?q?=EB=B0=B1=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cheeeese/photo/dto/request/PhotoPresignedUrlRequest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/cheeeese/photo/dto/request/PhotoPresignedUrlRequest.java b/src/main/java/com/cheeeese/photo/dto/request/PhotoPresignedUrlRequest.java index 9ed9230..6d0d67b 100644 --- a/src/main/java/com/cheeeese/photo/dto/request/PhotoPresignedUrlRequest.java +++ b/src/main/java/com/cheeeese/photo/dto/request/PhotoPresignedUrlRequest.java @@ -26,7 +26,7 @@ public record FileInfo( @Schema(description = "원본 파일명", example = "my_holiday_pic.jpg") String fileName, - @NotBlank + @NotNull @Schema(description = "촬영 시간 (없을 경우 현재 시간)", example = "2025-02-01T14:30:00") LocalDateTime captureTime, From e307161d0ea2834fb38026d0cd6cf27b86401666 Mon Sep 17 00:00:00 2001 From: zyovn Date: Fri, 21 Nov 2025 02:09:58 +0900 Subject: [PATCH 353/402] =?UTF-8?q?#84=20fix:=20=EC=97=85=EB=A1=9C?= =?UTF-8?q?=EB=93=9C=20=EA=B0=80=EB=8A=A5=20=EC=82=AC=EC=A7=84=20=EC=88=98?= =?UTF-8?q?=20=EC=95=A8=EB=B2=94=20=EC=B0=B8=EC=97=AC=EC=9E=90,=20?= =?UTF-8?q?=EB=A1=9C=EA=B7=B8=EC=9D=B8=20=EC=82=AC=EC=9A=A9=EC=9E=90=20?= =?UTF-8?q?=EC=95=84=EB=8B=88=EC=96=B4=EB=8F=84=20=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?=EA=B0=80=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cheeeese/album/application/AlbumService.java | 3 +-- .../album/presentation/AlbumController.java | 10 ++-------- .../album/presentation/swagger/AlbumSwagger.java | 15 --------------- .../cheeeese/global/config/SecurityConfig.java | 3 ++- 4 files changed, 5 insertions(+), 26 deletions(-) diff --git a/src/main/java/com/cheeeese/album/application/AlbumService.java b/src/main/java/com/cheeeese/album/application/AlbumService.java index 1841781..88dbb1c 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumService.java +++ b/src/main/java/com/cheeeese/album/application/AlbumService.java @@ -154,9 +154,8 @@ public AlbumEnterResponse enterAlbum(String code, User currentUser) { return AlbumMapper.toNewResponse(album, makerInfo, remainingUploadSlots, recentPhotos); } - public UploadAvailableCountResponse getAvailablePhotoCount(User user, String code) { + public UploadAvailableCountResponse getAvailablePhotoCount(String code) { Album album = albumValidator.validateAlbumCode(code); - albumValidator.validateAlbumParticipant(album, user); int availableCount = calculateRemainingUploadSlots(album); diff --git a/src/main/java/com/cheeeese/album/presentation/AlbumController.java b/src/main/java/com/cheeeese/album/presentation/AlbumController.java index 88249ed..2f213b6 100644 --- a/src/main/java/com/cheeeese/album/presentation/AlbumController.java +++ b/src/main/java/com/cheeeese/album/presentation/AlbumController.java @@ -51,14 +51,8 @@ public CommonResponse enterAlbum( @Override @GetMapping("/{code}/available-count") - public CommonResponse getAvailableUploadCount( - @CurrentUser User user, - @PathVariable String code - ) { - return CommonResponse.success( - PHOTO_AVAILABLE_COUNT_FETCH_SUCCESS, - albumService.getAvailablePhotoCount(user, code) - ); + public CommonResponse getAvailableUploadCount(@PathVariable String code) { + return CommonResponse.success(PHOTO_AVAILABLE_COUNT_FETCH_SUCCESS, albumService.getAvailablePhotoCount(code)); } @Override diff --git a/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java b/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java index 0964a49..4c1525c 100644 --- a/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java +++ b/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java @@ -186,20 +186,6 @@ CommonResponse enterAlbum( responseCode = "200", description = "업로드 가능 사진 수 조회가 성공적으로 완료되었습니다." ), - @ApiResponse( - responseCode = "403", - description = "참여자가 아닌 사용자의 경우", - content = @Content( - mediaType = "application/json", - schema = @Schema(example = """ - { - "isSuccess": false, - "code": 403, - "message": "사용자가 해당 앨범의 참가자가 아닙니다." - } - """) - ) - ), @ApiResponse( responseCode = "404", description = "존재하지 않거나 유효하지 않은 앨범 코드", @@ -216,7 +202,6 @@ CommonResponse enterAlbum( ) }) CommonResponse getAvailableUploadCount( - @CurrentUser User user, @PathVariable String code ); diff --git a/src/main/java/com/cheeeese/global/config/SecurityConfig.java b/src/main/java/com/cheeeese/global/config/SecurityConfig.java index 3617816..c4773ea 100644 --- a/src/main/java/com/cheeeese/global/config/SecurityConfig.java +++ b/src/main/java/com/cheeeese/global/config/SecurityConfig.java @@ -41,7 +41,8 @@ public class SecurityConfig { "/v1/album/*/participants", "/internal/thumbnail/complete", "/v1/user/profile-images", - "/v1/album/*/info" + "/v1/album/*/info", + "/v1/album/*/available-count" }; @Bean From c86a8ca6e067c7e600a0595203a99cfee2809837 Mon Sep 17 00:00:00 2001 From: zyovn Date: Fri, 21 Nov 2025 02:18:52 +0900 Subject: [PATCH 354/402] =?UTF-8?q?#84=20docs:=20swagger=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cheeeese/album/presentation/swagger/AlbumSwagger.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java b/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java index 4c1525c..29c1a39 100644 --- a/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java +++ b/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java @@ -248,7 +248,7 @@ CommonResponse getAlbumParticipants( description = """ ### PathVariable --- - `code`: 앨범 코드 + `code`: 앨범 코드 (String) """ ) @ApiResponses(value = { From d80b70c222eba1917e2e9dcbef9586a6acf36f55 Mon Sep 17 00:00:00 2001 From: zyovn Date: Fri, 21 Nov 2025 20:11:46 +0900 Subject: [PATCH 355/402] =?UTF-8?q?#87=20feat:=20=ED=94=84=EB=A1=A0?= =?UTF-8?q?=ED=8A=B8=20=EB=A6=AC=EB=8B=A4=EC=9D=B4=EB=A0=89=ED=8A=B8=20?= =?UTF-8?q?=EA=B2=BD=EB=A1=9C=20=EA=B4=80=EB=A0=A8=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../global/config/SecurityConfig.java | 4 +++ .../security/filter/RedirectFilter.java | 33 +++++++++++++++++++ .../oauth2/handler/OAuth2SuccessHandler.java | 27 ++++++++++++--- 3 files changed, 60 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/cheeeese/global/security/filter/RedirectFilter.java diff --git a/src/main/java/com/cheeeese/global/config/SecurityConfig.java b/src/main/java/com/cheeeese/global/config/SecurityConfig.java index c4773ea..4303429 100644 --- a/src/main/java/com/cheeeese/global/config/SecurityConfig.java +++ b/src/main/java/com/cheeeese/global/config/SecurityConfig.java @@ -1,5 +1,6 @@ package com.cheeeese.global.config; +import com.cheeeese.global.security.filter.RedirectFilter; import com.cheeeese.global.security.handler.JwtAccessDeniedHandler; import com.cheeeese.global.security.handler.JwtAuthenticationEntryPoint; import com.cheeeese.global.security.jwt.JwtAuthenticationFilter; @@ -14,6 +15,7 @@ import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.oauth2.client.web.OAuth2AuthorizationRequestRedirectFilter; import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; @@ -25,6 +27,7 @@ public class SecurityConfig { private final CustomOAuth2UserService customOAuth2UserService; private final OAuth2SuccessHandler oAuth2SuccessHandler; private final OAuth2FailureHandler oAuth2FailureHandler; + private final RedirectFilter redirectFilter; private final JwtAuthenticationFilter jwtAuthenticationFilter; private final JwtAuthenticationEntryPoint jwtAuthenticationEntryPoint; private final JwtAccessDeniedHandler jwtAccessDeniedHandler; @@ -67,6 +70,7 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti .successHandler(oAuth2SuccessHandler) .failureHandler(oAuth2FailureHandler) ) + .addFilterBefore(redirectFilter, OAuth2AuthorizationRequestRedirectFilter.class) .addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class); return http.build(); diff --git a/src/main/java/com/cheeeese/global/security/filter/RedirectFilter.java b/src/main/java/com/cheeeese/global/security/filter/RedirectFilter.java new file mode 100644 index 0000000..33a2a15 --- /dev/null +++ b/src/main/java/com/cheeeese/global/security/filter/RedirectFilter.java @@ -0,0 +1,33 @@ +package com.cheeeese.global.security.filter; + +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.Cookie; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.stereotype.Component; +import org.springframework.web.filter.OncePerRequestFilter; + +import java.io.IOException; + +@Component +public class RedirectFilter extends OncePerRequestFilter { + + @Override + protected void doFilterInternal( + HttpServletRequest request, + HttpServletResponse response, + FilterChain filterChain + ) throws ServletException, IOException { + String redirect = request.getParameter("redirect"); + + if (redirect != null && !redirect.isBlank()) { + Cookie cookie = new Cookie("REDIRECT_URI", redirect); + cookie.setHttpOnly(true); + cookie.setPath("/"); + cookie.setMaxAge(300); + response.addCookie(cookie); + } + filterChain.doFilter(request, response); + } +} diff --git a/src/main/java/com/cheeeese/oauth2/handler/OAuth2SuccessHandler.java b/src/main/java/com/cheeeese/oauth2/handler/OAuth2SuccessHandler.java index 69870ad..7c6e75a 100644 --- a/src/main/java/com/cheeeese/oauth2/handler/OAuth2SuccessHandler.java +++ b/src/main/java/com/cheeeese/oauth2/handler/OAuth2SuccessHandler.java @@ -7,6 +7,7 @@ import com.cheeeese.auth.infrastructure.persistence.RefreshTokenRepository; import com.cheeeese.user.domain.User; import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.servlet.http.Cookie; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; @@ -17,6 +18,8 @@ import org.springframework.web.util.UriComponentsBuilder; import java.io.IOException; +import java.net.URLDecoder; +import java.nio.charset.StandardCharsets; import java.util.Map; import java.util.UUID; @@ -56,11 +59,27 @@ public void onAuthenticationSuccess( 1000 * 60L ); - String callbackUri = UriComponentsBuilder + String redirect = null; + if (request.getCookies() != null) { + for (Cookie c : request.getCookies()) { + if ("REDIRECT_URI".equals(c.getName())) { + redirect = URLDecoder.decode(c.getValue(), StandardCharsets.UTF_8); + } + } + } + Cookie del = new Cookie("REDIRECT_URI", null); + del.setPath("/"); + del.setMaxAge(0); + response.addCookie(del); + + UriComponentsBuilder builder = UriComponentsBuilder .fromUriString(redirectUri) - .queryParam("code", tempCode) - .build() - .toUriString(); + .queryParam("code", tempCode); + + if (redirect != null && !redirect.isBlank()) { + builder.queryParam("redirect", redirect); + } + String callbackUri = builder.toUriString(); response.sendRedirect(callbackUri); } From 76d07b287df8cf7f8f22d27a3d96ff12c3f7b1cb Mon Sep 17 00:00:00 2001 From: zyovn Date: Fri, 21 Nov 2025 20:17:23 +0900 Subject: [PATCH 356/402] =?UTF-8?q?#87=20feat:=20=EC=82=AC=EC=A7=84=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=20=EC=A1=B0=ED=9A=8C=EC=97=90=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20=EA=B0=80=EB=8A=A5=20=EC=97=AC=EB=B6=80=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cheeeese/photo/application/PhotoQueryService.java | 6 +++++- .../cheeeese/photo/dto/response/PhotoDetailResponse.java | 6 +++++- .../cheeeese/photo/infrastructure/mapper/PhotoMapper.java | 4 +++- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java b/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java index 2027d87..5c036f3 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java @@ -104,8 +104,12 @@ public PhotoDetailResponse getPhotoDetail(User user, String code, Long photoId) boolean isRecentlyDownloaded = photoHistoryRepository.existsByUserIdAndPhotoIdAndCreatedAtAfter( user.getId(), photo.getId(), LocalDateTime.now().minusHours(1) ); + boolean canDeleted = photo.getUser().getId().equals(user.getId()) + || photo.getAlbum().getMakerId().equals(user.getId()); - return PhotoMapper.toPhotoDetailResponse(photo, profileImage, resolveOriginalUrl, resolveThumbnailUrl, isLiked, isDownloaded, isRecentlyDownloaded); + return PhotoMapper.toPhotoDetailResponse( + photo, profileImage, resolveOriginalUrl, resolveThumbnailUrl, isLiked, isDownloaded, isRecentlyDownloaded, canDeleted + ); } private PhotoPageResponse getPhotoPageFromDB(String code, int page, int size, AlbumSorting albumSorting) { diff --git a/src/main/java/com/cheeeese/photo/dto/response/PhotoDetailResponse.java b/src/main/java/com/cheeeese/photo/dto/response/PhotoDetailResponse.java index 92ef228..f3c0594 100644 --- a/src/main/java/com/cheeeese/photo/dto/response/PhotoDetailResponse.java +++ b/src/main/java/com/cheeeese/photo/dto/response/PhotoDetailResponse.java @@ -17,7 +17,8 @@ "likesCnt", "isLiked", "isDownloaded", - "isRecentlyDownloaded" + "isRecentlyDownloaded", + "canDeleted" } ) public record PhotoDetailResponse( @@ -48,6 +49,9 @@ public record PhotoDetailResponse( @Schema(description = "1시간 이내 다운로드 여부", example = "false") boolean isRecentlyDownloaded, + @Schema(description = "삭제 가능 여부", example = "false") + boolean canDeleted, + @Schema(description = "촬영 시각", example = "2025-01-13T14:23:45") LocalDateTime captureTime, diff --git a/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java b/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java index 6396730..6137a62 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java @@ -138,7 +138,8 @@ public static PhotoDetailResponse toPhotoDetailResponse( String thumbnailUrl, boolean isLiked, boolean isDownloaded, - boolean isRecentlyDownloaded + boolean isRecentlyDownloaded, + boolean canDeleted ) { return PhotoDetailResponse.builder() .name(photo.getUser().getName()) @@ -150,6 +151,7 @@ public static PhotoDetailResponse toPhotoDetailResponse( .isLiked(isLiked) .isDownloaded(isDownloaded) .isRecentlyDownloaded(isRecentlyDownloaded) + .canDeleted(canDeleted) .captureTime(photo.getCaptureTime()) .createdAt(photo.getCreatedAt()) .build(); From d610de25e0dc082d417fa300c7f6b422f2301d65 Mon Sep 17 00:00:00 2001 From: zyovn Date: Fri, 21 Nov 2025 22:14:32 +0900 Subject: [PATCH 357/402] =?UTF-8?q?#87=20fix:=20=ED=94=BC=EB=93=9C?= =?UTF-8?q?=EB=B0=B1=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cheeeese/global/security/filter/RedirectFilter.java | 5 ++++- .../com/cheeeese/photo/application/PhotoQueryService.java | 4 ++-- .../com/cheeeese/photo/dto/response/PhotoDetailResponse.java | 2 +- .../cheeeese/photo/infrastructure/mapper/PhotoMapper.java | 4 ++-- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/cheeeese/global/security/filter/RedirectFilter.java b/src/main/java/com/cheeeese/global/security/filter/RedirectFilter.java index 33a2a15..f706a11 100644 --- a/src/main/java/com/cheeeese/global/security/filter/RedirectFilter.java +++ b/src/main/java/com/cheeeese/global/security/filter/RedirectFilter.java @@ -9,6 +9,8 @@ import org.springframework.web.filter.OncePerRequestFilter; import java.io.IOException; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; @Component public class RedirectFilter extends OncePerRequestFilter { @@ -22,7 +24,8 @@ protected void doFilterInternal( String redirect = request.getParameter("redirect"); if (redirect != null && !redirect.isBlank()) { - Cookie cookie = new Cookie("REDIRECT_URI", redirect); + String encodedRedirect = URLEncoder.encode(redirect, StandardCharsets.UTF_8); + Cookie cookie = new Cookie("REDIRECT_URI", encodedRedirect); cookie.setHttpOnly(true); cookie.setPath("/"); cookie.setMaxAge(300); diff --git a/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java b/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java index 5c036f3..e501dc3 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java @@ -104,11 +104,11 @@ public PhotoDetailResponse getPhotoDetail(User user, String code, Long photoId) boolean isRecentlyDownloaded = photoHistoryRepository.existsByUserIdAndPhotoIdAndCreatedAtAfter( user.getId(), photo.getId(), LocalDateTime.now().minusHours(1) ); - boolean canDeleted = photo.getUser().getId().equals(user.getId()) + boolean canDelete = photo.getUser().getId().equals(user.getId()) || photo.getAlbum().getMakerId().equals(user.getId()); return PhotoMapper.toPhotoDetailResponse( - photo, profileImage, resolveOriginalUrl, resolveThumbnailUrl, isLiked, isDownloaded, isRecentlyDownloaded, canDeleted + photo, profileImage, resolveOriginalUrl, resolveThumbnailUrl, isLiked, isDownloaded, isRecentlyDownloaded, canDelete ); } diff --git a/src/main/java/com/cheeeese/photo/dto/response/PhotoDetailResponse.java b/src/main/java/com/cheeeese/photo/dto/response/PhotoDetailResponse.java index f3c0594..2a0d030 100644 --- a/src/main/java/com/cheeeese/photo/dto/response/PhotoDetailResponse.java +++ b/src/main/java/com/cheeeese/photo/dto/response/PhotoDetailResponse.java @@ -50,7 +50,7 @@ public record PhotoDetailResponse( boolean isRecentlyDownloaded, @Schema(description = "삭제 가능 여부", example = "false") - boolean canDeleted, + boolean canDelete, @Schema(description = "촬영 시각", example = "2025-01-13T14:23:45") LocalDateTime captureTime, diff --git a/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java b/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java index 6137a62..b0d66ec 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java @@ -139,7 +139,7 @@ public static PhotoDetailResponse toPhotoDetailResponse( boolean isLiked, boolean isDownloaded, boolean isRecentlyDownloaded, - boolean canDeleted + boolean canDelete ) { return PhotoDetailResponse.builder() .name(photo.getUser().getName()) @@ -151,7 +151,7 @@ public static PhotoDetailResponse toPhotoDetailResponse( .isLiked(isLiked) .isDownloaded(isDownloaded) .isRecentlyDownloaded(isRecentlyDownloaded) - .canDeleted(canDeleted) + .canDelete(canDelete) .captureTime(photo.getCaptureTime()) .createdAt(photo.getCreatedAt()) .build(); From 91795773d20af8b505f316821f9e0abfcef05076 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Fri, 21 Nov 2025 23:51:57 +0900 Subject: [PATCH 358/402] =?UTF-8?q?#89=20fix:=20=EC=9B=90=EB=B3=B8=20?= =?UTF-8?q?=EC=9D=B4=EB=AF=B8=EC=A7=80=EC=97=90=EC=84=9C=20=EC=8D=B8?= =?UTF-8?q?=EB=84=A4=EC=9D=BC=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20=EC=A0=9C?= =?UTF-8?q?=EA=B3=B5=EC=9C=BC=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cheeeese/cheese4cut/application/Cheese4cutService.java | 4 ++-- .../cheese4cut/dto/response/Cheese4cutFinalResponse.java | 4 ++-- .../cheese4cut/dto/response/Cheese4cutPreviewResponse.java | 2 +- .../cheese4cut/presentation/swagger/Cheese4cutSwagger.java | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/cheeeese/cheese4cut/application/Cheese4cutService.java b/src/main/java/com/cheeeese/cheese4cut/application/Cheese4cutService.java index df614d7..682b079 100644 --- a/src/main/java/com/cheeeese/cheese4cut/application/Cheese4cutService.java +++ b/src/main/java/com/cheeeese/cheese4cut/application/Cheese4cutService.java @@ -66,7 +66,7 @@ public Cheese4cutResponse getCheese4cutByAlbumCode(Authentication authentication List photos = cheese4cut.getPhotos().stream() .map(p -> Cheese4cutMapper.toFinalPhotoInfo( p.getPhotoId(), - cdnUrlResolver.resolveOriginal(p.getImageUrl()), + cdnUrlResolver.resolveThumbnail(p.getThumbnailImageUrl()), p.getPhotoRank() )) .toList(); @@ -110,7 +110,7 @@ private Cheese4cutResponse getPreviewResponse(Long albumId, int participant, Rol .mapToObj(index -> { Photo p = orderedPhotos.get(index); return Cheese4cutMapper.toPreviewPhotoInfo( - p.getId(), cdnUrlResolver.resolveOriginal(p.getImageUrl()), index+1 + p.getId(), cdnUrlResolver.resolveThumbnail(p.getThumbnailUrl()), index+1 ); }) .toList(); diff --git a/src/main/java/com/cheeeese/cheese4cut/dto/response/Cheese4cutFinalResponse.java b/src/main/java/com/cheeeese/cheese4cut/dto/response/Cheese4cutFinalResponse.java index e33b403..9e91bc7 100644 --- a/src/main/java/com/cheeeese/cheese4cut/dto/response/Cheese4cutFinalResponse.java +++ b/src/main/java/com/cheeeese/cheese4cut/dto/response/Cheese4cutFinalResponse.java @@ -30,10 +30,10 @@ public record Cheese4cutFinalResponse( } ) public record FinalPhotoInfo( - @Schema(description = "원본 사진 ID", example = "101") + @Schema(description = "사진 ID", example = "101") Long photoId, - @Schema(description = "사진 원본 URL", example = "https://cdn.cheeeese.com/album/1/original/101.jpg") + @Schema(description = "사진 썸네일 URL", example = "https://cdn.cheeeese.com/album/1/original/101.jpg") String imageUrl, @Schema(description = "선정 순위 (1~4)", example = "1") diff --git a/src/main/java/com/cheeeese/cheese4cut/dto/response/Cheese4cutPreviewResponse.java b/src/main/java/com/cheeeese/cheese4cut/dto/response/Cheese4cutPreviewResponse.java index fabbe20..9f5b329 100644 --- a/src/main/java/com/cheeeese/cheese4cut/dto/response/Cheese4cutPreviewResponse.java +++ b/src/main/java/com/cheeeese/cheese4cut/dto/response/Cheese4cutPreviewResponse.java @@ -46,7 +46,7 @@ public record PreviewPhotoInfo( @Schema(description = "사진 ID", example = "101") Long photoId, - @Schema(description = "사진 원본 URL", example = "https://cdn.cheeeese.com/album/1/original/101.jpg") + @Schema(description = "사진 썸네일 URL", example = "https://cdn.cheeeese.com/album/1/original/101.jpg") String imageUrl, @Schema(description = "선정 순위 (1~4)", example = "1") diff --git a/src/main/java/com/cheeeese/cheese4cut/presentation/swagger/Cheese4cutSwagger.java b/src/main/java/com/cheeeese/cheese4cut/presentation/swagger/Cheese4cutSwagger.java index 1b53151..c49162f 100644 --- a/src/main/java/com/cheeeese/cheese4cut/presentation/swagger/Cheese4cutSwagger.java +++ b/src/main/java/com/cheeeese/cheese4cut/presentation/swagger/Cheese4cutSwagger.java @@ -31,8 +31,8 @@ public interface Cheese4cutSwagger { --- 이 API는 앨범의 **치즈네컷 확정 상태**에 따라 응답 형태가 달라지는 다형적(Polymorphic) 응답을 반환합니다. - 1. **확정 전 (isFinalized: false)**: 좋아요 TOP 4 사진의 원본 URL, 유니크 좋아요 수, 전체 참여자 수를 제공합니다. - 2. **확정 후 (isFinalized: true)**: 확정된 좋아요 TOP 4 사진의 원본 URL + 1. **확정 전 (isFinalized: false)**: 좋아요 TOP 4 사진의 썸네일 URL, 유니크 좋아요 수, 전체 참여자 수를 제공합니다. + 2. **확정 후 (isFinalized: true)**: 확정된 좋아요 TOP 4 사진의 썸네일 URL """ ) @ApiResponses(value = { From 05d69020631604fb68a12f7378c17d579552759b Mon Sep 17 00:00:00 2001 From: zyovn Date: Sat, 22 Nov 2025 02:18:27 +0900 Subject: [PATCH 359/402] =?UTF-8?q?#91=20feat:=20=EC=95=A8=EB=B2=94=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=EC=A0=9C=ED=95=9C=20=EB=B0=8F=20=EC=82=AC?= =?UTF-8?q?=EC=A7=84=20=EA=B0=9C=EC=88=98=20=EC=A0=9C=ED=95=9C=20=EC=9B=90?= =?UTF-8?q?=EB=9E=98=EB=8C=80=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cheeeese/album/application/AlbumService.java | 4 ++-- .../album/application/validator/AlbumValidator.java | 8 ++++---- .../cheeeese/album/infrastructure/mapper/AlbumMapper.java | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/cheeeese/album/application/AlbumService.java b/src/main/java/com/cheeeese/album/application/AlbumService.java index 88dbb1c..c15e21d 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumService.java +++ b/src/main/java/com/cheeeese/album/application/AlbumService.java @@ -68,9 +68,9 @@ public class AlbumService { public AlbumCreationResponse createAlbum(User user, AlbumCreationRequest request) { String code = UuidCreator.getTimeOrdered().toString(); - // long createdThisWeek = countUserAlbumsCreatedThisWeek(user); + long createdThisWeek = countUserAlbumsCreatedThisWeek(user); - albumValidator.validateAlbumCreation(request); + albumValidator.validateAlbumCreation(createdThisWeek, request); LocalDateTime expiredAt = LocalDateTime.now().plusDays(7); diff --git a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java index 6694482..98a5cb5 100644 --- a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java +++ b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java @@ -26,7 +26,7 @@ public class AlbumValidator { private final AlbumRepository albumRepository; private final UserAlbumRepository userAlbumRepository; - public void validateAlbumCreation(AlbumCreationRequest request) { + public void validateAlbumCreation(long createdThisWeek, AlbumCreationRequest request) { if (request.themeEmoji() == null || request.themeEmoji().isBlank()) { throw new AlbumException(AlbumErrorCode.ALBUM_THEME_EMOJI_NOT_SELECTED); } @@ -47,9 +47,9 @@ public void validateAlbumCreation(AlbumCreationRequest request) { throw new AlbumException(AlbumErrorCode.ALBUM_INVALID_CAPACITY); } -// if (createdThisWeek >= 3) { -// throw new AlbumException(AlbumErrorCode.ALBUM_CREATION_LIMIT_EXCEEDED); -// } + if (createdThisWeek >= 3) { + throw new AlbumException(AlbumErrorCode.ALBUM_CREATION_LIMIT_EXCEEDED); + } } public Album validateAlbumCode(String code) { diff --git a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java index e4479f2..d7e35c1 100644 --- a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java +++ b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java @@ -34,7 +34,7 @@ public static Album toEntity( .participant(participant) .currentParticipant(1) .eventDate(eventDate) - .maxPhotoCount(100) + .maxPhotoCount(2000) .currentPhotoCount(0) .isInfoAvailable(isInfoAvailable) .expiredAt(expiredAt) From e527907253172d54e8bffcf170feded916610a47 Mon Sep 17 00:00:00 2001 From: zyovn Date: Sat, 22 Nov 2025 12:09:54 +0900 Subject: [PATCH 360/402] =?UTF-8?q?#91=20feat:=20=EC=9B=90=EB=9E=98?= =?UTF-8?q?=EB=8C=80=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cheeeese/album/application/AlbumService.java | 4 ++-- .../album/application/validator/AlbumValidator.java | 8 ++++---- .../cheeeese/album/infrastructure/mapper/AlbumMapper.java | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/cheeeese/album/application/AlbumService.java b/src/main/java/com/cheeeese/album/application/AlbumService.java index c15e21d..88dbb1c 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumService.java +++ b/src/main/java/com/cheeeese/album/application/AlbumService.java @@ -68,9 +68,9 @@ public class AlbumService { public AlbumCreationResponse createAlbum(User user, AlbumCreationRequest request) { String code = UuidCreator.getTimeOrdered().toString(); - long createdThisWeek = countUserAlbumsCreatedThisWeek(user); + // long createdThisWeek = countUserAlbumsCreatedThisWeek(user); - albumValidator.validateAlbumCreation(createdThisWeek, request); + albumValidator.validateAlbumCreation(request); LocalDateTime expiredAt = LocalDateTime.now().plusDays(7); diff --git a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java index 98a5cb5..6694482 100644 --- a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java +++ b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java @@ -26,7 +26,7 @@ public class AlbumValidator { private final AlbumRepository albumRepository; private final UserAlbumRepository userAlbumRepository; - public void validateAlbumCreation(long createdThisWeek, AlbumCreationRequest request) { + public void validateAlbumCreation(AlbumCreationRequest request) { if (request.themeEmoji() == null || request.themeEmoji().isBlank()) { throw new AlbumException(AlbumErrorCode.ALBUM_THEME_EMOJI_NOT_SELECTED); } @@ -47,9 +47,9 @@ public void validateAlbumCreation(long createdThisWeek, AlbumCreationRequest req throw new AlbumException(AlbumErrorCode.ALBUM_INVALID_CAPACITY); } - if (createdThisWeek >= 3) { - throw new AlbumException(AlbumErrorCode.ALBUM_CREATION_LIMIT_EXCEEDED); - } +// if (createdThisWeek >= 3) { +// throw new AlbumException(AlbumErrorCode.ALBUM_CREATION_LIMIT_EXCEEDED); +// } } public Album validateAlbumCode(String code) { diff --git a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java index d7e35c1..57d71b6 100644 --- a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java +++ b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java @@ -34,7 +34,7 @@ public static Album toEntity( .participant(participant) .currentParticipant(1) .eventDate(eventDate) - .maxPhotoCount(2000) + .maxPhotoCount(300) .currentPhotoCount(0) .isInfoAvailable(isInfoAvailable) .expiredAt(expiredAt) From dc27f1cea717827385508893ba554d97c694350a Mon Sep 17 00:00:00 2001 From: zyovn Date: Mon, 24 Nov 2025 13:15:17 +0900 Subject: [PATCH 361/402] =?UTF-8?q?#79=20test:=20=EC=82=AC=EC=A7=84=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=20=EC=A1=B0=ED=9A=8C=20=ED=86=B5=ED=95=A9=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../infrastructure/mapper/PhotoMapper.java | 1 - .../com/cheeeese/fixture/FixtureFactory.java | 11 ++++ .../PhotoQueryServiceIntegrationTest.java | 62 +++++++++++++++++++ 3 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 src/test/java/com/cheeeese/photo/integration/PhotoQueryServiceIntegrationTest.java diff --git a/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java b/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java index b0d66ec..7997577 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java @@ -2,7 +2,6 @@ import com.cheeeese.album.domain.Album; import com.cheeeese.album.domain.type.Role; -import com.cheeeese.album.dto.response.AlbumInfoResponse; import com.cheeeese.photo.domain.Photo; import com.cheeeese.photo.domain.PhotoStatus; import com.cheeeese.photo.dto.response.*; diff --git a/src/test/java/com/cheeeese/fixture/FixtureFactory.java b/src/test/java/com/cheeeese/fixture/FixtureFactory.java index fb7b30f..2ebcfae 100644 --- a/src/test/java/com/cheeeese/fixture/FixtureFactory.java +++ b/src/test/java/com/cheeeese/fixture/FixtureFactory.java @@ -7,6 +7,9 @@ import com.cheeeese.album.infrastructure.mapper.UserAlbumMapper; import com.cheeeese.oauth2.domain.OAuth2UserInfo; import com.cheeeese.oauth2.infrastructure.userinfo.KakaoUserInfo; +import com.cheeeese.photo.domain.Photo; +import com.cheeeese.photo.domain.PhotoStatus; +import com.cheeeese.photo.infrastructure.mapper.PhotoMapper; import com.cheeeese.user.domain.User; import com.cheeeese.user.infrastructure.mapper.UserMapper; import com.github.f4b6a3.uuid.UuidCreator; @@ -86,4 +89,12 @@ public static UserAlbum createHostUserAlbum(User user, Album album) { Role.MAKER ); } + + public static Photo createPhoto(User user, Album album, LocalDateTime captureTime) { + return PhotoMapper.toEntity( + user, + album, + LocalDateTime.now() + ); + } } diff --git a/src/test/java/com/cheeeese/photo/integration/PhotoQueryServiceIntegrationTest.java b/src/test/java/com/cheeeese/photo/integration/PhotoQueryServiceIntegrationTest.java new file mode 100644 index 0000000..102e015 --- /dev/null +++ b/src/test/java/com/cheeeese/photo/integration/PhotoQueryServiceIntegrationTest.java @@ -0,0 +1,62 @@ +package com.cheeeese.photo.integration; + +import com.cheeeese.album.domain.Album; +import com.cheeeese.album.infrastructure.persistence.AlbumRepository; +import com.cheeeese.fixture.FixtureFactory; +import com.cheeeese.photo.application.PhotoQueryService; +import com.cheeeese.photo.domain.Photo; +import com.cheeeese.photo.dto.response.PhotoDetailResponse; +import com.cheeeese.photo.infrastructure.persistence.PhotoRepository; +import com.cheeeese.user.domain.User; +import com.cheeeese.user.infrastructure.persistence.UserRepository; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; + +import static org.assertj.core.api.Assertions.assertThat; + +@SpringBootTest +@Transactional +public class PhotoQueryServiceIntegrationTest { + + @Autowired + private UserRepository userRepository; + + @Autowired + private AlbumRepository albumRepository; + + @Autowired + private PhotoRepository photoRepository; + + @Autowired + private PhotoQueryService photoQueryService; + + private static User testUser; + private static Album testAlbum; + private static Photo testPhoto; + + @BeforeEach + void setUp() { + testUser = userRepository.save(FixtureFactory.createKakaoUser()); + testAlbum = albumRepository.save(FixtureFactory.createAlbum(testUser.getId())); + testPhoto = photoRepository.save(FixtureFactory.createPhoto(testUser, testAlbum, LocalDateTime.now())); + } + + @Test + @DisplayName("사진 상세 조회 테스트") + void getPhotoDetailRecentlyDownloaded() { + // given + testPhoto.updateImageUrl("album/" + testAlbum.getId() + "/original/test.jpg"); + + // when + PhotoDetailResponse response = photoQueryService.getPhotoDetail(testUser, testAlbum.getCode(), testPhoto.getId()); + + // then + assertThat(response.imageUrl()).contains("edge.naverncp.com"); + } +} From 2a75b5d08c67e5c16ffbd3c47326a1fcbfaa08ec Mon Sep 17 00:00:00 2001 From: zyovn Date: Mon, 24 Nov 2025 13:53:21 +0900 Subject: [PATCH 362/402] =?UTF-8?q?#93=20chore:=20aop=20=EA=B4=80=EB=A0=A8?= =?UTF-8?q?=20=EC=9D=98=EC=A1=B4=EC=84=B1=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 3 +++ 1 file changed, 3 insertions(+) diff --git a/build.gradle b/build.gradle index 3463b0a..3176ef5 100644 --- a/build.gradle +++ b/build.gradle @@ -58,6 +58,9 @@ dependencies { implementation 'software.amazon.awssdk:s3:2.25.46' implementation 'software.amazon.awssdk:auth:2.25.46' implementation 'software.amazon.awssdk:regions:2.25.46' + + // aop + implementation 'org.springframework.boot:spring-boot-starter-aop' } tasks.named('test') { From 06322ae614661319bf91c7a9663b7b995b36f62a Mon Sep 17 00:00:00 2001 From: zyovn Date: Mon, 24 Nov 2025 14:15:19 +0900 Subject: [PATCH 363/402] =?UTF-8?q?#93=20feat:=20=EC=A0=84=EC=97=AD=20aop?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../global/logging/LoggingAspect.java | 43 +++++++++++++++++ .../global/logging/MDCLoggingFilter.java | 46 +++++++++++++++++++ 2 files changed, 89 insertions(+) create mode 100644 src/main/java/com/cheeeese/global/logging/LoggingAspect.java create mode 100644 src/main/java/com/cheeeese/global/logging/MDCLoggingFilter.java diff --git a/src/main/java/com/cheeeese/global/logging/LoggingAspect.java b/src/main/java/com/cheeeese/global/logging/LoggingAspect.java new file mode 100644 index 0000000..e47e713 --- /dev/null +++ b/src/main/java/com/cheeeese/global/logging/LoggingAspect.java @@ -0,0 +1,43 @@ +package com.cheeeese.global.logging; + +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +@Aspect +@Component +public class LoggingAspect { + + private static final Logger logger = LoggerFactory.getLogger(LoggingAspect.class); + + @Pointcut("execution(* com.cheeeese..application..*Service.*(..))") + public void applicationLayer() {} + + @Around("applicationLayer()") + public Object around(ProceedingJoinPoint joinPoint) throws Throwable { + String className = joinPoint.getSignature().getDeclaringTypeName(); + String methodName = joinPoint.getSignature().getName(); + Object[] args = joinPoint.getArgs(); + + logger.info("[▶️ Start] {}.{} | args = {}", className, methodName, args); + + long start = System.currentTimeMillis(); + try { + Object result = joinPoint.proceed(); + long end = System.currentTimeMillis(); + + logger.info("[✅ End] {}.{} | took = {}ms | return = {}", className, methodName, (end - start), result); + + return result; + } catch (Throwable ex) { + long end = System.currentTimeMillis(); + logger.error("[‼️ Exception] {}.{} | took = {}ms | message = {}", className, methodName, (end - start), ex.getMessage(), ex); + + throw ex; + } + } +} diff --git a/src/main/java/com/cheeeese/global/logging/MDCLoggingFilter.java b/src/main/java/com/cheeeese/global/logging/MDCLoggingFilter.java new file mode 100644 index 0000000..b81b7e1 --- /dev/null +++ b/src/main/java/com/cheeeese/global/logging/MDCLoggingFilter.java @@ -0,0 +1,46 @@ +package com.cheeeese.global.logging; + +import com.cheeeese.global.security.CustomUserDetails; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.slf4j.MDC; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Component; +import org.springframework.web.filter.OncePerRequestFilter; + +import java.io.IOException; +import java.util.UUID; + +@Component +public class MDCLoggingFilter extends OncePerRequestFilter { + + @Override + protected void doFilterInternal( + HttpServletRequest request, + HttpServletResponse response, + FilterChain chain + ) throws ServletException, IOException { + String traceId = UUID.randomUUID().toString().substring(0, 8); + MDC.put("traceId", traceId); + + try { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + + if (authentication != null + && authentication.isAuthenticated() + && !"anonymousUser".equals(authentication.getPrincipal()) + ) { + CustomUserDetails userDetails = (CustomUserDetails) authentication.getPrincipal(); + MDC.put("userId", String.valueOf(userDetails.getUser().getId())); + } else { + MDC.put("userId", "null"); + } + chain.doFilter(request, response); + } finally { + MDC.clear(); + } + } +} From ca9cba6f7659932492282d033e0169b0f7a0175b Mon Sep 17 00:00:00 2001 From: zyovn Date: Mon, 24 Nov 2025 14:41:42 +0900 Subject: [PATCH 364/402] =?UTF-8?q?#93=20chore:=20=EB=A1=9C=EA=B9=85=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20=EC=9D=98=EC=A1=B4=EC=84=B1=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 3 +++ 1 file changed, 3 insertions(+) diff --git a/build.gradle b/build.gradle index 3176ef5..a88b069 100644 --- a/build.gradle +++ b/build.gradle @@ -61,6 +61,9 @@ dependencies { // aop implementation 'org.springframework.boot:spring-boot-starter-aop' + + // monitoring + implementation 'net.logstash.logback:logstash-logback-encoder:6.6' } tasks.named('test') { From e33f650cb302ed5cd5f7e8a72c7c6e18894c430e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Mon, 24 Nov 2025 23:53:14 +0900 Subject: [PATCH 365/402] =?UTF-8?q?#78=20test:=20=EC=9D=B4=EB=AF=B8?= =?UTF-8?q?=EC=A7=80=20=EC=97=85=EB=A1=9C=EB=93=9C=20=EA=B4=80=EB=A0=A8=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=A1=9C=EC=A7=81=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cheeeese/photo/PhotoServiceTest.java | 144 ++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100644 src/test/java/com/cheeeese/photo/PhotoServiceTest.java diff --git a/src/test/java/com/cheeeese/photo/PhotoServiceTest.java b/src/test/java/com/cheeeese/photo/PhotoServiceTest.java new file mode 100644 index 0000000..33e09d0 --- /dev/null +++ b/src/test/java/com/cheeeese/photo/PhotoServiceTest.java @@ -0,0 +1,144 @@ +package com.cheeeese.photo; + +import com.cheeeese.album.application.validator.AlbumValidator; +import com.cheeeese.album.domain.Album; +import com.cheeeese.album.infrastructure.persistence.AlbumRepository; +import com.cheeeese.photo.application.PhotoService; +import com.cheeeese.photo.application.PresignedUrlService; +import com.cheeeese.photo.application.validator.PhotoValidator; +import com.cheeeese.photo.domain.Photo; +import com.cheeeese.photo.domain.PhotoStatus; +import com.cheeeese.photo.dto.request.PhotoPresignedUrlRequest; +import com.cheeeese.photo.dto.request.PhotoUploadReportRequest; +import com.cheeeese.photo.dto.response.PhotoPresignedUrlResponse; +import com.cheeeese.photo.exception.PhotoException; +import com.cheeeese.photo.exception.code.PhotoErrorCode; +import com.cheeeese.photo.infrastructure.persistence.PhotoRepository; +import com.cheeeese.user.domain.User; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.test.util.ReflectionTestUtils; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +@Tag("benchmark") +class PhotoServiceTest { + + @InjectMocks + private PhotoService photoService; + + @Mock private AlbumValidator albumValidator; + @Mock private AlbumRepository albumRepository; + @Mock private PhotoRepository photoRepository; + @Mock private PhotoValidator photoValidator; + @Mock private PresignedUrlService presignedUrlService; + + @Test + @DisplayName("유효한 요청일 경우 Presigned URL 목록을 정상 반환한다.") + void createPresignedUrls_Success() { + // given + User user = mock(User.class); + ReflectionTestUtils.setField(photoService, "bucket", "test-bucket"); // @Value 주입 처리 + + String code = "album-code"; + Album album = Album.builder().makerId(1L).maxPhotoCount(100).build(); + + PhotoPresignedUrlRequest.FileInfo fileInfo = + new PhotoPresignedUrlRequest.FileInfo("test.jpg", 1000L, "image/jpeg"); + PhotoPresignedUrlRequest request = + new PhotoPresignedUrlRequest(code, List.of(fileInfo)); + + given(albumValidator.validateAlbumCode(code)).willReturn(album); + given(albumRepository.findByIdForUpdate(any())).willReturn(album); // Lock 획득 모킹 + + // Presigned URL 생성 모킹 + given(presignedUrlService.generatePresignedPutUrl(anyString(), anyString())) + .willReturn("https://s3.url/upload?sig=..."); + + // when + PhotoPresignedUrlResponse response = photoService.createPresignedUrls(user, request); + + // then + assertThat(response.presignedUrlInfos()).hasSize(1); + assertThat(response.presignedUrlInfos().get(0).uploadUrl()).contains("https://s3.url"); + + // DB에 UPLOADING 상태로 저장되었는지 검증 + verify(photoRepository).save(any(Photo.class)); + // 용량/개수 검증 로직 호출 확인 + verify(photoValidator).validatePhotoCount(anyLong(), anyInt(), anyInt()); + verify(photoValidator).validateFileInfos(any()); + } + + @Test + @DisplayName("업로드 요청한 사진 수가 앨범의 남은 용량을 초과하면 예외가 발생한다.") + void createPresignedUrls_Fail_MaxCountExceeded() { + // given + User user = mock(User.class); + String code = "album-code"; + Album album = mock(Album.class); + given(album.getId()).willReturn(1L); + given(album.getMaxPhotoCount()).willReturn(100); + + given(albumValidator.validateAlbumCode(code)).willReturn(album); + given(albumRepository.findByIdForUpdate(1L)).willReturn(album); + + // 현재 99장 있고, 2장 업로드 시도 + given(photoRepository.countActivePhotosByAlbumId(eq(1L), anyList())).willReturn(99L); + + PhotoPresignedUrlRequest request = new PhotoPresignedUrlRequest(code, List.of( + new PhotoPresignedUrlRequest.FileInfo("1.jpg", 100L, "image/jpeg"), + new PhotoPresignedUrlRequest.FileInfo("2.jpg", 100L, "image/jpeg") + )); + + // Validator가 예외를 던지도록 설정 (Spy나 실제 객체 사용 시에는 로직에 따라 발생, 여기선 Mock의 행동 정의) + doThrow(new PhotoException(PhotoErrorCode.PHOTO_MAX_COUNT_EXCEEDED)) + .when(photoValidator).validatePhotoCount(99L, 2, 100); + + // when & then + assertThatThrownBy(() -> photoService.createPresignedUrls(user, request)) + .isInstanceOf(PhotoException.class) + .hasFieldOrPropertyWithValue("errorCode", PhotoErrorCode.PHOTO_MAX_COUNT_EXCEEDED); + } + + @Test + @DisplayName("업로드 실패 보고 시, 해당 사진들의 상태가 FAILED로 변경된다.") + void reportUploadResult_Success() { + // given + User user = mock(User.class); + Long userId = 1L; + given(user.getId()).willReturn(userId); + + List failIds = List.of(101L, 102L); + PhotoUploadReportRequest request = new PhotoUploadReportRequest(failIds); + + // Validator 통과 설정 + PhotoValidator.ValidatedPhotos validated = new PhotoValidator.ValidatedPhotos(List.of(), 1L); // 빈 리스트라도 흐름만 검증 + given(photoValidator.validatePhotos(userId, failIds)).willReturn(validated); + + // Update 로직 실행 결과 설정 (2개 수정됨) + given(photoRepository.updateStatusByIdsAndUserIdAndExpectedStatus( + failIds, userId, PhotoStatus.FAILED, PhotoStatus.UPLOADING + )).willReturn(2); + + // when + photoService.reportUploadResult(user, request); + + // then + // 상태 업데이트 메서드가 정확한 인자로 호출되었는지 검증 + verify(photoRepository).updateStatusByIdsAndUserIdAndExpectedStatus( + failIds, userId, PhotoStatus.FAILED, PhotoStatus.UPLOADING + ); + } +} \ No newline at end of file From 77052b505ce7294d3cdf2e57c713c59402c0fd07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Mon, 24 Nov 2025 23:53:36 +0900 Subject: [PATCH 366/402] =?UTF-8?q?#78=20test:=20=EC=B9=98=EC=A6=88?= =?UTF-8?q?=EB=84=A4=EC=BB=B7=20=EC=84=9C=EB=B9=84=EC=8A=A4=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EB=A1=9C=EC=A7=81=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cheese4cut/Cheese4cutServiceTest.java | 176 ++++++++++++++++++ 1 file changed, 176 insertions(+) create mode 100644 src/test/java/com/cheeeese/cheese4cut/Cheese4cutServiceTest.java diff --git a/src/test/java/com/cheeeese/cheese4cut/Cheese4cutServiceTest.java b/src/test/java/com/cheeeese/cheese4cut/Cheese4cutServiceTest.java new file mode 100644 index 0000000..ac8f5e4 --- /dev/null +++ b/src/test/java/com/cheeeese/cheese4cut/Cheese4cutServiceTest.java @@ -0,0 +1,176 @@ +package com.cheeeese.cheese4cut; + +import com.cheeeese.album.application.validator.AlbumValidator; +import com.cheeeese.album.domain.Album; +import com.cheeeese.album.infrastructure.persistence.AlbumRepository; +import com.cheeeese.cheese4cut.application.Cheese4cutService; +import com.cheeeese.cheese4cut.application.validator.Cheese4cutValidator; +import com.cheeeese.cheese4cut.domain.Cheese4cut; +import com.cheeeese.cheese4cut.dto.request.Cheese4cutFixedRequest; +import com.cheeeese.cheese4cut.dto.response.Cheese4cutPreviewResponse; +import com.cheeeese.cheese4cut.dto.response.Cheese4cutResponse; +import com.cheeeese.cheese4cut.exception.Cheese4cutException; +import com.cheeeese.cheese4cut.exception.code.Cheese4cutErrorCode; +import com.cheeeese.cheese4cut.infrastructure.persistence.Cheese4cutRepository; +import com.cheeeese.global.util.resolver.CdnUrlResolver; +import com.cheeeese.photo.domain.Photo; +import com.cheeeese.photo.domain.PhotoStatus; +import com.cheeeese.photo.infrastructure.persistence.PhotoLikesRepository; +import com.cheeeese.photo.infrastructure.persistence.PhotoRepository; +import com.cheeeese.user.domain.User; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.List; +import java.util.Optional; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +@Tag("benchmark") +class Cheese4cutServiceTest { + + @InjectMocks + private Cheese4cutService cheese4cutService; + + @Mock private Cheese4cutRepository cheese4cutRepository; + @Mock private AlbumValidator albumValidator; + @Mock private Cheese4cutValidator cheese4cutValidator; + @Mock private PhotoRepository photoRepository; + @Mock private PhotoLikesRepository photoLikesRepository; + @Mock private AlbumRepository albumRepository; + @Mock private CdnUrlResolver cdnUrlResolver; + + @Test + @DisplayName("치즈네컷 수동 확정 시 정상적으로 엔티티가 저장된다.") + void finalizeCheese4cut_Success() { + // given + String code = "valid-code"; + User maker = mock(User.class); + Album album = mock(Album.class); + List photoIds = List.of(1L, 2L, 3L, 4L); + Cheese4cutFixedRequest request = new Cheese4cutFixedRequest(photoIds); + + // Mocking + given(albumValidator.validateAlbumCode(code)).willReturn(album); + given(album.isExpired()).willReturn(false); + // 이미 확정된 내역이 없어야 함 + given(cheese4cutRepository.findByAlbumId(album.getId())).willReturn(Optional.empty()); + + // 사진 조회 결과 Mocking (순서대로 조회되었다고 가정) + Photo p1 = mock(Photo.class); given(p1.getId()).willReturn(1L); + Photo p2 = mock(Photo.class); given(p2.getId()).willReturn(2L); + Photo p3 = mock(Photo.class); given(p3.getId()).willReturn(3L); + Photo p4 = mock(Photo.class); given(p4.getId()).willReturn(4L); + + given(photoRepository.findAllByIdInOrderByLikesDescCreatedDesc(photoIds)) + .willReturn(List.of(p1, p2, p3, p4)); + + // when + cheese4cutService.finalizeCheese4cut(maker, code, request); + + // then + // 1. 권한 검증 호출 여부 + verify(cheese4cutValidator).validateUserIsMaker(album, maker); + // 2. 사진 유효성 검증 호출 여부 + verify(cheese4cutValidator).validateFinalizePhotos(album, photoIds); + // 3. 최종 저장 호출 여부 + verify(cheese4cutRepository).save(any(Cheese4cut.class)); + } + + @Test + @DisplayName("치즈네컷 확정 전, 좋아요 상위 4개 사진을 미리보기로 반환한다.") + void getCheese4cut_Preview_Success() { + // given + String code = "preview-code"; + User user = mock(User.class); + Album album = mock(Album.class); + given(album.getId()).willReturn(1L); + given(album.getParticipant()).willReturn(10); + + given(albumRepository.findByCode(code)).willReturn(Optional.of(album)); + + // 확정 내역 없음 + given(cheese4cutRepository.findByAlbumId(album.getId())).willReturn(Optional.empty()); + + // 좋아요 상위 4개 사진 ID 조회 Mock + List topIds = List.of(10L, 20L, 30L, 40L); + given(photoRepository.findTop4CompletedPhotoIdsByLikes(eq(1L), eq(PhotoStatus.COMPLETED), any())) + .willReturn(topIds); + + // 사진 객체 조회 Mock (순서 보장을 위해 실제 리스트 반환) + Photo p1 = mock(Photo.class); given(p1.getId()).willReturn(10L); + Photo p2 = mock(Photo.class); given(p2.getId()).willReturn(20L); + Photo p3 = mock(Photo.class); given(p3.getId()).willReturn(30L); + Photo p4 = mock(Photo.class); given(p4.getId()).willReturn(40L); + + given(photoRepository.findAllByIdIn(topIds)).willReturn(List.of(p1, p2, p3, p4)); + given(cdnUrlResolver.resolveOriginal(any())).willReturn("http://cdn.url/image.jpg"); + given(photoLikesRepository.countDistinctUserIdsByPhotoIds(topIds)).willReturn(5L); + // when + Cheese4cutResponse response = cheese4cutService.getCheese4cutByAlbumCode(null, code); + + // then + assertThat(response).isInstanceOf(Cheese4cutPreviewResponse.class); + Cheese4cutPreviewResponse preview = (Cheese4cutPreviewResponse) response; + + assertThat(preview.isFinalized()).isFalse(); + assertThat(preview.previewPhotos()).hasSize(4); + assertThat(preview.uniqueLikesCount()).isEqualTo(5); + } + + @Test + @DisplayName("이미 치즈네컷이 확정된 앨범에 대해 다시 확정을 시도하면 예외가 발생한다.") + void finalizeCheese4cut_Fail_AlreadyFinalized() { + // given + String code = "code"; + User user = mock(User.class); + Album album = mock(Album.class); + given(album.getId()).willReturn(1L); + + given(albumValidator.validateAlbumCode(code)).willReturn(album); + given(album.isExpired()).willReturn(false); + + // 이미 확정된 내역이 존재함 (Optional.of) + given(cheese4cutRepository.findByAlbumId(album.getId())) + .willReturn(Optional.of(mock(Cheese4cut.class))); + + Cheese4cutFixedRequest request = new Cheese4cutFixedRequest(List.of(1L, 2L, 3L, 4L)); + + // when & then + assertThatThrownBy(() -> cheese4cutService.finalizeCheese4cut(user, code, request)) + .isInstanceOf(Cheese4cutException.class) + .hasFieldOrPropertyWithValue("errorCode", Cheese4cutErrorCode.CHEESE4CUT_ALREADY_FINALIZED); + } + + @Test + @DisplayName("확정 전 미리보기 조회 시, 완료된 사진이 4장 미만이면 예외가 발생한다.") + void getCheese4cut_Preview_Fail_InsufficientPhotos() { + // given + String code = "code"; + Album album = mock(Album.class); + given(album.getId()).willReturn(1L); + given(albumRepository.findByCode(code)).willReturn(Optional.of(album)); + + // 확정 내역 없음 + given(cheese4cutRepository.findByAlbumId(1L)).willReturn(Optional.empty()); + + // 사진 조회 결과가 3장뿐임 + given(photoRepository.findTop4CompletedPhotoIdsByLikes(eq(1L), eq(PhotoStatus.COMPLETED), any())) + .willReturn(List.of(1L, 2L, 3L)); + + // when & then + assertThatThrownBy(() -> cheese4cutService.getCheese4cutByAlbumCode(null, code)) + .isInstanceOf(Cheese4cutException.class) + .hasFieldOrPropertyWithValue("errorCode", Cheese4cutErrorCode.INSUFFICIENT_COUNT_FOR_CHEESE4CUT); + } +} \ No newline at end of file From 97aed30d16a8603ecf262f9678c9ed28a1a844b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Mon, 24 Nov 2025 23:53:51 +0900 Subject: [PATCH 367/402] =?UTF-8?q?#78=20test:=20=EC=95=A8=EB=B2=94=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cheeeese/album/AlbumServiceTest.java | 196 ++++++++++++++++++ 1 file changed, 196 insertions(+) create mode 100644 src/test/java/com/cheeeese/album/AlbumServiceTest.java diff --git a/src/test/java/com/cheeeese/album/AlbumServiceTest.java b/src/test/java/com/cheeeese/album/AlbumServiceTest.java new file mode 100644 index 0000000..ece0c15 --- /dev/null +++ b/src/test/java/com/cheeeese/album/AlbumServiceTest.java @@ -0,0 +1,196 @@ +package com.cheeeese.album; + +import com.cheeeese.album.application.AlbumService; +import com.cheeeese.album.application.validator.AlbumValidator; +import com.cheeeese.album.domain.Album; +import com.cheeeese.album.domain.UserAlbum; +import com.cheeeese.album.domain.type.AlbumJoinStatus; +import com.cheeeese.album.dto.response.AlbumEnterResponse; +import com.cheeeese.album.dto.response.ExistingEnterResponse; +import com.cheeeese.album.dto.response.NewEnterResponse; +import com.cheeeese.album.exception.AlbumException; +import com.cheeeese.album.exception.code.AlbumErrorCode; +import com.cheeeese.album.infrastructure.persistence.AlbumExpirationRedisRepository; +import com.cheeeese.album.infrastructure.persistence.AlbumRepository; +import com.cheeeese.album.infrastructure.persistence.UserAlbumRepository; +import com.cheeeese.global.util.resolver.CdnUrlResolver; +import com.cheeeese.photo.application.PhotoService; +import com.cheeeese.photo.infrastructure.persistence.PhotoLikesRepository; +import com.cheeeese.photo.infrastructure.persistence.PhotoRepository; +import com.cheeeese.user.domain.User; +import com.cheeeese.user.infrastructure.persistence.UserRepository; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Optional; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +@Tag("benchmark") +class AlbumServiceTest { + + private AlbumService albumService; + + // 모든 의존성 Mock 선언 (PhotoService 포함) + @Mock private AlbumValidator albumValidator; + @Mock private AlbumRepository albumRepository; + @Mock private UserAlbumRepository userAlbumRepository; + @Mock private UserRepository userRepository; + @Mock private PhotoRepository photoRepository; + @Mock private PhotoLikesRepository photoLikesRepository; + @Mock private PhotoService photoService; + @Mock private AlbumExpirationRedisRepository albumExpirationRedisRepository; + @Mock private CdnUrlResolver cdnUrlResolver; + + @BeforeEach + void setUp() { + // 생성자를 통해 직접 주입 + albumService = new AlbumService( + albumValidator, + albumRepository, + userAlbumRepository, + userRepository, + photoRepository, + photoLikesRepository, + photoService, + albumExpirationRedisRepository, + cdnUrlResolver + ); + } + + @Test + @DisplayName("신규 참여자는 앨범 입장 시 GUEST 권한을 얻고 참여자 수가 증가한다.") + void enterAlbum_NewUser() { + // given + String code = "album-code-123"; + + User user = mock(User.class); + given(user.getId()).willReturn(10L); + + User maker = mock(User.class); + given(maker.getId()).willReturn(100L); + + Album album = Album.builder() + .makerId(maker.getId()) + .title("Test Album") + .themeEmoji("🧀") + .eventDate(LocalDate.now()) + .expiredAt(LocalDateTime.now().plusDays(7)) + .build(); + + // 1. Validator 통과 설정 + given(albumValidator.validateAlbumCode(code)).willReturn(album); + doNothing().when(albumValidator).validateAlbumEntry(album, user); + doNothing().when(albumValidator).validateAlbumCapacity(album); + + // 2. 기존 참여 이력 없음 (신규) + given(userAlbumRepository.findByUserIdAndAlbumId(user.getId(), album.getId())) + .willReturn(Optional.empty()); + + // 3. Maker 정보 조회 + given(userRepository.findById(album.getMakerId())).willReturn(Optional.of(maker)); + + // 4. 참여자 수 증가 성공 + given(albumRepository.incrementParticipantCountAtomically(album.getId())).willReturn(1); + + // 5. [중요] PhotoService 호출 시 빈 리스트 반환 (NPE 방지) + given(photoService.getRecentPhotosForNewEnter(album.getId())).willReturn(List.of()); + + // when + AlbumEnterResponse response = albumService.enterAlbum(code, user); + + // then + assertThat(response).isInstanceOf(NewEnterResponse.class); + assertThat(response.joinStatus()).isEqualTo(AlbumJoinStatus.NEW); + + verify(userAlbumRepository).save(any(UserAlbum.class)); + verify(albumRepository).incrementParticipantCountAtomically(album.getId()); + } + + @Test + @DisplayName("기존에 나갔던 참여자가 재입장(REJOINED)하면 isVisible이 true로 변경된다.") + void enterAlbum_RejoinedUser() { + // given + String code = "album-code-rejoin"; + User user = mock(User.class); + given(user.getId()).willReturn(20L); + + User maker = mock(User.class); + given(maker.getId()).willReturn(100L); + + Album album = Album.builder() + .makerId(maker.getId()) + .title("Rejoin Album") + .themeEmoji("📸") + .eventDate(LocalDate.now()) + .expiredAt(LocalDateTime.now().plusDays(7)) + .build(); + + given(albumValidator.validateAlbumCode(code)).willReturn(album); + doNothing().when(albumValidator).validateAlbumEntry(album, user); + + // 기존 참여 정보 존재 (isVisible=false) -> 재입장 케이스 + UserAlbum userAlbum = mock(UserAlbum.class); + given(userAlbum.isVisible()).willReturn(false); + + given(userAlbumRepository.findByUserIdAndAlbumId(user.getId(), album.getId())) + .willReturn(Optional.of(userAlbum)); + + given(userRepository.findById(album.getMakerId())).willReturn(Optional.of(maker)); + + // when + AlbumEnterResponse response = albumService.enterAlbum(code, user); + + // then + assertThat(response).isInstanceOf(ExistingEnterResponse.class); + assertThat(response.joinStatus()).isEqualTo(AlbumJoinStatus.REJOINED); + + verify(userAlbum).show(); + } + + @Test + @DisplayName("앨범 정원이 초과된 경우 입장이 거부되고 예외가 발생한다.") + void enterAlbum_Fail_MaxParticipantReached() { + // given + String code = "full-album-code"; + User user = mock(User.class); + Album album = mock(Album.class); + + Long makerId = 999L; + given(album.getMakerId()).willReturn(makerId); + + given(albumValidator.validateAlbumCode(code)).willReturn(album); + doNothing().when(albumValidator).validateAlbumEntry(album, user); + + // 기존 참여자가 아님 + given(userAlbumRepository.findByUserIdAndAlbumId(user.getId(), album.getId())) + .willReturn(Optional.empty()); + + // Maker 정보 조회 Mocking 추가 + given(userRepository.findById(makerId)).willReturn(Optional.of(mock(User.class))); + + // 정원 체크 통과 가정 + doNothing().when(albumValidator).validateAlbumCapacity(album); + + // 핵심: 업데이트 된 행의 개수가 0 (업데이트 실패 = 정원 초과) + given(albumRepository.incrementParticipantCountAtomically(album.getId())).willReturn(0); + + // when & then + assertThatThrownBy(() -> albumService.enterAlbum(code, user)) + .isInstanceOf(AlbumException.class) + .hasFieldOrPropertyWithValue("errorCode", AlbumErrorCode.ALBUM_MAX_PARTICIPANT_REACHED); + } +} \ No newline at end of file From aea237a932064c4c98236a3264b688f8cf12dc34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Mon, 24 Nov 2025 23:54:06 +0900 Subject: [PATCH 368/402] =?UTF-8?q?#78=20test:=20100=EB=AA=85=EC=9D=98=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=EC=9E=90=EA=B0=80=20=EB=8F=99=EC=8B=9C?= =?UTF-8?q?=EC=97=90=20=EC=95=A8=EB=B2=94=EC=97=90=20=EC=9E=85=EC=9E=A5?= =?UTF-8?q?=ED=95=A0=20=EB=95=8C=20=EC=84=B1=EB=8A=A5=20=EB=B0=8F=20?= =?UTF-8?q?=EC=A0=95=ED=95=A9=EC=84=B1=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../album/benchmark/AlbumConcurrencyTest.java | 92 +++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 src/test/java/com/cheeeese/album/benchmark/AlbumConcurrencyTest.java diff --git a/src/test/java/com/cheeeese/album/benchmark/AlbumConcurrencyTest.java b/src/test/java/com/cheeeese/album/benchmark/AlbumConcurrencyTest.java new file mode 100644 index 0000000..1fa39eb --- /dev/null +++ b/src/test/java/com/cheeeese/album/benchmark/AlbumConcurrencyTest.java @@ -0,0 +1,92 @@ +package com.cheeeese.album.benchmark; + +import com.cheeeese.album.application.AlbumService; +import com.cheeeese.album.domain.Album; +import com.cheeeese.album.infrastructure.persistence.AlbumRepository; +import com.cheeeese.fixture.FixtureFactory; +import com.cheeeese.user.domain.User; +import com.cheeeese.user.infrastructure.persistence.UserRepository; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.atomic.AtomicInteger; + +import static org.assertj.core.api.Assertions.assertThat; + +@SpringBootTest +@Tag("benchmark") +public class AlbumConcurrencyTest { + + @Autowired private AlbumService albumService; + @Autowired private AlbumRepository albumRepository; + @Autowired private UserRepository userRepository; + + @Test + @DisplayName("100명의 사용자가 동시에 앨범에 입장할 때 성능 및 정합성 테스트") + void enterAlbumConcurrencyTest() throws InterruptedException { + // Given + int threadCount = 100; + User maker = userRepository.save(FixtureFactory.createKakaoUser()); + // 정원이 100명 이상인 앨범 생성 (그래야 에러 없이 성공 케이스 측정 가능) + Album album = FixtureFactory.createAlbum(maker.getId()); + // ※ FixtureFactory의 createAlbum이 participant를 4로 설정한다면 이 테스트를 위해 + // FixtureFactory를 수정하거나 빌더를 통해 100명 이상으로 설정해야 합니다. + // 여기서는 테스트를 위해 Repository에서 강제로 업데이트한다고 가정하거나 + // Album 객체 생성 시 participant를 넉넉하게 잡아야 합니다. + + // 임시로 참여 가능 인원 늘리기 (FixtureFactory 수정 없이 진행 시) + // 실제 코드에서는 엔티티 수정 메서드를 사용하거나 Fixture를 조정하세요. + // 예: album.updateParticipantCount(200); + albumRepository.save(album); + + ExecutorService executorService = Executors.newFixedThreadPool(32); // 스레드 풀 + CountDownLatch latch = new CountDownLatch(threadCount); + AtomicInteger successCount = new AtomicInteger(); + + long start = System.currentTimeMillis(); + + // When + for (int i = 0; i < threadCount; i++) { + final int index = i; + executorService.submit(() -> { + try { + // 각기 다른 유저 생성 + User guest = User.builder() + .name("Guest" + index) + .email("guest" + index + "@test.com") + .profileImage("P1") + .providerId("kakao_" + index) + .build(); + userRepository.save(guest); + + // 입장 시도 + albumService.enterAlbum(album.getCode(), guest); + successCount.getAndIncrement(); + } catch (Exception e) { + System.out.println("입장 실패: " + e.getMessage()); + } finally { + latch.countDown(); + } + }); + } + + latch.await(); // 모든 스레드가 끝날 때까지 대기 + long end = System.currentTimeMillis(); + + // Then + Album updatedAlbum = albumRepository.findById(album.getId()).orElseThrow(); + System.out.printf("동시 입장 요청 %d건 처리 시간: %d ms%n", threadCount, (end - start)); + System.out.printf("성공한 요청 수: %d%n", successCount.get()); + System.out.printf("DB 반영된 참여자 수: %d%n", updatedAlbum.getCurrentParticipant()); + + // 기존 1명(메이커) + 100명(게스트) = 101명이어야 함 (또는 로직에 따라 다름) + // enterAlbum 로직에 따라 100명이 정상적으로 들어갔는지 검증 + assertThat(updatedAlbum.getCurrentParticipant()).isEqualTo(1 + successCount.get()); + } +} From e49b999763512a7feccc10bccd5b1a98beedcd82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Mon, 24 Nov 2025 23:54:31 +0900 Subject: [PATCH 369/402] =?UTF-8?q?#78=20chore:=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=EB=A5=BC=20=EC=9C=84=ED=95=9C=20build.gradle=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/build.gradle b/build.gradle index 3463b0a..f296161 100644 --- a/build.gradle +++ b/build.gradle @@ -58,10 +58,14 @@ dependencies { implementation 'software.amazon.awssdk:s3:2.25.46' implementation 'software.amazon.awssdk:auth:2.25.46' implementation 'software.amazon.awssdk:regions:2.25.46' + + testImplementation 'com.h2database:h2' } tasks.named('test') { useJUnitPlatform { excludeTags 'benchmark' } + + jvmArgs '-XX:+EnableDynamicAgentLoading' } From 2189cfd2c4d3e361d929ad0ff4f6c7c26a8550e1 Mon Sep 17 00:00:00 2001 From: zyovn Date: Tue, 25 Nov 2025 03:03:14 +0900 Subject: [PATCH 370/402] =?UTF-8?q?#93=20feat:=20json=20=EA=B5=AC=EC=A1=B0?= =?UTF-8?q?=ED=99=94=20=EB=A1=9C=EA=B9=85=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/logback-spring.xml | 46 +++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 src/main/resources/logback-spring.xml diff --git a/src/main/resources/logback-spring.xml b/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..ccb9307 --- /dev/null +++ b/src/main/resources/logback-spring.xml @@ -0,0 +1,46 @@ + + + + + + + + + + {"type":"%X{type:-application}"} + + + + timestamp + KST + + + + level + + + + logger + + + + + + + + + stackTrace + + + + + + + + + + + + + + \ No newline at end of file From f739bc0f7d00a832e8b4112566e605b9250a0f6c Mon Sep 17 00:00:00 2001 From: zyovn Date: Wed, 26 Nov 2025 17:37:22 +0900 Subject: [PATCH 371/402] =?UTF-8?q?#96=20feat:=20=EC=95=A8=EB=B2=94=20?= =?UTF-8?q?=EB=82=98=EA=B0=80=EA=B8=B0=20API=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cheeeese/album/application/AlbumService.java | 12 ++++++++++++ .../album/application/validator/AlbumValidator.java | 11 +++++++++++ .../album/exception/code/AlbumErrorCode.java | 3 ++- .../cheeeese/album/presentation/AlbumController.java | 6 ++++++ .../com/cheeeese/global/common/code/SuccessCode.java | 1 + 5 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/cheeeese/album/application/AlbumService.java b/src/main/java/com/cheeeese/album/application/AlbumService.java index 88dbb1c..63b8fdd 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumService.java +++ b/src/main/java/com/cheeeese/album/application/AlbumService.java @@ -234,6 +234,18 @@ public List getAlbumBest4Cut(User user, String code) { .toList(); } + @Transactional + public void leaveUser(User user, String code) { + Album album = albumValidator.validateAlbumCode(code); + albumValidator.validateAlbumParticipant(album, user); + albumValidator.validateMakerLeaveAllowed(album, user); + + UserAlbum userAlbum = userAlbumRepository.findByUserIdAndAlbumId(user.getId(), album.getId()) + .orElseThrow(() -> new AlbumException(AlbumErrorCode.USER_NOT_PARTICIPANT)); + + userAlbum.hide(); + } + private User extractUser(Authentication authentication) { if (authentication == null || authentication instanceof AnonymousAuthenticationToken) { return null; diff --git a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java index 6694482..21be492 100644 --- a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java +++ b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java @@ -91,6 +91,17 @@ public void validateAlbumParticipant(Album album, User user) { .orElseThrow(() -> new AlbumException(AlbumErrorCode.USER_NOT_PARTICIPANT)); } + public void validateMakerLeaveAllowed(Album album, User user) { + if (!album.getMakerId().equals(user.getId())) { + return; + } + + // Maker일 경우, 만료된 앨범만 나가기 가능 + if (album.getStatus() != Album.AlbumStatus.EXPIRED) { + throw new AlbumException(AlbumErrorCode.MAKER_CANNOT_LEAVE_UNTIL_CLOSED); + } + } + private void validateAlbumExpiration(Album album) { if (album.isExpired()) { throw new AlbumException(AlbumErrorCode.ALBUM_EXPIRED); diff --git a/src/main/java/com/cheeeese/album/exception/code/AlbumErrorCode.java b/src/main/java/com/cheeeese/album/exception/code/AlbumErrorCode.java index 5d92841..46ddb8b 100644 --- a/src/main/java/com/cheeeese/album/exception/code/AlbumErrorCode.java +++ b/src/main/java/com/cheeeese/album/exception/code/AlbumErrorCode.java @@ -21,7 +21,8 @@ public enum AlbumErrorCode implements BaseCode { ALBUM_INVALID_CAPACITY(HttpStatus.BAD_REQUEST, "앨범 인원은 최소 1명 이상 최대 64명 이하여야 합니다."), ALBUM_CREATION_LIMIT_EXCEEDED(HttpStatus.CONFLICT, "사용자는 일주일에 최대 3개의 앨범만 생성할 수 있습니다."), USER_NOT_PARTICIPANT(HttpStatus.FORBIDDEN, "사용자는 해당 앨범의 참가자가 아닙니다."), - USER_NOT_MAKER(HttpStatus.FORBIDDEN, "해당 사용자는 MAKER가 아닙니다.") + USER_NOT_MAKER(HttpStatus.FORBIDDEN, "해당 사용자는 MAKER가 아닙니다."), + MAKER_CANNOT_LEAVE_UNTIL_CLOSED(HttpStatus.BAD_REQUEST, "앨범 메이커는 앨범이 닫힌 상태에서만 나갈 수 있습니다."), ; private final HttpStatus httpStatus; diff --git a/src/main/java/com/cheeeese/album/presentation/AlbumController.java b/src/main/java/com/cheeeese/album/presentation/AlbumController.java index 2f213b6..eb151f7 100644 --- a/src/main/java/com/cheeeese/album/presentation/AlbumController.java +++ b/src/main/java/com/cheeeese/album/presentation/AlbumController.java @@ -84,4 +84,10 @@ public CommonResponse> getAlbumBest4Cut( albumService.getAlbumBest4Cut(user, code) ); } + + @DeleteMapping("/{code}/participants/me") + public CommonResponse leaveUser(@CurrentUser User user, @PathVariable String code) { + albumService.leaveUser(user, code); + return CommonResponse.success(ALBUM_LEAVE_SUCCESS); + } } \ No newline at end of file diff --git a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java index 4dcdb33..f0ab4ab 100644 --- a/src/main/java/com/cheeeese/global/common/code/SuccessCode.java +++ b/src/main/java/com/cheeeese/global/common/code/SuccessCode.java @@ -34,6 +34,7 @@ public enum SuccessCode implements BaseCode { ALBUM_PARTICIPANT_FETCH_SUCCESS(HttpStatus.OK, "앨범 참여자 조회가 성공적으로 완료되었습니다."), ALBUM_INFO_GET_SUCCESS(HttpStatus.OK, "앨범 정보 조회가 성공적으로 완료되었습니다."), ALBUM_BEST4CUT_GET_SUCCESS(HttpStatus.OK, "베스트 앨범컷 조회가 성공적으로 완료되었습니다."), + ALBUM_LEAVE_SUCCESS(HttpStatus.OK, "앨범 나가기가 성공적으로 완료되었습니다."), // photo PHOTO_AVAILABLE_COUNT_FETCH_SUCCESS(HttpStatus.OK, "업로드 가능 사진 수 조회가 성공적으로 완료되었습니다."), From 483048cbad0a6d11ed968b69a2d682c92c3168ec Mon Sep 17 00:00:00 2001 From: zyovn Date: Wed, 26 Nov 2025 17:47:20 +0900 Subject: [PATCH 372/402] =?UTF-8?q?#96=20docs:=20swagger=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../album/application/AlbumService.java | 6 ++--- .../album/presentation/AlbumController.java | 1 + .../presentation/swagger/AlbumSwagger.java | 25 +++++++++++++++++++ 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/cheeeese/album/application/AlbumService.java b/src/main/java/com/cheeeese/album/application/AlbumService.java index 63b8fdd..bcf8d33 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumService.java +++ b/src/main/java/com/cheeeese/album/application/AlbumService.java @@ -1,5 +1,6 @@ package com.cheeeese.album.application; +import com.cheeeese.album.application.support.AlbumReader; import com.cheeeese.album.application.validator.AlbumValidator; import com.cheeeese.album.domain.Album; import com.cheeeese.album.domain.type.AlbumJoinStatus; @@ -63,6 +64,7 @@ public class AlbumService { private final PhotoService photoService; private final AlbumExpirationRedisRepository albumExpirationRedisRepository; private final CdnUrlResolver cdnUrlResolver; + private final AlbumReader albumReader; @Transactional public AlbumCreationResponse createAlbum(User user, AlbumCreationRequest request) { @@ -237,11 +239,9 @@ public List getAlbumBest4Cut(User user, String code) { @Transactional public void leaveUser(User user, String code) { Album album = albumValidator.validateAlbumCode(code); - albumValidator.validateAlbumParticipant(album, user); albumValidator.validateMakerLeaveAllowed(album, user); - UserAlbum userAlbum = userAlbumRepository.findByUserIdAndAlbumId(user.getId(), album.getId()) - .orElseThrow(() -> new AlbumException(AlbumErrorCode.USER_NOT_PARTICIPANT)); + UserAlbum userAlbum = albumReader.getAlbumParticipant(album, user); userAlbum.hide(); } diff --git a/src/main/java/com/cheeeese/album/presentation/AlbumController.java b/src/main/java/com/cheeeese/album/presentation/AlbumController.java index eb151f7..6d4631d 100644 --- a/src/main/java/com/cheeeese/album/presentation/AlbumController.java +++ b/src/main/java/com/cheeeese/album/presentation/AlbumController.java @@ -85,6 +85,7 @@ public CommonResponse> getAlbumBest4Cut( ); } + @Override @DeleteMapping("/{code}/participants/me") public CommonResponse leaveUser(@CurrentUser User user, @PathVariable String code) { albumService.leaveUser(user, code); diff --git a/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java b/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java index 29c1a39..fd217f9 100644 --- a/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java +++ b/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java @@ -279,4 +279,29 @@ CommonResponse> getAlbumBest4Cut( @CurrentUser User user, @PathVariable String code ); + + @Operation( + summary = "앨범 나가기 API", + description = """ + ### PathVariable + --- + `code`: 앨범 코드 (String) \n + + ### 로직 상세 + --- + 1. MAKER일 경우, 만료된 앨범만 나가기 가능 + 2. GUEST는 만료 여부 상관없이 나가기 가능 + 3. 나간 앨범은 마이 페이지에서 보이지 않음 + """ + ) + @ApiResponses(value = { + @ApiResponse( + responseCode = "200", + description = "앨범 나가기 성공적으로 실행되었습니다." + ) + }) + CommonResponse leaveUser( + @CurrentUser User user, + @PathVariable String code + ); } \ No newline at end of file From cc534f8034019d0c1361777caabe3134eb1b8d30 Mon Sep 17 00:00:00 2001 From: zyovn Date: Wed, 26 Nov 2025 17:48:11 +0900 Subject: [PATCH 373/402] =?UTF-8?q?#96=20refactor:=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=EB=AA=85=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cheeeese/album/application/AlbumService.java | 4 +--- .../java/com/cheeeese/album/presentation/AlbumController.java | 4 ++-- .../com/cheeeese/album/presentation/swagger/AlbumSwagger.java | 2 +- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/cheeeese/album/application/AlbumService.java b/src/main/java/com/cheeeese/album/application/AlbumService.java index bcf8d33..499d0ba 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumService.java +++ b/src/main/java/com/cheeeese/album/application/AlbumService.java @@ -22,7 +22,6 @@ import com.cheeeese.photo.domain.Photo; import com.cheeeese.photo.domain.PhotoStatus; import com.cheeeese.album.dto.response.AlbumBest4CutResponse; -import com.cheeeese.photo.infrastructure.mapper.PhotoMapper; import com.cheeeese.photo.infrastructure.persistence.PhotoLikesRepository; import com.cheeeese.photo.infrastructure.persistence.PhotoRepository; import com.cheeeese.user.domain.User; @@ -47,7 +46,6 @@ import java.util.List; import java.util.Optional; import java.util.Set; -import java.util.stream.Collectors; @Slf4j @Service @@ -237,7 +235,7 @@ public List getAlbumBest4Cut(User user, String code) { } @Transactional - public void leaveUser(User user, String code) { + public void leaveAlbum(User user, String code) { Album album = albumValidator.validateAlbumCode(code); albumValidator.validateMakerLeaveAllowed(album, user); diff --git a/src/main/java/com/cheeeese/album/presentation/AlbumController.java b/src/main/java/com/cheeeese/album/presentation/AlbumController.java index 6d4631d..bd7e563 100644 --- a/src/main/java/com/cheeeese/album/presentation/AlbumController.java +++ b/src/main/java/com/cheeeese/album/presentation/AlbumController.java @@ -87,8 +87,8 @@ public CommonResponse> getAlbumBest4Cut( @Override @DeleteMapping("/{code}/participants/me") - public CommonResponse leaveUser(@CurrentUser User user, @PathVariable String code) { - albumService.leaveUser(user, code); + public CommonResponse leaveAlbum(@CurrentUser User user, @PathVariable String code) { + albumService.leaveAlbum(user, code); return CommonResponse.success(ALBUM_LEAVE_SUCCESS); } } \ No newline at end of file diff --git a/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java b/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java index fd217f9..63d6c35 100644 --- a/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java +++ b/src/main/java/com/cheeeese/album/presentation/swagger/AlbumSwagger.java @@ -300,7 +300,7 @@ CommonResponse> getAlbumBest4Cut( description = "앨범 나가기 성공적으로 실행되었습니다." ) }) - CommonResponse leaveUser( + CommonResponse leaveAlbum( @CurrentUser User user, @PathVariable String code ); From ac7e14fe5e863d535ec0b7d2eca91979b1734c1d Mon Sep 17 00:00:00 2001 From: zyovn Date: Wed, 26 Nov 2025 19:14:57 +0900 Subject: [PATCH 374/402] =?UTF-8?q?#98=20chore:=20=ED=94=84=EB=A1=9C?= =?UTF-8?q?=EB=A9=94=ED=85=8C=EC=9A=B0=EC=8A=A4=20=EA=B4=80=EB=A0=A8=20?= =?UTF-8?q?=EC=9D=98=EC=A1=B4=EC=84=B1=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20?= =?UTF-8?q?securityConfig=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 4 ++++ src/main/java/com/cheeeese/global/config/SecurityConfig.java | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index f296161..3219efa 100644 --- a/build.gradle +++ b/build.gradle @@ -60,6 +60,10 @@ dependencies { implementation 'software.amazon.awssdk:regions:2.25.46' testImplementation 'com.h2database:h2' + + // prometheus + implementation 'org.springframework.boot:spring-boot-starter-actuator' + implementation 'io.micrometer:micrometer-registry-prometheus' } tasks.named('test') { diff --git a/src/main/java/com/cheeeese/global/config/SecurityConfig.java b/src/main/java/com/cheeeese/global/config/SecurityConfig.java index 4303429..6ca2946 100644 --- a/src/main/java/com/cheeeese/global/config/SecurityConfig.java +++ b/src/main/java/com/cheeeese/global/config/SecurityConfig.java @@ -45,7 +45,8 @@ public class SecurityConfig { "/internal/thumbnail/complete", "/v1/user/profile-images", "/v1/album/*/info", - "/v1/album/*/available-count" + "/v1/album/*/available-count", + "/actuator/**" }; @Bean From 6654f8435238897f4503f573dccac47c557f1de7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Wed, 26 Nov 2025 22:55:59 +0900 Subject: [PATCH 375/402] =?UTF-8?q?#100=20fix:=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20import=EB=AC=B8=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cheeeese/album/dto/response/ClosedAlbumSummaryResponse.java | 1 - .../cheeeese/album/dto/response/OpenAlbumSummaryResponse.java | 1 - 2 files changed, 2 deletions(-) diff --git a/src/main/java/com/cheeeese/album/dto/response/ClosedAlbumSummaryResponse.java b/src/main/java/com/cheeeese/album/dto/response/ClosedAlbumSummaryResponse.java index 4e0e65d..3d39fad 100644 --- a/src/main/java/com/cheeeese/album/dto/response/ClosedAlbumSummaryResponse.java +++ b/src/main/java/com/cheeeese/album/dto/response/ClosedAlbumSummaryResponse.java @@ -1,6 +1,5 @@ package com.cheeeese.album.dto.response; -import com.fasterxml.jackson.annotation.JsonInclude; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Builder; diff --git a/src/main/java/com/cheeeese/album/dto/response/OpenAlbumSummaryResponse.java b/src/main/java/com/cheeeese/album/dto/response/OpenAlbumSummaryResponse.java index e94c989..70a80b2 100644 --- a/src/main/java/com/cheeeese/album/dto/response/OpenAlbumSummaryResponse.java +++ b/src/main/java/com/cheeeese/album/dto/response/OpenAlbumSummaryResponse.java @@ -1,6 +1,5 @@ package com.cheeeese.album.dto.response; -import com.fasterxml.jackson.annotation.JsonInclude; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Builder; From 31197242c5e6d90dfb98276991e4567a38bdf7f1 Mon Sep 17 00:00:00 2001 From: zyovn Date: Wed, 26 Nov 2025 23:19:36 +0900 Subject: [PATCH 376/402] =?UTF-8?q?#101=20fix:=201=EC=8B=9C=EA=B0=84=20?= =?UTF-8?q?=EC=9D=B4=EB=82=B4=20=EB=8B=A4=EC=9A=B4=EB=A1=9C=EB=93=9C=20?= =?UTF-8?q?=EC=97=AC=EB=B6=80=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cheeeese/photo/application/PhotoQueryService.java | 2 +- .../infrastructure/persistence/PhotoHistoryRepository.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java b/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java index e501dc3..435e513 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java @@ -101,7 +101,7 @@ public PhotoDetailResponse getPhotoDetail(User user, String code, Long photoId) boolean isLiked = photoLikesRepository.existsByUserIdAndPhotoId(user.getId(), photo.getId()); boolean isDownloaded = photoHistoryRepository.existsByUserIdAndPhotoId(user.getId(), photo.getId()); - boolean isRecentlyDownloaded = photoHistoryRepository.existsByUserIdAndPhotoIdAndCreatedAtAfter( + boolean isRecentlyDownloaded = photoHistoryRepository.existsByUserIdAndPhotoIdAndUpdatedAtAfter( user.getId(), photo.getId(), LocalDateTime.now().minusHours(1) ); boolean canDelete = photo.getUser().getId().equals(user.getId()) diff --git a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoHistoryRepository.java b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoHistoryRepository.java index 4987ceb..37ae07c 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoHistoryRepository.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoHistoryRepository.java @@ -13,7 +13,7 @@ public interface PhotoHistoryRepository extends JpaRepository { boolean existsByUserIdAndPhotoId(Long userId, Long photoId); - boolean existsByUserIdAndPhotoIdAndCreatedAtAfter(Long userId, Long photoId, LocalDateTime createdAt); + boolean existsByUserIdAndPhotoIdAndUpdatedAtAfter(Long userId, Long photoId, LocalDateTime updatedAt); @Query(""" SELECT ph.photo.id @@ -28,7 +28,7 @@ public interface PhotoHistoryRepository extends JpaRepository= :threshold + AND ph.updatedAt >= :threshold """) Set findRecentlyDownloadedPhotoIds( @Param("userId") Long userId, From bfd593c0b30629b870759e768f474be97e23875e Mon Sep 17 00:00:00 2001 From: zyovn Date: Wed, 26 Nov 2025 23:24:52 +0900 Subject: [PATCH 377/402] =?UTF-8?q?#101=20refactor:=20=EB=9D=B1=ED=95=9C?= =?UTF-8?q?=20=EC=82=AC=EC=9A=A9=EC=9E=90=20=EB=AA=A9=EB=A1=9D=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20=ED=94=84=EB=A1=9C=ED=95=84=20=EC=9D=B4=EB=AF=B8?= =?UTF-8?q?=EC=A7=80=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cheeeese/photo/application/PhotoInfoService.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/cheeeese/photo/application/PhotoInfoService.java b/src/main/java/com/cheeeese/photo/application/PhotoInfoService.java index a4cc930..52518c9 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoInfoService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoInfoService.java @@ -3,6 +3,7 @@ import com.cheeeese.album.application.validator.AlbumValidator; import com.cheeeese.album.domain.Album; import com.cheeeese.album.domain.type.Role; +import com.cheeeese.global.util.ProfileImageUtil; import com.cheeeese.global.util.resolver.CdnUrlResolver; import com.cheeeese.photo.application.support.PhotoReader; import com.cheeeese.photo.domain.Photo; @@ -42,12 +43,11 @@ public PhotoLikedUserResponse getPhotoLikedUsers(User user, String code, Long ph List likers = users.stream() .map(liker -> { - ProfileImageType type = ProfileImageType.fromName(liker.getProfileImage()); - String profileImageUrl = cdnUrlResolver.resolveProfile(type.getPath()); + String profileImage = ProfileImageUtil.resolveProfileImage(photo.getUser(), cdnUrlResolver); boolean isMe = liker.getId().equals(user.getId()); Role role = liker.getId().equals(album.getMakerId()) ? Role.MAKER : Role.GUEST; - return PhotoMapper.toPhotoLiker(liker, profileImageUrl, isMe, role); + return PhotoMapper.toPhotoLiker(liker, profileImage, isMe, role); }) .toList(); From c4d065582b62338d22f884e5a9d276a7a8c0d882 Mon Sep 17 00:00:00 2001 From: zyovn Date: Wed, 26 Nov 2025 23:30:49 +0900 Subject: [PATCH 378/402] =?UTF-8?q?#101=20feat:=20=EC=82=AC=EC=A7=84=20?= =?UTF-8?q?=EB=AA=A9=EB=A1=9D=20=EC=A1=B0=ED=9A=8C=EC=97=90=20=EC=97=85?= =?UTF-8?q?=EB=A1=9C=EB=8D=94=20=ED=94=84=EB=A1=9C=ED=95=84=20=EC=9D=B4?= =?UTF-8?q?=EB=AF=B8=EC=A7=80=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cheeeese/photo/application/PhotoQueryService.java | 3 ++- .../com/cheeeese/photo/dto/response/PhotoListResponse.java | 3 +++ .../com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java | 2 ++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java b/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java index 435e513..edb82bf 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoQueryService.java @@ -118,9 +118,10 @@ private PhotoPageResponse getPhotoPageFromDB(String code, int page, int size, Al List responses = photos.getContent().stream() .map(photo -> { + String profileImage = ProfileImageUtil.resolveProfileImage(photo.getUser(), cdnUrlResolver); String imageUrl = cdnUrlResolver.resolveOriginal(photo.getImageUrl()); String thumbnailUrl = cdnUrlResolver.resolveThumbnail(photo.getThumbnailUrl()); - return PhotoMapper.toPhotoListResponse(photo, imageUrl, thumbnailUrl, false, false); + return PhotoMapper.toPhotoListResponse(photo, profileImage, imageUrl, thumbnailUrl, false, false); }) .toList(); diff --git a/src/main/java/com/cheeeese/photo/dto/response/PhotoListResponse.java b/src/main/java/com/cheeeese/photo/dto/response/PhotoListResponse.java index f32a969..889c3f9 100644 --- a/src/main/java/com/cheeeese/photo/dto/response/PhotoListResponse.java +++ b/src/main/java/com/cheeeese/photo/dto/response/PhotoListResponse.java @@ -8,6 +8,7 @@ description = "사진 목록 조회 API", requiredProperties = { "photoId", + "profileImage", "thumbnailUrl", "likeCnt", "isLiked", @@ -22,6 +23,8 @@ public record PhotoListResponse( @Schema(description = "사진 ID", example = "1") Long photoId, + String profileImage, + @Schema(description = "사진 원본 url", example = "example.jpg") String imageUrl, diff --git a/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java b/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java index b0d66ec..50d0228 100644 --- a/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java +++ b/src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java @@ -65,6 +65,7 @@ public static PhotoDownloadResponse toPhotoDownloadResponse(List Date: Wed, 26 Nov 2025 23:39:34 +0900 Subject: [PATCH 379/402] =?UTF-8?q?#101=20docs:=20swagger=20schema=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cheeeese/photo/dto/response/PhotoListResponse.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/cheeeese/photo/dto/response/PhotoListResponse.java b/src/main/java/com/cheeeese/photo/dto/response/PhotoListResponse.java index 889c3f9..680a55c 100644 --- a/src/main/java/com/cheeeese/photo/dto/response/PhotoListResponse.java +++ b/src/main/java/com/cheeeese/photo/dto/response/PhotoListResponse.java @@ -23,6 +23,7 @@ public record PhotoListResponse( @Schema(description = "사진 ID", example = "1") Long photoId, + @Schema(description = "업로더 프로필 이미지", example = "example.jpg") String profileImage, @Schema(description = "사진 원본 url", example = "example.jpg") From 8a92e1274f50c42c416b4c1b947c1d7d0739ef25 Mon Sep 17 00:00:00 2001 From: zyovn Date: Wed, 26 Nov 2025 23:45:30 +0900 Subject: [PATCH 380/402] =?UTF-8?q?#101=20fix:=20=ED=94=BC=EB=93=9C?= =?UTF-8?q?=EB=B0=B1=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cheeeese/photo/application/PhotoInfoService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/cheeeese/photo/application/PhotoInfoService.java b/src/main/java/com/cheeeese/photo/application/PhotoInfoService.java index 52518c9..fb1c705 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoInfoService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoInfoService.java @@ -43,7 +43,7 @@ public PhotoLikedUserResponse getPhotoLikedUsers(User user, String code, Long ph List likers = users.stream() .map(liker -> { - String profileImage = ProfileImageUtil.resolveProfileImage(photo.getUser(), cdnUrlResolver); + String profileImage = ProfileImageUtil.resolveProfileImage(liker, cdnUrlResolver); boolean isMe = liker.getId().equals(user.getId()); Role role = liker.getId().equals(album.getMakerId()) ? Role.MAKER : Role.GUEST; From d15f95d0f11fe8e32f12482949d62a5e2191343f Mon Sep 17 00:00:00 2001 From: zyovn Date: Thu, 27 Nov 2025 00:07:26 +0900 Subject: [PATCH 381/402] =?UTF-8?q?#101=20chore:=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20import=EB=AC=B8=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cheeeese/photo/application/PhotoInfoService.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/com/cheeeese/photo/application/PhotoInfoService.java b/src/main/java/com/cheeeese/photo/application/PhotoInfoService.java index fb1c705..b5a68ea 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoInfoService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoInfoService.java @@ -8,13 +8,10 @@ import com.cheeeese.photo.application.support.PhotoReader; import com.cheeeese.photo.domain.Photo; import com.cheeeese.photo.dto.response.PhotoLikedUserResponse; -import com.cheeeese.photo.exception.PhotoException; -import com.cheeeese.photo.exception.code.PhotoErrorCode; import com.cheeeese.photo.infrastructure.mapper.PhotoMapper; import com.cheeeese.photo.infrastructure.persistence.PhotoLikesRepository; import com.cheeeese.photo.infrastructure.persistence.PhotoRepository; import com.cheeeese.user.domain.User; -import com.cheeeese.user.domain.type.ProfileImageType; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; From 5b1bd698bea9dc31ae88e8eccaf96cbcc08221ab Mon Sep 17 00:00:00 2001 From: zyovn Date: Thu, 27 Nov 2025 00:09:34 +0900 Subject: [PATCH 382/402] =?UTF-8?q?#101=20chore:=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=EC=9D=98=EC=A1=B4=EC=84=B1=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cheeeese/photo/application/PhotoInfoService.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/cheeeese/photo/application/PhotoInfoService.java b/src/main/java/com/cheeeese/photo/application/PhotoInfoService.java index b5a68ea..1b60963 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoInfoService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoInfoService.java @@ -23,7 +23,6 @@ @Transactional(readOnly = true) public class PhotoInfoService { - private final PhotoRepository photoRepository; private final PhotoLikesRepository photoLikesRepository; private final PhotoReader photoReader; private final AlbumValidator albumValidator; From ae2287a5893836560fb64b8aa4f971976611147f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Thu, 27 Nov 2025 00:32:35 +0900 Subject: [PATCH 383/402] docs: Expand README with API and architecture details Added detailed sections for API documentation, ERD, system architecture, technology stack, CI/CD, and monitoring. --- README.md | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 554ba03..943d520 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,32 @@ # BE -🧀 Kusitms 32nd Cheeeese Backend Repository 🧀 + +## API 명세서 +[[Swagger] 🧀 치이이즈 API 명세서](https://dev.say-cheese.me/swagger-ui/index.html#/) + +## ERD +Cheeeese (2) + +## 시스템 아키텍처 +image + +## 기술 스택 +- Language & Framework + - Spring Boot 3.5.6 + - Java 21 + - JPA + +- Database & Cache + - MySQL + - Redis + +- CI/CD & Deployment + - GitHub Actions + Docker + - 코드 푸시 → 자동 빌드 → 테스트 → Docker 이미지 생성 → 배포까지 자동화 + - 컨테이너 기반으로 환경 일관성 확보 및 무중단 배포 가능 + - 운영 환경에 맞춘 Blue-Green 방식 구현 + +- Monitoring & Logging + - Promtail : 서버 로그를 수집하여 중앙 집중형 로깅 구성 + - Loki : 비용 최적화된 로그 저장소로 대량 로그 처리에 적합 + - Grafana : 대시보드를 통해 서버 상태·로그·지표 실시간 시각화 + - Prometheus : 서버/애플리케이션 메트릭 수집 및 Alert 기반 모니터링 구현 From 7e1bfff2fa12852a1e658ceea1756794cfc062e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Thu, 27 Nov 2025 01:37:12 +0900 Subject: [PATCH 384/402] =?UTF-8?q?#100=20feat:=20=EC=9A=B4=EC=98=81=20?= =?UTF-8?q?=EC=A7=80=ED=91=9C=20=EB=B6=84=EC=84=9D=EC=9D=84=20=EC=9C=84?= =?UTF-8?q?=ED=95=9C=20AlbumLogger=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../album/application/logger/AlbumLogger.java | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 src/main/java/com/cheeeese/album/application/logger/AlbumLogger.java diff --git a/src/main/java/com/cheeeese/album/application/logger/AlbumLogger.java b/src/main/java/com/cheeeese/album/application/logger/AlbumLogger.java new file mode 100644 index 0000000..7284152 --- /dev/null +++ b/src/main/java/com/cheeeese/album/application/logger/AlbumLogger.java @@ -0,0 +1,57 @@ +package com.cheeeese.album.application.logger; + +import com.cheeeese.album.domain.type.Role; +import lombok.extern.slf4j.Slf4j; +import org.slf4j.MDC; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; + +@Slf4j +@Component +public class AlbumLogger { + + private static final String STAT_PREFIX = "[STAT]"; + + /** + * [지표 1] 앨범 생성 + * album_created(user_id, album_code, expected_participant, created_at) + */ + public void logAlbumCreated(Long userId, String albumCode, int expectedParticipant) { + try { + MDC.put("type", "album"); + log.info("{} album_created | user_id={} album_code={} expected_participant={} created_at={}", + STAT_PREFIX, userId, albumCode, expectedParticipant, LocalDateTime.now()); + } finally { + MDC.remove("type"); + } + } + + /** + * [지표 1, 2] 앨범 입장 (신규) + * album_joined(user_id, album_code, is_first_join, photo_exist_on_join, joined_at) + */ + public void logAlbumJoined(Long userId, String albumCode, boolean photoExistOnJoin) { + try { + MDC.put("type", "album"); + log.info("{} album_joined | user_id={} album_code={} is_first_join=true photo_exist_on_join={} joined_at={}", + STAT_PREFIX, userId, albumCode, photoExistOnJoin, LocalDateTime.now()); + } finally { + MDC.remove("type"); + } + } + + /** + * [지표 2, 4] 앨범 재방문 (조회) + * album_view_start(user_id, album_code, role, viewed_at) + */ + public void logAlbumViewed(Long userId, String albumCode, Role role) { + try { + MDC.put("type", "album"); + log.info("{} album_view_start | user_id={} album_code={} role={} viewed_at={}", + STAT_PREFIX, userId, albumCode, role, LocalDateTime.now()); + } finally { + MDC.remove("type"); + } + } +} \ No newline at end of file From 5c812a68b980fe2e7c7dacd78bb2d8b6e96bb717 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Thu, 27 Nov 2025 01:37:29 +0900 Subject: [PATCH 385/402] =?UTF-8?q?#100=20feat:=20=EC=9A=B4=EC=98=81=20?= =?UTF-8?q?=EC=A7=80=ED=91=9C=20=EB=B6=84=EC=84=9D=EC=9D=84=20=EC=9C=84?= =?UTF-8?q?=ED=95=9C=20PhotoLogger=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../photo/application/logger/PhotoLogger.java | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 src/main/java/com/cheeeese/photo/application/logger/PhotoLogger.java diff --git a/src/main/java/com/cheeeese/photo/application/logger/PhotoLogger.java b/src/main/java/com/cheeeese/photo/application/logger/PhotoLogger.java new file mode 100644 index 0000000..2e55fa6 --- /dev/null +++ b/src/main/java/com/cheeeese/photo/application/logger/PhotoLogger.java @@ -0,0 +1,43 @@ +package com.cheeeese.photo.application.logger; + +import lombok.extern.slf4j.Slf4j; +import org.slf4j.MDC; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; +import java.util.List; + +@Slf4j +@Component +public class PhotoLogger { + + private static final String STAT_PREFIX = "[STAT]"; + + /** + * [지표 2, 3] 사진 업로드 완료 + * photo_upload_completed(user_id, album_code, photo_id, created_at) + */ + public void logUploadCompleted(Long userId, String albumCode, Long photoId) { + try { + MDC.put("type", "photo"); + log.info("{} photo_upload_completed | user_id={} album_code={} photo_id={} created_at={}", + STAT_PREFIX, userId, albumCode, photoId, LocalDateTime.now()); + } finally { + MDC.remove("type"); + } + } + + /** + * [지표 3, 5] 사진 다운로드 + * photo_download_log(user_id, album_code, photo_ids, requested_at) + */ + public void logDownload(Long userId, String albumCode, List photoIds) { + try { + MDC.put("type", "photo"); + log.info("{} photo_download_log | user_id={} album_code={} photo_ids={} requested_at={}", + STAT_PREFIX, userId, albumCode, photoIds, LocalDateTime.now()); + } finally { + MDC.remove("type"); + } + } +} \ No newline at end of file From 5d001ae1349952e14ca3cca00c81a458b3dcdd23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Thu, 27 Nov 2025 01:37:54 +0900 Subject: [PATCH 386/402] =?UTF-8?q?#100=20feat:=20=EC=82=AC=EC=A7=84=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20=EC=84=9C=EB=B9=84=EC=8A=A4=EC=97=90=20?= =?UTF-8?q?=EB=A1=9C=EA=B7=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../photo/application/PhotoCallbackService.java | 6 ++++++ .../com/cheeeese/photo/application/PhotoService.java | 10 ++++++++++ 2 files changed, 16 insertions(+) diff --git a/src/main/java/com/cheeeese/photo/application/PhotoCallbackService.java b/src/main/java/com/cheeeese/photo/application/PhotoCallbackService.java index 902d157..c40f8e9 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoCallbackService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoCallbackService.java @@ -1,6 +1,7 @@ package com.cheeeese.photo.application; import com.cheeeese.album.infrastructure.persistence.AlbumRepository; +import com.cheeeese.photo.application.logger.PhotoLogger; import com.cheeeese.photo.domain.Photo; import com.cheeeese.photo.domain.PhotoStatus; import com.cheeeese.photo.dto.request.PhotoCompleteRequest; @@ -22,6 +23,8 @@ public class PhotoCallbackService { private final AlbumRepository albumRepository; private final UserService userService; + private final PhotoLogger photoLogger; + public void markUploadCompleted(PhotoCompleteRequest request) { int updated = photoRepository.updateStatusAndUrl( request.photoId(), @@ -51,6 +54,9 @@ public void markUploadCompleted(PhotoCompleteRequest request) { userService.incrementPhotoCount(photo.getUser().getId(), 1); String albumCode = photoRepository.findAlbumCodeByPhotoId(request.photoId()); + + photoLogger.logUploadCompleted(photo.getUser().getId(), albumCode, photo.getId()); + if (albumCode != null) { photoQueryService.invalidatePhotoCache(albumCode); } diff --git a/src/main/java/com/cheeeese/photo/application/PhotoService.java b/src/main/java/com/cheeeese/photo/application/PhotoService.java index c6238ee..bebee74 100644 --- a/src/main/java/com/cheeeese/photo/application/PhotoService.java +++ b/src/main/java/com/cheeeese/photo/application/PhotoService.java @@ -6,6 +6,7 @@ import com.cheeeese.album.domain.UserAlbum; import com.cheeeese.album.infrastructure.persistence.AlbumRepository; import com.cheeeese.global.util.S3Util; +import com.cheeeese.photo.application.logger.PhotoLogger; import com.cheeeese.photo.application.support.PhotoReader; import com.cheeeese.photo.application.validator.PhotoValidator; import com.cheeeese.photo.domain.Photo; @@ -29,6 +30,7 @@ import com.cheeeese.user.domain.User; import com.cheeeese.user.infrastructure.persistence.UserRepository; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.domain.PageRequest; import org.springframework.stereotype.Service; @@ -40,6 +42,7 @@ import java.util.Set; import java.util.stream.Collectors; +@Slf4j @Service @RequiredArgsConstructor @Transactional(readOnly = true) @@ -58,6 +61,8 @@ public class PhotoService { private final PresignedUrlService presignedUrlService; private final PhotoQueryService photoQueryService; + private final PhotoLogger photoLogger; + @Value("${ncp.object-storage.bucket}") private String bucket; @@ -87,6 +92,9 @@ public PhotoPresignedUrlResponse createPresignedUrls(User user, PhotoPresignedUr List presignedUrls = generatePresignedUrls(user, album, request.fileInfos()); + log.info("[Photo] Photo Upload Request | user_id={} album_code={} file_count={}", + user.getId(), request.albumCode(), request.fileInfos().size()); + return PhotoMapper.toPresignedUrlResponse(presignedUrls); } @@ -117,6 +125,8 @@ public PhotoDownloadResponse getDownloadPresignedUrls(User user, PhotoDownloadRe ) ); + photoLogger.logDownload(user.getId(), request.code(), request.photoIds()); + return PhotoMapper.toPhotoDownloadResponse(presignedUrls); } From cfb20c2783731d50f1b6a3b23f223f0440e94372 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Thu, 27 Nov 2025 01:38:03 +0900 Subject: [PATCH 387/402] =?UTF-8?q?#100=20feat:=20=EC=B9=98=EC=A6=88?= =?UTF-8?q?=EB=84=A4=EC=BB=B7=20=EC=84=9C=EB=B9=84=EC=8A=A4=EC=97=90=20?= =?UTF-8?q?=EB=A1=9C=EA=B7=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cheeeese/cheese4cut/application/Cheese4cutService.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/com/cheeeese/cheese4cut/application/Cheese4cutService.java b/src/main/java/com/cheeeese/cheese4cut/application/Cheese4cutService.java index 682b079..8a074ee 100644 --- a/src/main/java/com/cheeeese/cheese4cut/application/Cheese4cutService.java +++ b/src/main/java/com/cheeeese/cheese4cut/application/Cheese4cutService.java @@ -26,12 +26,14 @@ import com.cheeeese.photo.infrastructure.persistence.PhotoRepository; import com.cheeeese.user.domain.User; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.PageRequest; import org.springframework.security.authentication.AnonymousAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDateTime; import java.util.List; import java.util.Map; import java.util.Optional; @@ -39,6 +41,7 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; +@Slf4j @Service @RequiredArgsConstructor @Transactional @@ -140,6 +143,9 @@ public void finalizeCheese4cut(User user, String code, Cheese4cutFixedRequest re throw new Cheese4cutException(Cheese4cutErrorCode.INSUFFICIENT_COUNT_FOR_CHEESE4CUT); cheese4cutRepository.save(Cheese4cutMapper.toEntity(album, orderedPhotos)); + + log.info("[Cheese4cut] Cheese4cut Finalized | album_id={} maker_id={} photo_ids={} finalized_at={}", + album.getId(), user.getId(), request.photoIds(), LocalDateTime.now()); } private List getOrderedPhotos(List photoIds) { From f977ebb4d5b47dddc62adedf1b2f830b7e84b410 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Thu, 27 Nov 2025 01:38:11 +0900 Subject: [PATCH 388/402] =?UTF-8?q?#100=20feat:=20auth=20=EC=84=9C?= =?UTF-8?q?=EB=B9=84=EC=8A=A4=EC=97=90=20=EB=A1=9C=EA=B7=B8=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cheeeese/auth/application/AuthService.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/com/cheeeese/auth/application/AuthService.java b/src/main/java/com/cheeeese/auth/application/AuthService.java index 030319b..a2b4834 100644 --- a/src/main/java/com/cheeeese/auth/application/AuthService.java +++ b/src/main/java/com/cheeeese/auth/application/AuthService.java @@ -20,12 +20,14 @@ import com.fasterxml.jackson.databind.ObjectMapper; import io.jsonwebtoken.Claims; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time.Duration; import java.util.Map; +@Slf4j @Service @RequiredArgsConstructor @Transactional(readOnly = true) @@ -45,6 +47,8 @@ public AuthExchangeResponse exchangeTempCode(String code) { redisUtil.deleteValue("auth:" + code); + log.info("[AUTH] Token Exchange Success | user_id={}", user.getId()); + return AuthMapper.toExchangeResponse(tokens.get("accessToken"), tokens.get("refreshToken"), user); } @@ -62,6 +66,7 @@ public AuthReissueResponse reissueToken(AuthReissueRequest request) { savedToken.updateRefreshToken(newRefreshToken); refreshTokenRepository.save(savedToken); + log.info("[AUTH] Token Reissue Success | user_id={}", user.getId()); return AuthMapper.toReissueResponse(newAccessToken, newRefreshToken); } @@ -78,6 +83,8 @@ public void logout(String accessToken) { if (expiration <= 0) { expiration = 1000; } + + log.info("[AUTH] Logout Success | user_id={}", user.getId()); tokenBlacklistService.addBlackList(accessToken, "logout", Duration.ofMillis(expiration)); } From 41fb546024f9641b2dc76cbe9100fea70ebd68c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=ED=98=84?= <123882512+dahyun24@users.noreply.github.com> Date: Thu, 27 Nov 2025 01:38:20 +0900 Subject: [PATCH 389/402] =?UTF-8?q?#100=20feat:=20album=20=EC=84=9C?= =?UTF-8?q?=EB=B9=84=EC=8A=A4=EC=97=90=20=EB=A1=9C=EA=B7=B8=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../album/application/AlbumService.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/cheeeese/album/application/AlbumService.java b/src/main/java/com/cheeeese/album/application/AlbumService.java index 499d0ba..17cbe24 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumService.java +++ b/src/main/java/com/cheeeese/album/application/AlbumService.java @@ -1,5 +1,6 @@ package com.cheeeese.album.application; +import com.cheeeese.album.application.logger.AlbumLogger; import com.cheeeese.album.application.support.AlbumReader; import com.cheeeese.album.application.validator.AlbumValidator; import com.cheeeese.album.domain.Album; @@ -64,12 +65,12 @@ public class AlbumService { private final CdnUrlResolver cdnUrlResolver; private final AlbumReader albumReader; + private final AlbumLogger albumLogger; + @Transactional public AlbumCreationResponse createAlbum(User user, AlbumCreationRequest request) { String code = UuidCreator.getTimeOrdered().toString(); - // long createdThisWeek = countUserAlbumsCreatedThisWeek(user); - albumValidator.validateAlbumCreation(request); LocalDateTime expiredAt = LocalDateTime.now().plusDays(7); @@ -95,6 +96,7 @@ public AlbumCreationResponse createAlbum(User user, AlbumCreationRequest request albumExpirationRedisRepository.registerAlbum(album.getId(), expiredAt); + albumLogger.logAlbumCreated(user.getId(), album.getCode(), request.participant()); return AlbumMapper.toCreationResponse(album); } @@ -125,6 +127,9 @@ public AlbumEnterResponse enterAlbum(String code, User currentUser) { if (existing.isPresent()) { UserAlbum userAlbum = existing.get(); + // 재방문 로그 + albumLogger.logAlbumViewed(currentUser.getId(), album.getCode(), userAlbum.getRole()); + if (!userAlbum.isVisible()) { userAlbum.show(); return AlbumMapper.toExistingResponse(album, AlbumJoinStatus.REJOINED, makerInfo); @@ -151,6 +156,9 @@ public AlbumEnterResponse enterAlbum(String code, User currentUser) { int remainingUploadSlots = calculateRemainingUploadSlots(album); + boolean photoExist = album.getCurrentPhotoCount() > 0; + albumLogger.logAlbumJoined(currentUser.getId(), album.getCode(), photoExist); + return AlbumMapper.toNewResponse(album, makerInfo, remainingUploadSlots, recentPhotos); } @@ -261,14 +269,6 @@ private int calculateRemainingUploadSlots(Album album) { return Math.max(0, max - current); } - private long countUserAlbumsCreatedThisWeek(User user) { - return albumRepository.countByUserAndCreatedAtBetween( - user.getId(), - LocalDate.now().with(DayOfWeek.MONDAY).atTime(LocalTime.MIN), - LocalDate.now().with(DayOfWeek.MONDAY).plusWeeks(1).atTime(LocalTime.now()) - ); - } - private User getMaker(Long makerId) { return userRepository.findById(makerId) .orElseThrow(() -> new UserException(UserErrorCode.USER_NOT_FOUND)); From 6807003eca5ca67f17cead00b183079788b57cd6 Mon Sep 17 00:00:00 2001 From: zyovn Date: Thu, 27 Nov 2025 01:58:53 +0900 Subject: [PATCH 390/402] =?UTF-8?q?#103=20docs:=20README=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 60 +++++++++++++++++++++++++++++++++++++++++++++++++----- img.png | Bin 0 -> 1329185 bytes 2 files changed, 55 insertions(+), 5 deletions(-) create mode 100644 img.png diff --git a/README.md b/README.md index 943d520..7c9d121 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,24 @@ -# BE +# 🧀 치이이즈 : 딱 7일만 열리는 특별한 공유 앨범 서비스 +> 🔗 서비스 링크: https://say-cheese.me -## API 명세서 +![img.png](img.png) + +## 🧑‍🤝‍🧑 Backend Members +|**우다현** | **주정빈** | +| :--------: |:----------------------------------------------------------------------------------------------------------------:| +| | | +| `backend` | `backend` | + +## 📜 API 명세서 [[Swagger] 🧀 치이이즈 API 명세서](https://dev.say-cheese.me/swagger-ui/index.html#/) -## ERD +## 🗃️ ERD Cheeeese (2) -## 시스템 아키텍처 +## 🏛️ System Architecture image -## 기술 스택 +## 🛠️ 기술 스택 - Language & Framework - Spring Boot 3.5.6 - Java 21 @@ -30,3 +39,44 @@ - Loki : 비용 최적화된 로그 저장소로 대량 로그 처리에 적합 - Grafana : 대시보드를 통해 서버 상태·로그·지표 실시간 시각화 - Prometheus : 서버/애플리케이션 메트릭 수집 및 Alert 기반 모니터링 구현 + +## 📂 폴더 구조 +```csharp +src +└── main + └── java + └── com.cheeeese + ├── domain # 🧩 도메인 전체 (Bounded Context 모음) + │ ├── album # 📸 앨범 도메인 + │ ├── photo # 🖼️ 사진 도메인 + │ ├── cheese4cut # 🎞️ 치즈네컷 도메인 + │ ├── user # 👤 사용자 도메인 + │ ├── auth # 🔐 인증/인가 + │ └── oauth2 # 🔑 소셜 로그인(OAuth2) + │ ├── application # 서비스 / 유스케이스 + │ ├── domain # 엔티티 / 비즈니스 규칙 + │ ├── dto # 요청·응답 DTO + │ ├── exception # 도메인 전용 예외 + │ ├── infrastructure # JPA / 외부 연동 + │ └── presentation # 컨트롤러 / API + │ + ├── global # 🌍 전역 설정 / 유틸 / AOP / 공통 예외 + └── CheeeeseApplication.java # 🚀 Spring Boot 메인 실행 파일 +``` + + +## 💬 Commit Convention +#이슈 번호 태그: 커밋 메시지 형태로 작성 +> e.g. #1 feat: 카카오 로그인 구현 + +| Type | 내용 | +| ---------- | ---------------------------------- | +| `feat` | 새로운 기능 구현 | +| `chore` | 부수적인 코드 수정 및 기타 변경사항 | +| `docs` | 문서 추가 및 수정, 삭제 | +| `fix` | 버그 수정 | +| `hotfix` | 서비스 장애 등 긴급 이슈 수정 | +| `test` | 테스트 코드 추가 및 수정, 삭제 | +| `refactor` | 코드 리팩토링 | +| `style` | 코드 포맷팅, 세미콜론 누락 등 기능 변경 없는 스타일 수정 | +| `deploy` | 배포 관련 작업 (CI/CD, 서버 설정, 배포 스크립트 등) | \ No newline at end of file diff --git a/img.png b/img.png new file mode 100644 index 0000000000000000000000000000000000000000..5ae9afc7d48918c72468a6aee6fd3b0bfa617213 GIT binary patch literal 1329185 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

)*P>rU$d`cIPs_-XTPbxZ6dFV$yBXK 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�&+fnEXh9@=Z$D$s9*_b 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�KM+^PL0% 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 z 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�b!06y?y>W3<25sa= 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¬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 suhCFeiI>% Date: Thu, 27 Nov 2025 02:06:18 +0900 Subject: [PATCH 391/402] =?UTF-8?q?#103=20docs:=20README=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 9 +++++---- img.png | Bin 1329185 -> 0 bytes 2 files changed, 5 insertions(+), 4 deletions(-) delete mode 100644 img.png diff --git a/README.md b/README.md index 7c9d121..1d38a1d 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,10 @@ -# 🧀 치이이즈 : 딱 7일만 열리는 특별한 공유 앨범 서비스 -> 🔗 서비스 링크: https://say-cheese.me +# 🧀 치이이즈 : 딱 7일만 열리는 특별한 공유 앨범 서비스 +> 🔗 서비스 링크: [https://say-cheese.me](https://say-cheese.me) -![img.png](img.png) +![웹 썸네일](https://github.com/user-attachments/assets/f5a6c97a-21b9-4dff-a7b7-8c12fe6e27db) ## 🧑‍🤝‍🧑 Backend Members + |**우다현** | **주정빈** | | :--------: |:----------------------------------------------------------------------------------------------------------------:| | | | @@ -51,7 +52,7 @@ src │ ├── photo # 🖼️ 사진 도메인 │ ├── cheese4cut # 🎞️ 치즈네컷 도메인 │ ├── user # 👤 사용자 도메인 - │ ├── auth # 🔐 인증/인가 + │ ├── auth # 🔐 인증 / 인가 │ └── oauth2 # 🔑 소셜 로그인(OAuth2) │ ├── application # 서비스 / 유스케이스 │ ├── domain # 엔티티 / 비즈니스 규칙 diff --git a/img.png b/img.png deleted file mode 100644 index 5ae9afc7d48918c72468a6aee6fd3b0bfa617213..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1329185 zcmeFZby$>9)Gw-nq=?cbU4nE=jDXT1BHhiRFbGOX$B=?ZGc*n{ zF!SD*^X0kc`{Uem&KKu-?w`Euz1G^X*8Z)U=;vC>Bt&#XH*VY@QB`^R;>Hbvts6IP zFB04WzdTr|_q}oB%?;J3@-O|(cRSQ;T?Z1`DcDM=k7}K6h_TQRXxy-REQpg4pe>WT zh4bKEsJYLVP!&C#P^J5u9y7vz-eP**%g9A~0oK)sqLOl934=@iUnVcSW?GJV`WE7u zEU**5%V2(#O*=C8j?aaw-{-N>xkEaE6FAxl4w%v}{gC_i!4#u&c6(kd5emR|LV^!@t6;eh5)YW zEW-j`{TP3ij5MG)pV{6VP>;Q2qeDRC$;A5_Z}Qa>bB&Gw38$O_Zj2QG_FW`OJ0X0y z#`OvDUiU!V38bK7AU0DO35VoaVaVC7yj|$W6xuwFcdtmH?#F*N#?c4y{{d`{z5q;} zpJS0}uXiaf-z6yimUwe~KpcH=?!kU3-LBJG-;ifvTu3AqN+^)-`AnpPOLNwk3| z_Kthf!C2)pDch~-yRN(Se!7N0e?6A+-{66O2v@+Kt&SdwU)!S;A4jdEcf>X`v*d0%e8+8Z8Bvo0Q3Bm_U+(KV@A5JM}pFr3s zc9lXFNu?JSNOB(~J%-whyA90Cj0-crA9GDQ48=dtm8O>5hA6!Cvc#8=OhVU<-$A49F<#w_F+FVPCP{f1? zrBil5%GiRtC8HBdu2}M?_0P$8h5*U?-RwTJ`%ywbNkll}x$&o<7j%{w3DH_VMkM@) z;zlkNnXw|&XkQij2DLoazZ6goP?4rb8LK#w6xy|L72ZU^uKCqqO=N8U9SLhHU{-dr zbS4Wo@1by)X|d~`kuE7kj!~?nQYacmA68o3h9Sh9f=GSMPOwx)WVnbjvm&K-M6J$YohmD3P1*QQMcZmj3!69)50CYho~%34k&Q5f-a!KY z)2sb2Aa2~UA^^#<{_nqJ z=E7oY^m&ZOq-Nuv1o#wcA0 zCnr2pS0YjF80!B~KoaCKS|B`CgXAKzB1tp-#yROn?vUiFX&PU4|7}gb8J_*q7eXP8fx>=P3Ocr3iXNeQqwN+J; zaz&^_Ufm$YAxv+KEH~+x5O}CrGIoE2K~pb&HC8X_UY%wwF>d?ha%*G2R+<*WbLX#{ z9D)!|?PByc0$jvNGcm3qAitmbMD?yzzV)ADL%_`Vk7H?IJ@#kHf5?#FufX}r&eEUFd^B&3M$Pj# zQ7!$^cv6%3+M;)>v3^(fN*>lh8OkyU$f_W<)Ht(4;NR%pn+V{;@(_WRi}uO8KC}bF z#y|7vLN6a>(teBHgEAf&0&zX2YfrT5OhMf`}~o z>FNz6tk2yZm#eWj;JXb*`3Z_%jp6 zq+(-qJNSQ@;6LC^_ceQK)FJV$3&M-g)a375Q{UX5K( zTdnWmyeYc{!fWZbpk)~4J}t=&d4saZnx+3mWe9i;dCprUy1o9kc+o7+b$Q)s|n^LyS78tdK zm9ZgLLx4dcct>|2O&5xQ*eTue>VMLSPHF7PO<$4P8lz3^sq8<@Q)u1P7s;} zOJGTw?pU4Rf<<*uoABs(Jc1JZ)K^UUybm7A^|TlM}97?pm5ES2i4#G%z?V0l3V2TjrfD;x$_Fx*M@(dX@zOhK>*E#_QKH!SLn<* z8g>T>f1f>F0oc{6`i2G>0(qjgO*`^|`e(c59- zO`JHB9DjZCeNX}PRbv-sjeemmlrn9po1;+6N=CpxORbCqgs?x55bPhP5vjP#0Nq&8 zvKN_gFD0M!{k4Pm-R+;0o!7zr_!q$MP5K$>F zwP#4CtUx_WjAFES!EOEVm}GpZSL!||B^XDqwd5ECL=sing^nU~RUt0VqkKr}we@Ld zL+5gQt^Xlq1A`j|7MdY; zkX8&k&sv0Wp00CYO5(H$ik#XquDYkXynKM}^0k;MUT1R_JDR4+&d2S$XF2h3%Y&}h zZz1Dk{F`P+tr-?inqcn_iI7dpcls3eC^kPOB#GYQ$mRXfZcH@y(PT3mwVc3P4!kJI z{Teo6%F;gpuA8=;gc+jFwk7el;ArfVP@hmf+u zNURYd;S^5Al1<@R1^2lL%^q%~pyEOJ3sXX7Rb%PBB2X4Y4Z2w-3R)8c$>Eh0Cxd8Z zLjXpG0iGvDvOJ7=b?>sBgPxA~j2C_daaC9RJ;PWzEfK)FR;7F7*QiSG9vd=Ae5**I z`?Z*pp4NO#0#Xq*dRVs>VZysAVo~gjv^GBe8Ra1zau1=m(@|{ z6lsr{sb6ctenliLJSsI%?dq*IiL0pBjcPNVQdO+OIvXFG058jKg*3D76#a~xTiPcW zgvBn)9L(GauUdG-*5GrnD&VfjpA-fORd_i7=x$l^%lbfW#eUe1&N`27HrFH_Y8dDm zaat?p&suP8*D0&}^Wu>5#gvg7j7Ylo;yDXv?PKZ=cvvJ*h19b)ppkUcF(ycZ4|@bz z)3+qabZ$~JJnaAjvoU4O>#3P|RHd|^l+*Y2K70vALb9i;v6pw6xEeo753II<5GMW} z5_VVt9GR|wz6)u3!}H;4nL!tKKiqW_V7ojLwd~L=Tl0QVm2tTOhJ=M10%72sO`<07 zcJ-G>I7P1O*ax+-aWA8_9mL83xt_gf*EOxEr^ z{7Xs2UcFaLlf6F~hedxIa<=zvic8UQ^gZ%Ckw>SUHZC8K1}pa4@7oytUT=STZojY#)VbKs?J)`zXUZ12$MUh0QmsQ z5flIN-rcZkA6=HL99Dig;TE4Si)3oE*0cOPd31Ux{LwTX0jS(w5qt+;#~HS7=)P8g zy;I5gI&2NE{_PE^2mc#{td}9CKGaA_q|jT{q?g_3!n?|5I%nZCCC+TF6)U=4e?{Vqbl~^*H~W3(AV1E% zp-1GNg_NCB4^(Rxhw$e4RAYpelvYZ7A&yvFj5p{Zen#V`Haj{izS(X^2$ z$OXj3(Jf&Upxkh`k)i>6d1degCGf9>yMu%sKP>1*GhMHt5o=U4>-x|Mb9Pbn z1Zi=_k@aF_Z*cOUVB3KP0j%k&M4%w04ut(Km^$m4g%^L%#)0$VTL#{-)JabzsQ1+x zSX92J9G7xPG@XdCS>$+_ENumwoFAA?T;d(~hlL*pvWiO?`dL$C7z8lHz_W70UMf8x z!h?Poa2c@T;_jJ|pj@WT``kNHEbLzGbo424QR$)!a1G&*x70E2bo))Qw^6aS(iLzO zfrY*#%9SAp?apYEL^%uzpUMUuh5^u_C=+V^VdL$LNnN5Nog*By1dU0O;4VD^X0xfA z{=Yc%${w8qyku@JlKtCSAB334dVBJX zpgH#Vp68F-iLwy3!SVlY0y>^iT#x3^0(b&->J4c-qa{wHwV)k-!$$Rk4K&q>wDetU zOU3{KB4agxfC>4ho0a}}2~*MwN~i$ja2RU18AIJMsYA0j7>}+4LMw#ojo8?4KX+g7 z6`@5+=fhkuXSBbsml}+O+xFrezH0(rpg`0ZvznW0%`TEn^R_;M1KoAb-aZXs-?ee3 zEG;Z7-o(yb@FY{h0xq|)I)AYYy<7=$30v(s>WdfpZbK5U;yvbUvgjYuZ41J0?c?1@ zfK%`c->?+nm2zRu5iubuB%m(1m)2)5(p21;EcO7_#wXXRq zVhoN(mIRcLi0T_m6^v0KI4b}Ynu-~Y%DJdhQ`eI7eOs4wa%u>)$Rc4E4mk+eiUZGo z@>tj-j0Mbdn)FG;WN$&)rF>h6`;`}_vN`d$ppG2kD{5wPat)!M51Eo9=JT zho0}a9L($djlNWUSbl$SNx-U*$T{e^TZxo+Px(T(?P|?*6!o=d4ymQTyXB!D51CV3 zu^)G-4QAd9+28Tz^SN;D%Hw)BET0fu<;V}mUD7Z&+vpn_;Ij9X+$9Lze#byxhus`U zGrisjDF+0{ioA^ef_CIwbn4e=V2b0Dc~bC#xsOlt=**{p2G`=v_B$6)zvc>15Rq#u zEe^%hX|C69k$|`WTGEz-;u(Ka&jc#za$cEUUOg{38-8Q*{v3F->INVg*i8tfitNh$ zI*%6w-(gEfzLn1w-!04NlGF5aREJjej(R)yf18zKNEOygQ_D7ZhzREQ9F;rKjL+>o zDLyVzrf-rTzC*vn`-(D)g7)3E`3$6w3-|QX$%Mfjmh5zIx+B-=zfvEbv1*$22h&qu zpiPJO_(D9$@@eVdKP_(5*FGL$Fk8R1d@?Gom|nN(ccrq*oK}I%8lZ5*Sdc8@iHYp; zg!Dty7HP`?GOwGCc0O5Bt+iM#t9@6uS#Svlc((2@C9=)1Uf-V}0jJ;MCFxcMM~YaT zKOIiQ*rlu6$R#-Q77&e2b6I;6rGgvQWtx@Hn5`&qrK1Xyx2xZfOWx5fr{ zB)wnRVYIs!7Z$5gKzspkqdGStI&{J+zoc)RTF9|4F6_dFh?#QtLYV1;t@N}w3t9{H zN=&TXu^920#9~orb>4P2=J+X%c?mAKnm?(kxn89J#neeh__#JduEfc;ckvVFbvLh# z@%N=*BrM<_TNsLIFSIi6?~Pp$?HSKY^r1HwWSm4+sr-nQ_Q_A(F=6=VaD(3ZcO4f9 z;Fwtn4+)vaF?+Usa~9O#`g->dpq&qxvhU^Fr;1zT0*T<0{w1u6gWeB1sQ}jHFe10Ja(=_|@Yd`s}! zPE2%4mBPS>%;CKlUn;{1jM6Wd@lT6*Uf6r;_9b%eB7U9HxK))~%8%sN2faI?fh2Y< z`RQ9bsaNv;MC;6p(lS{|z7O2FUe$IIIN^A--x7g1I(KkA=Q~_M+J|Pe%jOtvtPfD* zD&3V%deYMJ#PPh*!K>WonchHU_G0*j!TY23nObx5M=Ki+q|dn}q?YW5b(annx%Qpx zy6OdgwxJ*y>511ViHw^#6~LS~^u`AR%MFVpd(e#e)_(Fhsl(?^&IDuhi9bs#fMH<) z?M`Mvui13mK_ejRKXJ<8%n`Lg8R@qPJMnCi=?%n!nO>izI(b=RIkSv~Nlsrd^6+tH z>ko56=z(G^e9ax+;wTyE;0oLdPTVws=gbiFH1D-7lwA}p5RYlhig<*t_1k=!_TFO% z{6dm^6kw3gTOw8|iPN4x;hp0vN_bT^nns)?kY6+`bg(eJ@PG{Y;9_&9DB-uyjKV># zVZFe7;A(!)$^iAtGr<~ROQ{CXD*+-=Ifd>vyWi0kQaztT+1QmC>p)8eG&@n;_KEEv zQ)n@*1udNkkRRHjAsN|+7SR0g`LaG=^|uLNgck4BDhE)IZA#-C+pq!I`9+}W?bht7 z(`78wMaI6ZZAeMPdmw>Pg+>|gagX_E%UIR<0%UziFWGK8KrHU!t|0sQWLQLGN5;VC zzPd*@<7y54y^$O%CpIA|xN0p6=EUCx9t8S{@GJ|LKX@72yQS77o0>)bOeOt+1$hX~ z^UnOJUE9+l4a3e2xb8~a$MB_~dQa(CQ}4o-^xL4x)-E64Nc7Glcv!dUTnqYcqJ!4n zz?`5gq#W=J|0)Dz6FJ1O|6R&|zhJbM!8<(s==v$JelPw{Jd(hD$=9LEyc~_(z5oF! zo5uT#gO`#v?73%*u8SkAGp0~C`|F4|xpRHXS{Ap$;O=<_i0PQ#*Um1G1qkuU}; zry*EzH!T}s$C=}*FICHinzslsxW74u`NJHWPw&65@0+m&&&e_Q#|E~}Dlo(lIJ=Mi zQ|cSZw*J<`?%+@&%-JRQL)LS5>kcSx@`trC*@On|M-qe=wYpB~`6b&6x@(dWv07^a zL0c}fHik~ZuCJ|_2^LS)rme1sFikmss&`?!dEd~QMeJO0MN|91n=~CVlgVT(m>4F4P?!>I|1NB)DIA(PupSP=)IQ=EvEJ$_ z+xe3Bg1w$vo+2~tbLJqhCjQnwm5JzZM8JpSnm#fFM{hlqD<4M#KX*v28;RtSd`v9w!%yVQ!7QtKg8=D5H;0w4{_;^eD?diqG4$Uvw-pO@PJlxAr)$e)dcuE)hJSog2d~%QU2gbT8zE&pd4o2 zpge_t3ihrgcl-LRqqQFak!{!;f?`H(l1-k~46>iGLQMY)iUo7MjFS2OKq%(dY3RAy z`Nh5=hZjUyV(htOCUt@~-$z;={U0Q`zlX;0s$Jiine;vxd_IsaLcK(9=y_bnP-JYO zhsykeX1@}->TW?+XodG?AV(IzyM>!@{#c7n4~{6akWT-q_HtvCD>>H8Go|2W%il1P zRp#XI!yo9Xw$cE{Aya>M%O3-yUTK5q&B`yPyD??#B>jac)6+D{_v>ccx~g; z_sVkRPRv4 z8J>RD)uX7d<*-rep>M$bK2f|)$mp(iZZ8$R9i8GC*JEc z1bhs{NZ+RuACQzwUKrig#Ymw5#l;Fud5QX>M0K4irDPC;roDc|Su{`4t))M;8_?dZ z5dx_L))!a0azEJ`ZV;!51ZmM@ewOg@g+w~oWHyLC2?;!woVEyDD2$2M{F^XzDUx(x zT{u{8u`eK5BAt~a@>$q8(p2+>P9Rxg%Qqgs$?7N<(oC1}R@c@q4V@)F&!P zPhHKhFR76D=Z&R8q!QY+tKtZM@BIhQEjIZvD_KG`0-(3AQ1QPBA^`BM` z;Gvu}T`^5rbKdh?7D}$rBM}+;h4R9i$CEY~MTK3Kg&t1&sWPz!)UucTC^R2N+fevp z^w7nn?h{_Wc07udu;#ytFr!SGzznH@^PA{y;>}K!!dS@yBgg)-&5V*gxt(&FD^6DF zyA%SlG@Wnb-!i$g-w}{{rjCsCT~fj7Vq(rNPg<7t7x=^+-R;~w88`Psv)vD4c_VCF z=zho!0yV(DFHtbGT)FXQD{$_y zYAgw4SqbUZYQoUDc{3(@lks~%+}lpu=2hR2!<(0K0i)ooajAlCsPnAF?sx= z`;$F}P5kQPsS@p4NGJG^LNp!-*af)VZLq?mt_`HucdNo=KQs*W5^*{DvqO#_wnT#I z5{S#)8W8t9C%{+xJfS#G^VvXw8_!2wS#5SA1cI>u-j}UJSWN2+4n@yV4)bY{ef<-W z!nt2RWrw3OahIy8%*ut)w^gkNkuY|7{|^-J;Ca#K-k5B724_XV@F^!tq}{QoB$ZB( zihZT?9^XB9RDQ9W<#ZlrE)iS)VbdSgk$8!s!m37L=CS6{*9%(~!x|2MwRJ_G-5lnt zr}$b9Br@1k0IH2x`X`B~auzny0yB~?BC>+UR;5fVpY0Ft+U-Eg4Uw?K3IH#`R@S+{ z9|vlHv!y{Ar=PZ?{H~a`T`@h7ju(N>u|>jfvKx)k2_HY1pT6;U5+|Rs2>mY-H(5p|JqG6}w7Z$|!hIYxX93HQ(VCY}7XxW@WFN{owKEQ~uYJz3)TH%e5)1w$f7 zBe;Tc0bVA2upQN(slg7O(WS|MP=HwQIWlDF#py>5DziOps>OQWo&iDFn`$j=lq5mouc7p0kv zbf8xbb7@nbi1U!HfK|F-dc4YkZ`T=(FLpL%M0S}?$pLe9u4`3Swq@jQbx{+lg<@=r zTF9I-6QG*mI$Z+Za>u#ZQiZt@7*g@^a$1CDN+}SUUMY{Luu`R7A(w{Y0e82=n3NhWTC8!V) z@{vj$vpoBVXNl#9n5KMn(#lGrdvf>F2Isf1E59*kMiHVMj%YcD3i(cDn!XD{RqZ_X zukNqraDy@Kt2tCZ7IwqwdORL~=vvbb8fTUgZ~2^}YYly}L$WMM6~R5IfhGHJH4kLa zomeXPaF)Z=%0`Wx6Ate8j-zv=dW-_=ut?^9i?45!v-m|c^*|k7@t?0s=UnP+6yKk>jcqF&O@2y!v-Nf2G=pD>@a;vUZ^r7hW@Q{4nus#FBH)&(bIZ1p_Mt2pmhu z75h)JX$UI-y}zBcSShQzGRuvmF^)O1vFBWo37gVFWX3?*)@u;>blV$z8{*1UujTlX zt96HE)X$o|9&0du3BtMX;mWt^+6t+*>Q5B2X%s#md{=SAROOw4$cr%3?6ycwIRC(> zH<6Ep!ey4DKaQa-o*nQabI8Tpi0tJE%@X-;lK5B?1ay+K<)Yv*OJK&D%f**+D4493 z-Q*VC&i8xA!CXoTNEl^DRXI%S-&h(Krq9BZq!7=CFi$*OdhpyIO9rRXFSM>v0RxS{ zj3Xq|T<6D}-uV!mbqF*0=GL z&PUP>P*u7xF^_Fz>~HLc<`0r16i>q1Tj3kM*19>dCrz-Jp{8ZDMY^&U(jq&+4)iun zJm&GMvF;vFB>eoN#{&4MkM{E-;n{!Q=t;aV0@lFCV;Q~tc2e#Q3KpggM(^Xp7p^Uc z68J{#QQ()iejG$|Ie>p40IICho8=5^oh+V6e6LkU!+C0#RMEoiT(q$%B>tB% zka()=n7_qg3>?Qu4Y+(2f2c6H@Hm#$J2G2OzsIHt0WZK%%yS1uBjD}UTEZr!nlTB- zjU##eSyunyB9Q)tVCfB3gZnnijH|e)MW@q)MUPKk_@>b5nWYyVfExJ|_F7zjTXjQb z&zyPmZWHSPS>5RQ?k@uv$-wFGfybj69N0iG=UvkoC+U3Ol~fCe@$pURwP^im!1>P( z{xZs+?O`2>HK|J<{2LKj>s8)nwJr{u!;acHM?5NC@)ObuLv08k5oq^Nq_L~R6#vz6 z*>MHnnMp?@rEAbF5Ks>LUSmp%1RZ{hCIpQ5pZTPKv8IKouKx5^vXB8A4BLnGKttd* z0%&c(n*46nU!ZLuhF_I}!PmtiJf)GTltXn!B$MZ(nI1Ig-Op5@mT%28%#W0qov$0L z10Vmw01rL8j4FqYT#E0>S_S=LcKy}xi6URI1vP1MsyAGD!l%^dVSU@l&n7Fy07jv^ z^?uPlGV7x(Oe+DX-BSkErskY>67B3~NhP+$9)*MMvB&qjCCuS!i36v`1hcf6BZn5+ zNI)qLXU_|+$wd$ zI3y*#X;aue-hG~!&*h}U2wEyw^v1AnII13t1DaO|F#!ZB9&c~2Dr6PF97dFmifP323cgj7y5ImAR#PqClszVld}?m4&%+7#Zf;{?R_M>URQ zZd9n~oG*O7d02QVpF{qgWqQTQk2vRvNAInwokteKg7VqaCUR@M-@)U;K>(Q6O9cev z&JS9=asV^Ek3bjmAOMlE7>Wq^9<3#2xvEXT7Sr=Q%L*(Wx7c$7YnQAs5S)Kx@&9=` zqzXU^RCc$1-uoH!-fetQxo=yLo+gLk>00yxdz5#iO-eB(aQEHBxdx2<;<9 z!5YDtn>$Iy-TDiSs1mK=_Ax$95tolTB4MBgPaI~RE_yz;JrN{mw8a$vnwT$yM)Cfv2MhHFE4BD4`P#ZvlYf_7ybc60qi1tv?iisEk0xTqO=;(uDMRC$FOLYWn zp0C0z!+w@E-yRRV>jf(kdo8Q4`ZuiZxeTDS+X@@hC-0cpP7PUN;NhZIMY4Wbcjsj8 zyyY_jpiT9@|F|94h#lCKM`4=FqI>G!xT6{<(ZQGO`VyUC1(>omh z>zX`{6~ER0tL9 z>@pv@Z(28URGNLQF$OSZ84yGQHv|&vy&FcjW(j|j6V8BXmL1aYO%Sd!{eG6{TZy>9 zmA)Cwx-vhI^W?frEPfg(*!ZPelgS}#J~1>^$-(C6VLP@ zTzNDFxD0{Nxwgra`XjGxkik0?eD5R@1>6DwAFK=dI4c63^WF#`kw5)}Wc7-0IUuUR zHoaZ~uYMPJ=A@FEQFYIOIw2&S)VdD3VDi_~I6o<@{rh%7zL3^7gP^EWgYSJP{(~AC(%q%(sYlY$oor zXf3!RVSW>as_)-93?>@U?HseqLhkgP|H4x zmiK}@%+H?|%z6KoK>#EFn()8-u=CAn;0(|Wt#W?%N{gl8z5PbwnzOwY_QAPnsc#J8 zf{db2b*g9V*|*BmfXa`>`Wps{z2>6=u+W#ZoyU*lu&-HXQN;#7{C{Lz+_xXKD0`~Y zUTC~BPXLT7dT|1qp!hM0J!O3@(ABQ}Tj5M>fJb6cDsWGFl7Ek37s_BM z*$U6&F1fVU=uP2e5*ki1W8;idy{7Gx+ac?2XYUlwuPElVRT$gq^@PMqHK)T6Awj-` z0(#5=g79Z;vnCQ|eCUs6D}VsbVUtvt)UEiwlsc-t>VuQaH<+*vkW|K&$azZJFB^d= z<^Fpyzls|`^`7}p`+`Z@2Jla{Y$s&w6$3I~!^TKoEl;4|U{7NW3uC_rm3wX!Ye}i} zmROC#mTK1HhX@}Eg`9OZ9<9!Bb!?c;LoIHh*Ilm)mzuLxkJWi%KZM}=B~GgOoi~=8 zNp_U5=mqMU&z6(9VZaKZ~mWVGYU__Hi6+*oZ73tDQ6wmz4#@> zw+pf;>M9e2*!q6syMwp1{$Ftu6Ta1u8|^!*k5K}F8ee90{**li#D$-V_{ZwZN1i4H z^edio05vbIoN%OJzA1e{pBQd73GE&YL{+_MgmqUY!FfISkvR$L?#Sb(0sK~*WTl!L9Gg?m|1Wn3dZ3$EBTnDj7XHP(ka90gY|tIt01 zKz(mvdKF4Ccfbzhl=#W`% zuKO{i1+R{`caHu156tJR1_FaP1v2VOeVG1O{fISM?pOY`6dK_1x#s6`HyWN-4ru@5 z_bAZwcrye(?eHJ`Fk&PSQ;UT}M^Osczh+}X08Q7`v|zZV?TW7);2lH*?2P*DX{h(X zhQKlrSQrZig?5jdsh=acqTw@iNz;0Q@na7}l&HvmLke^y#__u5IM7 zdKUb6PdHfQ_yP4wcYMrC^ne#7+Sjj7eG$bq?2(6WqgX_=&U^QurlLP<_&NOMEB8TK z1Mh@Q=YZ&*B{I-cwB(|cH3qc51nG`6*J9(}g(D!j|9UI}xDSTkxauj>>u7f*-t22i ztq!6gtYC~Uyph#gToHpe*74B6)Cf?1ssR30h`#NJeaZ5TR*CgE5YN2>gL>riF++2A zQ1nmEin2WIFiiIeD_{yHAEh#LLvXg1l10FJH8$2x!TcuK1mX^y1ay-jd-6dtyEmOXZm}0s(1y@o*Rsrqo%+w>AOdfzsF;Xc ziC1Gs(J)NU^xZiLyV2J|uvORx-X5%C8;+~%-m~Wfhu;`SFV0>=vpmOJsXvV*a29oo zPv9s47XCpG7v&S&qrmR&M_;Wv`G%`C@u*(k+LL)&K1AjdD`7 zU@;CZ2h;I)y{AUN%&iL8`^0C3N1#m=0ecaYO)qjd+(W?voVSUj0e^Tv6XP6;fGZ7v zqEutg(m#SxjLNIg#HKE=LrH!h>RJc{&;Zum=iBN)L3?sJqyk<81FXY==WbAY+T?It*=anB!30+nRmYm6l_Y9g*!0T%4s<?|_+^Vtxs@S8-iE@jF++-CUS2;@0@k=j~N0 zH$P(Z0e)vQ<`rb8`1JUb+E}mg^9l`N>$)<7(vJEDqxlx^?*Sb*&5y6@ZBx`ktW@|+ zh0Qq10lztI#?gU`X|Sl_Qx@L{lH@QElm-SC#mmz~PSs-lKr}o8`UFY##)iPEBSz8K zt5LE_q6;j9uK)s^G5A(AFMgtzzoAK`lMDgv3@BL9mX9KZ4$S>&U%DZ1UE935m-8H0 z#!?$JKgghxEkp7AIn!*jiOwuJxyn%}nCFuXq-RJkYw+pvVSi{a&McB$^Z3p{B>Ae^ zryQ0w9m~&mTCy@{=HC*D5pF&b&}BK7F6?c*%xy|AaFj9nNglWELY4Aa&uq;K!z+@# zcd40gI&dr!E<-ew#FFZLVr=p}mlHI{O<*d~!2a>VS*B7;;<^Jt07V*?BLC(_L*o|( zP0-T2xr5!VL$4YSB;I>*{2aY^%q^%LX*x3O>?$9T0X`zXmcT4W`nJomJKg&KC|Cuo zwIdq=7oME!ToxTnc?41H&+n3<^^%gPYPe151imh>g1`i+T~Xa@I5e5pC?qmLIW$0c z&CAW)nV4q^Oe1Zd`Wgd+8V;8sliUWiS9e(AZ=KlouP?SEs9u(+I$|dGzyxPX`p7A! zNT<^Ff>wd?_QpWM&z67+zLMujhX-GP{o_6>*3E4aGUX%M>T=(DW9(piOK{DcurmKfep z$r;bOoW|$$3y*YfnI!9}NSRIf8w1&KC_Y0#jd{dpakrRns#pAHau<~yN0-^#7L1M{dp1_j_EU`kd!g9e}$ zSz=(|PmOdh8U|e&IZ`44!g3(4J2IuJ8k^IF2CA`b;Vm_%r*&gs9F^P8mi>;$TM2TR% z1r{W;N@wI)CS-WaJ%2SA$M+)Ti{r8ia`E+c0#{1@<)YC2+?-xg`cA~NssT`=IpAaz zd-Tw31T4{{+yu!4wn{7|N7?ra|1!jEuddmR=ji+11M<#%`hHa&RJ4QW(gL__L;&BDQ-elN> zfPeuZgNexvs5t*C;nZwjSK1rFw zFru32aXd{Y%%=D9lCgRdhp7VE2WQLOUEsP%$sG*3|I7Sw^o$IVi)86;ci5>b2EQD5 zR;K#7U5qgpUN313WGIJ{D5seDk9A(BE8vb|14&K2VF#&H%1Db7?&_72T4K`qCKOXO zmb!v7;27b5h?)4~h;e4TEzY3lyCQ$tcpX2_n`YMrySF+mj2S9m!}(p2`Gfp2j>`xb zm;|fOSQ{`|{dT4vn~$mrpqTY|ITwMyw{V@+h}BP$32>G<4}p4K1#JOQGy+wrui^8y z@o#9Wko{s6bjJwFk1ZX;RFjhw9X12;eL_DwB;&e^^@}mRj-@3a)!f$^aJ{|f*^`!EZ3kb#4=WsFoWt_~MkELfC?l+eZAjy79b}uL3_c^OFZyQ=1g=}G z-@ou(5*Za$m;>Z`%DI3|B>x(K$>;=$Z?y!OesT|us%y8GihJaA%d)0ZCPn723>s4l0Ckc1? z5kUP8bqIRgD!{6OBWut|6Vb-*T031-{%>^wkChoId-vJv1BXFJ!<$7 zF$o}$bUUuQji1djvOu)HO|Krg(7OYENgGC3|9g+7C>nRjFCMQ=HU~HSr@ejj z$@YIiGr&c7RxeXC_N0QySn8AsfILYpe%!Gd=YJWc&0qT1IJf*+1F&0_aR7dotHFs- zan>G>Gt#~RF8_GzcDugEF*U80<;!UD8M~_B64N?rm2G!aLe5CKPGbJ;8wRt!^h*Q z!36+ahrJvQn`JFsRVU0)`PGhUz8{qjr&plm!Y0tA41EBq07%76SwHVvN=WLw7uB0h zIxLEv%B-zbvu~-X;3%zVy9b2l(g&~nD=BH+k&Xs4wfray*2k|%7y8d^#kj!42l zHny;%6HQ)`Uq7l*Uk9I2(ry=j9}-=EZ>>jjGb1>ytj6@)+p7SpT!4;CnRHH(_+99) z4unlcm(!W!4$@wiU~E;?_KPpYf|0k7nUS8nxRmC4r_0xnH;VLIn4~UNL@M$rKD+jf zl)MofDo$hdb8kPyE`~xLvvea!JTXUckcW+&-S;408vgp~k^=h5Q!_C?xp`*d^9VdK zL7XxskmN<{T0-^^8LQ~Nq0_=wAjT@>N~4;v>VoSb*PjcMASFj4QagNr^)mI_)@GqNb99vuQhSfjR*vK}B?Ht|tAc5znG9ncN#q@cCFo*sL6JJmmmok9Z7M+cQUV)Jj+}HRfU} z8~u%m`?#hJemdfFa2rv5f7(wI7fQc3G-<|bgrOBT7iXNWSojbC z_mnA^(Y)MTlZRU$k1PB$$HT5|`ch@zU|^?SoqK-?~v2@72KSzWU!@ zY)fwUUCH@g)MK46BT7m}Tf2Ea4Z*=<>u4HgV_zr9gG96{oS&ZlF{}M*zTOlU80eI} zwiCmCRoI%34T(O!cVF0bsY|_^T}Jeke9JT43Sml91U9%_n{Vf1eqk1)hCZBpZ5uPf3p^^Dts3n!N$FR%@SwJT%XN z_T|_ACBn)_8jwAx4m{aL3ej@^-7r9#;+TW1~J@jeH0Ev^z*C$Za;L2u@E4SV5Pn%u7*^T|i;Ic=m zdi3Q-I)t}~rSMbM!QF~OOt~zK?4q9J+NFdxbnpA|i`S*-&|BG@%Fn3bA-?Xm)!#3< z61s!wJAD*P58j%hdb(j_X&wW?>Sm7=S^rOajbSI6ivNFWf(k(#hw%v29I`9X-0huw zA*U^HHs(cMZnXs%us>?6ZAHM=jm?$ZM%RTotat@5ICJA8NuI~$geKE`TYwy! z<%)zKNhc1-0O8F1qk$P}iba1EP}=dH?7sgU@mxju`pm77yCF3rZu z5}K@Z5B!?Frj|}N)8ZOLW(laD1QzQ4w7C(m1+ujN-iN9t*J#ye4gbXk)Rw38;_JP4 zQTRZT#?fho73!pTf-l10es!CD2HR21Ni zaIjU8@v=(HN2(E}^H$&&k-#ONEJ*jA<;y*DRHp{VZ*A9IUo%vpg5?>l#lC59N>Sju zUnAZ3?wOk3^OuH>I_{rD^lgatjJ03TOPvRvM+2%NoY|j5D+-vie%ZJIV_1iw6c9UhOZY2U0d~f+{|MT zbC}9?YVA^R2M88>A9PZs054L2KK$rw#WpKIu^341L+(VYz2YfrNINVK1gk zp4*gIl(E&5Pg~0~{4pjEh`A3~JE1+M56$d<@tD1Peiyr(v)E67-GJC-O!R)k+IAj#C$1 z`d*#!ZTH(`45r2EUH4M5Ff-JnB%sRCn;s8fC4%Y%y&A-T}td9)O3Ga z96Cy;rp46PP04UvG?b3lm>}Mmc3jDgE%Hf8_)R@b45cWf2SF#yQRyEi^rN$4%NCSX z@e7f5eb)`h#Plu`*Q7*4pW!_hJ~3|-;4cY&NxO!k-;0C`x=6R) zFWMskS%=)Au9AIf4L_&T!LJ~D+_OVKOt^^_xGFt7u5m#U7U(vF0bDOYHJ_v9y!u9U zsb~|?e7m@TF4GHKP~9hhJjkdNAgdNxMSjZkbS;drF$~}15BGid?Wm#CaMA&ONrZ31 z{wQ4*I?~PN&F`0j6yh!-j|~^Objl`O6s9%Zkq-64V90}0n({qr9fpKona1a&kEWo( z*`W@0UClQ~vmU$W*48(${*n#tK;71Oz9%V@91t5PfmajNE}=U5sPoGO#?J=h8DofC zldFnG9FQrhIs80Z4#=&<7>a3TeiNqCZ(A~x-*ofIf};pFtWK5@xgI8}(x| zjquF>Z~dtq#uVB!60K%(r%A>CCG0^gcbseneXNFvj;aPhd#J|?Vj_(PE~3=vIaX7x zbk8~Jac|caqBQjn`Bgh33VKguW#JDv(;zoyuR@z@#%L}=o2)HTn`89Fu75Slhu%MN z1*CEv-hRxr9^k!8f(}>aUQm zu!L&~K(BmkWqV1(au=OHd4%mb!uau;e8-ELwyihw7M9Px03l*z-V1Z-T0+^kmEd4@ zJrryV5o`3&&}jQQzn=FaAY^Jz0`b;*91wxqAx4mTcw!CU;uc_~Gj1>C`~t?G1JXo< zb}-MA3W1C89JRf4S!6wMzRaFNO+DwGo0=rOfxu2t`#pd03O3`y5|?a7by$EMQn@~s zr~dqQZk6)b(*(sISKD2g**An~Mi&jb`q>PeWS9SIo&Z%2TNvKuZ$KTa@NaI5hd*rW zGL!(G#AioZ{&(I3bW-!0k57l{;^1^&zEZjICUV!8)?@O^c-wQzO3| zv3(g*sWHJ;A<3`3I7AWAx^G9xh{5aap_EoNOj2TjI=+BQ=i(x=fT9XeUUM7(B0-I- z-wR<07n~^n_nowqcT>-$O82V2t<87;#kLMa=BQEPWUOiGkA44<9`=k`=3qOwo# z`4;r2s-c=g3M0YoKVNlH{W%B_PrZFbDfXdDk3+YQK`Dv zJlPQEI=$9$(Df%vjpF6*cH?=JXWlDk{fsIu3InlD7~?{@&YOgZ+=HDr_dCuYrBivp z7gI^y4*zV?5GKi^X@AmsKbjK6&@AWZhic~A8%+6)`t`iBPH^8Z_yCoyBt!I0_J{SW zfyVDQ)&-*i1X<*-LogCh z{=3W}(p;j5R!XSKfj~{%K%Mo}RL@6?o5JaG0ZT zlcIoPp&2TT)_eLbyAGJE!o}^C8cIHk+Pa!`HKuJncFz-8;@Y&W6Bb7*SDxc%pZRPP z{N8CuVNSuNc|^+Y81&@sL8;S}lK|?I!c}~d)M`9OR(S|qALkYEnECeI&I*NQxvyq< znq`c)#Dwtu!`vsnHKis9w^M|vYa^S;r74;lK^dXI&Pyo@R_Oqvbzi-1{(zWYsp zDia(TOZABGtN!h0)Xj}XEbXHX($Fwaj2VKaxJ+wagfdsD2M8AqPN>|Q+^fAw4V^FU+0cg0Zvpet5NP*^l%T+n(3 z7t8gaTVCmgv0tlEfj|ysk6Hu2rKsF7XM`x&w$rSx?hdG6rrvy%pM5%f z_cviE{nYrr#CrGk_=f4zw=l#*Ce-|37%CO@9f`W}mb?FrLL7wM z&0oH+R-X`73FT!85IOvr+7!kY`|E^Ptnl}5)WB-%^DtCms|Q#_7=R9q0+g1{?mBZ+ z5BaG)fa>QsW;Q`(w*cbN>;N_C$wZs#^jOC|{sVxHvib$!sT}CuXZ_9AGgm2F*j}LG zWgyNIT5Y`+EkHw|??%}C50ZRe<2mC%luJ;r;4%E&0SdnJ>aH0z z{%7z{x3%?eLF=lE0fJrc11+0xbu+10qlgnB$uKM=x%1}z{qNslI=T@Qy0uL}`LXVd z#|dwXA2o`|Rf^-pziJF)*2niJ-Ue>y?!E*SKAHi*i%Q?oSXg<%>y~M4kU~jJBh4F$ zLY=+WS$7-{;GEKPImOI_w?%yxC)Zqk3(9$x{GjRCrf;g2($llHmPto&=Zl5FN9BzE zjaF(s#t&XB2sFYvwZ9fRDA`3Q8rZSm=PIz{IIxSbIC6-*m_L8i8YFvp_MYwI)87L- z`K0cCaqaeDvM(p)F2B5Fo$qDewGe{*DZd9H%@1@JYh@s={wwm&Po75+{4TtzAFV;X z^KZ!VX2|R)bJHr@WQCS#eWjV9eza}d*hPRx9-?U7L)*FW^6+18zK3VWEOgRfCR1?=h-RSJu^HT@lXx_lvgtK6&#Dlk}%36BG#f=xYrM zj8f$dR6{;thdjJJBegQ2e)~L+&_)N^_!km#zapX_p-x@NH&=_rbgy$V5eCs5 z+RlSyIS(}>Eh2PDL7C^*rW$}}Hp(?U3jyiH!EWp{A&`KXe>S}a}j!*gw{4K~; zFF{x4s3c*s1G3a3GdF(>_O2E>xOYII_M`?9jH3ESI|lep+rM}Ey$GS_RPrti{-tt) z6SPr7kOWz3aXvs)S1{mKe38g@4ZL46$7(J*;HhJh{*i}hHp3b!=J5mW&-^REb2Le% z>Y(DjCXDcrnO99p3c}ko+|D~LUP?Cxm^>RJe>)h(vIItbRCkcpg{308TS|{&VBcy` zIoMpkV)F719C}1y^81S-kKjzK4DkP8j!_M{W7rPyQD=(b!9B@g>EWZsp|EApCarg} zb#C@jZOf~g*yQG6o&?K``A^uI`eo^@8gn7hL3bz9fIs~ zl4*iS(DKLn*p-LMQKu@{@bYTx-?CMJTam2U+E2 zSQW>IuInp4%@p*G(gPtA1uq2>{-b?iSV_kQG(Zy+po6h04pl>vFVn_4vPc)9O#OBekLS z*xaa4sB1EWvJZuOBq1L2OBfa}fh{u?0v=?8QU7qMy6$RjF!ea=kibS;t40LWvc5(= z9DS1pu4m>^CtX?I#~A^m<0-$7KS>&GODn4TA9v4+ylZPMEGq>j9rRu4A#Lo57*_d| zOnyyuCD*DB?Go|23Vme?YkOz?ov(wz^9heemb8S3WUX*)*_aJUk2bQOgV*=+Xv8MC$g}VZ46iyI8mfwUM=-SJ#h~Qc$`Bv-Sa)HI z%b!cjhz;EVzRfZfzQldhxCPP#A*l<`M)nk4>M$DBvq)meTWvaCkX{(@vrGrHrQtG0 zey<55sIG&2se4u7zY^9uEkMs0RmHQApo0HQl9W)bo*G?nl~womlKg9f>|92(&oADe z*?DXnN@kzWq07Z^N|_eqBUi;5AD)WbeD$s{d!bp+;K<1&20pL#_~?ril~5f&MSG|i z)PSPUHLUJ8{G)yXpdxev_b!;l3?q!#HRDF(O@z$e;|15|q#a6|PGJI#SLCCC-Rr$7 zXCMt5+;E^Key9YYbWtsfk}QhDE?-Ry&vnDsXv&P1y&&-iAt926#aBk>Y?bBr|GNzT z{#A$iSvTai7#SnKuE#J^Ey+iBL%uh|&1`{7V4%I~%Mpl!R8TxZPP*_a+(m_$U=0l+AWp4fh*Ai7xS zUk?@Lr8hB>W`GN-t#yR4u-y$at$avqU(d0zV)ZN71|K~6wY+TH{4_yC*$|-N-I>;h zQ9*1U>)S1|B=x}~7L}5e5(mVZTJLlHYaNDD!5fNRyto@4xHL2wr#?s1%wr9{Kw$X874yC`>FnlZ&awfnDcKPBym`6#>$D54E?NLMi_YWBGP8hXG zij5NDqOO`AKVl8yOBCUvB0~`aGZ0>dpq2a64DNPw;!u@cO1o8)NJMm9ovZ`^3~~`e z+F2;^$ngRJTBQh`4tiHi3{*C|MwTK(em%@{rX> zGxD1Fz-^GeIH8q|DuKG|#|>ZjTn#8CrMxR|vv~9*$;EkPkg!BqIUO&1(S@KzT&%)w zW$+M7d2QgJ9ZjU1QA#>x%g!l?xLUNV7>p7KA%39BdPp*W47;vU^*q9k*fWd(y^r^$ zIOnsIQ5wqQi8cgC;Sw>i4(2nsi2YPB!crZep8=$f=z%sq!U}i;ZC=O7xwdWHIS^5+Z2N z&xMPu^q+oDLgW_NOl<{)P$@XAuz@DQ=5uEs_x#m5L}5G8^QEQgQ8O-L*c)_o2Es6F z-$)ksol8@+d~hl~1ISajT_$#!cJX6P81;WUP){?I>j94e{DUDj7prniT|0BL3dbx- zF~Rj_4{2Jzaw3}`gYYaBR9G(~Qc=;q3Oqwpm4PE%?`wZK{H8q z{rcoBw0giJZHAYd+kiu)CZUw8{+R>jFLM!*vG45DyY4PiqO~-#cCsJ2bx5E?wGPMW z=Q410A7h9ZtVDY_@e~h-n%kj>dlVgQ%*uu`F#F^mY24W#@meOyj&J>TFLz(QMuSTw8~1 z9{$F3A^l2iUIItNiaU#98)%~|z*6BQ7Lt2itT#nv1~mG6D#A*Sn^iLR)6@Pj`?u^h zoieUSpn1D4ZlyFFgv=y-{K*KbM%x#N zl7~NSd}})yp)3prjop}hAczf@in0RNWuEb}V3P427YHe9zkf}@J_XfSN4F`saVq&> zLrHG9d>-)M7_4V` z<^;WBq-39|2vyDgQ*=!=(VU9&zkX&h4v_{5Wi!a5?$ zjXVUgqNUau^0hqciJ=Oqb)S)#eJ7VnK;~#LST^(OV_-3-`J)h?ns6P4#Wbg(K$WD_ zRgY;=BIzhA;cbUMnp5Fei5vV*akWAE5m@;=C(>x23NXI6n?B73Z*}^9cxoTex9w%F z|IW3zu1h!yskBt$&8Gl}mS$;QANl8;%3o^fdzg+pPzS0wuTk7eYk3xFOO8oUumxKEorx`o?gQ#A>grr zfW#_jTNp?W?8VKmh+Y$y8qY~=4v>j353>d)(%Qiopv;O@ntjA*-Bsa#Ji5$U#%;zN zvYaXyDyWq|QYzgA^g-F2wolU3b>&IZl zGHsYKw0C~9Y1zU3wH`KQOD!AS646FV++}M4|MM8d*acpvLJwu0BkALjN9NE#g%HJs4b-J3Ph}2u+KHJ6Q zy}+eZPpi#n!W?Sk-jyqCr1B7^5vHxAtp%M>q>SRL1_#+B?L;!A(GOE6MnI5PKS@I+ z$i!Aa|l z?E=fsgiX$EVnxaYZN|zPeB(=QeM(h(n`5M!Q@^PYrl-pg!k}6^_1Pj z@uAw#=LkG``gkjBo0uRrN+P4@I0V>J` z=-Z^iaz^bO^FrT9UW|KWp8w&f!RDDszCUdB(I7RbuC+L}Xs>e1bQv2^Yf4tYr z6NbsLjnw1>O%yJj9NLdq-r+WIO{1?soa+>#xFzt~aSW!Rs#;cWo67Bs_OqdpqrFaS z7M)Z=^)+l-AJxaT!O*n8I6cb8#XLlItXPJVQQx!e#^)X_K^`EeWEF)eHL!2%3$iN#^aPw7TKX} zb+vV{QHUpqX%WyZtn0l^b(l}+bNsbz8z$Cyaz3bz?RV+L-%n_EXmD(H?p$~O?>-Qm zodx(RwI&kJnS*!P5)!Du)Pr>fc6&9&6^Yo4$=oMz^%LErp>uTV7BtbOqA{E4U}4_N zvZg3ysV8bKYV6@?E%SYv4wkS@2fattsq}aLpA6&!r?Kn8s5FaL~{63M+~3qqQeUw;d)y z=O|RMU1M*c&z5ROm^qd71GItI-iIeghY^qQCa$bZb!EJ{F3UvH?eU3S1jt@fnrmg> zjD@lthm2ayb}h*^&;dH9*@MbI5EFFv7^#mpM2tm)^Th4*7-%Wm$pm4Vl39NCQBGs%PLu%-)3mjD z+zA9r#Fw@E6_98}?Wnh~yoK$W`|ElPM=B2N@drez1N$VO#`_S=lROFoY;-aE+W2U2 zUKZh>BItFqG&Y+Bh8`X|7Zk)v;od}6d?!wSu&g+wT(!qZqfWVRRVjQbz6Zy#*3mo6 z|1#vnHGeCJ71zJ6bn*Q-sQwJz;CpiTZOHH zIy7rxAH9%T)}V;|g}#BALz{YPN!1D(e&qtD*$8Z*dNj3&yE_vUA=5~n44OhlBRBfn zP;hG+wQZf)kNS&x(D1|>mfqeF-p$1B-#i*e$g$E9Hx+IVf&F(hG>xt*tZ)Pad|sIX ze8l{+t68M{-j?TQItQg%9SGSz{5S8Wb@MTL2Es?|LpkvY9WBE{2XM0ttR$AJY)0{y zhqa>`auoWFO^YW9nu>6KU4E|zK^E@x*iF{5-6X6_Gl@03(FLICi9oN$b0U=a>IseT z<3*c3lX5Hn!d4q@*sy7TTc=B!B7`mKV0LYML^!xbx-LQBfF}8#)f|mXQwghCgsK{| zS!HTmT~+BWz!}9IU22D|HjZOSKn}I{fA-Xnn&BCAl;sDdgohdXH|RP?_XI}0jJkqj zCL2~Oo$oN(5SW?;4|MS@O&iy*LU4#ny4=9Si27`c!I4$d(zRL$JFnGL->@1Flov@W zB2h`1r@v<`v%jSlL4;Oq>_DiXq!G7kII-`)n~m2?Q>z{)pA3i;IZnILQ+Y^G=zYaw zWXL$NN%@IQqv{Mz_yCKvd{?fmQp}tY8XSZvF~V zb(de`zT&!zhUl7vyOcy&jFYlFYc^Ec(PI+hbWu{290K(2u?A5rU;ppte*W{eIwgUd z2FpfQ=|2BGl;_a$)2dBkZd`?u67xS?&vri6fMc3BCdq~Q@UMp+W(kmjD?zw692LqjDlA3nI?}$eu&whrXMa>7Gao6A3!VrmZaHg zYT4o*loihvP+2@eVKd>RXjsfjZ%g1bwUK3HqZDm@9_RiDTLi7hDxDtPkpw0pX#S`_YbE0zYv(AV0f4+S26h*Uo90m0z$vdGkzh^XDx%A^DSz8z-=8LQ zOs>eHHg!?k=l5Ko>1k5rhnGxn>odti%0``HKWOm{DRrBKx4(~fwQh=N zapv(79iq(~cx3l$#A&e9gPpja(GIH*NL!t0|lMiBN~|oVj7L`Wdr8ncfX_v zKC^5g($e?jah&o(~g;UGm8y zQ^F&bVU}Z>dD4C6NX*CPepc#v*YW+8EDJTLk>eB_5^6V#vJEZwl<6e)i;*zg2>3Hg zuv&4-U%wJ(tGI$hq(lYZBaWd%bR4}-RTab`sxC+MjxiwmP6?QG{|*jZ5bR?{z#hCV z2ioHTyyXciDyRDlB&&V(KMDV%v$rH{4mZ%xy|UEnjB3MQ-=`u31L?04)~Y^A)h#9? z9&_T3GaN)mNtNIc2rI?ttrpMvJv+Ch@c8nl24y$N@=ufbK!)*=v81a%J7bi}%oa5k z^l4HRjEeTBVb5V1ooy=Ks^T%*QHKGkksLbJdQz8}JD8GdV6NsvwmL?yN~xWr*o?A) zDCVr)2eTM#5G+eLH|22BK27(s5>3-A4_0$6@T-!|)Km3A`>I@Sj>-d8G#m+gwZ1XZ zk#5@h(9OsP^izg>fd$jHka1Eq4iaYYXV!xeC^fr{EO67zu^mpAcATqZyS=2TfP`>| zXHZp1OT$WphT>Sc%gON4YP`~)+13$~2{HcIMOZ(D^GZV#^24^=I+WdlM!p!PTz;6; z7LU>VzNoP}7#Qhj;!~kZ>vzI_(617g;GZCf&1}c&1Af4B-T#Fhn;q`^<|_O`^=;fV zm-H$|8P0IZ>koP90vdw<9BMx+weWW|R5bmcTkHHoiOX98HQ^tXVFtOnw!dmS-s9fk zCI6Yg#>XSiz!81@n3IAR-8RnB!WfOq+vsr}#&|C6Q3d6?f&jS2gf{sqZDnq#&7}Q5 zog%E?`H!n0PX%7!nCt%8(fj#pj@!!DY3?_~hSSR9+6m!Mh_MKc`vgXkzJJT+H?hpo zssy$qw=x2h))rXMFv48T6M%pdb*E9ES$X?g+&||CedhploQV=xZSp z7Sb6^sfyC$xfooowsqyzwZOOMZZtdeA-ES&khttpI?8aR@b}VK{{DNkgtE401!|ON zXYKFo1`BvJY^U8y^_Ls4c+2f@L!2<=MXJ_zvq+_NBP?GH#}yN&DPso-jSu+889eZq z5nNlLxHZuDs6k3%>A%$a31K_UgTsILVLt+5n3a{$6i;03D3AooVUf*Nu3d&iIFnl; zGZ-*?RBUBOEd4E0>QpoBESMktOaDr88f|7=D`JTuBg8jzSfLKujl!*l2&wnl_rN z()2PKs0hSAu$Hu7%85oW(L&sPX7CtrTLhilBX4{E=zS2Fbq#+;LbUKSE}daZGQg zue}SJSfN|ZkYe=2#TesPx<#Hu~dJ>yv!JRG!NrVosEthLB!e0d%pBY1@9%~p8Mi)4x>usQy zJE&;o8jz7aLC~J#E%3=z5CWjZ`rtpTMhQr6fPAxiriL_6m#vv>{h1PTm>z?By<5KR(~DF7gy! zS4xK2(LW^cr>TC)AImf^E~%?if!ZgbG8#wGIFumRuv@>lO1 z;vFMm6JK@1ccX92vpShC($Z(-|E)vYRz$0o&CWOvf|-N zSVE80#V#eLlnbxTWi^%3Y2S@`k@sZfUPpMVrZx zbOkauQ`t$3$<-F}eaN7*?btO=4LWAy$WhE-6W(vbm2qpABpW2?iNd+7GsqB3@LBn3 z1zxOGi(N^Fut|BxN`^uKL6HdmCXDeCG{#xqsbbbb|b!g4E?ParsWAn>YB2l(bSOkP;S@=wJV zHt`Xc;bz7sz~|)BUcycgcKyIj6`;Hi{Jwy7%3Hm^HQCY%Jzrd{x6Ze^AAxzxnKN8Q zD&O#y>>HvHy&lElkzW0lCas;BS=6meKcoQb5Dc&M6JCwyS|d_c=vX@cDps)GWG5y4 z;g$RWRkfP&(vjM!Fd-UFqM@7~Zc=+9kpde5D8_P8lhI~bsgVKCTqez!Q23Eu$%;;n zlSZZ`z6tlN0C)~;b z15*RDsgFD*DIw+ew59A7tc%^LBi@~8)c)pUc~8?3)$~SD4zy}+Eo6ePAO1D5`YqvA zpd0(~ISH;%n)K6778+}ZoukQQiK2vBFshSI`Cr#G6%kbKpbrSNMB9XgV*aak9Y5oFg&)6aCi>}P&%nib)8bXc-KD>* zI8uOdNR7i#7pX{YyH{!*kxu;#jQ>T;K(aJIWH;SG`->S&Cz2*fYfv}JB!`73-6g?u zt>*ZcQ1ze<{K*hxk?2u6Mx562dcmeeWV%)qk8PFCP(s@0kf_f`$Zbw!_}$PWxV3{= zfKasDbbHdYxz>9PlGo2p*5luvymriNQdr%ZxTS+X{DI-U5|+NWGE9MBpBLfu=7)1C z5=~TEKgL*oZ0C)N-b|9bPPSf~EEJaUnDf{!nv|*3Sr%MIh5kH-(-z$Es+hfmdPs^K zkHJd#FdZ`MI+vP-ZZzj}$cw$3QT11HLk^0*@SoMyOn1XD#L+6~30FyGMTghpofog* zzcQD#1{?KlNoZvtr-N$Ggd2z4?q+(kV!KN=P`fhq=H4zVOqL~HR+jJoB(K(|Hdwvj z%GYE}oZ&+gEmfr&xc#jUP{o?!|}tWNXaU#zh;czlh5>^SddA8tLDg&O-(>QY0|ldY@RwnxUl4 z&Q^$+TWvBR&LnDeonX|-&tJ`9!U9NXQn6Pp9!r!pX4{h1<@bA*yU7Sakpk&FrIJI_ ziNnUqFYIx{JwH!X7Jd%5X&AqC^E?PiM#Kh1Jb?{Pxxj1)US&AbW_IVi$YjPjSZXF$ zT*jT{w2Y|hOuh~6)0dLSRP!84k0-oNn`St^~hG*t?cvXov#cPl2ic==H{2U3w zEq^g1(H{L(#b!lHDdqR-hn&Fr5?qKi5G)u3uq}Lk|)*eBn+|~D1*+xblJ5$hgu2yZUtruxQ-NRsx}kR znI4RV7`rrSLkg6iFu!uqS?lVke*ot^oBPbQ6FOUCcO8S^b1=lps_lnNHD9%+rPLw9MdSlH|z4+Ju#&J`O8NUP$)_t;m^5lVNbJ(M2 zioCxYiqnxF-`|OD5oeW+dT=*mRN=Z-S5I2qwl$T#Jo)Tp;Od$yMsXZc>ia=dRm14n zBxB{Gy#?wB(n)LPXNA=KEY!tqvEmi_vhONCDnc&u`UPr+yHw}+D||Kv%T7>Ydx#$0fqqN9 zfiiQgy%th(tdxIrrJ+|CPZXNWT|yu~ZQUF8;{J(|@nG70+aLn8{1El3DNX((l)&lf z&ns%9ofkgvJ4`qFc56Ws2n3}fg8tac{q@L%#T?zYDm)jUK~mP z7}1bO)j{_mQn%r;|wpe z)Idm4znrqmqm`%?dPmyHPswG)Q=5_w=|v>k_l7=J5HMLX*SwJ;gx9C##7%W#;N@2;?fXt|O_$w<(;`L9=SQAs^5NKX># z8BN#<;@ECB1C?1l`0iG%@fmG88ds>%=i8aMzkP?k{$4#h0gD$V zeJ<|Gd=bq5lxUbRW#!HL;q`{4DGvj4k66U9cnSUpLm`oPpPvKPlFqFM>cpC#`t$ee zye-iB^7r*||6Eb0JWKbIb+_-{tl(oTfo`@ZS*i@okmFn2Z(UdS9j|z*9`2aD&v+x7 zDRa|TV7YK^P!;F)j|t}>U&8c1rhf6P)?se1&X#dZ`TnLU#0icRtX|J;Omrw_eQ)>V za1wd&`sC}XKZn)J5ESf3Wsp!A8i~?vTOG=R)P_X&3t5f)s8QKLR+pW(K1E`Y%6@AP zB)IL-<(cydcYW~|=t&jRUBuk~!P<95HPvmG^VHiTihnJ+-4O9yGO$yJvswf0L=Ay{)?6Kh|tnk({4n=yTH!e*rX}?l? z*lA{K>s*G79bUG5v^AMyd36P+jLKvfk(Yh4Xd!c;^{EgR@uB_c;*@Ga%k_8?GIP`F z=+A3AJ{vdcio|APIfmRDdPM67>9RW}eXYqpyY;b3gAdcGdYFpj_~XfM`|4|4woX?R z>wRgRx7QSU=dpTym@`>Joo*?{_|use@uh~f$Y_Ipk#1TSJOvBgfB*1s)~a~iBq3LS zn!A)kl0bu4+{ zHwk)}T2vZxIR$$?vpUJfFi5IhwpooEEgL=oXWPHQ?N1;NJ*Y66Mo>7jFZuQyik6^8xebwHNzhSwC=4?cO&IAocD z$F!7lH;vmI9??CfZ^Mgiln=1SWCRn5wQxRblsG?u^Ph=)8humW)PC0I_LVl>`4?L? ze%+<~Y_oE;EY>OT0o(DZ8GCLS@!cKJzr3D{D={ zMlhrM70w~R3Yo<=fsgE#({cZE&!AvN2?{O}QZ^MS3OV1G=Ab@G`Z*C3_VZDu+SC|Z z=CDjRKSdtn!JovwbvEK5d(5J}`as60RQetN#Zs!( z0y7m6e^m7xTjXi%$>Rr|drq)Ra2;pRW=M&}_3{P5O$DAbT@%lZ)%hnwISFqsddeaf zdi?RByW5g$c0P6iJtnZWfV0{+y=x?5woT3OLT98IMU+#~bA?OOki2r`b0aeZ=x73o zE!f3wGO!GDN5%uodQj6@AeH#&B{&{+A|CnJ+!lRkrZR(91_kj-?nXtZdWOR;P}G+$ zUPws-^L!z`{qV+TU2WH!qnr+Tu;~AAKd<~j^bsss7B@DnN&B~$@a(mkPVgi_%1qg| z84oYJVe(h_bM88WC-K@}(xEMb+_&QFK0zIgl)WOm1;u>`c?G3=jr?d8)!6j-xLu}+ zkXkES$8+^NB~fz8_8hWXq_@Q0dDxB@gLY%F2ycopL2sm)WN7<^`5aw*16nq0`F#gw z7)eZ~$`kSt-6%G3y0%nL=$Nn55^C71(yZx ze4XrhF(mNlg(vZ6`e)6xc9XDEIoy$Gglz@@O$H5Nk2*NqmJug8H1ixwLo8%cD6OW< z#l^a!dsN#ItWIAJKj*N%HJyPVL{;p9+X4G^I23#U^)LBlwYt?0Y+GF*I-o0fCy*(NRAvw<-j zf}V0*!Oqk@jST1vCY}pi{L*e;tX`~=`||WbyKA}WRqEKpV=rG{pXn<{koMy6GA`3~ zFL&(`4_8A`4nE`L!4i?Q${>Prf^&VNLubCr?-0M+HN&oQNvv4o3@3x7ze2X}SHClv z*d5ROCAbG0R%L2NUFH!!6_a7r$sOBpUpa3!#r#OGGxo@yEWy41c^Z3sj8o}&*KzvL z=hm%lYAzh@_`@DY8b6~K22*sq|Whp43bp#f=TV~5s`uq^#9}d9w`6fgif;{w zk9P_evH~#rXL=BDM#4=herMG7A?QGdJ|x#^4XGenr_ncb-Kt?4H23oNzuf@OFSX#TWqmYvMJ z{nUQ%NS#qf&8x#)}P1KubrFmY&;$rfmz{t9mVRQ{_C}grx({KAg&Do|vu0PU)Uvu={JRLWUUJSpSV60(($Og>my zNHgqF+mQreDA`yWlbkIj=dmx|mv)*GoQ|m51xr?5Yslr^GwbhmOpD2j7jZ2iOi1HH z-^TEC8$QW!lnv2|DeDw;ec$8KUX49Wp(EyoEZn(ID zKL^}x*Rt@>!qNY)YvIKN6`yqGUJ)`C--U@{0u9E0weXcZXg$($D@4nTNGi9{gKhw` z^x4=(h^0j?v+s!#Sw=#*6&hy(phH73(2I# zuQn!jG@qIj|0*W@?1@(q)8HLH`(*LriC z_SWR=t_AT0A=p9XT#%?%BOB19=hiy;6VI)-6jv$^)FAbO(0AXaoq&UBS~wh{>sw@t zDG?|OfHVnNR?%>iszVLE(vSDyo zx3jq-v|{z{BuXSX%9qoLdZh*nq5PT2d>wnG1uhEyex*557Yuba*c!aqE!%?LUWef< z+8M`l1o7MopB=jORoknAszJx^Vb=8}+>3Q6fBotH(~xxHzd5m4| zVZP{K5#IEeL;|-s)5*nUmsqUF7{f0iIaxc-XyYESVwKTpi^jN@ubsy)RyG z4f{bTg-Ot6W{>(=1LFGNS@a|aPB}#^LABV2242-L`jGZLVl}#m_`a1bi8wcNzI}5X z^qs1WY${6@VlzfCvOY`>XX~I36hen((_~w2h@{b2BzuLVh#@04nUo2_0!zC}Ld0mWWQ;269D_MFVgeoQe@mzjDZBz>_nc8p*;)FN{gK0${+3`bY18XM(y51oiyio| zS$XgbtGZfc=AO1vlhxBq8>5%g&hmu=djVN64^=jIHTK(^{RLitsYb{buE}3I#&WdX za7OJP{n-fb7$kEXd8YQ)r_2lqF8GWkJIW}oZ1@cjFwP_JO8?Ha4onnij$)5d|tcfk6UCC@J%m+9su zsz&l9ozz&vt?o<9&0TCBKIPAU-cM)+b`i0gBD9h8enN2RkaFMzEZ$xl6Y_fCE$btO zHG_BUDwVq_GY=vuT~NN9F&)8|a1riSt0#4YMn&*CGqzupr~vjof=Sy(*=*6;O!P24mg2O76M z>Goi6A>Fqz8M6gy70bo2318Ov(=JeD;7zZ&!lttm`g<4*^v8rt2v@V!bj*`P>Ozyb z;A4Y{zqYC%8r3Z&si7j$j6GK!0)C8JC#yn8cbGF!wMyMQl z*VQhY;v!Aww?4v*wzG8OIllXr`@Vyyo6PTVQlz6ot9#P422p~W>S&$dYJzKxL? zKgY;2`QsVGRQgkQ_z>XJ>Riz3?ro5gGP!iiuFF{qPKu@6MueS&JUKq#HM6^8ai*;*S^F_e`@b zS_%jb*lpDMKs`k7uUuft3f^~Sz9VL`VNh8k#E9~XfdVOAx|{*LGjsHzl49-#*@p)e z%DCgJq$dX#h9RL9+EIy6W9nV6hL8X>BJbrx5!BVo*Dpl)sn}%)k?E9TR0n}c<_XpT zvH`f5|rjb^*z%+geo;IlO~eNF=?s@ zz-;)A+^M#UougZdEG?NMyGOVEJ4^6x@0^6H(6_~P9=7cOPLI@-*KeSsLPA9hYJpc^ zjbemBTA^Y-=32@h+10{dE*5b89$pgx| z{jY2c?z)i#;6rb?WJt}|ADH2U0_4QB!h)OjV2f?43)<%|;*c!UYY>za5sNMWspF%+qe{@pLCwJA9t|KefjQ^h;zkL4p+*6XnTfte4Ou@5dK{I1<)j7rsJM>^ z$kL#*?`qYjWVn27&|T>shMfuTwL0P;e4Iws6Z9cBJ`}akAMDrP<@eirkQkb%!X4c< z>7+*>es(b*s$YHg4WDCb13pg?Ro91j5{Au6vM>FRPUd#knabtf{#Kd7)Z}UielFX5 z(Rxbc!2jqtCBd`(k;t%8>eCrOI$`l;RYoPN4zSHDq%(T|--qYQ32p8&v=y^wRI1vk zIR{^DArGSkUVQn$^}9{I*E<=0UB^c~wyuJ_(drolt47b>ZX+;TLMWeNt>SJ|{&n|e zFI|1ZAw9F#g!?4uhkMqh*SjS8$rsL!R+FGNVo1q+J5JG`k$UHi@j}Z6ua53s;a!Jf zHO5Efa26Z{<*^%z9Eal&#<#^Vmn4^KE8JmhA=0*%kuhxr+t2ZMUlnKrn~+=`v92k> z4~@_IJo4zHtAXH=xnQaLb$WGcVzj&w%^c_`Eiq}meBKoovm7-RRRL<&g(R1oL^PNX zFz1mm&&iI&GnUIjPWM0uiAOeu+j^raLY4O(hmh~3Iod;)gPgoEGt9kSLplxRPAjzb z1KSYA$_+UuGMMU9%DBwMfEOlQbl;6ynVhuO_T1=Hl;9Q&J8ia&ST${iCWR}`^FTFQ zbEMotu1ck3ddICzmb&R{&OdmHZkF!ShK|@(@plkpZDNJDm8fj39`;iV zlUN(uiu`-v3r}g#W+MQek$parw7BL=K)y3Lvj=+)bDt9Ut<3g%y=kC4Z%9H*u-J-N z;K)vdyN;hnP?F;YIYG7}jJYuLy@U+RV~~1D^hKRtHTmg_>XEQj0qZB*6nGZ_OKuOk z+PhA9y7?Le{>&@|WsxsIks+JWSl0*WR26gDdL}RyvU-Q#TbVOMvsT5m$Fv=`pT4uK z5YTMAOk%)TlrmNka#bXiR?nM6nqU9OUyM2h|plHPE)=Kl} zTaXan+-y|r2ReMu$3xVX?PyE@u2R|m&fTIh$sY);_XRHl2wuM2mfo=DA)%G3wuwzC z9!f~G>GgzpBnRV5jKpRjEO)|_WkbkaDjs79qAgod4}DoiZ<}(m$&HZd_Hb@rpg%eP zu+6z^ICm!#8pKM}y6q~!HH>U~a!(n|cx=Q%d(cBX15aUi7yYByOe6=7)>Om{h!xgV znw>X~O>D$YyLgk%fZ|_Gnv}6mso{t0%vPf)B8S8Bm{zQqY;7sDMpqip2xG!FdCmW7 z`aB>Qy!pR+O%~VqEnt|n3Tzk$B$RGGth}4|PuQ_Zo`QP_S7QsO+DosQyz2VEx0Cms zZkkiL$bZv+%11xILZyYMM=&CfZHp_Up65GtgWRWcSXMIXjN^y`Iy=pn((HyXpN~Z{ zsAX}ka@E&b&Mu|J@%QU>WO3(rd$*lTfkG60&yAgV>aQp7dIc*Mb(PL_3y*@5h29Rk z^reSLjp=haqZtYoI|f?$JKD`%x2Tna$;oA=zcH&U5xA%JPcx z^xi|)^~C3?GLM;zUrLHQ6EJc;qm1UYK@FP^2$O}Uax6GQbMQ%0_zQ;6$^F3e3J`@- zAO^jKZb>*3hG)ABpBn&;J|8qL%jYOe*3cMag zQkIWrgH!9x2$~z}%6(?}DbHhl0_$o(QDufaKLB|g)cyi!^G`kod-Tw$S2cfGJyufM zIVl7;2B-L|VhHWOA-)>m>=LhBw;A;NB6Eaf{qo3%isYvwOmcF4Ox?(O5(F_18r=fG zSqmCmpP)GWzi&`$M%WU9)~Ok#Yw&yga!N(QNjdu7k#}jAW{PRJi=Zd7+?yOJqGSpa zobJiR&%b%Cjv#?fK~r)US_Rv#K00t98}~>y8X@|JdTAPj`$81YGG{%}2WX2?PW^f;hZ zkZN0DN^n(q**8hGP1)m)@wDs^~VRc+zx%M2Ux<#`4&|5 zB}&=_jsW%Kc;LQJo_vzryRx(~GUY3(OA8Z{R7mJd#FYkh$9g!b+VHm>qtqz;RvRN> z(rV_*l^nqg`X+(KKGT$+Cdcc`Xhx^eJVhs#g4hM~IXsFiRa`YNqg8+l9i9!Ac07QM z?)}LIJ=;X(4p=C&PxR2Utt%YjE5T+hN5y*avX=v9$011>E@VmaNHd0dh4{d8RvS|W zPZBNARSwvvc*OXrt7OR|CQ#I-+|dq;q0uCP>mRp37vx9cT?T8j3g0Cy0&T*yW`-{C z3%T^#F`-Pi^S}R3?*TZY9v3cd($oi9!SnAopS=9|F0zU8QHqw@5>0q3Yqh?W=s=-c zeyt8+D}wVExPfWgtwczzbK6O_ngR5}9olSW{a9H)!RA*}j_HbuAyadbvYwyTiUxV; zU-e4RJBKx2<@M2TdD1zffmfnlR$uquVCXcc_Kt-pv}aqZYfJ722;A&_fWF~6K`~Ha z)zX=9BR2BR*YE(`O-)Le~t3@3gK8^AD$=uIq_dcz%X9=4r45AH} zXv)vQ=d`mV?w>G|MApoOOdIra}J}l1OqeJ!C+l$>de8V(b^uGX$3ZPp-)L zkDvIJ$8=*g$CU7?PB2LjDj06z&7>8+-}eDDuV-}~zw;;IxSLVHqDUty;_hY6NB!yp zyX)NAnUs0CydOu1!fL+mtWm#Z=s^)4&#$E|+9 zmf$@^(11(hXhlNV_Wrl<0(v26Op!N}sJhs_jA{`cVxIt1JVaQo#QA__X~ZcBp#a25 z(uo&=yJ04n1D##xkQ&p1adFU>HyV%sfLIZ^JBA9-8pqg$$<*2xP8i!j3MY|QN>AY( z67)r)b>PJqy+WhSMJy=O$XDJKXgwFhk^i}tjWWXf&GV~=3!G#{>5$gz!L4;h zuI1USW@aDgCE;RQ;2@O${u}M}x zwuOb@JZ)P-MAF(RlViqTE$IzO>yD~KDddN7cz#^JbgjBwSH5Sph0%FdPWYcDKDflq zdfziV6H%(!*fJsY^*$XGE*|2u#}p}v+H7XfF^@?RJ4 zha;}avPxAaL#roNuO14eYR$|mCR~Ye zV!s%9TncNQ#5rGEKQMCvl6>5py#R z>|(fjRbZ>@o%nU_a>l0!(0@13<H3;Yu%%qE#tlUf2d~!IEFvfruiI++ST_McK`ah_PdqEDb%3gTDddhYIqKPaUAmD z4H7wmIgj)aY^q&jca*DfPfDVNy{e#n%e?fU#We8@~++!vOno}rL}ikK!?&Njtgd1TLc_W7mPx#85}H=~R- z-PLvrg1=)=hX;ny)r|lGXLna^j|)Ob-5=S}J3RGU>vOpNb+0bXM|=FPvvK=!H~i<5 z(L$_{^qxcWO+k(;ohnkypvcnGVWJ-=lzhEKaWq5}+p|DmCBn=%GbBOSvp(?(c*{GG z@6#HT`J@6dA#`O^3#IaTN0ulcjUJ%Z|_y!V~Zuotxo;v}Z!mQ}wczaT&&)u>1?yH5fi5|WDI zZ+-MelU~Yv6@WI4eWu=f;`CPzhuWd3Bs8-@)9*#>!xQRtS?U+ z|46Z6mFbFBw!`I3ctxGSz~)=;4gNZrcvW`2(GL7mPq#sHw`g8j3;6S|kJy3+B*U4t zqM4;MugCF_i}0#ik~u#j4I-X;&2sm>wQMyYUX`OkxNi<*_L=8=NW_kyXGgR5VQJ>C z-YMn1Pi^#uN9a%CBJyyO{<+q@7hhKGrIib%>I)*9_0X?i9qR7EfI zc{M;dJ&fgY69;OGp&WAoCq-1OP?V2k`1m+iO%i(2k11H67^)5#=T*PQZ^=2f_pRgiZq;-CSHpgWruUzE&cf&W)uaK1xKEHx4T4i` zn8A;m zfAJMl{AyX6kR;tvZ_?qtMZdxu!n0UNsf+~2N`!dO?Tfj_3Y29!0zLr%NmcvBvC#f2 zN_Rik{Goi){wtb1s%VSs;od3Q&yYAyL8CD+Tm=H+W83b=EiTc+y?6sqytS<*3MjF6 z5`jQdFRx)*Jv$mqot~13Eh7uK=4gu0bHZU5VCq@7(AIwXtkPTQpMxzFBFT}U*OFo#xfaT3|286t-#w269q&1w3=I` zlM6PJ$o0Q2S5%Kr@^P^ZTt_}raZy7&7Ao;wY?@!JlAR*j{)&_YG1tRBcT5ND{!a7t z*-ak%?Hf`a_GQ6ng4Jo6&c%}z5#kYW7^3Roi<9gCa|U->(&O=gOL{~ut#~!eZ$6!Y zIHVf7?QDnK3KLxqq@kXMr`&E4r}d#e(zyn-Dp-6%|5Cn1PadoK#yfrl$Ux zpqg`%O*D|~+T-v;hHn;tctQOiTmGX>@n5VK(}7>8ytgPnb=})olc`UGqQB}jBZnld zkLUbT_xW@?2NA{PC91Qys<6~U`GXwYRVKD{2$$B){6yU}bJ(h?L>%hXPS0sQxacl4 z%VlFSXQlrxf4`!2&wfvmC@l}$;PPZk=9ayYe_?vH1|jon@?0}8`(-t0+D?L^(kV^g z-^ck)35sAqj2(B7rd8)YMJzJo12?39=kA|i^mmAL?b$)UAXGDLKxR8RE1?)f-#K#X zLFqr<+r^Y)T3hS$OiQf3>twdha}RvlrH9GV8`y0XlgjT}#r^*6{fN12Td+KzR_68rk5BwMDhS=sTYRFQ+XEqh*A~?L_VSjXDiDQ&&$|Q`Lu~>* zMiDngXj#l+M1a1$q75B{?h#zH`DL?gRy1brsCR1J5&X;ghOMQLJkR#((v>@7PP9a1 z@ySXtNNHh^e<~V`-Da*E9(@4D9(5;))&dIuy;F5K89p^9ZknT_5*0xr6Am3smftz? z2kyF<93}oerOex!NnxpCR+`;=DT(s_!|G{*1*0X8r)x6BYUc-9lq~H{%4qGMON~~n z-f1Q))b$Wa;}gE0o>neXR|UW)QnYLxEWAZb01y`A4;xlTa_;hiT7AM&gMHCPH;~F) z7dzbYNgdS|iwBowJ}5WT*HN2X^89>1auSlIAZpIgM+?)SC_nK0dy{^1S_J5M0}gw{ z#r0h4cKCb#g!=D~rzZ@q@C(30sj{~CGzO3bSS*Rp!^>D3{9_TdeEiWw@oR-ZG$d{K zox83>$34jaWLydte|qR9*&hv-d{doUvT?iy%L1P5@K+jDIzmR!D^kBlj)g*I3??Sk z!#r4d#H&AQ3#sYgph>gsWG!R+k7;aC91E~UTi!=bTc69bew39yDU`m8-I&tEu_m&;#_bdfO+ewEMACW500T|Ix;0^ydvvz)l_^JaW^;6J_ z5BADalU9!*XqPh_|M8>0y}G|=6bEZ{U?F43RBLPA0via{q7K4Uo>m}^ zw_=Nk>NNjGx^-=XJTtR#`=uzhk^#Dd`)~Na%rI0EJtHCF=6Zmf0d4x?{Yv!V7Z-Sv zfn%KS?`_8FpB!gjeng}gfAHpSd58fXd7=eChhaB--`l`r681Nv#n3VjFX>PHQA^72 zy~Q`}j`fmz`a_4DUcB-6-%(Ng?sWMvl{P9>Z}`6scuq@=`yF*t^9>u`%J8P|8`{ur z`kG4DE3t&tzSpdHL$Egz6NG;cOa1%KCMMs>YRPG;SSifw$8|~>C2`Vb=F4&OCmiw0hw+c(xGJ-lS~8gCoZ}v^9FTNULRZ4-%-5KIArHOF)f9xEfyv znDtEwSehWQuWeg9yGfpNzuAq>)Ea~mop#&WaSi519aJoX#H9guguvy=qng9{-h0H7(=emBt$#)jY*zmMzSpOUB(7B+ z2Id~EZS4?(N+v+!|Iednh-e;u%n&!$&hc=^dN#aHS7o$j8qK!!&qaB0?VH#dI6n3KMH8cmNkdc33rw!FWEWD zKBm~_e_v1J%=!v_0K4TB>iVar)t@9FFH!*?1Z;7TNzc=uVbQ{nyAHcMFV&0za*=Bp z^T0v@J^?%G>}34rsjK=i=dE?|l75j0A1k08)$p2(mnNFvQ#x=QJ4?3saksGOrJta; z=>}ptYq3`+S6ZKdYCSp|6#83zKIepe`&(3lT`&HfXK15@lz=cBu#UXCrcM%+;Du1d zA68Pgv~5Li8O|d+?98Gm?G8I{Wqk&7UOiA;?ayC$nAr67Y+|f5>dI@?^0G3hWVS+S zFOgPNPRw#dc?sXLf=X9s6`xUnh96Rf^P^*>qz`=CJPq}_??J`N)XC47=O7cic=UldcB$rZwQ(Y^+hkI$7LlNZ zqu=6?FH3;hTQ=US<#|R2q+imW%Pd&U zZoSmNQmmZ7PIomlqQ@Y?t#`=oG$v_|+Ty>vH4GU|m~Se*wsSK+oc_GBk4V zXM>ixaKXx1b7R{k^Cu{^f6V)M_G`tedl2E^zYpgBJ}h9MIYynm5S3@r4^6OJ26c zI&th@St<78zD?LOq$Ns=wU|cNT1}BtT?~AtQgEBhOO3Qijd*cx@XS@Ko8y`;(TAq; z`G@O(kh~mumz3h&50e0$fxR%7#%3)V3)9+@EIC^2?M-rZkt_B6B6eJ~o01*ObRaJT zUE?HD_im{D;ZsK7@>IhL;q&O zV&*{ZhJt|Jjqvf8P>PBnKsseQParCV0VkukEVIP`w#k77}rxZ^AeB<9QeTg|Q zGbnuAUeK?6SI+S3TuaOS@i69+9h)xlQo={W(pv=OWM!M06cOq~HF#{ifR(X&IOc&^ zZBoHlp6KTUHR0$7^Ly9>3al>czj3I!MD3t=Vw9*p}una zkXjudGhx?ScNVkng>o=GJ~?Q9OVV;J`%iBYPxRwA$vai}ZPgImQp7C}AH$X=(*V0H z&bC*TX>McHj2x;~>kil-*-bT!@(!T&Z3qcQ3v%TJ4;WD(+Xl<3P$OCb_F*Rl%`zR5 z+Phv(#?Baw8KPj92r5pBvP2;F1%*8K>a7E?a12qYf9yRo4xaqR52I9=#Xq_LaZR9u zU~|Q9z?U}HgpWOfanVVAa-$F)9V3W8MMI9qtOl%XCMCzj49w9S|2hSz*iSnce)Shc znh8Pagqf8puHB-T;Vt@r*DkZ7DKag17$ye;5AXs?!}t5ChS*@;+xq$%-{@cpqlr(c zoZLM6-ydM|2p?eAy*Z-KkW} zre|^ROe(U9^OFXF`ze|S5UzOuNOphI4hhFnqq7!fn+zw@eK8rs33h#L?%qsjnD05B z46ptUO#3+;A)Lo^r5hZ*5`+y%X5IO47Ko+Q(+*iECxB4R$4ygPKDccs7*z=PB{nFQ} zdQG-J=o=Mfozm9Y%w7E^KqDx8hTlK$5}QKaM59m_WIH!Bchgz_!2z0Inf)LXT z3H{*HQDhfLzA_Tq6RS(ON|?ew7)7$rONcCkIkiplTw5dV~_-3$2tusp9SnZH~#cX9Afbr9Kc}4kc)}w3k0v|<^uqsj<9clHXIZA4P z`^NnUW^km;tFR5P_o6QzH`fA)QV8f%j&cIILCMAg9VwW3?es;GJm%w~X{(MxFFh~oFp95?^|7(_BD^K0i) z%O(};G?50a311yM*v}mgZyB#7YB{7$l>Dwy;d~2p#Sq6ou09_u5_M@Qn;gD76pqP? zeMJudbE!K^6rw_--u>+?rl{ZQ4^;y~sTDwYArx_luEd2cXaiKV2He!tC62X^WN&?G z0RRP9_X)j!$f^Cgi z5IUiju3^DtMyMy%h`jLqyy;#>*{W?c5-LLOv{uv75z@@+%wt^>6g$#aq&bQ?sibao zQ?*-H+`IK_QO~7t8ZoUCV0Mq&Y|lXiT9TUP1uIG=^+)eH(5dBty5gYlz=@<{NadkH z7Rq4(A+ZVbDVV$fm>@uE-hWe0`nS%8ZWRky_Q5NS@r>KGun4WgAR4E>nXD3Pj2K{9*RQ?7-&PL%A$;fbq)9@ySE~D%KPa&IWIVyDmsJJVt9({7lgEnB zZ2a~s8`S&9S^?|A^mdDNPHEmM)`LlUN}_{}_zP>oU(QW7AH`?}W@hd_5`Bw)W?sjJ z8w|h#gAgqh0K{%UA_1cN*s*iUqnx89l7)^C@ohHf;%FaZyXwB-y!cPAxZfhYYpSEs^fV%#Z6|L_e`h6dc5c^Bq&a6DCT zIT){r$B2x$a(}bDxS~{%ahS@#T5`Ix4?co%=Vr3~W2@1GRIK~-U~#QYn>{?gKsa*Z@HpgOPZ}`gMw!vj6$Vy+XcheJxF-im8)NU2IFp?DS)|0rw#3)@&wwROa z(M4xB3Tzni3(oHIMo;%>5nV-I0 za0B%0gl9_lmG{fruUqLIv2#N@SLKaVB81wHSmO0dMyQ0aWIKw@eg@eGYAM`pCo~@F zt>%`k3UIULL${VMK?h4v|wpDrQl6piZC>#`Q&`qT+yOGm%KJ_6jh zhrw4F9#XV=#;+MPAr82A)<>qnpc!7Xd?25pFkw7L!1&tH5M2=AXkvlH48OEHMX*Nq zLZHip!Z=wm)?s_{uHX%Tr{ii`6_l2tjoJiJ(CWd*K)0A5XaoBw{q)H0pv$_eJg@-c z3{Pdz3+Jy_OGib{*?J7wAs16qt%%};f*M*pmQgq3qe7whR^Xs*(TQy?tdus?6*oGt zZz}w{miePb6M5o~uV;(fn$Ls1y0-V2JDnR7q%?61TH`*3m<_@4318eCT1VIREGT<0 z3hn<{-gwzyvr3ZiVO_UOW#s4$lu^y7t_nY5A6g{6X~e8F`XrNWR+-&{@xBuur{`}h z&p$4K11S?*f`A>m%n-=GFK=((71WB9#fbqi#bopldfh(C>z*G)1S65=Hq|63MCTdC zN7tr!tx4V}D6jy=ZjIE4USUcDbAu<8&%d^6$hSAtF=<70aNT+c55b9UJkm)C3){Db z=YMaTzV%JMoy}F4s4KwPA^%m%=j^jkmNavN2yWp=qqN~}7NaR$f-hV%=XsV%E3zjj zj%e_sJeUg+~g0(w@ZtunQZcQ-7u-n9R$B<>Epp{F-S zzn|SZupC=8A}2MA-(7&m!jc=xm+=WxVjzwMJ$Nj^361ynA5>&$&$X?Zu+;aL-h;7L zK(30W@RwT_&yM!&()~g!r*G%0ZmMN3Vj6z3k4_hDtd|iuw<#EI#p6Ng_x61pc9R@8 z-8s|3qS($#e;v$#{5z1#_DAb`FHaEgtL^?Xa=R4uW;t#NSy%%ZQ5|0P0LmZI9fT`CR}%yxs68!pV452)Y>mvDEta zHY6W!Z0M}Zro(Ipq=lv+0m(D>%Ai+oQo347d6rT%vr2n-zJc$Gck4n-SeG|1Uyhv@ za>lv*aL-m5Jy-3a)O+XmYmBgIE4YI~g~h6jg}4xscq*20WnL;8Q6g`1wxYK081Zkh zqV%7dvF?tIkil94@YfSR;88hBA8NnF9--9Kqv>RakmCMbBKg?Z9W60#KW)dU1EoVQu`TgdX z64Q{IEMgz4{Nox`RjOj7s;Xe$Keu>nd`u|26U6ye?_sVfMQUkZj-heWGYI38BWB{D z$FIq&-R2s+Px!5dM@!xIKV{iXf)JfRnkOL%K){tRC*!}2+|EdpJ<7-Gnbi-7f8X?F zI@5Cv(K#2{F!4+)EQ1&XU%cQ6)HNEG4QW`Rp3#-W3{5Ry-j_APYjxpbgw{;fQ8BZO zWx`&YoQ~;}m#4oAa2fvV4i%T{k|ym5*?$aiT;d#Yjg@CchcR{5zKr;nDrtx&Y&Sq} z_dj+{H`Vgz_SOj=Mgs&egRpKPE49OKGY5+pX}vw_JbM&e z)=Q~ZSJfmHnL4s_4l5Uo^}4j}z-?4cxZp$&ws&WGDB9XyWLTE_(sXY6Pc{`v)dQ?~ zOy#@Mhqs-IoAD5!)Uvx1>HcYqP=A(sQl9``Oz`<*hMg&+CU^&gxP0p%Y@%fnp?MSI z@R#^Lx@Bi{KFrS=YXwZyS^F_&YPJ*-ffJ%%RkT34_KKft@ z)u{1-m+$_P>p5wUznAiLOX?NdTcrNhubpoq@_eWmLyQAIeUkWr9W3`o_AGnO8|>WA z+YHe>xvY3=<$U_Q`!$N1aTk6DQP5j?4EN8N(7jPr)w0z2^S>Vm&)-+0n~c>j^pA*% z{)A2fltoB7%_VJW#{anu5bpEk;Q#KJgCE%YDPS`h#;zWG#*CN2 zlxs7PZ!ar|Q(H+I!bi;sX`%*ev=`+gMe@BFUSj)71h`XTNi> zv60Bz)~UtfzA=dP4dW$Zk*lZMSg?ZUc6HL2Y`MSYP18=5*r?6YS=2vi z5a%j}y+~+cWXqvT6#zZzR4-$GeWgN85WZd-AH(GF52v0o_SJC6vure9Opy;1EjPDl z|Au{50iCaVeaBd%H6fjpAMdbtcYr=s`(!Fe{eD1zgh)HApH5@}ODf-r`S*;QzN)4g z{2D`wd`} z0lSR#7j42Gg&tyvZdF1JuS}gfvuy!$`T?`sM^bT?p9~jH-%E|b@s&JgJKTy1Wgsll-lX3-H}YX>2A+_r5?BOMB>K2jTXSPl5#DbhFnGXTiRaHQL&H(9 z2&{e4rqbs-^FB)>!UIJl93X#A$e{6^hsh5WZhski z=u|*?iI%l9&}^Z#)V0UCBe7f#-8D~O<5u!`6F;e zL$eh2Wjo>>elG)dHBFy43%rwdc&k$D3@hV$AnJ!pS!G)CdlU$TBx)TGUOpDPl%x$4 zkFc58e{#|GJ1;<0XvAq*^3v8@H($=*>x~Nk{R!(so-WcW<2}o&07XzMTk-2 zaP!0hyRo`xdeSLTJ{NY~Jg{QCjJYE1K zORD}!G9ctY&cHmI-r}mTfuE!e`g}t)x~4Hxnj9W5q{7m@gZ|YA1r)0~JT#!|^$DX; zAG5RLPFI~TU^jY!7Zr90VWZ$v(^re+;%{F91Fa6!y4ZReLYXdQd8D^p`;nSVB z(V@C|I{-b0CpMv*DehP8w;-kKh4lU{X9m90udC&6r0$XUic?*8EIu?T`$hccZkbpb z!?Vi<8&>z(>*G~r)me=z5qeK7Yq^VEdxkoi`NwjFOhAPN1zh_))mg)2KgD!2_jFKLGSykSz(E6T^?Je*aaDTw zf?fwSe<%A@r&&P64iEo}Bsk^OPvC|)btLB84KOf`mb}2}YOvRFhgthLaqzX-6jRV! z$;6v5?0zf4Y>C`ilg|C`_FzkL7`Ee-LU?C*q96l?QA9a z5fJJ(X7=^dhws7?;(oRp6cAKHVf!uML|i8qu34BSrDk&%bO$Do4!rE4w0@wn?#Yd> z68~*sAA=4RM{sgNb(Xcq{3cYZwWt4so*XVBaw60CQ!KnH{I3v=D|@L@pmC@uoQS9{rA#7}23T z#VgiN;gMI^8V^(1VK9l%4)E{^e+pN7m(1TWrKfnG#oW#7*$;T(n*OssdwvKTV9mZ? zH#d(s?NVyOQbE))QEffsU zRo&l4+&4vGeDpY@yg~8{WESH9T{E?Vv;CZBiQ1acs-RKJ=cAVA!+hwUkI|hL%;%;R zDy`6+K=9odHw|@lgbB-T6tmd#UCK|wZj$s0bcZ}*4Din9`bg1VM}dVw zXc$yYftVfVoEWNo9V6IsvZ;f8$FYzJwh$t6`&g%Ivzz{DaO(J=bSKarg+=OS{i@Po z!~9><$Em%q*?w^x-@$FD`d>^uoUQsRjVNd`%x?ui-{>nB`MnK3Fxc~SH=HrV;uzu@ zdJt)U9{kloFe%Easg|(HP#RN$ou}^p(U+My81egw9xWsdPbFGE<2TP_Q^H3xIwFX> zRLJU;;{y@o4^8v@RgdXw$&P_8VuRQs{Kx!@B1oGMc%H1m63)ee;Q-_zo%m5+`HRMs z)PxKDCC~Q;F#?Q+_ANLUfr%^1_G{QsczWU?LbY+nN9!2^_>BV6uW}E~)7Vf;uW}I1z30*xc3WHPQD1NOT_x9{ z_{3G`)^y|eYjTDjURb1zoE2BeC;oVXGMf7_I_iVLnf1I^=Oh6lo z+hE#Wy2{{52S16?b^Fx-p9XbCK6 z>m>lfJpl|i4D7~&t0LDQC+LP6=ZDk-`fvf(GfK}vA%~(R`ZXwzM@8zdrn3qFLKfZk z6<$HpAwW!_=h^IF$K!?oH*!O%P6PQP*Z z$JPBd+_@6x4NNAuVX*Zq2JYXIE0q2wyrSh#{11Lr6lpS zsUZx`O({lMVe9>JtLDw416;;cpQyyVIW9Ou5_oY6SrsU3G88u5&bb%cJa5(CuPA4y z+aUfjBS~n|pDzY{c(?q0;UGT;PilrXVqfl~LEq;u-?ua*`B4ys3((f?%#8B)Ir(Q> z$E3luDu-8gg5Z{uF0UAc>^B@gTOMz!TRP9fY*mYa9#gy&SVjY$CYS91P4}PD+S!tz ztpeV%fR+{Z<3s%Y-)}nlcXqv$;mN#`$6Rk(l9{b?Le;GubfT*OAm~Nlj%ikMYFV-z zBke|w^9hz6|33TQR81E-bFW5vv5Yb(o_=|CP*y<|58Xy^`t-IDX8uJIGYMc zeLy~WVDMwyCa_jwGOseyFSXlD5XxXbXKASIYh&6h&=B^U+ydE6rndHLO5(+aV3*;8 zeuIbX4VFF~bjc-!;Ek`cMPR(w`^YAEU`_O@9tX_rgfu)B^Ur@iVs&tP!v`&sJDa;x znc|s&H+?7Ox zvS|;pdNmP}W~F);e;ume{zqg{p&AL*u5tKnF1=AHZXZs36GiIPX}I-u5;R8JKI>+S zd?&M6)Zj1mj$Io3A61hPFq}B2TXZY8uWz@pC4@W{zY zMf{;E4W(p<49pm*zoDv8P5nCW{Ag}25TAm7>7CZR?Y42dVZ3$hDcUCvubtDn%W4q+ z)*#(pg)a|mvD#Y9#EY$>OsaMm-Z6M8S-RUy&KA3dvoc3AuXreYNZXp3A3+~^g#+5i zye_jieKCYB-#Z-`!P@S@t2Z8xgJNlQ6opX#`Q}|I)^&d})nNI9D zuN?33d3ieT8eHO>?jhlp--`!R27)zg9svfbAcl!VhoT4HENdgCq>eNi#r^B$F~)LP zF_c2qbWNAhWz%s27DnmnoRdWd1GrzPGyREExWsW^N2TgMMKV1{F!b9ht(DD^LzXWg z#yA;0zl7bfV?|6d9YMmL?)#gbqez0HB*>RgcLVW|y81%0)=U;g0!q=L)t-e5Xai=f z5g1~7e^!1ETb#M^Jzfc|1G}5bwag!C|J1_j#?N0$0bY_1oxh6rPZ_MbpobM?=+H8y z%T`Xs@*@pgRk+r@Zs%77{NU0Rd$}kXQAFBYEijgBj%4OH_pH%(?c*`M?jgBHuS3yG zCud=?8*y`GZ79ixKcn;6325?VeUzO?6Y29ve{A>`5kIKhoFkYF&G#4I!>c>~sHT$2 zzg?{)R39w&AQt_DUYc(H?=Vj4YD{qolK>HaShwX?M5>R+OuT$EiMU?0R``Sh3^6~K0UAh4(Gp~P_=roP&PQXdTUWGlI5cR zJgE*!z|q)rzPIs_+4j1K+H)VlJz>QWNO6ZKaf}F3-MYGp!)_^HjRgu8OS-4pdZ=1G zj13^v`yA=a{Ovz6c&r845%n;3*F%dk= zg30Yib}p`_LB?2h6A(y`+h+Q%eyjhudoYSuv_{(H_*fB83G-TV_L5J%x{xjsSlrK<~6xr`uih`zEvLO zC##YIFO@zNkA+3pMJar|XQ4toHMJcwXu3Ev-K|qO7Rrfe&EpKq6c^q2BSEA3_!kRj zCP}5@p8aUsOR@qcY^H3?`Vk-ek^=7Krihzs^oC_&Aio$_q9wY4q>vPW0zvZX7;hiE z+V`rn{*&Mz4&&c?QnoAFLuSWxu=U~s?VcQ;EN!0HM!Y0MEJ3r-yeBG{8g0MNZlv`9qZ2jvS()VIR4<|$)Tsz7FPf=So7DD4n>LKQ4Z-;p z0huIN3rI9P`$Z~mJ0a+v=LoaRlgX{So0wP;v1g>CztzWUK68vxl&TMUs&>Edy2jl8 z-2EN<1L;Xwo||n5HSj(uHh&rsWtNalw{M9fR{I{4|HLz&Q8B zS=K4{ql2RP!74ItWK!5zl=tspW?u=VzD5)u+jk0G?DNRymRpmSS)X$AxMy|Y=++i8 z%37A!sU41(eXC69Y*VDMrT$6LtK$|%#Uj5~m<)Nd9smvivdonRdVVCvp+i5jCe#(@ zY#Wm{x)kC1j2ii*;nLI@6(C)&ia(#Rs4q%C}QPE6~#aQTm%9($f>J^U8FU4$HY7F)S4G5#5?y7}sn--e~# zp%2{;RRABn8+#VoX#*~+eVCx{YC~yOOHs_sJ7KA6GMPJWavLXP_M2Zcqp|j=Tx z^ZQ;r`j=+{-j%Kz1w-1w4(ouyImN7bisYJC+qfNnUaBq>gXkC`hnKNP^FrmBu6km} zm|u8LQqp*p$2z~t(VC`>XDd*55>>m6Q+qc`e4M>knW-a4 z;D-~`-#3zICdSH>SZF_?)x;7rbF<=F0+y%{2c3#q!xquC+4jU|COK49`6@qtTr>xQ z2pP~VP!HzBZc>|6x>bmOdXcA!aX$YnoByu2+MTP_C^u58ewQk< z=5PX7+nF4-22I826V?NY*J&o@tCEj$rVU zd^S|*LhtCoDqL>pCTcvlwIen~oo{v?pW;d2fFF~Krn=NKG>U(qMEn#G`;#w+IPdI$ zc|Qvv|B+4+Ruqgi8x7&>qUXTVnO7x0A0hdBRjMZ zJ3&o1T{4qSQr_s9nCpp)-efoV_Riiz6N^^1g+K^zU5<}k)y+q1t$`Iq0=B0;aWroN z{RWXtUn^&6e4#x6N7cDgZtLSu!kfPB%`}E68_^hSsd3z2S8pmzm(O#Nc5D{YzqYyo z*>BrE1z|z<-J!-$aCk2dZ)w&hZ}CzFOfEA;1=R!bH={8Df>iX@(m11{x5vFN(}{Kl zC+t!?e6PWve!lxK;DY9-c8vx1CsopnS!K)r1y4 zC564IUO>g3Rzy96AZqbxLdaF9x@9b4X??=O?7+5Sy#wB^Rk04DJ!?enfR{|HzB(2j zd;SjrWzBITYmG==@`a-CS@;JgMgj%lq0$@rNzQWmpR+WL*|CEWG}Ei+>!t#zR-ZfK zBot5f9?WuV5QVCUS|}<68S(BvBQ-MkY4*uEG+m@R7w>F+GxQ-~;eJKcEz#>!Ivutj zEsu+m6d8PHk7BG@o2XyaVV-UMWC@WQcLU5|q*dJoOARGm6pesgK@FX%3bcyizv>G{ z5Eu`o))wvu>0Vr+&O2rWP??gey|3lMt|86QJ9&H1aWACto5T(V%Vsr>vSiONd~%ksJR~JUxlMNO(m%YV zb#9K~^}>g$B*&!~B~gt^8JU>Mw|%?+i8%CT5YPL`YhRWl@o74_m6IL6)G0Yz*?~-^ z=Xiz!;pc`;X={%w7u0ksW)tf`-EnM_ zTGj66j%mE0(+Oto-dCU6s-8((e3k(iOR)ZifQ4MxCJv3J;z%4+XeOrq$#_VzF-fbt zqxWcE#hCXIYBM4ngSYl*OmV8gv|_!{imtn;T2~s*pQpG}fuiM7;ocI%<@_cM18#!8 zKte0kt4vDV|M8k>N)Hu~?gsLP)-dXfRV{6B!r);2QhAKRP$q0BgEOKrY6epZXYpo1 z?7W7-Xfi;8S2!VFOzbE5S|B*tw{i10opiy0SJ6)2vYtBbCoanc!;pRIISvb2M*kAZ zMrQ8T4{@&PCiTOfi0|~|$hzBk299d)SdQZm^rcqNEcl31ZWBp7=0lQfNd$yqM9vqo zTLg3Q-pa)q9Z}`-^|K!P0|t7Y5gtMj;&@(B|F6dAP+DV>Ld;?GgKL+eo>FD)r^m9z z1Nqk9id+({8#bz^%|^eIF?#yT*B7}(WKm8U&3=bG@BP_$W}8Jo0}0qkl%O7D#Jd#8 zX9K|Cw~6VsqdjQTvte1(FtT2G4FS|A=(1%HH}X0Y_?UGRsl#g3L;zben92axqu7Rg z$+W+q_;!6tQA_;L$=Kd@1@Ko=GaJ$TrX3c<;x8`YRDjW16&|ptpPeWCsQt#FsJJ5z z{k3aU(Yi67Ai{pNqM(f0d1;8FAMl~jAMQHTIG}R=SRs-r+z27Y%Zk6nS8@YaV$#~L zxPkx=TdsNR_AT7X@~K3ZKd^=GuJcdXgcfwgu_0-%cl4!4G_qo17XrdcJy!KK$=@FHjw*UcIiteH3?5|I%2Pbg|gvXWTx6~a0wlX@HlzJ=RiYzPk~AuX!zl& z#mHc}&G_N>e|?5@Q1E|Uh4**?hRjsAQ!lKP&v!AZA8^QYa;c)Sv}}3m8UOJ0+x}pl zZH zCC5C7J9;)?{c`{Cn87j}|6oTOYl+5IdE%yzuWfJ)?t#bw4?L*>IHV(dA~Z;I;Kp<%U?sp)9!Q#~X;z{awXn{g;yTz8{~?VH4$AkE4#yM%p?!0(5|KYf_L^P_#y|MFI6MreCdzP5sE) zEU&`*f;)$B=uRAihK2-?Po=LuYaPzAS^q@_tPaMM#z%zGEl+1f3^xNuMtvjzT} zz&0E;QM9aukn1`$STP_m_u^~&WzKaH6Z-+%^KHfGnZrGsumYJ#%hs=dv~8|>(aikB zWN4;w`BQ~i2^0SyAf|J$qZXUKKil@lzjs}w?W(DbK`oa(es)i6IozlgBR-S3$oO9- zr}$nmo>ZLpVc1jI+!bhXVkx<`p1lu~X$lv%sbsEeNfN6vzf-7yq)a~st-eW?B_z1) zj4Niz?AJfAI|7D>pLCz7<2u(nyDzhnSjC8+tHmvsblD}7;(0e(IibI#h+-_i4Y?={ z!LtH~(Hdw+wiyNgjk@RTM429LW^BJqjs(HY)$Ncewgn*xbr-@0E&*Hvm17*OQB(Xb zhJ3I1pGtkFG#&^G%s5A{-`fAj2v~E)rs%68#Ysk`h@Fb6{5ZXtpTX$QO4h}BGE7K@ zyP|p^nNzcnl}QG_m?}yga(!+@Ga#NwqD!w=i?Mu!%rgP}s)eO(Q?;B%KgHq<(7e4`IaSV!^%P6 zwK?#jj3JveYoCKJRJ5v@ygtXHooIm^xolUc|#0Om2QM39RmF!c?- z+Z5Ad3|9j=x~vrh`Gj(YmQ zjmMz+h2#ky@mXe7N>{r4D8B7M`asFrq{0!R{TJs;tMb}|v%mCtV`tmPoMwjdB*GLn zPnLWObw}}B=KaH#76X9H`Xw0awq=!b#dbf@W_Q0a@rJs!w?4hJx>b~{ymm-^T%Z#a zcmf9(2q!BcrlCtlAd|thY3qK{^5WWJ@-vEYnwX`>Gk(tuf>{q_cV20yXI z4b;qC@r`1qGG1Bq_jK)2zV$U#>RF>k6xEn1){X#40?CvmCwvGg?^2JJ+~j;c)%MKw zXfr~?H>U>@f*ha7TEo{p#ATj8__zMBI4KwbIiuqG_=MR(=qY=%|6_gippq7<0xm4N zSIe^}6C^c<+3HF>-;KuiOT*N(mflM>R~}CRXNFN*|U>}*-LP_z*d?md&!wF}L z7H58TvD3uXcC-s<8^i4R@qz{fp?&YRQE1%hK7*q~O^lzD zb5zrGBw1~Z-`W*fcI0r5TvOR@yrQn`f)CA(vEE}V8q|qh%cF!x zXOFKtP03?=v-o4aIILC6S5TJ28RDMHzS|=k4J%JB+`UVou4|<9OMJ$nY3DyiM4&h* zNEs(Za`mJ^m^4If*ajT0iBkB`6PFZz+NX)*KbE{`W}rST-uuHEad8X+O3d(^lkN@r z&Mkk0$X?hy6Z!<&)f!BjmdLI7<||VN^SkoOZ$*BS?e0wa@F#HzRvhuQpT$=P<(}EH zK)#5sR?ebUyBt`braQDp5tf~F)X2Rvmd-@hs9A6G$l%%DJt>xA83@0~TP;Um%(r9|yY&Fjll-jT*+3 z#6P8?HI3_$;!0{8SmU;c8f?xsMP4Bkw4#0Y4m@6B8wjnacjp~6`e|)B;jTje6Px}_ z*r~lBk=e{PP*ot+!X7V&GGlSDY_-M>sarsnNWQs}ld@MKy+ICf1aT@WbiF1P-v6H} zncM)Hsb{X&NN;iyrma|SpeFktZ}lKy77v?##1V3h>iiW{tzWe~LMBJy&bpUVIL#L7 zJSk_*pZ=tCp0KO^^BTf3T!|(rtS+_EaIQs%F4hStcbb}vk8!_B|G%1Pb3@wh>zTI# zDt#Xa=zLwq56b}K@ymsta(}Y>61%i4MHh0QKQ`6xCn-RKKD0S5AEM2t0yOxd{6AOC zUPme~krK6Pg3rgC3j&#hlBU^nNuc313Al+GUSyg+^r>$uwipqGq!?~DpU@_jW)PC^ z($-P(52d<_M*LQ39q^6Y5jVh}9>hM379!_HLtp6*8~-Yt`i(owV5T08)r=jps4OHi z-jq=gE%;qw{K;uu8+&0B>j2)MBf&Cj#9j z%C3{^;(DY|Ylb{qVTMHAU4_QyVguYB$i?oy_mP0YJCYLA0A08`0*}a&rY|AX{WJ}O zfRB^TP-WZ`K9=pFziUfx=P{;5y83yOCaOdZwpmx%&X3Z0*>i2FjRb~p_q+Hx{6 zD+;NJ1|xY1F-;EGA%CzNgQc!CPD=YrnrDIpzi|AI(+r}XrazS?9pochDP(IeWhyRe z)c+OaHXSb=kcs_=EARH5%_FA0pg?t~4{v17ZlK3|mjppwsdxuaZr0*%HJq#(p73Ra zDfOt|=#0Q!QnD~A*#4;|ZsUK<4qW=7npA?W$-~-X-eFE4t!)4Qa`e)V5dTF2z>H9aHZ5od&z@Nk8<7zoyS!l*YRqiY|jXiU7Xqoavkjjpio< z451GlnRVirDsmy*e#0??DIilB*FxiU`^3)WBx{Y46ea)g0F4)xUqO!j?o*)Io;y%cvhVL$Y) zEr&!J)ZB+9&v^d@h(mAeXlz{%n58Hq66FPN!!;K+QD7H-MP@zn2nEmoU7p*E^2M5b z)m2c>hO_(C{Vxo%>ifpe_BZiYs)zB|6;G!|31Dq|TomGphnLqQk>53Or`Iu_4U;(x z8GO`hJFOr4NIqXiKEl8V>;{9JaD*y`fM7^gh6R`Q2iP8*z$mIcjTkCe%Ln@vI#kR{ zV(55{JHM98*1aKv>A!w8&gQ9P5Eo^&Y_*9>i_)Ahf{n32*RH-jscvUq%l(UT#RrlR zYeMPw+lUB9a8VgPivh`Q3dx>JUTOnppWv5Y@w5I;`TU_djBlzJ+aXhE3Dc7%q+?4F zzbpT6TT2if7sq(U{@{YFwIeg*j>n|USDmFOP!+q;q!ntIq|R*{SFaG)YZAX==1w<% z1&~;2BAWUvkd_Tt8vhUqtlilPN3MeHRuq5_7Wt91m@}CY2XyE%iw28T{q?B>UU>c2 zqlUX33|P}8Sp@T9IOM#wnkCNJRyR-RIfu!*e*5mIH7;Y0I`zfzq+onC{w9oZOjzU% zdS3#tgE!kN10;LuUNcp?6>6sJ-D}tXi)yf%F%>Kt#|E8sq;a#~5h*TrRgP>N7IO92O+Ik9LB)G~dL0@Aju%qOUtL_~96YS+n$t_~ zhD)EHE;ofgL3dvSKJw=<%Ake7sQJ;L>@Ai+)gfrY8)r!JK{j<8!v3JI*)l$hIV4K_ zFghq^muzsf7+L+q|EF32BMa+ScY<)0{CgP#Nx+2HftDc22$0;Ca%}$s8v2Q5&|<=8 zf-XHjr%9uYC-l0%_|<=CK_#~%yThKt?~`M3;}@sFyKhw8e(5J~XiAO44|8o$zU=q? z)f-M>qiuVyby~diuPHlQk1nPD&_8b$xIn0Ds6Q0Fmhb=51cr!+N?5`6tBzq3oMC2F zUYLD>gd=x&3=mQtCf<(dt>#@}RP#XI;wqSNq$Y4^a)dvmWq4GU3r$d>?T~W@hgpyW zb7_jW=f>!;fB(Ib%(C*{sUB163$CHz5Xz_?iF=hpiD>@-HU`P!o3qAOl#^2ZmA-1i zQ#gYGRy6kaHY?BloWx8HX&!#+M{&x9BnvKh1^eZ~BYzqztz|ZJ@pi(X>?p$bn51E! z-83FYR7wAnol@vkkGrlbOk{>F9sTT=)XsLI1MhOa2cz@tB@Qxib zUdOjqp{`BB-~n#k3`@~N+(dV)#Q}4!OW_lun5WaJ!tUKG=z@bB5X7m-@-zy zr6(6l{-v~+1>{s-RL1CCriQkcBqkT*?g>HIx*vyuVS_BM=l-YUy$Cf9!RvmJOzkG} zN0gd@e<0I|2YW0j^~vTn1%HQ);h}zX8LaPgSiotd*Ik#^WoB|_28 zBH*ieJId2)WIOHAh?PLFlcGReBn47v!VmRkl>z9lf{Kb2gGWHX_8j*+2#mW?!_1Os zt%sDn;NHIB|L=bP{4?$Z!aq(0BTiW)CN#a{vaEIIf3-I-_rugYI9?}I!e|snr5Evq z!UgxkJ=E2$0)pX_UMCUytL~P+^d;e9Mg)B=q^(2GD!6`zOxoF7F*A(Qs`JB@OzGj# z)2-MQgq9keO7=#LXj~(>efW2bEWlU3RIejINu=?Xu0pS&;NSh}dfd%Wnv5}Ibm=1O zEan%(+HtdDb@VmqP(>K@`@J3;I`l7k{ti@bs0RuU(6LZ5b}#dC0P*U*-D}fR4AzAC zoXnE|ek!-fUUyW+uy=7QWf~>&sg9Lh*c4D*<|I;Q>@^xVR03ZBrxO+Qo{}l9pq=cb zbpIDXQ6=tv^^>HQIJMN&8y#$4qUIW*MUDj>sHeuSayQCIR~6`D+RwN}JnsybfeU9D zBzqOVhc-Nq>EbYY9QjCSrHuu)X{*iflOcO={V}TISBYjdl#8}{hKyLl{cT#Twf6W= zRXelK-nkYlTa!X2in4(Ee!Uj0_g#~IcAw9+^JTA%oKYRjZ1`k?P3I&*tbszrBKz>XLX(FwA#h~(+j_(CX78@lX@Z)mt#=ns#}} zD}GlK3=yg{IxX4(c2N8$2@0Pb`tMLQs?6);-$AwWaV>QH84ABrMh>tVa@TofvJj9b zG8{-yO~naOZfQ)?8og4gczkEHdKa%2B)i|vhbpDg(rC(+8841a9J_6uQa~as8C0o> z;GjtY8`2^sMvbd;>X@lg#bXWnt|+h8BqSQksR?POPK2p~sY>-p*>@{?qbdJ-E87w9tn?l*exM`nH%z83%M=0 zs|z=VSNWt(3iiVV#r5-kH%%4$L*e9>(Z**YNb8~65j*7!T$7ra@pY-C2?3Xuy z=G>(a`S801O9WOW{8PBjF*ZdTNJnbfftTR~YP`e7V~u*_{1P{$F2>mkAkifmYmB9$q$C8aPiV$|W;?}1R zAIr8HTy>V-%ZggHdy4;n3ahMm{_hUOA_$I0;YJjSdrZ*eK0m-QMC|yAN!qY+L9k%__&YA@JPB5tXwJh;5 z7WQ-Bx2FH|QN}zF$vm~N228HBM*9dRd|t5S<+k1DbIn~(iJay2#d+weWfr+@N^VJ7 zx;0m7(xAp?CXaZi9yA45@BY`*GaPp5|1(C1_YTzgf;y z{pb$7j=FZ_yx$zC|8>gavNU%MClYA&(l3w|I&e&Ldvp3wb>|X?i8ZZV3xP?RU8=`n zd@fryTTkC#J^$m}SM_!BA=zR|L`_9q&9VKuN~MzJ$bBwQjty?0%bi|Z0n!D~Obs?4 zli+wq)%0%I;Lplu^4Z(LM)w{*9x?9+BNuUOyMwF>lX;h?t!YQ{!YCzlo*XaGU5DJv z({$0lWsEB5(9C}!SLd$2-Jk1E+6#~qG!$Ynhl!UMN(!Xw6}FJisN!*YU>J00_`Xse z8rZD`$rT@<1Y;N2MAx<+r?}aUO&1{4K&mZ)){o;{h^Jw;^~bK+I%NHTFPLM2*wv@b z)nL$iNTbbb^#9@Ag(cwsmvh%1xAOD*7>J1=sKD|)f76sOV694(P%#%)mQJ_LIE=QQ zHEC?Nd7Y1|C><-=4#AH|M*MWp<0ppd^+i8Nfj2bu{z8KPi&o?3cq{D1V`SH0_&E{} z!`q(nqf8Y7#6V*Ob_Lg2cP(dvjZgK(wz$hR16tjP%t1ss(n4P6vTs*BZAJzenb*AF zLh;g=HI;X#q3EBRddJ2)`JcU_@Up-DW}dks+smOIr?UG3q0*GvxSGy}+c?3rFAyYI zCV*0UtD5g-Yn`x)5UIEd9}lS}Hzl@+-%k@42rt2EqsdDft>a(@Tf{P283WxV%ZL{w zU^R4Z>lgsk1fr@whH9(4RrAR`jOKpU$&?c*wl}f_X4NYSJiC<&-6n*}lRxh`+~#%m z$Ti13C#TGOJ3AZEydI`Bm&_=~U_{~#5P3%W9#@>n+3xpnIH-x3%Jpx{JxBAw=?!>M za+Z>h}WQI zec2z|4@8}1DJj_+UEv03&stGqOUqmPH-t<^V{=O& z-z^GKpT`h}MvKUbxoPhU=%U8U3a-ZdA5wFg%K-JqJNvz!*AC9;*K74py)yJhg0f7B zcJ_O1^CCJ;vLlhM>M`(~$21`-BI7s~!JSDG-XV$~hYC(B>%$)buW$5`6vmDk z;-VSMDLzEYIjy*BOeRno@$=^Em0{^OMCG*mB#RAUVr9UzFr%|3W7bb>1&8!}Jg+0& z-!>|TU=5>_qyIHf)w~37cA?QtZ}{lmy^bHYrgPS+I@)JM~Dv)X_SB zRfg$1F@GwJ1aPE;9vu+2dK9<;gy3%ASI-sBfuPFNy%_uQBUTiIx{Uz_F4|d0)(ENQ zDGCQ;S^FY7|1MhvVfSzsh{%yD2{V92?up*s0JDxF;or%gBQ4@lgMM+OlHu~dUp}d0 z{I@_glHN-=1VGMe+E8_p^)OX1#O!v7Ucm!(dNpE8`C)oXb~t64KtDhT@c*O(>lc>AEto zp8UibYg%nTNuBW9gZqS?As0}wmCEzD zp9vAK)>j|}8n7e{|Cu1;fefC`{?mPrlHDIhkCPMC54h4YX77VGE5{^kR~YYWAsw4J zf2>$MlFfhmqC>x;Lyi8I#TUo~g>*1Y$xcs1ZsEGdF0|Z?FFfAx@RJHUi6nG;LGQ6n zQ7AKYO?GxRV6mQksNt*Ks=L_^`=LB=G_{m?W2cQwK+1d=MS2S{XaZE?3d;? zloDIJgH^mI>qz;-=#DXlQD+ZuH|ecSpIS)rnGv)moBUv+s&^`Hjju7T$5Pi&E_b)i zzG-{^+&CM>s8Ex)p&bt`7YT9_YOfQz|7-4YD#hPb2Ry;pw+_#aEfm(08+HD6dJH&K zf`ZeDOp|C`y(;lw*vxG>&SIYti0p$ ztNh&7P5_B~^wx**v3x+@u4Tsa2*DRUInK~mb+PQ9F1UCH+GgfMW)15xP4`VLJ{VfY zYK%XfIo+U1j9fI;?+I@3suA9H;CGN+cFFc$m)@-raC;wJ1Df;utjL=T6OwoVzD0j$!Z*gN7~E|*izD(`m7CH|`crc@{zK!6 zn}O6y376|07BLPD7~7U`PCaO7VwhxoKdlzeFR$N}@jkth>}+}FyAy@BS(5V+QsdLO zehumCqNIIpZFvNo!0F60X%tX2*r^A04U{#VXx9Ay7aK6acg+sSZf&-ayp#1t;ENp{ zmc9qcwa(1*9GOQTQ)!%k2A8+N^(by-MFGX{ovrmOc&N6uvK>u0?1q1ehq}0&AU;yc z{U_7TJq`cTr2Fc(1Gs$ouXgG_d|Ptb=k(Vs5Cxo2S4)?8M8(Sa}XS7c1E#Ac8H8er_{XG_P=Jp;W| z+GPkn5{}Ckg}=XbkOF4zY6o{mvc|SVt0Y#MU;X{ANcJ=_eIyl3)6lZE`Jc{@;gv8IG!~zm0_)8nLzXs+L`m&6$!IPHT97F${M)! z4g#w}k$JIGUM-n63dv?MpYOLm$Y=9SD&2s;KHn){&jf9)P=;U5qtY->N;DZ3)>c0%Cpo2XDN%8J;^X@QX&Vv# zXV;g`8$8^CTna#k2H=$bzXcNq0_2!PyGho3&s%(xGCPy$cmb_G29d<_TZlYTZ`)T3 zVqaMgKZQSJM5rEoPInp&$7d7N4A_VN8)07^)>ijs+d_es7A;bsKq*ilxO;I6E+II@ z-JJqKic=`=h2jvrxEA-~?!nz1lAG^$XP%im&&=FEAvrsFvi8|$ziY3x-e%_)ue}J_ zg38sJ$f>p8EDKqo5%g9 zUB3=iW-v8RS-2aWkET8OjRNi;Gq93u%p(X?vUiiIm=1`S*I4IuNeCJ&FZX`RVs`4e z5O?zTH${+#KNhFAluZ)@^#*K;O1_p&m@{pD5g5!buud(>7!ml%W4?SPebTZ2+U&&^ zDM=GT&Vw6i^~Se%l0(|YHb_^7#4|7;+$XPomiip^(b)6HS9Ly64rVK;d#V#7GJE#Y zN3dL#Wd=?3lF7lY-s3k2rr}Yj*cJSg8xVgwV8wi_l<9zv^R^U8yphbMtnpY0Kqt*cJiK4^g_7#kroDvdxWq!{W;q_Ddu7^ z`-W2rhqax+<*sr1nZIwo`rCNRwJ{YnekOAg9ex413O_c4U3G1aR^pzmfLz%{>HH65 zNfxBVaDatCDg;>F)ud49yKHYq`!d%J(bI=C7_bbT?@LbCE83CVO~aWjM)H z3qX^}a-ny6=~c}U<7NUmx1cd|L+CcYMU+DJCtZdQlZ+^;LRH>aUgGL=!;KjFllgTe zj0Cw01d}5DZzal<`wi;lhJr^96$}u*!^;i3uE-k47U};iLre(Bz^o6-PiDWxo2DFc zgT*rjJHI8hRu0O|yeyNmx9#K>D-VpP%$E~wz{yeFP<_%8@6t4Z!ug-N>_exNn;(TR{c z9NT4+8O~-%fuL25vj`Mw|%*1oHxtf-I^AR!^Q zWx2U{V>k`08M>k*5Bj8TBq9Ztv0z!RdIz45)fn{d63OCujLg)CeKv@+17B3Fufmev z7`%rgvxxY1qYB?|Sw=Ib=?j{P#QAqHW|hnjs{CS*p~H_%?$#%1^hGnkX2m%^d(8G@F~iyS zT)bw9Xl#-2!~@cjl%(msluDbzaZe#BK~*MXRqrMJ_+{L=_HPq9{w~y5WRK_ZHyhS> zJ}iWkdb9)$k;LfyV%!F3N-kZqlt9L<_+>Vz#BGNAho~XpgPcd-?agWz*l@pn+vAjT zsGjm*)c0>SH$QDxdb|?k8wG00HJG*}zk&xL$suq}-_9vjZ9$^5Ywx?4crDE+tG)M7 zeq2Bf{@Bvo{f=%^X*{x_PKgkQGf#+UP9f%FsmOP>a8-54KI&5tBHgUawQt&jyYx~0 zic3Tbj1QLX_vm-Ml7#k%=&iYKRlgDN*D1o5xuR+}q+!lu719a42grNZ$4f@F=mcFs zk|=NN`Uok>mC!9ITjwqDL{n?5$`dq>8v+c3w=O_d$)KvMlDb*z#ieQSHG1Su!p^|6 z_o1@-Be$E0o}#Hz5oyp`ZL+3BGZrv{Nz4#Md|^nH)AcP{Paue>x3crx##lfojZ%Qfx+&hdlDIJ9| zohNbX`m7l~P2UaVXa#e^;(y}qs;TsblQ7Bjnx+qUjtZ6&UBWh2LP12ByL;(J79I^n zSn|#eY+x9`OKpjds;)yB&XG}m*)=S|!*@ap`M&^2!uGh!v z(~c*k+BLEK&=)qCdhoM#R*ypsdnEd{#XOubXL%Lb!=aK?HPv_7DAi1$_33Ka_aw)3 z;B}05-|i1^nQ&GCW8)f_CJ!A=qos(b;+l~l0 z3&X5Pq_s)L+H}H-jGNglo>^!#bz01ud602f|DxN!Sc}HjgY-o$Z?^)r4`hADFvUo|%=P6bCx}P{%@A zChD~pM&DC&Bb$)?by4^ybAh>EBBeB*B$PtCrxzB&S|;=@piPB|q5L&m{lrG)w%-4^ zGk$q~RauU7LBIR1BqN>wY29^rbnqanrFiwxWDq`ZHy1o?-ee z*lH4V6AW$o>Q^KZ-;yKr7UV98+>%)8*C&swivQ}QJXA)Inw2QQ#S#6=H!+VIh(9qV zgMjwsh~1+-)c}_SlvEVifUTxAh{FuRXP{8m-I%5AYWX2r+mGW=sU=22OhT|FhGNk- zY&BgioQJ~6zqjKhUqO6~j%F64Q{vJ)op{CspB0(*6lFupip0E9B0}F>5KvDHE?1P4 z7H3i=A#WJj!vI}0m|RA;s+>l~(8g@10lOoycLK|)|Dl^`g*LF{shPVqGV(xRr>bFHo)O0=o0UL50$GZD;O{S|uKW?j^?2|tjof7aA17ry zmSoQ6l6zr(Q;k7BT^Msx61_=JAhw_2!7k9L<}CeSu0p3y*2}qIjmu$L#v(gehzm68 z*Ey~$THsV#4kwQ5_#nvo-Yw*SMEFw1<%=O>@M1V-0-4lJ35RD%LM$eQv%ZjrKE`X~ zP{j^U;Q;%e&Hm4^OQqg5ZLkLL>kEBASM2vlvO#*z9G<84RyExl%AyAywm43al>fFz z3Kua*T-tWa*W0TKC6F8rW*UosYdY0IdlbUmh< z{aHG%m>Q&@JldQ>td|Mv1`TQ;*T;y9GuZm@)U3id@V{)5qs6q z-fa8!$oi?!u)wrf4nmwo6woKav)4<0u>X_yxBPxdugdZ5mSv*Q@N^mCH*L9l9Xx)n z1NuNrc~+;X&tf~s0$prl+(}|WB-9&NeH`3^I-|L9Zy*`3d7DHv4w_s zCJqY6Rrhm~nu&Aax(>q6^mue(E>N6x%4ofT_Xgs4;EAS*hpY)(Il&G@HePjC!Izew zqP!LQq!N$|t3+EPw;K_)(Q!>L3WCvO4X)3PlWRc=yt;pKrKE!z!3T(~yQkU4%%b&n zHZ8oMPn&{6wcf}z#b04VOaFWPfN%fJtTt~g&tp&&zo9GfDQh?*E3qub2kNQg z;+#Sb+D}m%V0`RL`f*h$F^L=?`ID2(mDphlnRK@0-*j+Jv?;osr4Bod6y>lE55>K+ z(fDlr%piPJNwgajN)Oc%IYql!TkmYwvV z-{{?}-vY`|%grGfU>@lWNfc(D;Mg7Y)yTVN?!$}+v3(!)=^RG7{_}^wV`tcxH6IHx z50FaF$1!In!|`pb?pMe#|G&oja8 z#H)Uj*z)-LZKM2Xcth^}2lrttYL%!I0yi2?ONrlqaz-XFekXkoZPU{VIn8>ZskPre z>#;o4wwKQ-ahEQfL*^u-vCtB%o0j8)ztK%7^6r$#Q~ZNP*@R%ZYfOS^*{zjdHGh;x zROZtUno*{Tf&qZj+7yQ8gT{^J!sn~g_G9HoPY8@WDHtZH@x<;wG-mIvrwSOqaM!{0 zBPp^8Mp$w(o`c@>j(pHDSFiCt-SC(7JfmG_6L$KGVanZuNOPYh-L0Fs9|5Me8vN=mka==1T%F)o>LyoBBL zoSw)q8T$*f9Li2sx<}YOJ7Shg%{I=+xd)8>C`x-hX!SL zbfeLW2)y|JJBNw1YP9da%v7I^CBH@z>-Q%6(HlCnlEv!jDpur<+z%Tq)$F8n_?A@+ zQ9@bw2E!PYCI;FuLPUE4UN#h(`@1oMB{;@?OKd1TVREW696>x>ubCE@eA#T~J$HwK z^Vcb#*xmY^$}q|~M#sEqPW>N#i#i_ay@=$mY$^_71a)d&HY?@(n%p~`;r?NdvceV+ zjB+vIP+_RFNfq7b_QR0w=pZmE>_Mp_>^ZD?(~zw3#msLW{41_MSfgONzX#)RXbMXH zo)23y#c`0zEf@Ep1FIz6X?n1T6Ce{&u$iFCP6|R1Y?L9dAa6|Un>am5nN~$w-gKC7 zbybIzP@OZ7O50-sRocqSnGf6)2_;@FpHn`mIR?s@J8NCuQ5_FZ75GO)q@I{YMP z4s+dHx5GyTlqR5ujG@#h>L$w|1#3)BaWV6 z>h2%=P?*_P^}bb6T~^tUQHAzW&cAe}!sFt2?)q$M1j1vMO!7v|P#hOf0JB(d6IN2H zj}ql3MZumf8*Bh3jjy}Vn^xvWM7?Gt6(%8$bLltZMEsRDkn=vU@iIW=_s_hFE`Y2Z9qj62kXE5ao4&)*+emM!b;yWSZY_ILsFLyfwF z-4i9UhHq)Vmi^GCjr%5pHYg2sUGSv>9mAkNjXW|=359=MxJ#yR>5DfeR{B}`uem~5DLh0rJ{OvB^hZACS2;AF8Hk5C z7Oy+VBx+i4YNst1(A@<8P&s9lnoKzebHtjZDwT(oXq^!(3K4r{ipjw!6(ns`Ntg9S zMEP2Lj#Cy&NT#MDx6P7lsD7ZgrU>xGjio?-e)Zv!3iGr?BS2~;Ydk92PFW|FI1y8utwnjnYhdt>oQ#Lna z)rnL67mUuXY@qZU{M0f1a}nX+XwPWSV{_eKaPb@vJ?9!a&ySz`N<$`<y#vj}x^wZ4>)wqj%K|A6vx;w?Zwt{*b!)j!jUo!T}7o?+6Dp(k0 zGkB!k{v#I;22N*RgEC*^;lBRoPw9)Kos(Q2<%J9ab;agvj*A4o1j1ZJu)*P(;mOGz z-BT|_e!dtm?hbvl{d4@estRs5tiz<;9A%^U{*i8H}&kqn@jLG!aWjoYQD8wuDxIWsr#!Bm!|&h zY;`>4md~5USYod;HuA~2LVX1CA&LfOe5tx~Gp>G!3`i7#>o`~jo-fVTN4M6=e=TcT zEZ-mppKFQ8Tb}VSeFbDsGdl&R*RU1#6k2|#9rc-Mu9~IYg4VR%-b~1m&W?laoMwKo z5W!6q`V!7)Q_5^$n5Px5$6+7S*d~8KaEWhh2PVeKw&9^Pl#kqJM#22SHKXVhM7&M# z1Ay>R)=RDRHJZLd6M9IPXfXAjc|^_b1&UhCKLxwT^7?75^FXptfd(>A!4UpjYPJo2 zdv*Cdwj%d*?oS-#RYDn?#psHSi=wOSF%d4|8=5jb;~SCiMkaV-M8F(_yIoS|zi{z9 zMgmxKBSOE%^oDCo>8+tTG+uvR!_sH6 zjEVtUyK#@fpm3JhE{BV=`VMg%3u4v zkJk*IxrF)E6!(pf@Di%QQS^lGnvM}PihE9h6?4EshMvUDn06l8A0=`O=1rH=xFBXG zv1U2Fqa(rcZ!`D^4R%5I5e^wWOyY*KX+&O+NO$3pVtngbiHC?SvW*v8(WO)Tj1S47 z-T`75>9f1y-i~cgzoyDR{Cm0en3-V#>n5~FDODTNZv^YkM^fX6gy|er zwULZYGBM>z%>GPO*Q%INay{1;3Ds$-B5aU;E$j1YFj2(1#Xez@lHPQ!Q+wVMm-kv7 zRZ9e9+eE!Ql<|HaZX~ByR-*F8x7XP8X>>zBsGE?FpJ2rk;c!t~A(&9D36|B)zPUYM z@(!svzCL&e^;>o~v^$gH-b$>6O$a~w-BNp_NjDA1fzN1t5J3^5b5`B$xC^d?<+?JK zn7XPI1Kg^hu3Zz&<8Y<_w2x5bk9Ydt-$F_xL0VgF!xJELwx@#zMn&MHvm zMpclIr95q`Nr^nQrsn#|{3XV7;nZ;O!Mh7_{+~XMu^WLo}jRyl%vg@RD zVhM!UWzDyECca=5re_|huKgIu*f*eFAfZnM%)h6oFw-rf%kWX?g- z9OV-wy?jEPaLxJvA|J6o#96Nnlp|kDR^5wc^i*0Kzx*beRKu0HS#&xc7(f$__E1B_ zr3?c&Aoin?V(XO|fD?BVB;Y?048b;776}Z8ntjG|SG}#Eb-o8? zt`iDYAbM$Zl4a1Ud72ju>)m9_8@L{7MrH$_(L3Xw-}1hsN~)>-H>?Qs2KV!`3OG!C z_#cxA^VDYLJFW0&2~c|uy{t1I;eAlz%$X)!^}*3XYaS@hE`6w!5Xw`A>+AYP4(&g3wz`BT2l5UH3b}((|@n6MHN%6s!7dknaoD*r_$=~bAc0h8!#Q$KY}owS=EITdGMVYGu=_Q%_qSoQGM6mMf5WVA3AVzA0YZdKE(XBF<*LqgS-tAQ3Lm!0JJSB<7hvLH+h6H1Nb)6C<8!_|n5Z^v0a@}?e6?wB) zw7vuy6d71y=tCY8YSYdag9#WIKbw7afnT=ow%@h8H?MHG#nuFMPnXNzrWVW+SG~a1 zwEFaTGIF2QGcok_zWvdOGUC~XIzIp)_l1C&p*TLw@ z3gRgr7Z#nB>$Mb%N2VBHD`}c_<`I0V(Te)5LSO7vF)a3)OF&M0pbeUhYZ$yg7rN>N?4^`*{Be=SBsmUS?8y|vp$v-cKNgx;(UsJ1+hH0 z9h8v78TaPhCiES!@O=f{?30ti#9>NHFizNaQX-#vO>K%!0coO^H zE~6^nd!KL(Rz2Fbf!rvL)`-D)mZH}pH!si4pTBoek=8#nc1)pR7PxK)L-D>=bL~0Rgx{!l~Af;uuGEFFFA`&n_avvfF9zc1b?CT$= zuq9ZOM0LZ$n8S(i@YqJ|Q$B3LH(4*~5Ozp5_zLFj0A-H?2Pzl`>Y$n8cYZ-FVTC{%A)XY?u-DI8Z1#=Ho~9gC4C zy51rJ-lA&UzW*-sS2jNNd#5S~N2-IOYOjt-JiE*kXFRp~XVQs*jXgCUoGn8LKoPY` z5*DIVE)3wZ#L}S`-n@?{$i&nmt5!o=+pKSSf2;BVr9WMiF$`+i*m7)#d7JY*CMzl- zO)B3wCrr(A9TTDywsqALsx()*B*xpNd`}Hk&9{)Xn#grzMpzEDS*2x6LVopbqDC=Q{-+&Wd)Nh*bXWJ@sx;42BYmzBhA1?p=`({HE2A0bOm z@+B;BNkF~Eti2l;_`zQ}w6{MM1Mxv5=Vxl-mB=b=GVQc8mlLs>@{?|674CiYw%zrP zy(zl~7bLOHl&xjWe-2m)&66V-IbhnKB$m_bn0%yZ&1)|G z!9<+MsV3bt9x*9y8`0;fhyTT@OMStBXCRu9sfPIUT|W92$RJ5P_ugZ|tTy&Iu&v|d zVLp=9@=i@&kKv~ot$sy>$b1(SXcg?ES#Lsc~C1p>p9#aY01Tv<6h`Q zupCnvT`97N+e!?HSJ^ zo;NYIAp#%&XT)aaOo#EVhFgqJl}{QvT`F>MpFeM77)@Xa5vXqbO{>2Y?EjV}Jt7OW zcck~_yFPZA!ziv_3Ix#WV8so$4aop{9&wOS&09O`!b{qbTfnC?3_o%jG23CR5*h`8 zs*LubKRlT(f;0okt-wuNw>T4b!?{n(sQ&HJz6fLMMS zHvDfxs0cXp%GE5Ald+m`FE$I=ip3)%SM7cTK7~=I1XsJ+9rcKTFT&Te_9-3*-~m~# z;Up_Ei5}|A5;E=ab;>=Lak(|K0J?JjEN7j28quKuLKNENhoGk?2V(HW4D{9Rkr~Xo zDJuy2MOWfcCfRtIPt`ve>C90N6%QKm4z-191@U(cZm? zF0ADC#dxFOX%=GDPO}qJ?{f;jjhx!DDeCpSZgDOdU7@ke z&zdUynnrTt!gh2>6L;Xs$+3oD(Ho#YJjCI*O9vpdvz*tDH@Gjoahtcf9m zSZAmPs7iFc{FR;bME(jNBEGAD-W^G%FIYXmbty>&qmoQmRcSdwUq}Z!difx}v-JFb zunR$y%)JB!k1N#_Xa4m^rj{m-Y)XPwopSzgDCS39=4(W?CoKImj8ZH+3hAtk(D#4B z41cWbz;i|=v96tTs-nl`2lez&KT6G+O0_-5ugQD>Ov@4mYs@76+h8m9Q|%JcN(mj6gi>P8jE3X7d)#2auhf> z#Xl+Bz`p>2STv~#G-gt63xev5+Z`rgoMU$nAP6rLK!V= zpR#D3XipjfL)FL6WW9yH4BpF@_v4FKKi_SFcXF=GM7)0bFm#u`>ED6|4A6kh4B`3Ef;(t3V8y0s@{B0xCmiy4#3~uA<;i%jwiGX;? zehF+nY)HF}TcxkdldSJp6mCFJm8tW3QEF;8mFN1(=5yxD1CggzIVOkc9u>C1lfF-9 zvtH@RnrC4*ukw!XWbVJNWc2-nlM48%<<)CV8=LWMDt^cNlQ5lh31X_VRA}>N(r-%U z<$Tup$Lz4SpKpM>1ySr=5)o@ie)Xf}?VM&QkS}5`!k8ZSV34F4AqE`2e!AgkK_EL# z{kQM2x?O$6{fJRkBuI1eqK*)XAN{e8gD?g&3T~us8hx5f#O67zO2!~ymErtn@tKFv z^CFH#8McYK&O=9n$oFr{&oOGT4d2#&ECfol{rZF32b%g@%^BGg`}XU)_Ys$J>s!$_ zXw*x=DzjVp*IbVdxmt;m>p+{X_MJD^YU($gO132M31sV)+z6M%gocvw7WPY)3!ks?3w$nAi%-g@+7Y3N$Ins>l7Jw9bm`raqRs=!Q8Um3$f|MRJ zz!}+j-P5>HsBp8cw`P?Qikxo=o%Sl3oIv#fEZ6YRef5_5ieX;YA>Y8^vr?Gz)3=$Zip)n zhlgXR>W(?HN6Sx-^bQLr_D3^I-SuCIRL%+wgOpRqXNs^zWpY{*vAgjQ5~+r{D@y*Y zY?jEA_S!Rn|L#{_q}QZXZJ6*zTQhXmSTCOQ6`oM%bNUsVgVhni!CtqSp}#k}WrpCxdM zO~MN+bVr(-2Qu*&ZEtzgH_$VWQyjY>-~a0iLFja>=ka~=7HZ}_g}LvKxCCpZ{9j|rY|Ky_8Yqq{1%Sr^$g{u3jtLNhdAf;ZL zI3fvqr;y~E%iXuvG|llG^cwZVtgW{V^|kxw6LMb%4ZYD4gl{U6qG3y;InIyGg8`oG z13LNN^i~%0aBvQJPEPGhOZx-cy@aso3YVsKj=Pn=KD`1mJJr5`-;Cp2YJ8gCG!p6k z$_wbmKAC?S-S^PDlkERP!KcjGx)Jep^|L*9T=V6K$;vh@IHXzvnI0mW%dCkhvOq1H zTW(++@(1vtSg8>jWx8@c=lhg-d8x`AMR{%6Ur|eM=!YtqeY^J-<1;q1wSMkH7P)#& zOvao}{`Hf`x4G?~WrzOxfy z64Kd-AZOu)VyK{8p#fo-2}zYU_s@P2heB(jEpibZ3U;k6jU!h-=~JQVSk zZ<3CGLZ(*Fgx#8+njcsnlf6zf=2WEEO{>tB?|h%gS7%q@ts0FNUz=DBS0PuFG5i;z zJ}+R_mJi*8i2bJ7_Ex|!z)_#^5yw$l=|C|u{dSV~;X|pM*X~mtvqJmO7AQ9KOAstV zuxz~gUsC>aQAAiuOep1$RV-@Nh0DQfBdxGl1PmvtWk@X$Z zD1iyo@YxIo9J~``7Sy8IiMAH_PPYrsI*WLlu+Alig>XEwrAS`~pPS4saI)owuIseT zJy0T(ZtVzjkJV!1i76tFK|&eaPPNpXo@$x$q~*#B`T}Ueg$po&rk# z_iX2sltekhqwSGL8&AP{C)i!zZ)R8ZeLdIi(Om=PBrZAHg=#onZgj7m{Yt-rTOe8I z{|+D2hW`Q&aWh=zdHxXW;pEx>iV^SQiGOb`EL$%IDg9EKCi5FygxGfPO8lj!K`Q1W-l22`0=v<cvr4e1F^51uukL5| z%JLP6-!$cx5?#IAPq8-Y(xH?I$$%uL^*2dd^0&{uBMWxg+HT~Q#>Lxb4nDJ;J-<*$ z3Y);(DPmGjRM(^uOk}2~vuG?B8kJ*fzUbqovUr|ML)7xHFEHoCz0PC_E5Y0ry&Mum zc&~^!Me^2G$Fc4#I`lU_e?-+%hNJMBxA8cUleHk`XN7$irv?&r0971<$W;#TlSz#9 z0{YOrA}if8E#H#yNUy&T8Ea2}>e*!zCTe}2#qEzwI>Nj?*n4qKBif!sl&$ZGoqst! zS?>jzsThk|eIg=5kK|8itP#S*HyYYqV%oHg+~$>hrL8?_9~v_# zLx=~s@cSVCM-*P^hW>Nu&VRmCF#z$=2?SbOjQvwOR)@m0Arxj>=JalkfKYyre~0!d zX45+cC05T+LoV{A;ED7%KrCmshg8sydLBj_477HC3706Cf$6fP)M;nwZI{Pg0hW%)R?SS0*S7Ayv4|J2I!^?#b5dC&bC4 z%OW396UtOScWF%dHatGHYYgTc!kpi-Pi;A;@#Pj_?Z!Z?Eh-HDWB=hzMH!^HoUbZ8-}P1O-A3-bdD7uz@QI zw2zH#MH8p(T#dI;bES0U0FB%sE`_;|!|tD{J2*^Y7?-3pyOWlLJS zP=DB=SRe*7sg)%u5iwS7Y*^|uyX&;JjP`g=t{$?Vj*vKcwD41?g=ff0&eGXEoZify zYbRl)hnBzaFwaD%NnTBi=g)`X0jgLz?VNuKi%?K9-RI=GhVZW(tWp044w=R>FLG{kc{u2N$o_J1vS$e~#Okppadceoy5n&QuWUtR zQ`F0j-fdR(D>rROETSXmi%~Yv839xav2|NA&uzsYG%Kv766XkLq35w1DWCwVb%1ue z1lNkrSkGF!bhC=2QK4)h>KqwPrzhiUNppJ;2_D&LfSJ~pr7u#nl7bU;kM#bEmaF@q zvLgKS98=I|=l8z>Y&3eb2OeR)y05KoE076Ewh?ilyMCwP5`R3}@{+-0E_afF+ilA{ z!0P5v7*PqJ->|pdI^Gd|Yc~PEX>c$2$C!EIH5I@rjtp!8}hsD_fw+c%H$>tI~58 zx*w}vOEhq3A|ugR1ad_0B@E7AITi5{Fy=fTiI)YnU1TVa>u89?x2_O z!BvEvOJ+Wr!S%M(vk(C4y(lx%Vq^`F(71pBSLd#Nb$| zbU`O>@e7!UI~NU8!cY4b9H;f)JeJl%+slL9L#jsi$dv9m2YhQp^C@9hS5)A|8``L6 z=vb*r=*r>9vYxb3cE`|D??I;RIAX{IcoLec= zlfVWPBi4L{dnTnUV-0PeB;PHW`$+^<^I&jq+|v#9;v{}x>V0b^1NK3y2=u?Dt-?tTXs8M0*A&BA&fqYcU89 z%I`9gImFD)vW-o6`T~3%VQfiQz$6-_@{I<51fYq-e;#Io|3!8VBQnmN0l=h=Lqt2I zGtx@TiTdUx?z87Vo?%=daQwU1WKy0VXV_?H z?r=6#sTZvpvjpnt=m&k#z+w7CRm_cv;a_b~*s6h3{$1UhBZ7I;bKN4YaLtiohTQCm zR;5&;5c37~5?m2^qh-nb;%~7Z(-hSKW#0bg2Om^xNUf*yi+34FiW6l+?5K+XFXUoZ z#q;HAtd$f=(2lZ*5Yw8%qQBjK(Cc8;?jwaD2~kr(nyxxL4Z^^@eurNZG&b_;nV!X@D}SFvj1Uj< zAO99IZvT$r`0@~JIhJ|WYn_OhdcFJL=|BF8;T3UjgSj4Q7hQ0Hs{p8aEcv18wmVTl zQLK%w#@ROl<8e<79~=WuSfv_cZ90c`-@ZEx)zGYde-sLoMU#pkKFdm6P=3HQkja`$ z^%!snl7qm04r^QrVVll}Lz!HmV#n{Iml@nf8XNYu1nULmyGylFXgGt0y1nCnPI8%j zm14Qy`}=6cA&SL3-v|tc#@)PmzqC<%+8f5G(x31bxMLZ&NX7=I=4cf-*43O(Qb|mg z<*=pP=X4-P48i|2f7eMC6F`&-SR4ZD74smUP z1^{_l??^~~Szr@|@mP22k0#5rED5M_=oj^KHEqDS?jxfePaO!@ekbor-%RC{SkVAe zM6tS>hRlc{`42P3oPQ=!8wn>V3zQ>ZuF6jmdB`?-O;?NtJw^SWrmj5a~b_ z$=a(~s&GF-OoxNWTe4PYh5xP!zJq9oGb)9KDTD(JRe8ejrIrU+e+0sY`n(bxAm4~7 zdU6pHgcc>(OY|d}3|Y3zYVSGB%BnSHE*lciC`aK<7mj*ry&HtNT0mGy4JiA01ftev zNqy;(WMj|p`kWfxy4c8pY)?@UhQBL#^SHsblXJp_5Nm@yX4&fIcZ0~!ox5}T+Dc*Y zedGS0$LGPv%~>yl0>QS4%#0XRuz32^3g?`J97REs9;2=bs%T9&oHnQ+&T0-c#!)8n zR)&VfBl@80T-727zmSNN-SWf;`YEmGfC^nP<5h9w^#gCHW)F5p!DfE7M$XC7ql5GQ zBxc=ks*>*GCwD&x}rauin!XUb6 zhI1pg=k~lb<@fDRqw28z10(34n%(^mH08JHYVs(oy@4QYie@^ed@mwA1b+ycejuG+ zX5j6HGgJlL5MCxe-!dk0y5aZ1&*2Z->0!k-xvw4FHo}ayT!V=2IZx>jhk*L~yBdvJ zf9KtefdvflXv|5C+62N$FTJ*(;SK6@%%=lcnO;pRes|Y0dNUEj{zI{5mDjBNPEu#X zs`@dIP&z;R*jGyX#px?5eo%I+DDD@_5sKa|(obs?Hsa|rk2IO_Z#{C1jN!_4Wood9 zTr}U5+K(5J70vOCUn%D5r9?4Vd;HI-FIgL|LVUht5m0cX1}!4vMwm8SsSmO`zAzdonT@Ou?u-7UtC3Y|v_QVr9zL?Q&?U`j!%XNn!c zMMO8EdaztpZ(K8gMSJT8eKP@c+dC~@k9oM9!}ypqZP#)?NDDRIwmr9PGg`BzDSuNc z`$()}cLV_#Ax^&wPFZ(&*H*JGOmZTJ>jiV+tW}U6JEvBj?@O zJhThe<@kCtegMatm~Z*F2sNXgL=wdD3J#R8S;juLiAd#du-)a-h^`iWv4gZC$>e5s zoP;!~O<|<&Ao@1HfAPQC5vua!w){2*t_@u}4HgK0cP0#XS;& zKw|8ozsnh^jm`yg2&J(A#yxw_!`6XkO90$A?pg*g;EP6V zhXJ(0xrDZIE`7Y>x7AGH;N7$!9BnB)_zuc zWjEUpUx7beD%&m4ztRj!6#l}KYHtc0sMi5T&LRPTDV(kPA=0j6M7N1(6Y)G8;iJFq z`cyP8ZYqc>x;8z!i4YOS{dKpaBx8U9LsbwV0V>x)69@jMc4~w0vlC6d@i`#1Yww)^ z7(WF<^c#qqyPTFSwwhgg5m9uDk)4>(%tM8)Wij@Spl>E3I4$Rwmx_hIM;J{BGe=|w zk<`S%j@c+UL{3t!p2?|@8IJMmzrTV|o*9moCri?AbqSIV=N$8Jdu07*w>E9Mf$`Ap zEq^mxIkwNbZUSCy0!0oJvI|~4U%;spJdb>uANAO2?B3?a77&%;v@Z?!fk`80C9$LTJ84TSSWYlTl&&E(^ zG)a+McMPGSsr!11y+oZuUTBGQq`*t@Fwy@VxP#3t`;c&&G-oCckzjvqgb?G?@-5*@O+$jXX-V!k$!8UP;5m9^cda{}l zU4P?l_uK8!HmL*%#BURt43zdGo^s!1x9{eRd<_q5h%AtU26lW*(62-uiRFIOW^Uc- z|D;}mdhqR)v3P{=qn^(842x=kpI5iCt}6C=o1R7Vcs3 z(h}bdph?4RB~Yx(wBn_3w13@`W>myXkA}L=`Cjkm?fFk)8#k}T`283I;NO2f_jv5? zfMF(kRJT^iUK$j%bNi#PbXa}7&NK*NwD6!+t0yk&23+xN>Q!YQYH%&>WQvaZHdQdE zg-`m`%J??7>T`hU*`Fb}DMNO5@UfI#9J8<+jXQP7r|Gl|(rARbYqBoAsw@w;>l%~y zHWN3gZa6RjZC%-;rLkZse=e3fylwxRyte7?;%H+OyD=~Qj|`7fZWC{q14m+G^rR32 zdmyq!2LVL5N8`YykGXZW+tJvSr@*gXY8Z9jCIDQha|ZUk6Tb2@dr5QNNwBX@P11Qv z=u?qrEj!Sr8UA%h4zGsvIR58c(=UI{XEbjWEw$!+7UlhP$0t$?m>(tR4xWcefGuS_ zh$_>Z^olI|Q7Z)L=lZ;6doTJdU-~zV{%Cxlsx;sb=?n*rlNrakCWm$ZWn6MC7-Ao( zl>jIfNU{B9B-amsO6Gskl1&^y^AC_r#Q=oDEvzLdi;v1B;%J!C=SI_IR>c05n?Hfu ziBR2>$;ecxUKKUi3#2qSG{qf{2zNR8D(&^`GE@WvuLv58o?}iDnv86ZKi> zu!CqLBJ+CJ+trcEuu?KqNt>>4-V+0r9d~<|4n<>~Y4UCTBg}75zGPI4nXAIH%)rH= zE`A-vRBXy>gMWa@`}rF+I)e=%jPECwdi9}Y(R|6m!ZL8Di**T}wyKdJRSd;rkW%8C z;#b&|nzBY&tBdQKTm~0Ge39vIiE(G>fP%TNCKqo>4Xca_hP|Z#P(NMdC?Q_I`JtNu z02B|tz<={#b>kB1n#$baRR0G>$xtljW82wnepp(=(RYgAtf9SKQoe(21LGi$z@c!6 zq0m#ydzfdwE{wJ{*cg%`$QYsRW;86AlfX_~y!!c{p9*zcR1HmnccPTsM_ ziNh_@MhM>Q>LVfJML9oHzyB7}Ag|kDi@VvvN5d3!XC6A1&n}U)F3gM?s|~EN_#a+t zBNa-ZR?+_44&wX=8lJYwZxUGkG>D|ptz8mi!WxMd4=M!$_N;(_ZJ%tml7p!|j83EL z_`ni@JCsy}Gjs{@6V(Yvuc$3y-|*4WxH8^n6RWs7@L#eA6);A!4On(qEI{lgsA3gtlCxi{?RyCgE)M)bQA;o*KQ%x_6C)}0*0Y`1}1&pnSsssfg5 zUk5or?lkI56tic$6`^4Z<- z+i`DQ7WwB-{Zwxhi4X^e5s|MpYB&^%hmMRpox}%hg0s31I@!w}1X)-vGhSj!&3Aps zkZqm(Z!Q z#@yp+16KV#qpcQ^9>>Ds23MFp%fbk@s>qiYIGt^^w7a|B`cwPXJtH#DoAR5x=Mgh( zUL^P*WkFU6x746DD{1C3LC9n9yMEJD#!o6@E4i5J8G?7>42>?(tuXIT6|(VpPbaH3 z!b}6G3+__UC3!b|nqZmSZGE_;vC-lKH#2cqgKZG4nb4JJB$=g$zTc8X;yv6~m^~vr zJ&a#pu;on|9{0end{*|^DY|#4HS`Iv3iYFwFUAuV;~!SL(Z5)@Pbk*FCQTDht^MM{ ziP%bGfg{yU+p^OS-jG8>E|L+$_!>nR(|z>ha=^~7o=(14iIgBuF}3=moiKbOnLW11 z09zmQ=0L|qA597;G(c=k-S#ZA-gV0zrfR?;t>)=4#C)4y-!a6Usz!n$KSoBCaFRvF zM*}xN*~Jm9ULJzgTTDo8lgs-`Y7sm;Ab6G0T{lvBjxKDRVp@~3Q6yVu62?Wnepk`y zkZs(-s@{+FE&JQHsYbhPZU_VJ>_$o5D1dN?Gb_Yzt8uiS#+KWzYj72~Q*<5sj8R+Z zcvvdeiE02JzH% zpT!5muIek@`nji%5M%3%0*%k3RW+0B;M=I@IKfJ@vdkQUH>^)(0;z?(J4S~mMz|OR z=!BgAN}3NfxLBQrWh*Nk&jlwe7In(zf;*4fQ-`nVe99E#LEcj=YG8(q$g$$}5cE!- z!O3!LqBY_6hMIuabjuwSdKqC7_|jz8)LBY_ZMV*tYQgVO`+&==tMvp0Cumk(DS`<} z{nA!Dy{R!kWE~hZANoL27Lgi%yrcmU&iKar@3ftp7sVzJ>{BnhTIZ$`^T2v4U;yEa zmWP+(hK5-$RW>4reP^kgWV3nxZ?(@z6?@NQoDhT5SnF+Q-~YF-7(9eV<9&|d?Y^wL zVa$gPnPz9D#Xf@~5Btb~kLL$LJ^AIFx`d`g%rRlNY?8?PN~{}m_w&-wRQk8K3y7)Q z%nGwq8ODkS1m@zRQsaQaBaYA@);|schgJh`?8x*8~b5%M(wM7ElpQL=fqKV_;G8!HFS@!fRe@( zIocqnBfMd{81-jCEw3Z9BFEYFjE^r)hb&+&wGWP*GK2K3&=pBXl-Vv=d24-H9|b8d zzbP?@0}C#H zfXmk7)gRdxa{xH*J+u45a>ji3X^Rs}hw!j%w6unDsi?ZR{mJG!FXvs{=hdf+svk4D zx=pJfdQ2-80{ymo?ZiA=+p`71%2Q-_b;)c}{GUVVURs-pqI&q_f5B;YuqwYjFqQ;8 zV>9y-^GA4^@;0|omg z=B{9TpaKA#z=RSpNO4f%<)4s}3x$!Ss0@i97>6Zy*L~CI!heI)m%Q}`ZtU5hvpg>E zF*tN!ouZ$0l&HjrLT!Gdc4gx<$54lsSIr43rq=R(;Uw>`4LrTYnAu2PVvlZcKe6R* zd2Y{=4*mb6Bb4ko$38h<<2QTwo9LG1Z>6Y9n1aLB173uZSc4i`*G52j1`^^n>j7}n zY7?9kO*HS(uaVWeERJ6V^h8DJuazH#q~j>|3)O7-2dMe^^L|p2t3=VR2RdWb2HH2c zRRiaFJ6Bq!BpiM^Gc+tViOKM!$xPGqek!Fy-6~R8r-&3?)YgM3@mE8l?4tJ|($WXP zY~LiTF{~ip^5RX7)y9hKA80Q#V$|w&l@6=|MWRu19WS$~!09cPmP;nVl_Fo3G~Lp0 zul=9k@;kc9MSK$8oR_gYbTVjwuSpM;wTP`^J3X%1JIuE*LC(701~@DVW0<08NbDYY zEt$E&gTV6>)(eTu?Z6Dy0gB*QXm|fcDmp)gU=VmmlfcY)$Y{OS+kC1JvN)oA7 zr<3RU7{Yws3F-@;9$k3;9nd^~q19j?!^Dn&yu(Nesh`){j#R-X0ma<(eq$bsN{K|S zt>O2|-wAr)2O+Tjn*DvGyMc0a`cGxSH;92JgTTl?gLeELfuIz*ng)Y}Yy@eDB`WjV z16wzaDRlZ!>y#%tUvT+mbea@*9VLckx~Lva;kYfkrJyIi!+$gznv8n+bWK1nWVVZE zG=nH4&Z1%B3U9Cf3vcJ?1u~<)iP4t7ix_{|~MG`c$&5X{$7_ z3W`OX7(~{Kvq3$hJW`0D5jrL5J(C4+y)cKoRYl=&xsA~&Ejzu2* zM=KU!uk;ER&aMG1vi(s>Gd41kJG`MQ;Tf>Yimsi(Je!s`tfUc!&SQ*LyhTYfR6g15 zhFZzbMAY9s3qqbAvVTO67;=#1TYh?o_&4w#)HJ;`U3-V{t=T06&r7$3ASC~=t&FMm z*ZfkDX)~+xd9XB&#ci0UWs5*c*yd*zR@ekV@111MmEph)m0PJo`!&g2@)?K>YFO2X zr}hPL=_b4eT_1&mq741HG`ke&XxRd{FG=~*a=|F0#_s7$$I7dNUJk*V{9qkkRuT8{ z-bI2-8&Nyktyn6K3_ZWrbawLh-%_;#&WAxctHY5Yk_qUAZ~C#_WoT@?Xr0#}cfiFJ z_;;?e&9+4TMcyms_IC<|HXa_+ZL5Z*)2krxBC6GI8=B|M@D-nQF!~BV@;etB>8l)ld1!y+M2xNEp_I z$iM8(yjk!)6ZdsvrE9si7;T_BvKR%G1&sS&SPEh%uxg0$cWhX=f^u4{aia$v-8LB!gfC-FN-4r}2#R zrHDGX>qkZ8KYJ2OGX!P1O*K{EXE8uqNx>ua>O=4vT!>1OW-L8<7-lvZS(1e`SGy(I; z5%PE%YZgqBupC1)ve)t;YOw__Kj=$U+&t_41ViwmFA@*Pc9US{vvu1}mKc`?TK!nS z(BJHTl|R)W&aG~LX2V>km=qbH`qzsb7fZEDLLBb(LB%*?<7TN#<-GhlF1Ie9camQt z&yxa2%x^XM#U-9f7?SEpDEuhH4de`)e~7J~643D4zov#ZEq_&MonpuP)P95)6f(7- zj;r~7{zFwLn(Y#Qk2GPSN8(_iV<4?_BjGFV7ZZFwysBZT!s0>=Q7+~i#H zy7e*gbI}He=feOS))>HuedAl4480+k|>4Jbi0g6_G2eMoQElpXTQ7COR@U4{3^CyQxPPY&mcW1cr+(z_AS#FH_vHDywEB|5 zqE2#C$w=CCDscz0(!vEn=m0Q-TN!^;aux-pxe1Z>feEpNPaQ_Xlb zi*&U_6Wdg}dbqisQpQ)E3-sFv=!fvzh;E^LX0ePFFj5Cj}ceeL%f{D=EDMVBGJgaz67tNA{g$p6FCHpdFpfb;Xt@0LRgG=Ir88t(INE9iwg_| zU0>;w(7}Y!0IC6b`=~@Oe(6a@Aqe$r;-P+3XzVSas8+*AC4Fc~^9L)cdg4xmS>xPs!UeXP%p>rSJ%!NQ zCtaPJt)u^4W=$)}NY(o;85%+7rqt^qdnIiY#%|8B2AiMFr1$=Wv!bf-#7Fn`i$`wO zSl7LCTkNX-)+H#iwm-!DI>;cV+cD;$XywE6B5QvGg6t12bkq}2m}IWq0W{=F$rebu5hH1L~&nviO#rm044Vich($FeynFzdOx!&0?Or8b%=&OXYdLXz z(?WnEcC)q<%SjZjE!`V2Q~dDbCJPIAoPxdmc|Oe+hOwcyMPdSn5#zVB-K_|EOy?+| zPV$Rt$R!PmA29Z8Ma|2v!PrF_Q6@b?xi%-~y(!yZwT%URZ-h099Dm zpDuC74Yd%8Cv{s6zVQN6#su-~q}$y}b9%D@Dd?bkWty&(;;K+0ITfw157Fry(Bcl3 zvJxAV>ww&7Cj%F`rBFC|KpYlYDTwSOJr-6TTNwTk-%c~L8xL}>;|XH>d+5kmjIHyo z2MA{~Qgfy~a^!U?zT*iow`|i!<_P*%iL+AW?)T}k$$MwOR(XHLRl2d?O;&9nG*2d~ z(a5JYfjQC_?MI(;)Aa<&z``#z?EN9=nlg5o)FA7*^Uy49@-w@;>36M*ChM1ruQEg& zfhJFS(jx%$*e2Q>w$FAf7!aV8SH3h6Kis~ULQ68iSS;8s1q65&5X=RJ)Y2Ge6>Sja;vZtcu4d__j^x;zKMxI zxRbglsm`&`89vNh7$a_6IdaRfqnG`&Kn$6bFIw*zo@MhX!)6 zbebuQdkD8+o072}OQ`r*`*X5(K4)^`ug99feP6Nr!IToaDql1@52Hx+W4LAZ>mz*; zEEG7}P#&z$jx@cA^Fx!?$01xyrFd1ku~Gi>Ngw2(yFXP@)S7I2d;eiscK@prr=n0S z{U9`;u@R30pg9<3YPM)&DS*zQgcPs8&`F7D5?hR_K{qjb+9V`x?U;sex<7YTN#11v zf3L2#dMRWM$Cb-NIBIiVSt?_iKcvpNs@+{ zBU)~(8;Iwo#4s%5{}hkQeE9Is2RTVG%^dT4t4a@Hnr!#@9lNar%R)+E$uSF0S$Fv9 zEcoQDq51{4G1;+6B)CORBEex4Tj$*LKI0hh6narb-LwXIhs~uFc@6ng;K{Xl4}i6| zAhVwGs61dgnvrTV*ZpYWrT~{rJ?~Kh2r^lg8eKn4;Vb^^`+3a_( z%t`2$mZ1VtCrf1tJq-zRWEJ~}X7cYwwwqPTtF&Cc?UuOrLm`@zFtkP!bI{^K;L4d> zH93MT!LQ;UGYr%Y_K1>ua<#5_;f*Lx1}l>rCGgijYs`B+#mN>J7bRbwHK+ld{( z@Y%imW7vd=E!*%PcTH^KwM0Pr_>o8T@!(dGCz`D z?cjuR1M8qPV1EhA9PTz%yQfRfN#y=^8}D_ka^Yta!9^%DDibg^4}s=9qwf#u{INf^ z)T|Nz0xjAS1=ay6Z@jCe%j(BD$YZHHEUMJL-hJssu8W?K9ux%a=EqLV z=5S({EpMi%>k$1}r^+~xA5VL4fWnm?<#Ftfsk3;d*~7Ze3{oC-UBniX|~?<61-eoo`MvVwu^;>q_B$z57kV{rlCoE9h}yb9n%Dc`Ut@ z>ZCU-d|ey*SSF!w5p&yL_sjk8_Ng0VvZ86By>ps{_g5U<7C-f6uNX6vn-od{d4vW( zZ5|Addi*%aJV5EpQ1+CxEAz54tbKdf#V|t5Oh5kTHx>thZtSOm!IXDr_Ds^jr4K)6QnFms`=AHg;RDax&%1)tN<31DgSh@nyn>&xbe7x<+Q{)!gTL`j z2Nk9!B@)Lpfp1-JWzrror9$oP1WI%bQ- zl@n;RzM9j!7Ib+k3uU?q`#OIakVw6IIY>2g|BK=rw3K>zvE9SXRMU+`mZZM*fIzVf={) zNfMJ6dSf8n?E$r)PmN*=IUSVd*3;X8O`xPhP96%XA(V#aHt`-&%Y4ff_UI9p1ZX>oGkK2 z^m9kjGFX=?r->&LU^}Rv#F1-59kgR zhwvcQ=kdk=l|l?a*|h@kO<%NtQ~EEgs<-Yj#u7d5$)wqMusumL{E?Ml;w?N?5|UAw zF5(^|foO&DA06IdiTv%ztHn&DFRt8o`B@j4XVDxHzLT)!W%N*t*P?F}qFp%LH`@OL z4?=q)UeeUCmep50slbZn0VZt^r?+yj4O;0FFrR;G0s=`%&zf1mPUAw z5(Bx>0cmE=g$E38+8j(e|4ezR)oijK4DeP%%3b2=&3K-|W*yw$#sz;Yt;Vx{tVXpV zeJ7^Z)x3?VPDHtV!BYH$>nd~{Vi!8qZ-t2r@)$M93z{z~O{v7ln#3*F`@Z)2%KvT3 z0Iqsg9p4~pv$%16`Wtp~v5@e7`LZKT3hA;F6Gh1K>f!NufRb9CkGtQ&QvUIH5CJ64 zBLk2NF8_rAXcKw{p)jI^pQKCXtm=bT&3qXJrL5Vn&SS%Ae@{c=c2i1ku{vbdx2l)c_bya~(?eoUN_4tvhEzuarV=*zYU7bG> zY1l%SzX&1EM~z>>?nR6kUt{THkPqUDIM=EhzEVL+&vS{CMaobQV_@N(J zle~=@e*Ar(UKY%}ZHnPqaIcP#R+f?Lzz0jO<2AYUd{F)h z0bFfkdtFfKv49x6n0o>Bw{OixhvuXr9<978-ItF;KaOnLOn>VKa^JU`{RQn`t5$`F z8~Xe0r7>H@P}7XQli|TyU{2lrW0cWBi7L2kPe)$5RF!>Jao2tffH|?(rjHNR_@(rV zu*2(oUW5i(uZ<;G1nzw3%EFB;-o^34_JViLPani&E*bZ~JhPfu{U2449=aG_ z@`gVK)+G4RBHprZjNN=N@Rsr!dcG*LDu|1=DRH+(Nz?C`K7n0lhD<6^Ibo_dCU;f; zQ9Ff}=X?b!)pI8EtL!E*(<2jXkGY-jfEF!3_CB`ZK{&~I%0>a&dsG{pO4$+51Wp#d z|2Qq)_HQ>mws%p;rTiq^{&Ei9R0i2G>HEUQRD@HJAt90K_l#1e-g5NCwEFXc)%u5+ z56^6$GZD7BpldVuUtDAp+mJm`+R)z>r)F|rYlH8qJRj7Nqw@RAA0j;ksu|?+X2w}ZX6?<(6@}T zDspBc{`)BP%TMyhb-vId`*uin8TURYi40UY{i`_Nuw4@Hj{+;~uYrE?m`kIAM+b%Vl!v%RdQ- zDuo2eV%#FCGnLehhxxZAOg zSrvYi*~HOT=EbA^qk8O3|Kuh>yr6j;PA`ffjf|Gv(2yhc6Wt4R;A^;sqT!2+-eP&4 zAs$_6eIVXhaZZEWbh+Uwon@Q)6&>lDMt-VZk(T%~<4R_??{iKWvPIM^mWBf;P^au{ zVct_FxDf(gO9{a5=o(_RZZH#N{RZB5XL=gB$S|r7kRUP<76vavp;&jsy6>nLB#eQJ z9qt!bS4jZ7gE~Afzh*&LwG#l{yMgsxPyX*=l_WIXW$82vAG*B=+e~4n7~g3UBkeX&>RsPaH2r^v})Z z-BX<+DI_zUB@=*)cQd`sjcA74hLMq#pJH{Z7VESpJ7Uu=Q0k^9Q@0RBH050+<$vC#?hU;D-P;%@oYvXplSJy8WRW%%C=J}w=J=?yXzya+Yvu5Fyuk0Aro$|B6O zxm_F59>bHgh3x*xj4+jwi-REA-51pC;w*qjS-=J$g= zy1OD49tnh+E7#BU>E`q_h3v{$aKIw^T6LKIx%8~)PO`Ftlr7H{&)INOBq++!STzK- zLecc`YG3P5^_5Ux{?c-PhFv6NeEXKIXdzUd!tGF>mQkG|=6KN`L&Zn%M;!()YeG?~K-DI}K@rD?I zLVpX?;R|sdTye43nb=Txss%16{o*x4dxT&-l$#F$&AWu~Oo#&_{k=05{wPM)0lqc$ z!(_afh4prksa`K=?A^_ zKTO*?=wsn%E?6gL3~>@)KIFZd`#exFsD$PFG_@f=jI(u2oz724E>`XRqBBd=ZJUb4 z_I-b0gY%yl_9K3?^#Sp89fLanmzCfb6yhaUGqYdcMao+Vp>FGb+7oKZf8c8iqtb zV?5EyN=dTe)jUXblhpsM7^u+U<(2*q(ibknWglxSaMBs?-(gf$gHcVd6vt-TaF?yG z{ZjTNHB*#OLFq{;nKHVxE;D*f@mVaPNRxfNL-;O|r`3tfT(!s!4P4^JRN>S|SU|#o zvQ^4cDz77BQ9KIBEFT5L0hDTNr_Cg3y>*Ia!i`8FR|=%6l3*&lM}Dtvnj;-Q2ndc$-?{N?nz@E#S4*K8vt?MPt?D>El8lEy-$3kI;BuWsve*bq;#)7Huy`>`% z=^WWpXQOWayBig6wkw6QDm7(TIrf=iRl3Pzn|^Ut`DI6c7FM?PoVW{C1uK%*j^-b% zKX-x_yWbJsUvbl6PE@v1kl4z49u_PiXy&6@H0S&J45PsI29(VQrQ2T!?`>r$jD9L9 z!S{#Y+x(+?iP=aS3HS+p_A-V|1~?~-9dVS}rO*bDhjs|Pb^;5H+hLy@F4|4pW(6=| z?a{%-XRj9@%;+%;IGP&mnYU8|soee!I5g_{4J~(iXPs>2R^%&AxaaBkF>6c>w-dc3 zu{J@$FsQ zCy;4L7X0_f0EKSWHz>|5h%@l z!Xt*{)L>n2H2ExRb68AYAN82dwC21RwVy?M|BXBU@p^9(>rg9v&Alw}z}Yi}+&+QA z`*KdPKKw#z+~Nr;UhfO7jvOX?h^Y?fzJKzX4_Xf@JWG27r;QtWpZz%QnoaMmXWb9D zKdmhG%)27VFrn>=&KS=sOeEFps8y(;awYZ_1P3vWy2Kv-t}887$dzfpW5!6WMGvHl z?f1r4dBC_jwZj)CB6(kSy~Ch>Ggm-u=;=sU_T5RIw<}DWmwR|~zEEa`Hc)C%&5`PB zSRIBKG6iZdx(a)G_`H1D4om!~PWpQ?nQ5nIf$YVxB^D261#^id3Lv174EGZF{rc|h z1TE<46r#iH%K!CXKCwxLY7I6*UgG zW|?!TWRhyCSxeGc!`?F`ZpL|F>AUc z3Hd(MMnxBemQ!vik^cHeu&W;VYzFFcRHs@3iMOuV@7-fV(y!RfvF|l$h$G0&RpsL( z{RzY^8+snL2mpETJ%*E;`-YOqf~lv1lf?|H%>ffee|%gM}EC0C(F5U@@`6{WGmY+@bZ5wWqv!d<|{ zk>^v1f2A{>Y7UKIYU%-lR0=7{GT7<-e|SV&{wBRsU@Lt2(iVPmv6q-9EiOo%cLU?J zn|`Dy%1~&A7jgN-wshGw$!U8jTd<=jKZ*76KL+w@f;<~WlqmD0C6?RyNB@(2=FbF) zI6%p!SBlNTMv`cMW@<9cCw+|1QgG1TnfB*|3?a8xW9|t@qiW&3OeIChW8~Bmq6t2A zc>}E`Ne}eUhlNq>wozINa~Z}@Le_2e{)P1e^)aEDzR$W?i%nfJN_y%1i#mD>>G9C1 z{-{|_MMbLZtGO23ty_9aF3G2EBIeFSMV^B#7ht;5cuB?X6S~ z&0lb6Xnw%p9wb-fs-Lyy>;qw;X$Vc%qLbrun8qe34tzd*4u0q9oSA~wttg)wtU9(o zS;z$&m-JWG$CVqZA7{5q4}-kDGo1ZStlK+g>wkqeRq*1Y`-NXB>J78&Y6GXdNOEJ~ z$F0nQA6LFLTtg^$+7D9H{}%iB2e5Xy$^xms{`lE!a)|+kHTd$~6MJ84aLz_##YC`i zLUfhpci=+#`qdKylgmLk*~IxhB$m2vwFc00XT!2SaxK60q24_c6;NeTFoXJftRmsD zTFCXQkgJDbQ0J?Wi7R?71ico@p`zElGZO+UCFXsehkXD0)(%Zy{#Tu`fa6lVDw{|9 zC1dJBa;QpMv}hE*9g_pC>~BpqmX2YMPJagnD59BUW8svugyMB<-yGYub<=iYWs!`RW)Ut)SE|~;`eT# zD_Q0P|Ik%{UD6A>d>!w`?sNQxU@;C)ri2-My~a5BvscD(^v`~+x4pPS&Qi7=cCzx6 z)xB$Nb^UnjP7I&5DtVItbVY)HGySEZK~DzAw#N}QSEdq0;B6XP4vO#?)fQ($$mj*bbH+7R1(!| zRuG;!?T6rw;K%IWda{-@8;)H?2F*XzKI6A()saa&$12aV!Zwa*1CJZ<1ZT=>(};j; zJ~T#hnN^JHzfyxq4|4RgrGF(VSCX>&fZGqgPjQJyhg9AFsN5OI+YL(4}+Bz|k(v55cs^}mOU<1+D2=K+-g7cyN@fC9h)nNq^`qRAO6 z$$idfxQt=m=z7-l_UQ07G!NeY8KkFeM;?_bc~|@5yet@-q3lJ<#PP2N(6#rN1TUN5 z`hdLz+8yZNlhPkot;O3%)ozG&BbK-rdhy$}m1jckWXdW5Pv#q)L%nm;aDD)(<$G(w z$y0$x+@0cSUefnc@GXF&HyRzf3lBCd7pT>+)s`LOkUJB81s;A?K>WIMsH2*1NR4ot}Zj!5?k+(N@#G?1!AtBUhbt7 z4Bf1(l@x*GVbfS{NTh9b+kw-n39F^;wgN_5BWc*AouxZ2j$IkU*1G<{DsxLk+wB95 zX_4RKQKHWdN)XT6XO*zC!s@nn%AEY%QuU%Jjs?M}AtB))nT)FwyQx7yvg-_}zXn(5 z)g#rimN=w$Z!8TW|2# z0Im*^1<>RJRicVQqyFb#sMPP4&q z+BF#(fJNex(dS6jMG*1By@w;L`q_ta3F%f!Zj7O}DIL$eyo{^@x7Ub0`325ORUT<$ z73+b9_A~#XgXWDyQO3Rz3>uien7?ooQo$;1W~vm=s1GqcEIf`rHCvK- zFP@t{|2c|qf8$%bira(7?d2lJpZPh>_?=AY128EWm|eeEV8i8JY9uV++3Pqq^{Oy? z4;P|jHv2DU$cWSkH&QQ063F8;c>F2AY<=*KZb7@N=OGbvp&g!ylPWl^U}$%Lvux|e zKyfkK0ZteWB7zKhX<#Zjv}7K0#9}N08KRt@Ax#o9Ry)Jtc;McFdMtEPi_t!}2n?em z5AxQfe);8Bu+M|c^%-k7pP*sc3Ix9@ZBV^0ly#&0bKE@Nb4xLUfkaL`H3^|16qIWX z1|~tJ&uKr15n~>oe&u;&*AGDAg%ujJ$1iSR$DuB)9PRgtkqcLTA;JYE(jWP*>4OXg zC{Eb5yP-BvNR9+e)@l_LDMxX2n1{U`57eLwkI)9gdcS{`!GY)eE@q9ozGRw7kR@r| z1QMpd#i75jk3?lF&0$4;Nj#IZbkZEx#UVQLgntyrJxV{q9hkD9nelIpSz7wwpR-F) zU^=RAxo_-SqR18zUS^9(dSUgQ_Y(p~$^|*6G4S6n)(2sPq>anRL2A<3fr!KticMiN zzA*}6R_3-@HlX?_TpfOtA>27v)jT^aEamj>V~7Q0LW_0swn4>fA?aot5>wiMd3$G- z3+tXbU7x=%1Y@zv$P!yc!MZXu`=LBT(4n+1erGWsERx@2C%Lq@`KW}FTwR2nPK<8nV6=z)ZoAJjw`=OBM49h$T z|8$9pGr8fpe4pGzC9BFw6rcIb%H}p&b~nWc);F--h*HXPha^}-OJZ+GXQu)=8#G2p zI^t_%{%nTJ`*DNK9YfQ#=JLYA-Oy&(J5YZkM+{T2`8Nn3=PANd$M%7}RpnY~S}wiY zrwO)F$URQKBIj5eAxqe8ec>>3cGj=^{tF|9a+&y>UyH#I#{aI!dDa%JdWjoTHj9zZ zyos5X2${E7>G0Dd3%`H>#2P_u=s1~w8PBe$bux+Nn1Ue@Gq!|A9E76bPIo=&ne258 zSKsjKH>;W7J{uagEe=|1qV(gp3lR*h+6C}}+L$5oEgeLrXf#K$%$ul!(y<&qzHPVk zt=e55#N^f|*!(N19ikS}{|K(oOX_?+!P}#3uGf2n5{j}(@oKG8q+>cMr@3KN;s6Mq zajr@0Yc;P(P%r``PPZqwcgR-;G(6= zhHGF*g!FQox*mqn^CkjSiz;Z7k7uE z#R3$HyIXOmc#9LHxEFUPxVr^+ihF?)T#A-rA(`~MckXv*)_gOw)~q!vf3otPoWQ&H zd(LzA-p{jP{C>90YdK2^*YvpJLcH8hN!;x$H-1F{7l1FQwWA!e z@IFy5S%`yh)Aj7M^IWRHr4R9)-m40UT8`BbjtuTxbkjD?nA$R`17zj**T3)6a@+A; zgRjiS^paX&$$HK-2#B@~%vIvqr5_Ck3#BJ%=rSf`x(hnK--obXG&q_pv-NUd%K7g# zmGuWLDHvxS&<6GYE+rdyEr_yb$gU?d2cH0e0p9!QcUNMM3XNJb03w6|RdnC0Jw2ZW zIpcA?d&<%Q^aEOKh{FCptvJuK@akEu*&qPR#eZEzQ!>~ao%k-B?=KLt z5)!$j{-`t0{zK8_a*Fr4)Y(H7i)BNMpjynLaRAlP-9*n2h#qx7%yJ4-rCvLcE&jaj z)n8eW(QGLd1Mdn+LWuvwNThBFQdoi3YMJ_ESJ`Egw-q>AI5N1abQr*o9%kcptEx0O z=Ttin0S|*a8#}oonc&{l>QK?hoFN9a@{F)Xnr8w)9!LbHaW|dO`*;B4^*IN~H)s#A zF-~kND|x+VXyAI92M6{7cV;%X0@&yo-T2Qgfx(l839BFXa*YPRm?l3_k=C1q;sZ5vq-=s(|Xl zxbD91sLl8vB`c(Ai*M6Cclgkrl_T_c-f;Y;(0lh>;Ew<5gV>7KD44}B)5GmtKfa^Y`x`N@xSM?;B5UnWHE!u{fM5_~x#XqVW=(jP7Z{{x5V}+~4tTBu3L* zmnOTVzG`72M6tb{a=+GdFLJ>Fs`QIcdk0J9_nixZ>{(m=9|nH3PopKw+FTOl#FlI7 zKS>L6acj74&`bGZe)ZYTEBl+ zTSI9ES*;Qme9;W63%1cufXykkrzQ~2atz#N*-8%m$xx`iblueHRyrov2s`=XY$IZc9e}&1Z|7m~ zs;>GiFfNcKJ}-8g-I*o=_iNuDH-1&|g3VleeT?B8){BQN5w%MAE2(9&QPHpXD7slr9Rh7K zAgi0I``6pzT}6q0P984pkMX6oF|W_-(wm6V zDl^YdWA2~Ly^1zn!2PbU&sq2;;4SLAK`8YzE(~4x3-$5jyk28dNBVh^k?Tzx`!5PT zJc)pol!j_WGT#~4v{7;~G@{>s*hj5eztSo^Ew7#YTm4(rXRZ(mK#H@`>d3-#|0~Z` zMflWji&tu-@8Naw5VklvKNu)_qjOp9z#Q-QFhTu;ExXI3`#r&kNzlwC`CE91E#?fo z0zoorJflGzVNN{n;4q>*E0VeYxUmTOe5IYm@*)Hr{n%2_+dREzL{8&=VkViS?s7HL z_|gUad4G{XvbBghZaFQMD~OG5oXQ#7WE6|m&_bHe4kI|O zFxu<`^Ecfad(mZN#)mlW{Cwx-#V_biKQUQ&r4+xzym#0JW%~6a5_Jj{z7UfT&Iv4x z(t%6e(3JZT6cstduOced_z+nxGK4-N?kZ^|nxLn&9nsYV$6ZIb%9NybBc49OTx0(4 zi6!>wwOzR-Y&8jKZyYcyGdLZ7v~D6O9sbqHCrLSEp<+ZL#7c)Ooj!_$begh!uI7SX z{%#*kyUs)oG;R88AJ7`)k^u1g!>9Pj?Z@Ll^r-A=tlsML_$^tRi1)?`Nh7jjhwwbA z<(1uT+iD(6;3|0bdJ%O{33{ngoSl|@78S)l!JabDKtBg?{Q%yMEB8Cvd@fz+4Xs}w zPw#gO*iUupI|MWJ>b3}+wGO4eZB$xB6pNhOl;odtpC<=!LgS5xuO|os=e0a2r)|Dq zO#Nj~YL~`Lk|z+*`rBIrcfcGMbDxX{zo#>Ldd`;mZ{}DghMO@^*&-sf3A0Kuz$5a{vpK;) zuOYaRgCP12#$o3dA6IBCM0`@LthFzkJ_;0KFp0nFHGuELxil9L@=_|R0+T8RS8Ceu zbyNWrZC=i9ai(`7fs6ca41Bp3!)Vj$dX$<`28aEAr!N}?!Z;BEN8?2nBUob~Hma@) zUD5(0jrxHODp6^a-cM5X2to?dE!x#y4l%r`Xc&x^Dn`zJyI5f%nP_toGD;_--n1-9 zS1uPRhp|s(Cnr21>Es+PMts1=Z_VR2JY|@6tZl*mSBZ?{2Tn&0aa*t3`xfbFb}LXu z9A-WSiUeKgFOIniI*c3o&~i*F=P)hhb(K|gSrkF6`P?AC)f@1ba__-_r!nbrEIY~ z5$PM)rFwrgfM6V7OtGB0c(onwUL*(fL@8yV;B=ll_g}=?%hd(ag<+ONgBs9Z?PNzr2&o zht2o-M4T|$^1V6z3Xm$%>kxh|5;0=hkgOIId?|5hvG*WEfu?_zWQh7GVI}77tfC-h z+yQ+ELG~e7J&?LSdhx9m4Wp+q;oNIfMF&kYZ4Xt_$;-*wN5azX|m+}t1Zh7rP6qn&MT&r=y0~wsE_?=SG7_W&o z!-&g}+XJE)-i+~sG6C4uJPD}JgNFWbwzFqEBevTUj^F$p`zLMErKjHZURU4{=y0t# zA5!yr<%#=r$gB9{s0UX<58(XGovNw9b##?tnK=U!PP^s({8F%&>fdc)ojehDgMQDy zWh@Ten@KYwhxa(fg>7xW9+uRM=NtyiY6SXHj=SLzKk2uR>m!)cgENCVPfP|I!3P(#AlWE|RHS zAeNGH2?78>`qrpuW&gxE`lkiod|HjrEgpr0Xmc*>o*4;pc6!3Av ztgmRAJ@qQbm?_blf}^aiJmrX9X*2d}BB{yGKEL-XS|Vnt#cN`+Z>dH!$a`ORx8ePb z+aJs(paZ5+cQWi+Oy^6SPjaHsY6~xv5Hv%{3RJic{83@;aA0E4?`QV&>%h?7XRgzx zKSMe%o0*iIZ*4-rGkXa_UvRe9U3zmKHKTIayT*1z^tShw4XxRKmsqlbtZjVXwVEWh zN0*f~+?UwI;*xNpI%CDm2*RRf81ui2_dY11Wydh{sJTE@&VNB?2w;fJ$`Dd*lvVwc zUx==un=FiVvY`tk6sETS2qJkz?IDDdY8&?#V~q{m0L>i1z_#c`Zf|A!j2bJAD4MK- zWuC8|gu(=C&4MWw$@O$+R`~=bZwZ>>HQ!mb0O2Tz-PB0-q-_{nhx&{FX3u4433RvR z;R!SbiyuVQ8Qq`HPCSu`!XtcS)Rm#6o!AosQ*f=TJePda}r^e+q0-Kr9yDkjAXO{ z^BQi&-dlk_D;)3d>}R(8vHhMe5t@2Dq=etjL{O<#gQ#Z7zX{IwfmjB5(CDb~Y`kQK z%KnGOaryfwL>~JOuI$GDVhlSAtVf4;?w7lC%KR)VE}tGRms@ISmOdZbRBA-2wmNX| ztmpesC5cuxm3t2jxWcvHTKB0V*1%1`kv3wljRK&85c#p+Nvi8&y&DcVA$ppRflof} zf)8U$g75uir#JXrk^G9)K^!L4a<<<;yg7HHo(ZDcPMNM~N0Mw+EAUGNpA9XUHCmww z4G$4nS;q%_^lZn4*GiA;MHq`L0IsRh^Zb8}P<=%!3Aka2Az;~xcr-+Va48yp@v&2h zI3qdixW_qW7izAcuDt-?g4F>oSv0(g86i|ZcMn+LIshTZ%>*^A-2-42M1H)Ip%#)% zw04k4H3lO1a(53uE7_V#2NQMFzEK6uun}HL1Ztj7!~(IJ2whyGU)q1Hz$H|?=ORE@ zrGOCr4BHVmEpNPbT!+fE|2M?Y{DAGw;cMh!Z38k1=_8KRFZxx&bm!FnD! z9hhRlkE~`B%ImbG@LrTB43S2^#pifQrOOzUl`J0vRKn3{#y)ykBV|XA?H^6|Glu3G z&-_1J1|gb^7&BIz09<8LcW3d4`aa2AfLAT0{}D8S_L}0MMFHfBeUu^|^XZM}QA|sN z>LNI8^19E2UA+;5MM|d#b1~mrGUs%Rn`Y!Yic)2DOo%G+8=O!br~(N2Z6GPP_vEMnlsK*&qCT6%C0 zsS-IyMI#r6h=H&emhKgEF0t#qdG{}D1{*9rRL9Uk39n^(#g7)T39o%v89CBG;o@nO{jwMi^@y!n7pl?vf8@ya)T5JhoS16V)ij>-#r%`=6B!e>?UC6C$ zb^x^MqIC=2c6E7er&^0@HF8q?$A4;kcL5x1672|qL(Y=!Jky(gF40Zg!L+=ifPIIY zQ2d-y=GxXMC-do0?K`sS!``&cn7R^Xy~{59x8y500aG0iskT0}9Hw-m2Iemi#cK{x zH`$MG)-pjhO(kV&bI2~UWg&s$%N+p4O_P2pP43ZWz2^Y{(jUnTcnpsX41_TqSe4k0 zK_3FV=>EKO6tO_r<0u6bnVqO*eHa`MKJ`;Ih_WLg>_wKbMw~UUu8hJ5M04hU8{p2} z-rB_;sEKeQY1#U~(8CeZt4YDCpXoiETtN{2eDAro{`;RZKS>-dbIXC8>HEQ5x&>B5 z>LHafB;|msAmNoHQ^{CH>@;ly669Qtw^S%q_sOc5!cd-1mnisr;Z>n6{XY=utfmAM zKP!Z%U*iN&#LhfV1vCgQM?J2%8&I`7A}i{?WGq+o41OfQiS(d+KpxVcH&aOcqA@!@ zuwz~y4LEKN8pPQ}cA??5Y!}g|IQ!Xfe^~QsC##{P0P7X<13$FizN9_>d^S2uVU~0B zFBBS4TPBXS97~iU`#hUe)kLT%vx#&fgQ3uXZ9yZQDBFy$#V43#<4{T;FPpD8jXR5r z+sK^)u`C0129ZN$v_*9zHb)0Gs`NNhfT{+%?-iq*G}6WkL(1S&exJxBAC5u|Ml8zNd) zetozwJ-tHz+!)i$ldN3)!`e>F`p1=86Z`EczFrI$WV6KIz~}6o9|@bB=8e|V(4X){ z0-Fm&#@BN6PrMV|?+s1#(05w=DI;huHzwx}0t9*~X{3s(@;pFXz`b+ZmK}0(aSYq$ zxS!(t%D3jsJ$UGa`wX?6F(ChQ&UIX`a4b-hObi;nX%w}eQvSy#i;-=$WtA_bDTgqT zDJ5um$44T8rX7TWbxMtw8c45;`-HR94zr1DRqKeFp8Nn4Ubi@_$o@~q56YeLwqlvL&EVFTn&ssM9UanvRDCsgiQXuj|B+qmUeg3q(|Wn@ zmM&P!SRMhG3zw+}Jrov`bKlu=eb?Tf&=6cw5-h+MA#zBHSJ`9f4;N`5Q2_`EfF^g(7AgZQuii-=18i@A0F0Li#nc4S@SW@p!V zNK3!%h+KG#{&#T1mc}7D0AY}fgZK+l%=$2z%n9Z)S&l*m#BS-D(Z%)aQ&kIj8KIH! zawa>)>H{j?SsA83XII|rtVw@mn+UHOC%joiT@?sa>{y;*zDa<4pRnD5dw_qnt~Y1h zCl|bCDbwS|$V~*H7|r1Yqfa^BB?Q$%2cmjENAtZC+5?2Xk=(JTwGW65jX5E?Hx^8O z6mwVl+fc>Mbw$Hhm-Ozr?&%3M$0-_yh)b0))`vKFmZMRzULVyUj?9f0`X$A6iTKPp zhzNVz9c01f{z*6IQIWt*u*qkllCieA-xCXGDlh|4At%s0ugKx7nJYono)IN9w!UE% zD;2ah1DJ{p5m9e3EV0yjdR7`lz~Q>FZLndJox{~O1Q3mcSSiX0{N_9un7GX`PJ(1{?5`G-&Vfz?h3Vw|=(CM1JR@jXwIy0h= zKK&|+ozTjnl;^d(Cb8VYFe~$TeTGaE4Rgg3A)D_pDe>HHik#Jj46mH+n}v>TjScylfL53`s6P=)Cg$o)zNKIR84_h3d_9IY)B zkg4E*soEv_wT*|_imKI6#FXKSBJkYN*$sW~iyitT22*W!l4TkOBc4XoZT2Hbf~BkX zUCe#+(lIQ%%@+{sPX8e0`>E9?XHwqyN;kNBS<%EUHH=L%fqw{n6BEH@o#e}HBo$gd zXLk>5_l|DVZ5|VyQgtr+E0^9o)O2~|9R&s;0j70#3xQfj~WT;EZWCf5?P=Q1PLA` z>6AtD`@EPxA!1F{P;AC{E|+5=to*}DJ-uKIcTRw}VMV3hI^e$cxW@AcB^(Ng7)F@i zWYdA}uXO7Do=N?hR){!civ}a#JvYI7VqHeAQ?5qJae=(~;Jct$wBPC(o$Dt8ix4To zIg$@|VGaV#D6b47zi`SDHYZH+)a?P9FCWaAs<~xXzes}exeyJzY~YHl(Et;a zW%c0`3YiR9W_x9dW&(`3IP;qgDbbBS3GD=y^5Pu(FH#8B$CT%l+ia3FXqM~xKdmC1 z^Q%@_%$6%*t{XdPM;e)Y(8KRP0cKiLl1`ffsvrDci|*((ICl_zj!FanF-z@X6&O!YVM_Z5p@7xuu)QmTKM*F+pI3I56Ts{F<5l=Eknx)rhvokEQV3+!J z9bvG(P`2_k<7e-Z@`LC#*&xVXxX~J4x~Mjg z;QuuIbwFti<#}YMm9!6L(1R8XGUi@-jx-me8}Ib$r^8oqs?t8| zeXLDU>Hx;BNbe5+zf4g`(H6{1pqic;ybU$kYJ zB%m6yR1>XxUikk(wDzc|>n@JXA1-XfgluQh>KVszheoj{4YM+S$$)+2$ar7eEic=; zI3#OTZ^Ky)PAQ}fm*P7xRBXjg`^;3!R$O+30Thk}hm;Sz?C`i!y9j{3E(bpGE%}>+ z{l%N>r7ud(8zhh2o>Nxw<2>BWDx3SCFuOmp18PIg z(9$V0uPBkFa27w8TNsq=CRD-5?vX3bt@r6`t)kDt-+RrVExh~pY|2k=5_`oy(R?Mz z*f@Gs-`m;NeLnjVxwA6W*5)V_rBZUv1Ww4R8mDHQ6H@9KOC6~bPGyw~6bsT$ramUn z{I^?gS6HuWx6pGlr-z`zE$VG)jLbmP*O0-$7Mn#Ts}4=CkRw@kIl-6C0$o%%&FcE> z&Bt30M~J|OmZ^^%86f6E=`dJq=|AoGzfb1&Y`DsXo7ucdTJLa1KO&XxLYK)ps`}o6 z*N#oFKoHNCWo(m{@sN<<<+hC`g(J^W*0b&jBb}pVr`^&N-yExRQQP>=@vGDzjD~kq zhM?ty9F`CjvFG8_)GJIkElvdR3}72#=Xv^kWm=aWSsiy=q{BBO<8p;liEomRafLAz zXarq3MW%bU2Pq2^PM*>!@n*D3+oW-pilC7ByP?;x4IZ4nG*A7+=Z!4ujO5DU zozGd-R^TWs(3MV^bOT9E7buy~5`-RPw4YGHUIySjWwiSalGMl$GCX#@s|I2mSA`7$ z+v@_r&&kx^>mrDC1x?R!0_Fo8Cc*8oeoWwR#n5`G#_qnN`!CWgB zpLR#wt^xw&jl+asRfufF)>-_6#_aJL+_J~?%OZ7qgXjaJ{UDL{fI$AoTgwZa!8^<- zHW~oC3yv8&qS@gpS8h}c@;2FZ(nHvRC9-cx62uvmnzPxw04(q(0IE3QN&F8~$Pg|k z%>pnSofW6bII{M=Ukxd!&BXD#?Wa`BLn^HR)-{5)x!ur`f5=XqNeyP~?TilKJ*so9 zz8{sR(Bj53pjeQtvdN1&2ioExd_!ghB;Eb0Y5QJ#EfBtbi=WiOYtrm+ka@%jLmVtm zwP-&Duerp)eR~iUGs+}2Sw2jUTnRuhL{Uil#p@rEzWNk-7P!AYB8Bk1YZ6Lst^7Qd zDWgv@fgz%GG&VOQh!$oTO;lv)j?6mLiOU-0=)1+x6Cne!!aGA?YW`9re)Oey)MIm( z;*BsthU+AsMVVxD3~?5tO0)`m;a|w|3F=CSWaSw(@&AkOA~Kl9nO7IsLEWM3DMi0z z!X(_ulG}^;@$Ivh!)&x!RHH&b%Kh|2#;L=e+U2Jq(nMS`cyj&W5JsKFZ#5Zu3q-WF z$J(rJ7UrsJG+Dji+B(V*VR4Uke+^wGybe_&>hhHmKy$*&d<$>TZvMQbDsAstHBiGw zqSWsy=&1~|r|Q-*Z!E9=R7kWR=}lS!Uogsfi>%9io7wig%VP}l!FA_P&VGfe>U$OO zB|RQD#(2xV9FC*!I*Iunsaki6d|&-`%#MBU+{)y(55u9q;*y_*zLnYpf`=%F@bUF} zp3t<$I4NBz9-{~sl@UTYL;W@F5Z!dro7-%Nd|R&kr?u;;I!P39)fMv}5f{|6DY9}o ze}??WQgoDzqoT6ZHo+=xt%!pBio#UgdcQh^@IjG37^0Him_8JY3fFooR9RMi!9UJQPvMkVdYiM_&o5A;|!T~ zj5}H(qFLocM9{j2hLYW%5Ngv?aua79dLY#~t86``8_W>~@gKqZWZipOvj#g_fNZK zo2$%EF0)+t=OI|Leb?0tEwPAxn0IPgL*Y)wcDVMq%9+I-dTNI-j7(7iAJk$34jjtyie)`rn=}2`= z>han;NwSb$>zfTqZk8PFJ`u`mx`7I_1>a`DIYPt1NkU&sQtExquwLml;_mA*RJ9 z^`3KjCwz)5Q131lm#(}{AG?E44kd=8otF=T>l2CG*(o#W`1y_&#V}aw)QwZl*m$y+ zi(8_~W;-3OE&>_Acmz1@bkUd~7OT@!l7;B12+O?PY?o5SyGxv*q127t^SG3a_C2AV zNepXs$Xe-&)VFLIhmt@M{Y2CFNs{vv!@2Li=2RvXBnwy?Y-03&g(1FEL#Z=zpJZ=^ zpi~i4fFC&L7>{?~CAvSXa&yB>mp1sL+6G^9$Dr!5h8Z;h zCjD)~{?|=)i3(43r__FGj9vo5ni@=UfXPgX=SPVWu7mvccd-(10cF~hpiGn>YIa5F zP2*7j4?o}o(I7)p?0&WqdTzRt*<X&0y{bINK1wz{TOmXF4r#BCOdsgWLhIZp|_KTI`%aZ@%|^dJJ>7k2B;MzUJ3ttCYMefdvfZ)F3U8dl8X=97>j? z9f@?$AR9SI5`}^P-SjOn>vdc|c3>l#J{Dm08$H9l>Bqa}4K zZRh3no7GQ;7@(O6V)49)H1O@{`RUvPzD&6~4lJB?;>VE&o#I7~*(j`H6(+dxgjl^3?f<7&U~ zvi*mwMuz&}>;#dyg42iyiL`LShnWXYByEg zG*;@|?iyU&md7M}QFah9Ni`<79A?-hy`uQ@{500^eG**yrNlLG5Ad2vgzVuWa2LZn zkd2zHlvQAPB@?43dev5*p$Uto(fX6_J8UufsAkD>HOr9ib>AE1jlB&woizR?Uv~?P zbA+1P+^uORSanbR;GH>W8GZ%W{m5q(m7KouONHp*cB|pX;~bkwhj!uG~aR5Hh5$B@aGI#`U8ro{Bm3MzC>faB!uCY<2=Zf2EMNVDAs#pd5Vb+G7}&=~G# z=ry#7KyJrGDARxc_wWMPaAyC?Lej4qA-U5}ne_u{Wj;P-eg$xPiZsn&;&~;;CuLPw zBc=vOr2AR%M%8L1&Y9JCg0zW+5qrzm|KWZnJWL^8Qh35-a8Ro1gHJRlP}azeejS1e zmo*~&iNhCYKWQm6Cy;a5*8TZf2>=#`$F>|>weZ+eH2fyL@DF%cm76$^qwICM{sQhC zc?L8oY}#Gj&kTf9tZa#uXS;6wzWS_)`wL=r+$-7x_}V5*Rs)pD&NjGn@|F-=%^ zL8B68p0mzLid~uE4u}}{+3IZw0^2R8+lwsmXpPrQxNHcscf_y3iSg}X&=5AS5>Bp^loce zc_DREtcT~4@CDXfQ>NVuy6TA3rzpugLOUMcsaWYk0d>5+<4T*BG^h9W#Nx8qyo36V zk=NBssV#jRIp#xT%CuBFeCmMc3GeA`lX_#k2tQgA6L^8QJUH_Yy89Z`i>|9nK18s~ecqhmXN832|7MS~>csXtzR(E@J>~{?AQ3qg}Zy zdA@XppPrpIAgOBUG3wm~&opLsA)|aG#`wqMa?QLeUDmdyut7urR6S&gX5s8l-|RTP zJ@xrf)nKQ@vW3;bE|&S7g#bE5n={QTFqX|@j=G4_fY=#`eY$gs%3nB#yPn7&ytOJ9 z1HM{EBhDclSoK+RV`;7&JFSh==#hwaa}yNf6@^Y1UW;Nsv@)O;8LQr*ltw z4(o=8J7B8Xolk?vC9+}kMMjfTRO$-?JXEyvCF*_47N@8NRPRzD0~emm5)QA&?9a;P zfg?L%vwWZKPfBF>2Z@)f9_!NE$J;zz1;dtoEr8Ahg}07b$YXSe`|b(PioCj& zgHB>g7@5}TyiRjT;_=Ve1G}PvV3kDm37J6(kG10pPS4M}lSxW(Q61mC#*il!Z~RtpZ+!S)*tDZ0WT1u74N$nS8Y_6+inTQIP>vpMFYfT&{qct+6<<8t zwvTh7eM|he7XGQrT6oy+kGRa1gee13U7fu}A1Ao8MS@Ye_{#A^xB#S7+yhg$nZ*sh zz4uqJr7D7@cqePfWy>%hTysVAGZNN-IWI47!#nRVV}6l)Gj5BOI?mp!4d}61U7XgI z)ULez)dytWi&g&v)BZbxG%CAV|CX`(b*y~YZ6j)00LSldlRb9_ob222B8Zh#jh5~h zwt(%-4GV01{~T$y>C!;N_lBE+{CIxJzN)fyD?e|}`68`1N$g4VJ=~F2*YzQ0`*q1$ z_XR+ZQyiyrY~u1OS5&qe6phxh52k?B+P z9oa@lqDi-V&%G+5v@b4DdojKApEh2&EKuSioaVu~iHBYsxwP_zJ&;9^NY8lhP(NHu zUouJ6ME0RrvTcNecBImcS+dNj4tn^m!SG5+&mB^=7d|n0Xa?4n8=BB;e-o$EVycENc&emMF{X&E zbL`j(RMhica_kTkTZKpSz0O|G9yp4iah3YY@*}kzA1loYC1XfFD!hRV@fdZSx*ec? zpAOQQ=oWEl!XPYXG`5PF7Ip6N{`3pYM0T-L`-YtEMYuYEKLKhRxSANn_5;hw!3Cq3 zI;0PItx#C6NRdbXJDC|iJtO&u&8nI5zVkPbyLP2X#XOqV2mjkW3cVO+&PM+e&>Qg6 z1vl`*L$5dc*U6oPX%Yah1Sj8=m-&7!PkWII1Q{jh zd?zTc$KqYPUTECpFejX1H3Cp_>FST0f%`jUUAh3-sEK85>%1+Rfr%M`L)N7yo?Hgz zX}*IMIg-}6a?#U}#uk+g4ly+CDDz>*A##spdaP7VBTZr8&$qd4TGzU^zAVrFb3%X) zvAfv&UVY=1H{3Vr1}jJZ?yd#UF3`4zP)xFMmSrkbYyzmqvP& z>CpXxHw8PDL0BtgZw{wspbNT{?_jBBR@@9QfCv%cZ&@gd`hvVXo zLpcnZy?0Tr(9#yPwrV$}#7k z7I@Y2#i=usk@}jSwdh24y_4hW(L{L18Vn3&U%M-j{(C;$2FrbS;M;mFIL}NyzR{>n z4$aRFSs|wq2SX0Y}7evP{H5q-!HT5e|No{R|_J*H%Z_FBtm(I zK$-z!r`^+R>IG@8Nt}WgW@@ujBPebWi3i1`FBn76f@l|Urg!1MOlm=^qW}Nhv34|* zT3+zAF6+(7fBPfbZy`Rx^qxc-r<&7_kuON4pJ%%jV0V~$k$$;G9jISs8KJjP9oav` zAB5DC<_^Y3>UBIiW5-w|SG*v?`dH8`l5u*0;37Fw4$>;aA(NPXGc=)qZkzpiE~aYtv9euCEdQ(cr-CP67c zmi%J?=0m3N71nSt-#c)WJm)VH!?69MHDGJ>&0Kmb`j;y1+F#>vHhRE;-tVJhpxy7I zd%HxPs$-Qf_K7WuEVyXKK39dwFlsn&iy&FR4b8K~vf{?4tuzA7IPUbEM#p37-4zEi zte_;=4I22J1OhmP|J@*cm1+)u?M@!}=LmIaW9!YeRL9%dL(P|OW=Rr&49`wWZE&-P zYfyTfKa;rLy$86(|2nCJ7L#hn!~xOp_hhBU@Gd)_f2X_mw;wRtT?uW=#6-APN0Ob$wzHK{BBzT)TA+1h32N6GOHbIx6lii+IM`nF>DQc8nb@r(&lyVd z@WejEEOCnGdyS4wm+-eu+;?huZ7CCqi3@(hGl1-$U|PJ4&GJvF*hbwqxBDxwj`bmY z)eXE&di$=Q0_X5XuulJ<-4LNlMi6(eaqAl8`ra^GxXezG$?eq=pmO3TIG^;ls-xc4 zCyB?V@2dNlniHQN*tcO1F=5x^mDF$j+k+_V&=sO4OzeJmKY{C~)_OY_HxQWWgq3tO z@fYGjQM*ULD(-g@*QQ7G@LewYcNn;ee|uzKnCzH~#E|L`(5z1x$5Qa1JaO^c`tN~f zS9;hIBk9)YWJg-OckDTM9!o{9_#@MAi>ao{FSUZ!U-hMvleeH0T;fuUFX*%|GLdQf zN-cY0J1<&9{!ZaSk?F?R7G$wcJ(-Zc54x;$S%D&-bpySohwytc_tK;Y3 zUaog9quy7Uh~3_Co8F&_*s|8Uo$3Vn{&|R_|3&Zd`?1aC&{XX4QSGtdGlsS7HBlAT zzCeQhY%vLNP?b`EI(jmlD{W=7`kl%f3ug-$$meFJmZ8;)n;O2hpPlf-M?mZ0?zZad zaq6FoM;wWamT^?$KnuN3q^YSFd%ij_)cb3f-|HwLCl-NP|Hs$<& ztHe1)tK?2PXo~=C!wkf`dP9M?o6ETDZuU{}MHt`nTkNy~mjNMB6_WTqCnj>L{q*>cWs5U&QjfSg zzK_~mtVYg(d@*iU`};zHBul=xbp#k(fNnjnfyU2i*fnS0RvRUEXq|p_SMl{|kDVL- zHSPC;e%}AG;eB(qB`vw}S8ob5As9$sL;0JbjRY z9cp*Z>Vh1}zpYg{oU^plXU4U0p~?QSy1MR9`W#%q%KKNQ;Hjm!$ugGuA5YCcaK@vIEoUN zu04Nsgk1wNAJ3Hzx78UV3^T8n(D+$RO<+5!6&_*_UjFYH*i1jakW~mY--L9Srp)7U zMNm?G;$fon`w+#|9oFi@$JkczN(f9Da3iD`xmXv2P=8DfQs&sNB6_~Q1G{E~_PU9} zQJ5d*dLRF6{(`!I>%V`^_FQjY4Y;^wr#69J&YVeUI{d-eDgAUy)M3G>WhOUI?VtHZ z9#Z$`v=yEnqiYfLwxqW6>7tG?!Z?Kub>E%X)O7gkL8u%mPIK{%c02w7-PkbO%@6(n zjD!`GM@*658K3@ee}Y#deNi31%vv`}@U!eTpAHyUbJ`6Xy|Ow8$q8u3-6zM^m63iP zKxdU-)Hanpt1z{H(>h_@C^&b#q9JvPgN`WrhfMo%JOv$n*lWvm~wPG_SX zcjIlQYd--ts8G0kzt7O{;~w8)j?b0p;fnWGGgF}h^?D39h}uV_o!dp__EY4dOa10J zIGIRsZTj+pG~OPbUZEv^R_l3s`q*}D(Iy9%YUR0TgLHY*Zuy918^XR?^$%x0EvU4d zc4NkWg=86Axd0suxb$cbZ?@eY=ig!PTQ;6QsZA;=L^E{RtE*Vn-;d0vZNhjarj!XO zJg+YKg!MCoPKDmC%Mbsh#+5J*;?(T+vVr)u9_#b1tq0EJB;z<{e0cmuRQpF7ag_iDNSx(jaqunyFhxN9gL4g6@; zWRo*fiH*9xF7pDbK_Sl|XIfs1C1)h5IdvZx$=O99Q{Zs1c>U|sd)~S*miI#GFE*Akq;n3P%37#kZBo0^Dbhv^Q2myN2D< zj->b{bExp7L3I?*O_rYG9|ZL~v4rkG;OGPvVI7&key%$Q z29l0c)t`n#!~l`xPbpba+DO! zx6a07xQ^z0KkNQKzR|q$}q$6!={9lP?cx91PV;gRH$)g zBF0b-ro62nz5Is9vr0)x0t7o(dRqiOi_sbZI$E)b*ykgtRT_YKF5m` zw+MkI#wmiw)W{`o!PlsCvm=%I=rdFyVep^nj4&PdiTquj!P&SPgU!LYh@~DZjN5D>d-p7Vra5 zVf{hMMrj~Y3wh$CyCIv8lf*DFnVAD#>S}~ta8nEgirTXPUpvFwsXTVZnrSq0p_Q4;fsawf5|3qQzNwF4xo4^h)KMd5#x& z%F2!#W;?Tz47HpFq7>7nC{DUD^^7zvrk?tdYw1%xjX{PJ(w)%PHR>+O@IAD2YUh=y zU`Kzh!+=e~9>9(1Bd=S#500X#PAk?6Bj*vESB7`MPDe%uz0Ep*Z8Guw>$J~q_l@nW z7ticzV`N%5xV#PB!i*dDUHhmca$PFfk6NjJEm^C3Z~j1{4_8-`t3{&i=GYF$Mb_5(A(ni6`|l1sonjOZ!gkNRLi;cP%yv z{@+LcKRO*BBT+43J)Q-7ooAX;WmPA>qFp-rm`*Btbxv13PTD0XB$q@g@&nO(8<5B5 zbzSV2qNb~`v2gR0xaup`sabB_D;Atg+@!S$k||7^sW(#UW;#?3g@Y0K5LUu{dWsj= ziLY=rsB1Y6^GR8=%mGL1XEf@smVzu$=2CTvFtV)W{T7j|Bco=2{Sl&Wl5c7{kt&Eb z+;t)?on`PD_>NfqNv1L=LkjvT#TKQ7uBmUN)x$H;uvLLKyfOTuRa8ioV3N)H8j29k}_k63r`) z6_ue9X*CrL=1Sj`PdrCiSUwP$wv}!|_Ct-?6$cw^bAgInY7?hb+A5S*Yv0|aQaq3JXIe)qd;zBO~# zomn$~y8rY!`*c<9Q&mqrRlEPT;g>S8VWl~0cbF1!r&mM&6C};-8C)b^k;lLVXbNPm zX)&U!zIt0n4= zH6c`iID+njtr${!D9e;7bQJt-indML=|-4&HxqFU2U~rBn|(+U$H1d`Qx}jeg%ZqDR(UXrFfRhcRhnRJ*08-VeMrJ709O@7(Xb_5;H zE%*Syaf+T^u-rk&6yWHZ^tJS*&+eG@>2fUZWdO}4ay;n6)-~TnCy{$=?#4l)B|Q5z z>VJH;U(i(SSiHQ4aKyCUJy3C)X}oITLeV*-DfJ)XIevmh&HC*GONU>(bHP1Bw{|ej z|F94|g9iAt-=S3Pp_1t%;)tHruK;n4EDY0qc&C~lEp2cjcpA~?%1Zl+u>~Tt_iqAN z;UlZoR>Tl-3hrzccn=uwRZHgT^(=gw(G)MnDr^nWU+JG*XLM7&%4r5WrP4CssGU?{ zImPivD`=t_?$dBr_>;(!*`eo z129h;v=!T?*IwdMcC{nK4*UNMimOa=c-vN^a;&(gf$Tvw@z+ z@Uj_=cnVpG;ye+~;TVu?i^8B%TB&s}>uAxvBx6l!byv4yZ%#G?8*o^ao%;PY4QaCH z?^gMd%#DonFzJj}7fTLL^B&9;$B##QC4AjSm2K{K!QALseznJ-v&mb#ZJbJ#0|;k+ zl)tLZ7;R81?d^Rp$ICEy-)G5v+dco6iC@6=D4mBcs!Y$kuca7IW~^zV1yXUO zVm9+m=}*EOkCqCPD*KxI1G=f>Ajj*)0aMr&N5*l1u?uDKtwZ(5>i0*VPdyrKf&0gP zgdy_ipSeq4`U%!WUXZ^Ti%22UCYaPWv`y;!r`odoS?-Z=@ADjK*JJO$&gFi$IoEy% za^i`5R8Qh;q;9F21Fxr1`c)pFlHeuv5*+UK-_oh>z?Q(TgEN9emb=wT~Gs#7$^`E~^8wR%8v^@o!Ruot!g!dXG zsX^^-Z8E?~E7)|zAMBt3JUof43b4Xlz_ z>>&-964H_+F%bS@7sa#E1BFh3~JfX>u1 z^d3uFkxTZLWD4EjeN8Qz_g7q;wh*|>NgwXy)?*xmR25}?t|!dTE}j;@MV^kg5sJ2* zoB)1&*w@xU?&(L1HW-`$6wQrDSqXNbOKQ^}R%2(C)orN#5p867-i`7c>ih&;_NvjA zqNjd;em95lh0=G3g16(2)!92W$3{a67ugHvV~x;#BfYoQ$#Q-qxw}^jJWueN1b$cz z?SF`0>L;*lB|Vp1sKwV!(CN)i$&RyOw3Xfr0hp?#{JlkL93`~$8I~*<#Wp=KlMu2D zwA&^)BgRlxGg|eL2hlMDl0RBwsB2g-N)=1EaV<+R>>$SqyJYY`PXvph7*WEh4h2kM zA#e8Casa=R6PAJL2nr_oX@|@*qZF%#{@d4e$l%f7K3|Ws97VT?6YyCu#fobn&zHhR zYwc<`neg%T_?c}K)$Db4V8&E2!R`7WX<6Xe8OuxI4gC+T`R=F1amP0Y$JQi%MZ-_+ zP%y`8ux9NiM+RmfE^<`Ul*zU&<>$5$o~%yAhyC9g7dgDGSS=XeIpM9xkpi&s{xV>#)H+>x4&n+_pc~*xm4tBx?-uBg#?0q`ID%AF1bKfSSTrLBBme9EDwF^&3Nzjs1RM~ zq~iUy?gR3<&85O^1MEg?#{ZvX+;NZqp>h99)nNzB_$j8GusMtvsDPtVKG(MmbsF@> zPYM8U=RYNTr0K0@pDk@y@5vx-Z|0>16qm;bstq=X(BLu!~hRI7&03!)*cTEy7OyI*#FdTY~t)diqt`m13pINjSNCg1h z+#z`Bj}DN7@yOuJOHe>e|EG<*fp1I+>vL#9dekf!!>?7QtzJoF*7(_|%OK4~yWLdc zl(A^)B7NKTYG$@W-EA4~w~IVNW87vk->gxAoJv>Yab@1U!`H4z%XLzgIma_INdaR? z5`S}#=D`iCT{)R{a!9a~W4YIzGSnUAQp)dxupGruhhq&H*j27nlX5Bj_=SUCgdr_j z{g|*WEMyx`U#w}w$@w42sMS0}DBwnS8eamHG^}l2txlWAA|t+n=7S_*w7=Fhd5e$N zEQykIMW>nB0pJZOU{&6sWFNQ@O`~wDnAG)Bv-|mw!oEyy(DwcM{zh)+v7%p`o9gx% zb;^~)IOs5#>kiM~d=KS!=I|G;et{$7lQu|RxwCQLMzO*g$^du~I7jLvY&CSzEqGzj z4eAWtH8Z>{f+zC9_WD$ zfcrM0T7!76T&K?@pB2X1`#1rfL2$J`%@6*)xw#B`Zj`m0>o3L38r`&qq~F-l{@~cs zBI{q=J`~hee|uAq=HPc0D`->IA`m<#f@_sbqlbyTY`{ln^V65if>tZEQjTzdE1;r# zB&<=|D;5(Krv~nOwtbYf@-|F4xs92izs{XC=HwA$TsQj1ocXQm1(Vp>6xF+pb3z)-TW{g8 z#^k@tK#a7G@}o@2h5)w{sp1|ifo_8((evw(M&p8Y+gfpig&y&l?qFs%{&h-~&4k@v zsPlyUS{{fZyXWtKWc9BhTmhNTZcz#IT*=4mM1@0SMOkYM>SPo%4Y$SD=m2d`NR!%Q zf@Gy+reAOLe~-f1Hk#RUD23Rpo;a&ZkWw?D4#3PheZb__*{OIdkVnBN@)`1iL17By97mF^h29s7ABeHEZe4S<9kjUEP@htzh{5}m&S z`!(G<$iDCzN4TZEj{%&A`w!USDD>dv_|C#H_E7U#rz#*n(W`cBD^MzdxcnV&*otYdur>$7!`L z!`6XOC+$DpUjj5hx6b*FPBv;s|IN3w>hA`zX*g|I zILYdb_pYTN_#cT!Q3Nfz$5Agh>uo;4RI&A2JG5bRne!1oUmVQkf1%qxzA*e3e)+>~ z=>wcZs=GFM^WzfO$p7&+#lco7Bn6-YYO3+91W||&;0C1l?;ILT>_yljUHFCpr|jx; zWTBS0EKOoX_V-`9rOlKy@iB&-!pVxc9SXBk7DcwlwzYWQ@M ztHHN79CN9tJu+`yslnc$_hz}QG9hQ_i$OwEMGJ9n9#{Hj^^oJ0>Q7%LbjISNceBgc zJ(@bzr?3`h(r!flPO4XN1v@9yy@^?!_ud;W!qwkddo`@YsIgVuK1n^3F)xzql>~xZ z+@H!rPTN=T(||Co8){nqIPH@aeKXm!$PhHE(lsMFfi<888(r*cQl5*_MK$Pq2f0Xk z)?W&EsbXoti0)&}8b%W+m%LY0-Nn6)G@3*rL>^bh!A3)CDm`3REd1C07;1XWMn9Z; zVM)c*l1VGqm5l6&%h;a4bgndEBZw~XZq|WQK1GO5w*7H_IGq;%B&Hyv6TGykF4ICV zCBdw=zf&?-w{?(%gLKZaDf~R-qy)5^Tas6c6IVv4J)ElL=IBTj5+Yn0If>cYQubE zROv}30a%2ys}JvnV7Fl9=&sWRpk-VfBaE{|a5F!t>=e*M+M@}jporrV*M zt{re==663LL%2^}q{Oo*Q$tz14xD9}=v4ebMlhlYKBS!viH@MI7Mw5{;T2EP4Kf}w z+`q{Flevn8t!9yo(|ct9;^%euQ)r_BoqGMdPCKQSVuylr8o-zNt>q0{I|No@6=yU5 z&d}1%1yuw^x>xYuP4N9g0o>l_(cML8G=}QU;3nz=1zg?LPHUTGcuo@QxEdW3E5u0# z%WV&Wmp}ezWJj(VzF4J>_+r)Q(5kXAy*Tl+Db9yCb|4k^O_w7 zD<=jcUV-R{n+}V_LbB`H^SC9khWeeSdD{Ncz3=l_8ygApSMqyXBlI#WUMI83H)-}Y z_rCg#8%{HpM=BtcyUI>&;ZQ=yonjh+C@Re{L}OtlhIGmF@%;10?7DLSSw);tk`{0O zzei}&ct{ZwxemN7lol$+JobNegvpH^3sG_+2isEsP7;mjZ1<8DzY9d#a(*FNe26yV zywoio1ug1551jYNBa5@<{d^SMcDx0*LJH9Hr@uJ;1m-7US?X%gWc%qK)A5{1Dc@Zh zj63HY)FmZ+_(t>W9KSTzaw!<7@(6J9MEua^$&(!VMQ6k7RKyx5uHe!>5mmlUmXy}K z7=WlMhC^@ospq2t#55WFu@CYbd`+D5i^G8a{Q%;bDC92WVewj^KE4wF#^YPU$Za4i zJK7DBWbBY=60z<3j0k#?bh>8-O8p=JlhNSXx>}M+O0K%`Zsm{17umkQGx}p0zCw(g zd}3$$oMaZFvbng&`dIl?k$&!59BXMW;g{-6v)zRP^g@ z=}40(#Rv}LrGP(}r-#YpZFy{JZ-weGc7tRnWpU;% z4p(D=`N2RoSJ?ku4Z`t!RH@jHJT6}R4aVZ5OR{oSv;!C@{?R63Qlo=Gkux^~@Y7xi zMB?6SoujPJ2O?c1qpKlaN|iiDYf)ZYsC*^t6c}tI4WD|jd1pFcK*F8;hcVB>VV7SGePmROjrWEd(rqlvnM%hUA7MQ{Y@Hu%C(NjvmNXC z9-G&XbqusmvT?-Ac!bccqZ|WPJlhvKz%rT9T7`@63fG++;yT)r^kbNEThcbKE@aoT z)mNQOeQ3wIzG{rteMJl`h8m-BM4*X8h1+2{4N%YzaRfiV{pxNJRPuL>b?9R{rArYE zv#W@OU^l9J1G(E(w!-#4?KINk4Q3c48z8@y;ao1djq2hk_ma=dn~3+;Sg_X@ayWNP zk^1@1)?vZ-iv_tKBQujgAAUQ)V8Im-YFhFW>+mkbSKcYF%baM%!&w2c_`h~6??onTsFA$%KpBQ zE|A#(iyG4v+aMU$1f4xy0HoiSM#<0{efgWS)7bt~V4Re3V~_XO^jb!S zmp{+JSa@aAOy%&wfiCzEjwzbBDPx=2`S_3OJHgzHO0<9KeD4?Z)a_OLcoy5@Lw5oZfrbtyf92JPp;4O$E)-6B2&&nc|KE|WTKn=6oAw_kA6Ni zD#!7b^**jPgcXia$gK!%>foGksNp^dCEUH1Za(Rt6v&XIu+>qMm{e_g|!>1^*< z+HlHE{kpV+4va&#;0$qwtj$eaGvaag4gG`$%S7bn0a^7y&^me=tHT8B$Q1suyqGbO zxxx?|4&k+`(O@^%Pf6?ymv^lO>CTC7D0dgot%~D*xzX`O&0-{YNZ}qye|$8nRw&&m z|GxjZJ}mJ1c=0gHHHf=U=IU;aec+)2PIk!eo&&tesyUQ}{k4vqT{~`eZHbXfe%FZv zZpE7R*|jwhB$07yJ};nO`Ty1YC(ePg~(%Yc7rJX=g8XHGYAVhIC<1(10Yz9tUef;5Cv9Hr-9lgG8w!nKLokJXiyO;X`UeRI+ zkO!}(&o12NyM3QlGya21+r$h4FU9B&#&+QR!=_uE!D7Q`Z^_z9Q5 zm*U~Ury+g5we|6b;Gq~(8T$vTAfU)C0os61h`RE2wt8q5PJnaU*Hzzm2WgmA+ZXx! z!i^dajiTfsi1FnYFS!&{Dr9)ew|b&~POOihpOylo6uN81=)NCd#!=2s*CDVpde=O} zod=RvM~g;w7{Wp#LSM+Fx2@o%&^*K% z=xNK~$_q`|tc#;{8D8%uLUhnTvnY1(JB_RlEpVEJme(*?aFR`XWPKf-ip?#I-u04C zV2+KqHd9eW9_E+!uC^nOOaXqy$?%J}e=&zn1S8<)y{S@{Nom5GK8+Dyi=0p)bRKaF zI1UCMvMWT6TmtD#lD|XvE7HPNEN554_wlBrc{Zd+zEK`s>T@p~#gWXO`i+^XCT&14 z>P}-hF8y!PDq{9WjS4%5Z#tI`n)SX0Z)7q`DbedG&gl${x^kgN=ef6Q$H zEK(4J^pZZ!IG%?JP5X}vvwWaHo4RTpkK`G-J(1WF=Ww3=yQN=lQ%-_?cynerB}Okt zYOoj3WMlxp$5_R}uZ2Lif?a_EJzF~|G!th0Wf|Hd1+~k`$BF_p0)dG9B|A%8S+H77 zB^Q9Kd}7s2)69x(-j`OW{;wx8yGJ(MJXImnmP!^hkEpQD{gSA=pcZFn-I@{hD2X>m zj~4m()8-Xdo=J=?XEd(UmX1wolAl7r-)g4m(s`yKrZ2V7?p{Q26o}vUmG^10@bwAX z-AmNf4>Och%rCEhTz|IwP^^|E=g$9MXH*Jer2@?wOqsy{beQ?gr^la1)2`kAw5TOR ztmBU`Q(gTCcMqYdY3cTlSc0-=JX+QW`>k#?cy_ratj!3`b(nwTV3_|8)d@%8{F^3F zC)(NL2T*PbT#T~0$>PwFM9EdZtbO_{euv2WyK7G(;^*{i%fX3f+R&W;XnS#JG5VBW z_qT5uQtgrKg_j)<{QTjfzAqo73Dw#j&dvccR1xoQV8T^pT1gMi&W_ ztr3e`tP@F5^31-Ys3#fhc3L0VFfch`-8zZDDL8L`$-!1n(3`watg=H+oU$!t5g4+p zB$i5u1YNSb))g?w;mszp=QJ1v4nn|5bmivut^x;;_#lE^7 zp<9ypH{~$qJDZPJ;S>GQ#g;}ENPJ;^Of_MDReb68lLEg zs5(l``z_otx|yN0%WD&_90T8R!)Ot?+wN9h*{HW<9*nwI5G1qwlvcLN>wC z=-#0xsfZ=^o0Xa>=!jqxrzTftpk+s{?SexOlP#jL#i{VM@nt?wI0}M;!$mnZCU(sC z$p6+o{+Y-4q_G0zv} zr_(5C>s;$icCfIt9Cf@ZynFpY;ialyPlE*dnr3yblv`_umoZIaK%JjO^Ula!fZ+U^ zgtIx40Z&k0<(jLY_wTcA!=g*cgX+3pqt+RJC}65`==Q7cDTKL$0==1fH$Zm6bTJ_)q>3JaQ|XkJNbdUf zTges(DbiMWUk}8ti2L_GGm>bTzKtXngC0&a8Xp09^r}jo1H*&zo*bV%gdR8(&C%CqcymZO@N|bOp#T~ zg0awuft8e*2T5@Kx2|MW%B1gn|rF^xcc{Irep>U$Z<@M=9BI z_}IGt7)Ck?5fj5BxcSr994amr%mtLUalRPc&anp4$m$6~^fume=LlG`E58zK8bX;U zxvJy&d8DgLbB6Pd5HprXj2EQ_j+eR!WTxpib?5Sa4i#tqlVJ9&_r>7RkjMCVkhVJL zpY`ik_8R%V`i&LtikVda?eq`mss00oSIvZ!z0&%Cp>ws1XG_n@zq zaS$S(Mv=RJ=_3`3B8``#aGL^*@_1T5^wH>C+M3#e zc;9!c+F0P^(!VKgFR9QwA+_sTUBjB7YWW~IlG%lGG(!2AM&6<%0w*?;Fy%kYw+R^( znh}sN0|$UTL(YqCE2)iLd7`)9t66o8IZC{m9`FeV2Y20=Y<+fgzndDca=>%U{oQ4L zAj@xAAwaHEbYkH#&VvjFD2`EZmcOK|)iSYbE@O%- zmL$JAmqzM#UiQZEUsg0jIqEk1Sz0dr+YhR9pW@Hxx}vpRK9voJ=S@^lJ%xq0m8Q5J zq*XblhgE3GIs{-vo0IAil8ub`V=Xk!bi7|O%i_^s_EzRK4i6c}5gnUyz-~8!k2-O| zm|5`(W6M+7>rK=+nH&hyi8=I4xzc!c8Z+nyJ(^XS<#$4Lr5l_jSGbqNt>vkR`okmM zZh&t^ZCWrw+BG*QS(frA6+ zkkqAE3do|!w(!uzk_TQorJxRA6lIqGKU|Ukb@h*p_`lGn0C?b(iO3(-;2$4968|*d z7{LxTyD>9f=< zl2~R1a><9&qF50`lxuq|9&_$@Gt6u1xD2xvktT`UWb9l@euwytnwKPG-9?2gkX?v% zboci6j8||oOP%M9hmPBIjMxDG{QNLpv8Y^o4BkZ`=LrzvX$fkGI;mu+BE3m<-EPfQrPZEPi7-tU zYQ+<-+T-=I;SZzv=Fo>Xf}?@g(%)RNUMgvJNl7SyP}Q0pyOB1_ckeq|vj|<0C%Q## zlpMj4oWm1)*K${?XVjDcUETIOd=HxJ-bdlSIH5M~W6qsZfmtvKe}_n>cQ-pOe+DN) zV039?ZI?h10j_0k6As^S%nab1u8ky?5n0v?MqeY{0fe6-%ntx%61Y>N;so!6n4kzV z?~m$FlR!A2lEguc5&UTG2VzNy(1KT)z@0!n^ZSHn$d12f^FN&^FU&39bTL74#E(el0db!tN2AFxesrjhd)<5nfs}%3Lgn1 zslGNM<$|e}S}5J7u9VGj=d-GM``vEo5m1)-$%lqeeG>DZgRl=*y6$YgSTO8rSnI2G zw>+Kmo4IMCYN3K$2C`U&*eROhY1DPl_hk0bMmNHz;RHD;6`DvX$4$k*zfr6W`75CE zYh|uqg$|WBO>U1D4s*j&bAV7MkdivG)f__0LxdHk$z#oWPX)Yqcw@VAm|%N1njNK_ ziGUT@>Kxh2Tux5W+{Gf0H>n@ky|nN8rBd^Gg{}HFU=LcVd`mF*L5Tc~>gk(U^$D^; z{8>cQBLOTEWDQW=`1&7nQP2$M!xe~Hc7^~(O3OMcg`Wqa#GA2GecO#C%S-{T&T?^^ zIQmzY1{7K$r?nz_!xQ%eIym`?Ejo)C zZI|U0jGO-d*YYX_t$#l*MagDf(ZmN>(C7x7@JbZa0SL zttw}~kI{hCMMt8ep7G)DW$M3GA;8(np~vKFy7nA33MAOVk%^I}9GwS|;#^IIVVLOh zo87EPQY7C+I|VFO^NIiSYYU6xA8p}Iv#!fUo3kFomuX*+gQbFxYRN6S7wvuT{|mnu ztPaF(RF4LrbZ1i>!Jka46gnI{hDvt3yy?p@gB*=4bL$h$cpcRai8$;S@kJo$Rsswi1vN5xxS^cv6`dq9&!Bc!T^QugwDhE;D=3W)eV04;tLBGr5 z!y)=WDtO>}mGF4%^X8iiV?WL64l(QCKNq^~!rQklJC|ayF44K?@Rw&ku7i%lo*bE@@MX$P(i39 z%-pC}Zho6XIH(`$9k%uxGdQ;;5dJ`g%K|n0FcKM(!d$Xul8ZdgVmR65E1m0XGDLmY z32ponAQD_9%6b1hFs&=dl_b9L`3munNO*-7^d#%_;yGSiTwBq@1DTW)^gtMk!NGFi3;@U#94o#AmRw46Az&%j|g<4r4( z(+}@{`E_Lw&o!Anu5<@N`IyW89zJV0x!Wq7+Js2jQdV_7el`uUOw23yaDbKTufuc>UfR(#8v3}QcT9P=l#y; z-d~hM&Ltb4X_y9U_J@!Y#HG8#D9hiuHx?RrDUl7$OdeG6kilyb3W|s;It<`EN2am>i<<#2O;i)uk!@$A zdp{Iei^zp^e+*6q!}AYzCl1hjDHol}PBd8i>W9&rzEv7H_d)oh<`Erd@=$_zE~9 zQGGf~Ctx zoKPtdd1|=5#NsNxHIo|bF}EUkmC#7*y{EvqdkC3wO79}9e1C}1D!@{WDK-2vx}c1+ z$A?EzCaOqnHlyP&SBtuf&HMb=6Px&pTj`O(jc5vr zt3Z9(Z>DDeOE3Ns2(k+V{{PEQ_`kZcATM}l5YAWtYh`qHE!yo6PuWMa13e8GPV$d0 zdUTWJ#$cL1ibm9%d&h+E>PVF+J!()@aW1W!95t^74{r@OG3v)Ac(s|jhR|y7|-gjEKqMI(GBUHwg?feZ&-&Cj;z*$5 zq2AzWWKhD>l^!~Pg`|Be+V((f$l^fk*H_r8e&YR(=P5*0Lw$rOO4-;-1xc)$+Tk&> zHJAIet+fr+lT*Dcw_kv$t+_u)sN5*%9{;25VuiT%mP@~}7x}@!VADC!bLj#N34cBj zH&scU`b^+6>cn*F)E(Sc!YQb)g~_^==h(BeYuK?3c<*D4~8`ir&b4z=1HH(TLRhKsAP$0 zPH(b&=i84^$5yJmB+!cO9S0`AFE{Z{>e|I6; z!tb9U%V63!OGew=Z)x7*`(;0yfg8k+!?irPEZ7IB)aRSN2}3-aXWxei6v}B07U0lD zpdh+uMw=gf4pAC%!zFCWL`{E_`r)^gX%6-*$q%WK3~gHMemzx5skes^%xkdf^$a6*a zB$u49T~&IvXUT{Ugf^Ts1Dqu1h#R*9VSh8l48E7PsQ)H{G?>@C?8Lo~eChc`-n|I% zsM7kG;u8?Dv5qJh&VRgcr_~M8T-Cg!+zr{xbH5qt$R49c?iA8g`5{F?z|+?CYE+75 zHq&>yvYi=q`b`9g!OCn_mcY`>JiNjzg>nq532#J<&5;p$yFd7~L+)TwjckUn++KV8 zySTG-l#N(~IT7jlTncNse`7_OOT&u;r82Q9g2VUs6Svk(LdVS zyvbm*t4=cKU$H6S;WLpp&B206#c{WcQ9ShZLTCGmN~Xsi?f+R+a0gcG?p&A8emE?n zHEIG6wl4M7B9i3-@&Y4F}2=LJEl7 zwfaW8_k8I7+)X>$2^$^4`0r^DDS!T!R3Y4-M;5~)f1)=+YVcVcD6%ko>n_vlmmb|@ z5*0DGQ^SIf1&%bArQ@4gi^&;oK}8f|UwLjRH@`Tqy78O_4ou^BKs3MQ(JZun6ftb` z0dpAUo6--0cR!`~JwpTnJgX@#R(X4tZ-U>67x_rfSo2pB20elNbDVZ~GUhT5l}TSu zo>W`fc{*Xoip|~=5TPdx>r1m|u93+O#jOwPBo5rPfO)6-{H(o=^KMq{gmlJKB3=os zqc+Tl>Hj{nYM-V9DdHev>d#T+gDiM`^+)izueh7g2B*ld8!^z5$bR#1YD79XN6Ls8 z3OZe{{27NHVN?=@=7GSf z8a!#-8J2h*8~i`Ep4ig=SFkAnE;5-c%#jiP;ks9dG`2Gb7=>QEOq5G>xP|IFO$ja1x^-k$-?SWn3;l zmlw#0i1LV6<0R~tTBlzujy|$+!?979k#&M?5UKxhelPE3o|4*Tgy&~9oL0iaeILLA z&ZVN~x(C0u0{(p`XO^P)tplNQl5iGl0;Dwlv8RdJ64vuPT!*%OQmeNezsrdHXo~u_ zKmy4%TKL)JO7FoUwmmfFD9i8!>Mx+T8E>Aivcg%*wDeB&Z#4l+B$?=n{d%=_y2g?X z-No5yELxRzr%jDF(INa0L&S4d@3G~cQ@v5o=Ey{6go+APw4ACJ)(_k^7!~bhuOn*e z3R~O`fSGAP@}nm}3uva-c&t{RkKDy+ZW8{2@!tp6OnyDiLuGk$a>5k+nN}o&YzIJB z9Hr$UxOs$${pT$SoAR*WL;z;u8~eunkVH^(7%rt!0+fLfHx8ZzH^4I+KkY&k$SZ1~ zJw&7i91I@~zH1a)g3f>K`Ah#p^d3&dn`gb4UMCvmB>t?&rHH}@0`g~0dU1n>ra;Tkn?qrbczkVyG_HI^wB z0IRz^=>D;JJo%1wIq*d)r=r9=%!Z`%C!?>3n9qW8E<1}eYY|>!u;k$!$lz!11T7~1b&JP zZMozDQC3YrzgKP%C2h~mVW7kL?C&iIcP0X})ThMb5to|xi$+#-ztyU-Ax@%zqFPy| z=hfB3wthWti`-Pp+c=M}fv#)vfn)l=Uo)`UYm&TwPxf-L+duk|(ZFs<$0GZ!=)i}y zMeyN46RK);4#{F+hH5pLr&R>@D`z34IB<98uDv1#o^@4xv&W(lsVt1j61FP-?%nUq z_FCh0-y5nIuWKP!muHCb_*XbN`L~vog`gMa1&}kO;lC5*x5x<6NeUl@=eF>qL6HF7B)VABk(N+=qpMAR6GaWL~jZ(bcMBCz1sPuy7JD}SgrF>wgIL? zL{2>Fmh->07oWFERHaNOd*TC|o_#KT$9^eBQx1K=kIj zQ#yAlDt{vk$F>-ji86?3p=|63nE=pFl>CVOM^W`R$w269?;!tWO(E0G0k+2j(4c^! zOCcfOUGT2~zr8l#d3duy>EruMnZ<;f#-eBqOa^!Th)sh?PafZGzY3#zA>Hh3i*8Y8 zkc&~Wf6{*C=aZr->SjutleRj@+&Z&mwJzbUWYZ1QaOWei1$Z1*?HIASPa(*9m*mH$ zj^nRNnldZ@NnYFaKL~aOGVMsNpN#Tg;_#NCovf-%F}J~YAkAObJ|CM`Me6X9$ApQQ z+*FKJ%U<01m!0G}aX)K^um~mCc@>kNSgC4~7QS1zecoIb^$BgrFJtm?`b98K%@OUG zjyFBVUdf;>S11i7WN3r8c#@EU|dG80$v~9l-N)a2T9(cs@c8 zs&UKj@6g(BD%z|05R3_)|4-!1zkf(sgp+pxK83Vv1UX*E(a*A)hBggXemVrr#YTSKy4^ z&zL@cvVA4L;-sO8LSIy6(<)|Z*e(=-QwM^)3h*|@uwYA0eB)Gm-z>RcKYeDWW~MU` zi`+6X-|dE?wzD`Qgg<+>%w^1xp-FD`{pG>R(wi=;&p##B(>8@wZVqau~jy$30XJBwvd zsDn*bOxsdxBn6jM;sR42Qs~-=*mnn0$OZXwK_p1k3+&sL?@%OeAkcP;W z2o^X>dzLX`uzidL$C}}VTx5Pn63EWr|MG*gRNzTFlwuq!6p5#ht$i@akLA#NgEdQf z$uVQFtM2GaNybp@Av_aO-cD}};b)V8g#LS&x8xMi# z<$9P|?gFKQNGruQ)%+FeFOCmrtT|^mm1! za}kH)cMlV-s6C;ThW3ED%~5836LTKgsF?;%n`03(5~ESwp%;SsPy1Sox*1h{K{4V6 zVlbSB`~fry<=Dt#`|>uZ_}t!}s-NYh1-0Wj;RRR=!Jh5E*>T}3&Ay|$l|;8lA7JDC z9e;23w8{5BgvK#f$&j$V61r@fY9;JUq}-a4T-e!}02SkhBgsg$uoQp>jw>{gK?aE6 zdu33$y>4&x0O;8_&nQ3$MZs!r&6;@p16fVH=goRg#9u2K=hiNR@29B25>juA#^a$dS`)r1A3K?cJbsbH~7y*!7BrC{7T4nI&kj-~_!9=Eh#Ze0r_!(L7Wv z2$H&S`hNb}>ibZl%yW?;73B!-bZ&l%h`(FmuYfSiv)i zkH~yT%-Dh6a}|4`HVtAlp+~Q#)jvg>TN&UKw>(qi4Zhf;Rs|38iM3q}4|NBsO%V{8 zgHRzBsmC2oAQge)HIk_nn%UPNb)z_f$?xckjKi!Eq#^3;LfMt@7o(w_gkU06?nu{m z%G3SHj*mS@GcINU3TQ2bQLmMsVQ)qW=oXIJxs(xf6o;G#-MYB872LkJPS8x2xk&*!dtViM^8H(CXPwP+m7_i8Z_L>OW6*@=o;d@MPx@R63rJJ?6Ys^nrij2%|{Oo*#&%eohf z$rC5(zj&^bWbw+y%zt8yTAsNhc|AU4e7?^{3caYACUc)m6>Y=gy{*AJGK-lq6YCWp zctGhdC;fit%UrPfo22RrTgtRU;f?2>FFR-FBb4P2Ynv88=0F|DmdID4DfSdJ&Z#=` z?NQmSh6lw^S)i#_f72omfa9RU6vY2`1UeBsXPH%DE*Xed=_V7iW*m+lf)chgN=Q+p zJV6mm63^9>(owjioReccK=hu8k4?2wVr{y4s5g)Po{smW=~nX=f+Tc)eLpe|azZxd zZ$S>~#xTal-)(g+e1B_v;;Ry(Kl%F|WM_G|q#GVkgCf!0Hu%->p4h!a7zSCb|G@{z zI$Wu5i7`PMWPNVf@V{9A|M(4b^$Adg0(PZ%u_Ft*he}f?@qyM(bMMhEEQ0Kn{MMN% zROnIM7h|tKnJ8__cRE4Et<1VdT`by-$@0RG5po+2$Nmej7>UIp3*CcQ$e&%0m1(}W zK1`)}GehpepKWG6qHFoY{i1@2CYah6q*jHeCHT>+V^MzfWHb(VX*3k-ThwQXd^rB! z*n7*Ux`J&@6aqnlJHg$Z;O-vW-4op1-Q5xb1b26L*hqj7+zA%k9rk)V=br9yM)y6h z@3^DK`}O{=s#R65s^9THVwto^_VR47KL?T#ie=jS0meuw)CdRD4`9a|s26O1a1g3**Xu<+?cdT} zKre_vOd70xkp>qKBOE9iDYOyru#_7A{jXhuSu~vta_#YwhY^v=6Zt+!;wa*GGA2D^ zDd7D`y54rgT#+p*s$}lPPeF~o{YiFLbyp^`aS1EIrxZU4{wuVrlA@k8@g7Bh(P$2LNr5^#>5p?NI7@tNejZ-@DP8#ICY1`&_nYfAWA1Ou%k2W;v5zJY#1 zw(a7S0~9wlsF$sYtMBat$Z)GXHd*sJEPM<_Aq3qYuY$+?yxturGOHg zzrw~#Qk9tSJD4k*>8e4icVDboVhvH~7W^^vPiFKx7Pkus8x~F}xh|-N$#Xqv_H7Qp z_n@IG=nA;ppSQ$2->;(>zy8d>ALr)Z%Gdy!O@rB=cb?ILV|79=Uu7UMDx{CK=qSOO z-7Ju+#-;dw03rj%YKwyS7Hc6JX#4eJ<5JlxHq^&Q>fU{>Uvl3eqMqf)pG9{1>$0L;wac<{ta>M71)1>qn@?yZ#UQ9- zyMiozu^0zUzHkpnk~U7h_~c0@2}G|ZX&3R*;F3BPOQe&2|A}AsMM7++k!S7=Bo48! zf$TjHpD|j*<*W6-mjZJB2C<>O?~s=U-nzoiHoowlMdNk7Jbgg~hx6s=r4HrwV!2dq{%w-$P}kK^uf-B!XYW*=%)Xz|+VY z2v#G>KrS!)5&if3h%9*J67)&E1&F{fI3ZsySFS{;E6^KD5BFjicejlASu!~{-KGSb zos5-(OB2o|*2Y!}A4$?uB!onH)O}%mhCW}AlsCF~erFv$j`-7GsadFrh8LFQs^|Ac zr*5o5O`S0bVT19DMj3Qs$tRnBt%KW)LE|X=h&N|&%9-lY0>9>eo)q?YzD*)ZRek)z zQY&VQAtW)8XgV&y?G)0w7KI(p}8OFWZ)D%GgWagy2i%=x&Q@zurl6leq^ z_&_xRwvcGG{~U|WKr1)~Sk4_#pz=5TTkIKMiOEn}bp$KsV-WBq_+9@b@6{$2t+deF zn+^2qtugEn-3k7yK&$WKY@Cq1^+Vu4onI|&GcyWtXDva)O~F*qi4ot3&DebL?^XQP z=?v;{J(e&LAn$l1Kl?1O-I#rf%C!y&w%5;2&{Y{O8pIkLn(=G%pspg1Q+yKXNCpt4 z!HnfhkUm9|f)z9Kqd^d*X~z7|@C>@pH0&TGiN%Mj-U0h$pcJ#1>CdxWeFf3p#AntB zewEG9;nLNLBImp9tvY@8Q|MQICvFoKnGX{Cbb{Er%N}#vdAPgz16#zUI*6gHpJiv# za_!O&Znmt^l;-!#FFXQxq5>D9{L<*V0)$xOBBKtp*FpQuCPgOJZ@4~hm8i(G7iyg| zIMAxGUFBISyMaq*<}JrRBR}=SC$^~#6E=rJPGe8(vxIYzzuuQ}wku;f%l>2lE(F=4 z16fJZYPUC-M1nOU;*U2CzBKq5Vrszohp1jD*T%pI&W06!hN!=PdIW*+D>MRLR-||z z`Wt>?UR+azSC`2QS~tH%dHV%J_@ir1Wvw{75(4@JZ+zfOUoxIwuJ_o%0)L-Ueg42U`xuh;bI zc~wS7kKC4W2sl-Vl|^i79zgMtXP5W&qMsViD^eYl4wsFk`=t}SEKspE8xJGM;e2gK zqZE(x@b@%Fu+mf{$G)2IlW-jwI&rrAtXNiHuUr0sH)_Sp{F9yY=ZNWUAZbj+vfChf z=rqtsnzBMAAJi)G||zKMAD{Pa!hAXuaaSgQF=x*2%KAHZidfyFO;MfxCkoq%-| zM+tPICq(>LzOGch;o@=&VE3kH)md@UfOXx9lRYw05S7cHW#XJday}VG?zdE4=tCA_ z$M63vBxEgiBSBEbN**ZtEh&eG%d3h+h(I)vWI(b6;*w;Oa9U2~Vv|rtmUhxpp4NqA zV23+a0Fh$SS{x{$kW|Vf!p#&$vL%0}1W+c?4el&ZCTFlhF}^MQa>bPtDe8a1yoww` zT=rHE9X3OO>ULI{z+_eo$Lv9)*+47l}q33k1hoM-bM6XhTm5bC*ysK=|&PCl@XGtgm${f zed32KSo9d{7BxEGPyInloMQ!V9W8-tGVuf~ZH5Vl|B2OVQ^a1t-MfTPWY4kSNB5Q$J& zv?IaJb7JuOkcr%?;P*aeY$3mVe5OMFO=U$$44z5ERs*fANklGw+*VU=ZX?+fIm$w2 zk_gpD&{Q^opjILY%6AzwQ;J^@H6x3>?PQD~E1wpQlDE3_fGH|KHuRQy7cCmA;kpDa zalTMSVY`AYdUjpM_Zv!t8B{U_3PW_fMwtbY$+ZtZ%DSJGmAn$VZ{1r?Nu7nQk-el} zb@s3n6sjCgD67()(@hn*&0l7JoRDM%x{2DzfLArM>AA#C`f(@GO?5*FGbKI_wqQho zAZ#$p7TF;$o~u9wtEjrF{`d*5TiLFO7C}_Rtj!=;@+@OXajO#RU0tDdoYGMxo{^ z4O7m>Wb};^$^nI6)sEBfm)lhsKX_meyUow8Zuk+b;mZc&tii{4hdCf4ox-vc&6`N@ zTy3(`=^i}9PX^K(aE;4fFLz87Tl?5=xt#m=FT8^!oebQUTy!F6fjHnt?n(bCNe^H* zhK!NH)#l8%`@xPdI4bVNTGuL8GR~6{Xtjtym>^hdBXar2PtxEkxvZAG{r`PImq{0h;2oD%@aj2@!cQ@P_fw+N&1{)sz?>#I^=886yA1D zz}v<{yfx15z^4QzLv`IlZ#U?RK`loal0urTjW|+XBx1FzY79L3F=J5aj)8@K*x)H> z(exu6)S{v<`z=Bx43A|mRDT?wLSPXpHcKyRANf?#O@^LqIDdS`@)ucSS}Ec1%!ekb z=syd&$q+6~1M?g%CM}t9Q^S{x{2o4)rIdX%7PNo?hwRoLU=bk(dV6W z5lJ&%nJ#!~{ix@f;6qhY{6|vx_!oGNe}LrluOP8qiKPAKcx-cz1AaT>*Ge!CJUBN{ z)2}lqaE_t*UJ<8#)xoECOX2~&xM55mJ!$1T;kcRdpAE}@SIADi6B_1Jymmw}^%EQp zy^wU6dP{m#-B0M+*tc4DI6ej2>y&RbjeGUnOa?KCLk(cH^WpiGwZb`0{&?d!Si&fP z^)e9tRY)Inz8C_b`9LEm@9rC19-l2$u$ zZd(h#YrfgIXC#Zjn+u1{->7+6)j|X-;B@^_yqj>l-^Brz5dXXX(6Uf2nFIU?W^|)9 zV_}Hm0-WG5%*TV*ndZK^xgS;?Cn=7t7q@tNXS3-|RmjJS{^M})l)&NuaV}8qM_r4O z_KHP|8i2L2c_(N_V08xMGVj8ZkV9bqZ_0sZb7x21Ym6i=4TdKZOwM-gkMyy<7+GVw z;I`{%;Ou8LC|hm}e+ghlXpg@RtQ<%WO2kI9{H>uhuW*aM;PP=$+UKPqT#ejWpsZdG zZR#T@peyTrNdWOV9OsYN2nGEjd_ORx0tt(I+mafd zhF2?w|JX}nQ?&rY+nr3Vh-?W-lxOmb$9}T`4{9uWetV)N>WDKBtBp z9Y}w$0KucgmE&N6ZY_rny(A4O`1{-R2*S{>i}4$7Z6%zZUT%d33JX)YmD)+N$NCp3 zB=nsj9GZGJLwvp?N)TU@QY4!M6Pgf?LG6q2+n3;BaN+^;4K{G6x#Cifb3RAy?q`HNmswQApWgIiTHURs8Sw|u;_eifvvknq{}$k%${-2TNk`P}G(KM9dH;FJ+fX;$6CPwg($MjLLV z|5?>!zd7WY5)jz3zeq#3YB1DZnu23>XHsw+^5qw@oJxYXGGc6lyaNaGZyT^;%>qm5 z)M)Gl60|J!3S56uV8U#dv%=)b|(eSI_l3R@YU?10>5%kT7&U z35ZQ7aJnnQIBI)l0o?|Mov6G2zc2285ic=j1N+^Ju%GE_6_DWNK_U{Th{+AFL2lE! z$oQ-S31$66VR#C4?PRof>qG^I@BQ&hA9=#f=UPMrNEZgADO8tGAgqz_+!hjlRLPQr zm(7urc*%k~!f{X_l90X76H$~R@ndiNGGVl&DGwxy71w9Q=VmN_82mif4wyfF&`NMV zj_wjcy0ac4`EEf2lq7xp@|G`S@Ur<}4o94I7bLL#II9S1B%ZuEGe zXFy43x2M7%`~APe0&B#di>zjKC(B}cNW9++WV&g({o_i;0kKSSTRBo;hOetYjIDn@ zAOAcMwKxI+_LCd3RPQ?T<6c^4ek~ME2ZQDWsDMpNLw?+D*R&h2E|lDXp=eQCD(2F~ zo$nL4n5|IwWBbs8fpk+*5xmZ|82qkp3ooV`*P*tStyfGWA-9@AB5ENL$Iw!?+VKURFJNp>ci3#!1qx~OA&-xqs` z$d?D^h$_P41=E>Sm+emIvg;PSki=5Hkre&b_tg3?)f_TyNv^mOejZ4_&pG!uvFl9` zvJDK|QzZQTc?bMZ)BSrVvI1p!lXNpLKILvS@sx`+<5ck~1{CGeoOQr3>Nwuap;h1f z@_7>`i70H$G~Mzeyf&|L_Y(*mW(!>*ug!;7nc#Q-y!yMd{Ud7(FjANmf8^^efz-z^(|_=A zt8$xGU*d*P@d?Qex1Lo=>b?dx5~WOt)%x>^H-wk-X&@1LGw2pHEHC}{YkDW%03%r1 z(;^ooO<(4Yd$e=->2UmpT&hpn)`Vti^|NfMGKl#QtaRKzTQgRrht_G?D6J@ZFuC8A zJc^)w<}6?IujO}FVR(qz(_40K*FQ5)XIA9Wnn)mm<*e#xYQ$L>7t>*Erm?3HfF#fR z^^zC)zjecWUq6mpLQrWbgBtQ)%W!4+o$Vf3Rk~g(cPcR?Ki_BYw8V`oK}amu17k} zoWgE6s44uQu6{7Guno}KfiqGjFTB6$%z3$x`&j)E%~(hXy!7~Ek(DD&ruK&}SaiaB zDhBPi^Ulf;sja5gCi&hH%a~(3d+*_mxu1kD<4-DWK%`3yIF8g89?(wyan=nqkZP?b zqnVv@N6eD$?lkPUoNfZd|KH$XiKHGs-#`i9k6g)eY8T$@g1#VMEtfr(P&~Eq0XQJH zr@8Go*DOVqe@j|#z$n1tIpJRgSv?~*%gLc85t^AEEdzRd2**RYZ9Y5YI^33dt|B*6 zRXS%5Yg77=yq6iwJFe*j$;|F8Z_kbO+i{(cpbykjHdojYy>fBLCxj0I{^Trc3|dpC zSL?OJO>5dnw#+T#b_Lq+>Gd(gep8kUupOn^^41Dtdj9sD?`frul9#U0VzbO4tX+<= ztY)o$0d7vWg>FT65~hBvCQc1H(8XvtaXpLN_@cz+r=_-BVL9<&0BhWERjquMkO(ih z34C{$C{a3suPs5j+?Pw}$TVa=MRkE!VCh=)`!P}v)#pw8ShA$mjC>z@Hdc+blwJZR zr1-MVkw z_;cOHI9%5gsceVVbCPvVK9R!@Nsa{Hr1NwbcelZQ()J^ka^vS+IiB zF-iXcxn0F}W6HP|v;N2d0~dwj-r`8i0 z$qbcL$Hnw6J>R*}`(v$v1)d)*SvmA@L_{U!gnN&6#Wj`tsW+i6YeLcnucQ&x+O~;L zM-bN4qUN>SlNjF_31tl!ZE&HoS;qesATK|zc%*v$P6X*l8;CT$#oPl=H0)LQ*1Fq1 zBnwG6`Q`CYWHUeSq=cO91_}1cr6k}!rEf3{f|oN5e?GT`Z#H-~xIN4;k7|9gErQU2MH~eX|OJz8X%^ULNIV zFhR;sAI0u_>laJ}$ZO>A1u^_UwhA3j=dxII)vvPj4pelG^%n!}1jr7U8yQM$>%U{X zzecq?s5^{Y3>*P4M*6e!fiho3KcC9TJ5!2z$A;rg&6_x-UbNVS9O7zE{*s(@&vxOA zz|#UqFIG}&zyhh9& zu*v$ho_T_`G)u$8ZIsuYrqhZmTySBB1#oS9)%G$dGiGz`GK2FcqjD>#os_P4uvaxR zEB(51QSW0sLTx5nyl?W!SHxY*)CnK>sNd%M2g1jxS5_v*t5=?F9l5m|o#6Eqo@dC< zBH~_C?NgY3=>(OgT6-$j(-}mbtdBEP0tfE3pLohf?6OOMYE-lyTftR^!1zmAJxhR9 zgpKFrc{6tS%|p^+2H7>G!XG2_YunA_%mG3~Bcp$XA$iaTxJL2&o9P4kZ)LaJ&14!C zz2{`LHCdGnv+ZzKF8npBF6L~Lj$xeZ4;ZfNC2Mip;qw4|S4&YPknkaRb|o?Gw{*xA zE)wgv%Kj~yZTn@|U(7XGrO{c(+49z%@PA>)S0eYC~zjyNOE3yoJOU5NOoi!sDA zm-T=H1|PhOObz+q@-m`ir^XbM&z8Yl3p8WwV#)fs^FY}&eht|86^;JZ@%TarQEyb{O7&T|TBhk#7XC zIBg&~NHj^Oe_>|x1+B`hOZ29%an}<%tX;GB-Okp6?#~$0bt+!#zN5!qUe*&U*YucnASd3X; zV{&Z)2`hp1=O8dw&vQZGtET^9f8OOP@XFdKSR8ZPG~Px*G@SzV@bClmo6f-AI)Hc`=w-qHm{zwXX`iDc3Luw8w0OuL1C=HBQ=BZxR&r zN>K)16B>Q;Y=jM(v#5>_YbKhbo0-X5g@MZ?b9c#z!;#ka{5`1(7!GNTSie_vUlK!* z&7;!nr&5#Ri$U?%2k+*V>6>%yL|9Nroay-;v_eJbnjO>;?a{5Zfy6Lvz*Fsb>~3dv z3nQ~&$BOGARPC5MeFo0i;}($hx(%fL&wt&Ncs&o>1@~P3gumW_jud>FIaCeU+Nzr~ z1VhRC_VX($Yp?0SDJOVI1PkOT^B$->Zr&fVpH6u^W?UwnP$`N{lN30t*4Y1D(HXotZ80AIk*HUih3wq5%)Y^~!4rG-mte`O`B~t&)VdbRd9H0P+ET$yd{^CMtx=7{nxG&u^j0 zSFdV_6Amrk&peYdHG+-+EgPZb00RQS-)e4aRd9hSHtQvrD`ZnOU{XZLOUFeEsi&jG z{gfDzs*=IyJlJku|Mg5c$^0aT~Mm4oo|67pve!_zb=KzS2n2@3`E@a z22p23^o_#g4mwoXR~u0>?|(ggCi^VmZ5`+>V|Og#kN5X&1Y+;>)oZ&9an4?$>!hv? z`<><>i*JKJc2gA;bS%yds5mCIx}NHYWO9VdM^#^C-mVmC`y{-b95yUN7xy(1A*<0p z$M|g9@D!-Pt#C$Ot980}UOb1Ro-re^miCTDcL#QMNGw_UK z4Uw>qf43}OKwXy12T2PU-E;jDnr^Wy5#sk(7LTkq_OUd*Pk|CO`ORE^_kp|&k=xVI zN}hLz`S_80WPGcJy>gGzi6bm)b_NBv+1<=Sq6n>otvMAb0p{?tR~oEO{-M;y+Zz7H>fB|r1TN1VQEjijy7JB<`mTPiSo*ZbyY)T-uB+^0!|=VlFM60S_#31b@e{30*NfcHqu9Z%qL|wtV)q-N|P2Fm)Ixce?>UGF5Kx zcYSsge5##nd*^yjE$Q81Z;PX+U^KwF9r*A;aJ9KZ$eMBoIg}ZG3^5~n8$?gDh897X zl2H55rjedJwsU?NTE^3Re&Z$RhBH+x`|y+TwTJP&FqlMSiySeyBzJY6fKTO%eftml zmCSkIJPu4dP>GgvIk))gs2sREx>I*s+d8iP@@lPn9w<37=L4kP40@W*UF2MYBQ0-x zL0NjQdH?w0^cP`N73Pn^wfg14SbVZm9*bz3;i`j>RtLbF!fo=VeJMphN|GB)XcYOo zIPA$yTY@Y;>Zyj?%R!Z9V@Hbmv>|@dZn9j)HZ9zB9zI33Ygw{m|7pC#0?p0cQ9V(t zH+zCS>O;7AN%->3sRBl!c}*v2@CcX(TM`fCKF&9Iv1bS6pYkTfSp1_{DwKtuCIwLIhFAr7O zpbb=3UT^d6O^e>}BIaj_)loUCt3hW$C~|%h83EUnR&pR!V7Ona(~nS{VeT5!Fg$mm zX#Meh2Omf*{Pi&x2`vY)ey;@cm)D-#?aJZh=uKCQa{dFz=0KoksfLu0SA@Z-rS;}< zM9JH7FrfOxyLeTvR++jIaD==G0nQ^ud&qY-Dt_DVeQF1S-{k8(tmu&zx!nY8C6^YS zNf~GsgNyYXm_Vl8z@v0G&@LTje=CBMdfcbR%!9jI_Y`;=IBRdnGM{2)&AYJLmaw^X z5T;J7Q?WM^LZk)Mf|dVQFzXH%i473l6ub#AQhK7W4I^|9Bbpa{(tW6>7}&>UC%M&C zu(T@#uJI*u8IJAQ^&4l)efE4m6IZE?Q`jQrw{j|axGT4s_rCefTN!z5!n>s@MeO`s z^d>82JYiR}NxZc!MSJhFr0i3b7U0=f2|yN3V6(C*UQ*)m-{~v9>Yib)+132py>R8d z4lpfR+R2)89(ZwcG2hlNG+lW!q3z)A)ZD18kL@uw5)j(Sg?d@N8)=HwPT|Nr)zUoz z)6gEq6lFG^yw{Yq;3ZkI!`oYqOxH$8t$ea*Y)qXtfWvY%bGie4y9Akyy$6Oo)v-ft zAs;U2>vAUHO&^80+Pqp}7wJ~Prk$89CrH%XvJn>or|V{=eO}WDc^k0=ME~#m+pg}HmEx2^0v%@la zMkG9w%Pmf=){uQtWv%}H-t#w21haF%fGuzI5<6AwPOOIU{galX*^P5}IQq9~mW}R$ zf?=`f*}9n5@cGTaN6W#@5DLA%b_$%1X#IDc+EcdFzRTS^?!?iW%wlTkc4Z1Q#`Ajt z)nHb!d0WW1PMaBR{+l(rd7gj-y3J&dB=-qlLFgd=`Fiv0JAFs`PT#hJ(j{H1?P?2M z)K6G|{eWR>*x+pDoO;2vxRGk*nhv)XJAyX@sc+o3`;dhnKBQADK7a4Os;)Y6R%x_5 z7`Xji9sw_^LVg8>^nA^;jf{M0N5TwFerULUx1e{CI<>}D%84TUq}>h0_8R-kAopG0 zW+A3EW?HOVc~JJ4y8RF<%u)m+GE)& z8^n|f3kgGx#|oDF(KLeos}=u;!DBqLG~>fC<_RTBiRUd%d0tSWP5yUs|QjMI!OL8+7<|dbh&VM z35EU(6_wH}?ExMs>hd^k!e*JL?jh(c7XIi(6oqM>Nka|p0k3t!_@z6Ai&NU9*VhdE zRe^c-o}_+OjUNSe z;@!qHRDntB=7GN_wQ?-mO@b4xv1uqCWPI#oo@{g_Ak#EYJQ-!cHnxsr8Q3vrug3pJgKS37>cIPtpRwu|ssIb3n z46jl^z&wA86|?KBq=0H-!D2*czeQD!@b(-2jEEk~ILcrckwlMLxqmPwD307rjy^dE z_sa=W*R(ul-@5Uu@uR)FB1c#ZeHOEYp?H!PYnBStrmda}6s7Cs$|o3FIVrlWp&;;2 z7gYy*nqB;>boo=HG*K&L3y4ku*mvzLOlwBhw2WTZDZ{b z;XOE5UYvR1YG(-~)G~Zl7 zf%*t+Q|_~iKvcI*g1jDH1m*breF7!5ZyJN3!JhTU8(7UJTt>3TaVWlqujC`4x>xnV zv#a@^KE=%gV&XUJHNHOEuwR{+I=?tgkpuSReT|UJ2f3#wANYO{k7ySif86=W=xbSz z_m;0=R^-7e{0fitdFNdH_*I#L>2vHr7I6eSZ0MXyMmvTc6uok-^~8S_370`O^3kMP z4IAU{upH)5I%@J%-=$~-kj@)ZV4d!@0qp>N;#A~(vv*cVx|!%y8%Q+RWA|S(i26VV zUEC{ua%vdwc-g-PHW{Q5Mj-M<_!X-?zoAZgFENy&Mgh&tv8?NrmrfPb+56OcwR)6g zfq!5W()h<%qaeFcv$coLr? zBMlSrQ}Wo0kNgyTb?3w0~H6*dh);1%qlELuJPi>BIL6SLj6Z%6KwPH2c+LIwfW|vWm+z!qa zlaPiODpy?IOpN#nv+WIRWBEMbp}q zqMob6p?ubZuH|{YR}X#ESzH^P%j3ku?YF!Hnu@sUG5EpiR({ts*psZeqhskQBM|F9 zj2Dv%9i^Y^Z<=D~{SHxJUqH-}^%X3Tsl6DRO2~9Uuk{s|g8W9TlE=8TwEW?HxnBsE zDa;m{3H3$SlZ3V({=QwUt$=R%ZRch}>vHvR-4np?-FgSK{1Ge9%M$*o47(AyZ1ib_ z6i5}3oG`1E1ZR?Jcg2iVMt8G4+9si-qCzRtN536DHVHs%q?3=zRLFsxStlhrN<^X( zIs=f)_~4laY$8azN_+`hV4&zlf2lqEh*=y*8=iaL z5l7~u3|rp-l4;?A70UN-l|bp*<=Yi&xDW%i?j>V>p@;7$VOLrwD0e-M$1Vnbj9q6+ znd{rD)@o%byrpCUU6H7zNK4>^=PlyFh$565z9ME9{i?v0ja;IB4ffji6R2zcCxqSKG-$G6*H4Lt!d{51fM*Yp&Qk7Ri z`-Pg-A|+nqeblwWn{SE+QAur5WxtR5Mqa9agANhkbiByzZq`mvf?Q^QtdDJep)V#& zOQb3nLri_(;@?ODX|j1u4|XJ%3G_)I1Pj!A+Y9+g8yvI}f-i>w4}`u}}O!s}amn3U4wy z367J(V5lOc2qMr}tB2Zay{!ycRs2j@W<9YUM9x}@!@zR`U>m5Uy9A4SEY zG(hQUwYB`bS(BaH!ZY4kkgZ?u+}lQBnpQoJ+ZbM(P$SCC?af)G=fNEgy);ahZL-fr zZD82Y^iq8p^yeD4Aan26;QQrdsT92Jy+2GM@@83Eyl(t#W#bt6DYFMFuVa^9zjhLj z$WwC!$NDh?;Y@rzhGo=|rxp$0(^`nT%k6CQDqNTPar+QTmn%a;^|fWR$p~?#>TKHY z5JBJpEqAoArAvQ7YJ!(8ySuLVa3WS!0Tjd z(&kxs+~c^wA~#}z$ye>4Fn*Zy)H%UHVND?L>;~8iGeSU`+iHr2v-@jd^46!!upH%L z!-mkZq1sAexyVc@Foy*XNtwUiLE)-))46u96ns$rlal^_7xSaQXiMa;_$`}&Phh)Xo44z(2tR0jD0qKpz^(?Yly6Qgk~`8*y{{qq?qba0#N zcy}1?3mn2rz3@j(&bR`ooyD{&o+QN5Oh485Ca39{6^Wt2^j!?S^6zY=WaJr$T6&q2 zjR^5v{Lxa#V%0QfpIFWukTmeAY1j-*%e{^BG%c&oDZKc%_ZRuH)BHxPs_Ft{>M>uS{`}g=UpCJnKSzBN zVgGc_!4^lL*A$5hRY(itEocz-PF8H_*EI?~^r{lBkd$iXr?s>}*?5ZW-vf*~d!UgU zrD0qaNObRm6JK^Z%Duz6a7plP>aOUZf;T?dPZ*#vMW*)9T+{F2#!DEFnpS70z0!+9 zGtIB(?SNN9v248{?gTAM{YS@uwf8J8a^-8Es{4+B5Vv~d#@Ek7|7f|h5+MAN!`5?x zQrXz@^LkGEBU+CF_-a)``|4{!AfW7dF+NXun~+* zIMWjv;`V4cw|}fOI=89mGU-l2SzCu8H?ur!g@ph3=Z`XvK?M~S z)i;$xlQ4Z8yMo(g^ub!=IEL7|&saS=QS0~fK$kRPwT4QTdJ_5sEMv98zHZnELCz3G z#CI($&kuN>t#29PFtPA!>NEsd)e)P8+!hM6RZk-_zZ(?5YDIs653&S#52&iYsZL|; zpli6J^{YqkJa?P`x6;-K;vk|6!E~mN4dZ`cu8>l?@qv!Mn4JAyHE8yp-*pw2{kkhg zha-X-S(`?KejTgJNQ0C$^FYZ9XLoeMV3i7Oy=}N_A{N! zi1>`@LH7KfI+i+;Ry|UxA}=Z2pwYT-;ktZs3>u3^r(v8J-X|oyZp2pBIq}fQRXFM# zS?dJn;ewuG8gvp4Cet>Ke0i-8bL1ML5#nZd!3PoSb#PMb_Bf-Qu-Qi(ovJU;g;dEp z4G4)V%gM7UyK&*)2d8){CrW8baI4JlXudcJBS&<1+)H<+Q{a#qoOpENhqBDzviM** z7?*{^p|zsO^CwRc?Zim=D=3i(TIdWoS&FAueJYbE3qlSbI)Rx+F*iYpFOz}&Ii3m5{t}n)XG#=Qe@T{W>MtW_QOZ^bw7{yV3cAIZd*F_ zV23mO&TMc)v(}@6ghJv#nC3>2!#9Ex`;_rj)C*J>wmlxkp!-t=9{<28APn1NlYta% z$!_ZDuI4QA$ioTqWOkw2yAdSpn7f`tjMpsV1cDBkN%x-EYY8Dr@*p&1Be-9digc1> z)lRp@Cx}g_HQZko#k>D%ZJ;xP#r$o14t{%HX4YHHKW&_uSBFAK&@z0Gp$AvS->Omw zZSW#xN!DG^BDBF4LkpmV7}s)|UP-ZW70CLTNS}B6Ci3omN$~^k&L0>T{h%s)lExU* zy6p~QQH>N&HBTNGv6nP5m*ep^p&PYziZqyIR~ut$OG*6yG3|KAEO}qE^y*>^vn&Q4 z+3@dy0HramH0NE0bemd`3DH5$;O zkr{~{OYV~^>mfoGAJ?}u($Ysch;bw6nVFY&O7tyTjiH@jtJg96l5i-w!YtK_X%f@I zX4X5i%UBGYD)aU1453ALzqT*ehi!cv(fVo1^jxA7zD$fL5p+W>>ng9MFYeXS6#W@> z4zaBSr`WQAg@=y%TtW6;e4*zl&qZO3lA7G@{*0yq32)7&3|C(p3ccOR!GnpsEwx_L z4S%ACUdz-&W&oYcAF&eH@y9TavgBt%R@c*O7~LyCM5Be1nUSYi5Yej-nM2QzOaCgU zhAHlO?oiO-)L$K8Q}6y3D%p15Y7{d>;Jv<7Wc^9D8IF}F6*BZ}X5Ev>1|EBaPRZZ^ zTX8Y9uK~-~i@2eeXvTQq#_oF#N9P13on^1vA2XMU_m+$;b|AQZEA}<-s7jc35_^c> zK2(M^P@J~MR@mZtS$UoqIWzD^J7Z&V}0wXr1z{y57`>`JyyN>hZS zp0Ih~vL}jt=zlI4m!DygSfP}ksIiVot98U|5GIP`l}P9j^E*9xR1MpDAO(;Hxa%O2A$pEoF4{F0Q3Eu>Ccr@pJm|S;P=~b`&yE^X8XP@ zsFmRl7La@FVj^t*aLpmB$FP-8z&!qvf_S!%a4(vEhE!rgDp))IIW^EJFJQ=6P^aM+ z{g;9HNWYR>FF~>JWzje0LgT-8DtGC|=Vh*rR61mK@`;EO2=h0Cv123*x4Fo3Y(doT zkOfaJ!8%s;Cz`$?$cf_O#^%215irC)ls)=r!b5EBp+)S zY~SP9&3OgWt~so^DcN-c#;?7{92U2Mlh7XAS9Klm6GuQB`X9vQ2F-4Qf7bukQeOzY zreE`eB@3!`zwAdvz6l@r2l!nx!K*+}^zKHLX)*W@ZKXh{!57i5yFT8;1Gt zbb?Q@f|pdqYV}i^?;wk!=BwcnC;>A{Uo}Fus^yac$QffLeI9r_*(g`8QRSK*QUy+| zwE9OMzqQiHF)Nu@FkKA7JRpk*`r1y70q5ADnCv_WoEPHwp`GqdY{^_e?eyL_W4h=H z4Y5gS)=GPhTf+U|!&wH6`8;dz9KPYwVy$Iu29_%|O~iNdJb6sc-Krs$$uVNDyOs9+ z8(C9^MfTl-NiP~d6_SglUiHfB2k87 z03BD^`jm&A$1qFa-GUSSXAzZjmW}oPbnV(nn^$rwo*iq1zTXr79E|AWOUY{UxM$T3 zjESXc-&#iSPk8*%tUzMqn!)w{Ehk@W*4;Cv>K)ky$mK+Io@d>HMQX}s8;UHvK<_x` zbXz29)eLpYgIhpY%KtA6HLQ5TnTg8j@<+-(@&-M}tg zUX@?jx>h?Gv^si<2$U$A$Zc8dlGiW?4wO1Y?-Ja5*RHQeFe~51JM(oY2O9?*l%{|P zYeAFbDI32l1(c~}AP##fqQ%onV4{kD#PVtGDDYhjBO{73-dmqHCti_Me3Pfp2e|G+7j@B z`aXloxvu>Ir>H0hzBcBkKhE6|gxmY8UDXTso%$~d_>X?z-2=HBzTlGqkhFXhtkWp3 zyU$C#!j(B6+Wve-;&VYFc*}gREGxk}f0mt`)Aevor~iWmD|9TiBs+9pGTc6SY7?^Q zmm=B$cFV@^YOjVf0DQ3mGNZhp4p(fdY=m7qkaN{R#`IIlxUiVFYLQud!Me70J~#%4i-nq?`5cus%jL7i1tRaiqjWfU8i?KloihYp0se0?)EE`o$};q z6{VAwe zzwFi@4cV&IcDSr?L(vd)@b>2q$3BeF@rF#5bzwSR{(uR*MzBQ++-@;M&AwtE>hMC~q?Uj#`dftx)>Me5M-AaBGAiHj3!5d}#6}t$}vD{TB z0Gdipt{@wHb4Ta4*Yt%}3f^^?mYB-Pje+X!><@rlY56gugGC|+L%S$ApRwmcd&+a8 zmX+}mhw8=EJfJ$5DJ?1%<(47AGB##UuL z%rFt?Ewlp}MMrjah~63T5@k&040r62pHA%#A*4eKI|e@}erysBYpI3hca=@mY@(2z z+%l^qg_TodGXq)zVHL|%LCu}JB}{N)1hN#jd!Blce`#D`(?QrO8=OpRnD zSugWi+={GiUcZVA3zH-jtUW`Wy7zDwuZmZ%);iN--@#UDTei?m;$k~tmdJBTtv19Y z3oW-vO+6?|$x^AnJQjHIe94Hg?R@8SHGk<=t=>=KD!~MIBaVbtKW=r;C5X;Y#YXj3 z^`T<-E-f7|=6q-V{;6H{g`aVOFitM$vK;6AvSGN%k6#)@O;ZE0p+^4aUJiCupM(u= zKLz~IWa7xkLzcAmVgVTw_zy}Np6Wl#8j{_ypn!wo$QYrz#ZquikEPjo|?-E zm3zI^)0dPqx1h@ZAsvL{`0NXQRVFSe-SY=i$6TE{~0Cb+DR*%E;(9$DY`C%sOW zUT8x%!zsksrH!xuU3;f(#c>W-Ic0oD9La83&$wk#G~GtQS`h2ZxZfluAa^jyt+y)i zaU~@v7#hFgEf=k2Y;SynWf*aamxo{F-P-+ zt^^1JMzr}!q_G-&9~I%Z6Mo4TeBD_!a<}&o*5_=&6>;_1%KiA4q~UL^D#wUfZrc^A z>JFGXS3Rh@rr&HE0r8WfXLa*_Z%nJbmF6_YvgWv&D{0zmP;wel z8X2EKU_L4k`C@EEBcYWQZ0#;@73p{X;3fJz(@Rf!kV^gy2Sb#ah;lnguBNI^a>|y< z`Ha}XUp%68)Rh_HOf5Du$Y@c~BwE;*iCQz=(f=+@v)1vTPchAYmKS?IZ+&eRO?)|>+hEaZ~w6O8LEgo0xfBe_Be5|zWwM|Oe zx}TLN>O%fqpb+aGWXWrXIHg^VU+`3S-Hp!SF~Z2ay5mQ{P@#uxF4g}w^9azpZVg;u z^$3_b25I`QbGTLu7m;Rf&>P{xsc~7}lDHv#Aw}YzsG=)N_~rA9lH<>IZrGPiqa#;c zbj3Y4-5+#iPr6U+8ENE8smUffqd%GgMxlcRn}>D|sqrIa9Hxiqnz&Qp($xC#3! zjW?;i%A0z9mwy8R#jm9WF6do@HXbkUmDGnqE=|vsr6rS(o1Xy8kj5kbjmMXyHHsh$ z;e|qvO*F|gj^|GUQFrK3>>vaj%S|$gBgy=dgBaZ2lKEskr@>S@hPVojnm`j%9NI9` z{);JmdY@^i>hIw>WqV=&zs%|RX*bw(R znCQR&r4NVlE5}%3K$Bc`mvt&{Y6dZfRb=-QkfF^PG&&fCFsA*u)H28{AGbB%Wh@|Bms8y)N9yrDB z7TfPAYYzUDSYPQ~9r-@zRS+V2`pQ%2+xt59?Vyyd(sX$TUr%k)vIAryP|Ni9iI_c= z@hl%@vglskbC6@5YbX1Wp%!f9s)&aNK(&Aqms^suUyl1D)O|Xt5GyGTrg03<1%lET z;y?Sx%gBFl`jTWWqhGj`>{sT0ZWolX?Em@KU9M?h`#-q+MCSi?eqd+5a2-*-g=aYT zYR?C5gv)QVJ;9%xJubJ7;L*z-n%+u34b%ufG^JWIP5d>0yY6_O3UxeONX@~oV>r|r z8dx}?o7rNK*B|b3#ic&!+wWgs9s1ibMW_z3s}){I=;%2y*D_*EyMK<-x(9yE?3pO4 zE?A6X_yl}T9fMAYVX`mfg-15%^P$J?57p4Kjl5D zfj9R|GOC$p3^WUw^v~my$r6SgB9iz2^S}t;FS<9g)m1fPVcjxCePj=QDw!Ja{1yz( zqbw4y)8QFgy+klLW*GFBhQp~_g@TB5L^S*Nm^;e~bhdX4|DpoKLX%4cJQtKVwaNL( zBx^mHPn>rqm9?@Nk;vra8u(BH!vf@0_>mn|olnV8C#%L!d@ieo_1@zmvQOb8 zz~GzQ_J?#+khJ8K*R~=`1%y=^xrq&sXx+(reN?GaF`hy;z<0xC)DV3p^I4co=P#!H z_=P|8$*$3J^r<0^6knuoY-Di4lKuOV);u-kXhB-Wk5?M8eT>LGWE7zZ2N|Z@sie?z>OmqBu&gLog>$mQL zyQ}IEPA#~+F_5#wRK}?Q-~WSuRk6mWTJ$EnMckOMPt^K$^pqt{nuSc?gwQeaWg|ip ztN;1sdAO0K10gd=WqUcdZp#T1hc2e~W*+_~?4Z51{|5**g(8v0>!*9L$*$D^&*U{I z#-Ob;eMe=G_XkW!rmvcS8GzC=l8I)oY)Sqv0NAQ2^`f!o#fQ~{`MOZv#9=uF#5MX> zv{8NQc?M43+oVq4ZRJIx?-|zE90iDQd@Ej`QHkEKfrO{)x7o=M^ZO#M>1m_)fA}nd z4)Fv~MHxo`mW5*;>S3;r3VsgvK&G5ZeTLQNjlx!;evD&X-{V=Xb@R$o*P{yFsjCbu zJr>dfwc{N(#qUbno6(9l_)L2-?VqnEC`$}E_j`pfUOSR;^7^P^B6*^TB4@wSDMXbW z_PUHUt}+tJkq=NIqzh$8Ii5$-DcY|hy_i?LNcgxf0+^;m@3m%8Zm-tXZ20t}@?-lK zB~?rwsVZ6PL%|wzKc&%{-6mU}72h4LIAx|#U%k%N^yA-N7B1QG?fjn6){XhE7Rgx4 ztQvaOxag232sY6ysnz^&F{u^@Ih@Mv=WPj3*_6XE6PZ4~UL1%eGo||yp1uC4K9}XU zgq_WZ3O)L`S88xQ?*@Z7KSzyvvc$nYyZT%8&08dicXfS00KONVi#V}3`)^^uJo!Kb zJphWJ`ugyOhO$gA74pHWQWdnu%@XXud5BnbYsH!~+mSIlD3YUnPBpVpsh z9OW4Edein&y8deD`R1D$mRcy(AX>KkHD}s_V(qN|m>J;dKlDJw^x>CdsPU!@`n!Y_hwBzx7j1 zy%3&Xi~BrmFBTZYasx0p|9Y;_1;*>4;4k@BRo(a%0dK;s+KBCD zVxu4N(vQ@fhM(CDmC@>5^cc!nE+F#`El+TI_m`!IZ!kzd={%h}XOX5nQb-l;uET8e z?u1BHX3}^}5Vq#J%4FR7T-`ysn)t`#;Yq_6-pqEf?VMZPFvO0H7u`u=-$m zm7lDvX19wU=`HYHE9Bir9Fdxd%pbmV15IHLYVoV8SD(3*H!dS4E&qNn{DGt=nbF-5 z$42yyS+*NvGX0&y;M+8qMx!d>mo<6wpko&aJ;=WRu!-+NWbvR;g#u{?(scGa5<=wO zEG{*rezm-{UQHF;mjB(zOGofpnh+VImyK<5BFJ58po!{?PhhbCSqnky6X00U@}oYy z&39;^y^C>UA@zpJ;s7U70cHl>9olk#yP8Wm7WR040MQ4bV$yg^&ZZ-87Ah^Fi}PCF zP|dX5Q=I0@g)+HWyEVKih!y#~EW$3tQAV(o9VM673BiJx^KGS*#8VQ##rHsQLnCXZ z46W+R$kuDbq0)4|5yX!}YpL__zp1=ki^k2oON^)>*jJMttAm1R%@&`Fk|+G(&AY3{sofCl zg5K{54Ie{pVPF;Pu%;*QpaApGDbr(XX4(0JtOM^S2A5mlLQ>E7TA1r)e2ja5a(5lm zp+xsza-0=Rlb51f23}UpMfmk5`(V4i6PNdTe}U@OQsbX1!eiX7l+z{>n9fsz^$x~0 zu0szCbspv(yFL=qHzZ|w8Qt6WvxUwx{!GaHCXhcJ_TKvF|;eQ(u zGxb8a#>aQdImL5|=QpThj21U8A1{`h})oDy>EN=3?v*BYIekLZeJYClioP38Mr z!*e1bXP@oAQNsLXgRo4C$^gFj{@sK`zO=l~)7nQ?~8}zJlW9R4$U+h!);~WmE5axGfFI;@KPo0+eV!?57ikG2`=1 z_Gda(qCHe|$Gp`k_ot(2Vog_5O-Ho>D?Lhle zQI^rzF5?GtKjX<{Lc0+I+FO5h`2Co)r_#4iV##WJqCKMcjic$EXY&=1?aqdxON!nJ!u zm`!#tPkL8CC!p5lszuc1iZ$~iu?Ft^{mmZLmR&KUo22R^Pan51a3DP{XaA?KW=^XEq7404S{PSF@HyPVcItX zV+_ucug4*LQ0A}SHqAje^*D7e+y(f3A|ZCZ1l)s@JbvoT5yCb&r)JaF82E)Rt)=qgeNGkp@~6!RBCtcS~vH{`@ zbwDI3{39+u|ASw%)m&<6-0y|yd%ut1Qr#fSV5wgsyjSy!6F4^;`txz0$KW5`o7GZg zDN715R#7?5@E%0-pFm~@(%0$4l`G#BZtzzg3al7diTVnv?oBbMqpuqmL6zn#D3uJiZ>;NDa?C^c9-SHxVt8rX+K^m_geJ&%jgk&lQ8u}L=+m2AZ*u?sw7$0090PdX*>udn zxCxeyXnULYgt@a?6@M`ke(oLSev2j73H1+S85E%@3cKO|)$e;Jc*=hh$r9n(CIEto ztd|nSWVI1ixVa%T3%VAvwe4h8X$4OSCLMc?m!v-a3`KJ)6dFt90nw{71zKaA{A)Wb zv|k&blt{uer_yd?>kQIs8{pEIK%Mh>XL`W;YAuVpTT->D2nJUuaaS1(Fb2$f3Z;nm%q$6*+og#PKF9hBx2^^&v zG((^z&D4j5Pd+=E=1;PEdSs9eiJs$W!4Ft$fDtq&C# z)-9N|R2fe+ed~dPlWu~P1(o_WxEq+yUQa;IE|9jFo4Kb0I^?Nk5r7Sb9oZR&RED699Cf#*~H5ECyH(R#zTVK^P}3&58hQH zw(;g`*R>-5u|HyIa?ZCu0km>TS4XqMtgD5ZR27(QZng^@x~wd*>k&b(Llwf^V#X-f zHHIjOb?Q>g*b&DL>AmFf8&ngwf~!AAK#BHH%{Tr0ry+bAc9F4LIBHifsHstlDS{{y z(%H)ozl5+QP*W%0dSJcC_#e0?j)4DJa-VfkEpkPMZ!zq~I$+-{wa>u+URw9{+=v2XWe4mI1o8jBJP>JtloJ#3o6WJ3*g|6j zVRm<4$7HneWo5^(ibPG4APFZ$lQoLX(9%salcFF+IsA8pE}!5{r``4-XCkjh)$CF3 zU?^P^x}kvxaD>1YN9JcQ=s0)VSs5qhH)PaYhuxFaz}ga4CV-LYr`Pu%t`T_>-4Edh zFEgD$t{A!$AIW8B6+7Hr6`YBpuR}fjAeD9mT@V1_Lz~9{*E`38nD`j45?KP&t0sy~ zV?rL&Cdmx<^sqKgUx0q4hcpytEq6(4jnHK*1by;xl0o>b^6))q1ZMwUBPB@rABdRY zj;|kPztUS9kULP?9mBZ2#jSLArAC|5w@lgfpzo#n~ZI0K5@z0cyMFUJ7G{E7wVeo1? zPeBeGMmA*P?JufSy{^2|qISNL@Vt?LDx5TN8C}`j8*0r`9aa|Cn1u*(F@h^bjA-e1qcZKw8 zX64RoWTkeH)RgMw`D1m&KsFN*SDc|5BcIXt-wBrr>J2DEc{#*d;asliJ{Dq>%Zf44 zZtP9(ISfWKk88KR?b;ty41BFd%ZVGRDhFSS+pFJ4^CA+f#N$yXpW2oxw>h7GX%j77 z1(klKwMDf!FWpxwZtU4CNhBZ35EqM9R&El)<;%);nQoj=YrIW1o-e`7xd>})8$!=9DFPXOd4(GD}q(FWqA}HcWtK3;0XUxKFu60RM zRmrh655jWM9C6yALvmD+|I+(b&T9=bc1P>;sF}t&-xBFww460+2O&f|)Y+t&Yzf_zomP%biXttRtv^bAt?UXCTbh^goxzmw>>Ab*~RO|F8 z=?KE^w_g#h5U2a|hG`ZxN8b$_+{J5&zosbB@sBOVV+;z_{Ps}B67x)`T{Us08^Jr# zWL>H9Jv9Gcew+$DFLQWlZ2^F{fih`y7~`qyJ>TQdrAt6qYL z=9_f7drJik6Dj8D4s%_ffCDsnaT3oZ({ytZIx_ZSZ?SUg;Z1{LKldxwzIYO=1IDBq z6Qto7EmH}_8$oSrO8-=oFX22&=IMn+$o5nJ3TTeh2?7Z(E2 zN!l*;w_7lTNnW1WqgFJspOmeujP3?{$RrgMD3?Tc`F3zb>&V^7ORI3LVA$aPA5Sv` z>cRUCfUUAffiS-&5qLXvCZtYkrYrdxMV;X1r|P-@!;3@8uM?|3<>2Y-8&r zgEEDr3?_se-#hQlQLnZvbQ8jNV?HVpsZ)5f_?nwoE4@2Al+nIxkYvHU7bz{LWAu9m>D-kz~w|uO4BXzJ`o7;@EM2`#lkZ!o=p3YOZ zIXu^+rZ_1xu+BoLd1u&L-q#++d3g8O^;d%Im#!DiHC^Vt9PO)0w&;>rN+`Y=~;DEBPHi6t>?O_i|iuS7>Ng#%dR(2$|)TGhsqqSpOseHl< zN3(|U`G+tCEHKHl9t!48o_Un*55?{F`aI?g2ku^FnFWya*Bl-Gi_<(i5|DDTa`T%f zVgQSyVktU&ig08rqSS~S-QM9@X_kP!Pi2B=%D$p*9XRNv=9{2AF4fd=XG4-xxtmL$ zSNzAGw<|ei<~9-@Rzd`qBafy@rAzQrEAQqL+?jlyy0>9+3@Oap`@ZZC+oS{0x~^@$ zz|q3@OHRab|LvSO#WFLDye|V zX)>P}Je(Z_RB=)$$;nT2ED0>|tz&iS62%qB9Ei#p-)gJ4@G0~95{vRLAxVkxrsO9` z#<4Xtsy4Y^1erEbD4rnI&^yF}5{K7^nsv51XnwnF%_k(Pp;^A7 z<3&Lz=-dOYmrE~^zwnIpi$6Jal1L$NI4!VAmhQc=$pXq|1z~aQ4uOB4{0i^?fu4he z{F+}?+s+ZCXKDDrO0TIH<@VJ)+CxPMqvql|{E-z3)IsE!Y0(_yW1^n3SJOyG4X zrXPuw;c+JKv;jZ47Wb*Y(K+bl;c*e@V#@Qh>+>hY^K|tb?f`qbjBGu62sBi|F(@Vp z>VjvX$GUVNz4fDrP$A}b$fgS`*Z8l_ul9}^#PL5k|JoURGmn^h;duQ&0lk;-|L`*6 zF1AG2KBT?K#7oFT!qGh;6|;a~U7$t5BgdYn7^!~8ave&K*5Z7t0}VaU+K zS&nH#6gtOW_)8N)rDCO zrv@IN=Amg$LT*!T|Cie2WeQQGewH2CyZemgFev6WK!GT72V7N;kZ}lw-7Osfsq0}I zq_Vf;sEcO+}+duKvB4ZERJQ~N9qu*U?jfZxfI8g8Rxqh>y++b4aF zI)6KFP(&$?#~yw7*{^y0ak0tpmNA3v+f3-f%($P^(FCBVW%_4~fr#706(W63&&8ex-7 zI^1k`^9k2s3EzXcY=`uwYDt!#r39ih;fM%@^2WS^;iYe-QnApXr(l|2XIB#Ut3dc@ zSEH@Zj?EyQ{*l;?3lDG~_yQ^bJhx4PpYf(FpjFpd@TqICzuQxP)ILa35+S8p33#Zo zg4clqV5IQf$2yv?7!YzC-+!w0#!%GzMr)+7b$xe4jjC1;*!>jIfKW$QH4At6f>JSY zThS6)i+}=D6$Z~j04eSxlK-5p5>Cc?Zbl3F z4>I2G=%w)KJ7JtQ&ch{tE5lcPOn=G??mF85RXKRV#31V`545zJL$REj?+s7;4nVA9q#WVWppNI2CF8W7V zU^S#&o7S=#SMk2&;L8R|UJ03pEn)ln6g-@-q!mo1E90qluc2z8?aJ8}md_(}r~&}j z&t#W@L(cn}FCEuYFFlX@u-V3SV54c!19a~ghB+-6bE%Wx1{Hm!s7Q7c@`ne8?@fBk z2yq5y^~4MWz1d^YJTavIRUp4i>sB^g=i*hAjCUV!weWF5sc~-}IR`%9rX8??uWn~c&+F?l&WO)STab_ao4I}1VfnEBbBbc%PHDj4!e9o&kz4TW zyd*Fd>J1y%XHvo5h`Wk_GZpQdaiaA6JO&+Oks?7bC1Cxpb7FC0P3i$dZ!<$Ws*u1CXZ<*jQif5;H5D}c4*K*}Qu@Pcq- zG}?Rv@21<$&Kq=W9^f7QCxl(O6z|qjfp=y>cDB7Wt^M3UTW*irCuj!wlc;Bj$i2i$;P6At)Z!|=wQ z;1>Tcd^zVywB6|-6(BKOGqDh_*Skvbl*Oa2CBMyo#TnQsIC<&4C;0G>ahRg<%^RyM zalM35cLtSqWtXx@%<@E+WmfN8bik6V=pG-Lgnh6mbDt=B;AB4Xe75}~1&M85ImMq6 zvE&)~n6u}RhL-ADm}cTTtre4)8TXWa*$Jk1gBs17uS_t9B{6Jl$tu511QJ~_+Cq(mfOm?%}ydJdXb zp*^lfl3i5?$>i3pv4R1GD4R6gk7fm6~wOk(13MpUdz}8n(|DpE&WEJ(?QM5EN3)80Z>a ze()CH-LMPzp&!ywqPhaPIRm)+Xn2hTp14q(N^O0f+n{)50L7%}DUF10^ArKDEt2ra zp!49srws5{HrPWT*a8*@;eNj}3*Sq}oEqbc|F_T<>=v2+aQ$5gp*2m`{Ud%A!z?9_ z?&nj#-#5O=qIjcVY0$oAn#yGT&4cF{6sJG#$}b2ya(op5{9Y+^Ff<2;9(p5igFoOP z_`u^LEbp2Jjt*R5ld4#F{c_Q(XU0zw)g5s>gHiNYll8Y!bxkt}Y|m;@g>C^WAoQD) zboY7+^K(;}a#U|M2q&86ib|&YS{N~TcSMN9EBm;nna>jwbm*Yy54@O#G&ZnR^1R$M z1RgqAkzc(6NEJ3ez5uJQ28%5?>Aw(n+%$LbZx3pD`LosX#6h0sHV0gb_|#~R=B+jjQCdnkK8v9UPS3UAS@VecBCuBJe<|B6>dWv)@ZXAWkVmY)3ZN8{xQKZ6Qm{6YE(VVnTyJ%o_^4sgri!6sA}xA6O?yl zuu_qVaSoU^X`KjS2RB5xP1x{yPe9$&!rfm#XA@JyGR+^4)}${i#w`)r%91c9_|f z;!HcH>?b>?8z>M(PCv~F-NN`rca&&q`X(a%94nkNuc*0_eKpY>;rS6x|DFj}u8y=#cVrc;%`)3!qok1?GVe1k zE))FqSvlg@q{PMQ7E(WZ&*jWz4O8+RCXT0o@W*@jW!3V}8>z9t#M}Rbw2wd9~Y60L{4xawD zkGp6ttmb5pSEFeauC6J(^NMP0>aZE!wSKl2Q{$fGl3Dm;)>*sBS7b$T=&+aM#gsE? z?>YMQ@d(*Mcb9He zUquO?qWRV1&M`#o>=;JkGpIhWNXnX{ofm^*nr&1iC1Mgy#cH0XJp zq5s+FOk%&w)E6kAOhwW-q`Z%-aRF zWXgHy*^y2YdFHAfR{<uUf2Wpa8zWt?5Cn9pid7%SXf#(avrx3YIMag4Ag8fEAS@Q`!4A0>@sfA*JpQ8yI zshYV_mcTNBOd3&40e!ll6*{zQ-OBKM)rf+?Tfn|s!Mee)vjcj}sMjqZFa(WrnW(~l z9+&RFFN^b0SkWs3lhhgdEna11@krBjI@Z5bftiBybG-4C{McL0M3H5)SA7}88Vr22 z@|*EzR%8iC&Z+$4_dKr`2tDdYEC1G6a;4FgeWu@%e9MG{jH-0Uj)bk?&S;Uw@FoM? zbXmLX*+DO-GM{s-B4*05igcmNbV#PsmtVMo5c?wt7kVWAMN(_WAKs$Qm_J;C#!pfi z0=<1_O6_{xBdbL@y11hxw+nKSbiOmKA4%5s+WV!AyErC{B&mn^zp1>H zm3R9Ka19ARD4ah3banC`AS!~NhxeNzAlLpTK}+2Cd(i4Xs?C8OT{LQwReq93fmDYy z^v!Am(t~;auPKJ%18f$kIuU#)+1BWgKz|#i70Ykzux8CFvy?#Hs;!dhK6RKQs;8D^;_@$6`ec(x8WUr{P0 zZ&#ITTLSe<#$(YC+&#iat#(Qz?`m{4-FF5!7#YChSI9wGTb12#XjBm;9b>+!wjAsq zK&6H@1#AyO{|!aN3!hqv?8RpLO~8+UGbtaBLcN!Anh4PT_n)~yh2vB(R3LJ?y83Fl zXkuiq(lw(L0L96vC2&L>uN{3Iz{0)#HdtXd|F*)#(sL1=1w=0Wc%eJb6G*5AI-!Tm z8^PM>^EXUMpK^;l>OCKihsOhLf?2nrm&1aWEq@DCRd^zNNWnTq6%;h62QFF1gM`3H zQZUQ((`uG|*L0Ebq!HPn$xDJQ0{4)$1v3IJ4{4_N{H|}IS;#^yJ{B-w;-`+s@MYhz1mJs5Wmp_Q zs1Wb1qM!DgBD&=FN;Z!aCyCoYyBkF=;Gu_o|^?gdKPNGF96fOSbU8HCi zzN!p=Jk!KpH1bEQI?HM%a%*yZ9%P3=V@E7`GB`5}P~S#cr^IsG>i3&_evm=XP7SlC zSu2}9dgZn*1|bZCYMFacTI{6{uc-S8{U7Mvug@rv>pj2PMgSJiU6%(Ll#hSgM7AhL zl0L5>iZFWG!Jo<`gVFRrlT{z=@EQ6VwUesSV^Ly)qN!w-e--5e?g47wX!I|!7TmyR zo9shR@*mC&e2@1%0aXQVw{(8n>}x{6ZI#YXm2j4%f{Kq4kICI_%B6n|^xhacg5B|N z-Oe}1Ml2)%WR<2z4-0sS6L`>k*g7aN^=LY`Hrkguk){4>s$3-r(Vd!de{;ZJI`gZM z%|Eoo!Le>Jsc)i*I9;tRnF&ney&2oLI{`QVA4E?R;1wSZo_BB=ZM$ONc=wF}k(LHJ zF8qNf+M@Es=Y;6!q@1^_5TiJ2lkQM7B)DNm$F%#vltytIFSk6(V86IbBy(%xBolDi z{ZSopW|;+S$5Ivs>J_!m7_Tq3vD&m>zUavywi{mz)#W|vUDHF_e43v=emsKIm>hLN zxaGkR*F;y`*)~3iz|F+?zolr8!xD?<%aD5-lPiNW9Zr)JD$`SFzVx-tz6EqDEaHmj z_T~@(aun1wo$j5-Ida{zqXS=x9H*GT1*GpTY|?DgRhRm%9@iP-i7B{^NA<1Y9Ph;V zKcHv6i&;y&g%!=>t5tQ74#&q^ZF$KUl%iIgVmyprfcJT`aF^jZzu@&JvVZW+CBfgh5_PTXV)y1= zsstwaEsJc=lk7|RyHYwEF~KcCw%V;mVKeGm6hz;{+eXcp{hCC0D^4$-r)ykxA-dW0 z1)~gMfUvzwm^PPbV==B ztXByi85W!ax61*(+he>dMWiov=QNJ{8R;}guw8fVm`sQgcEFNYA!%@qKNv zO;W@V!VlC13rYqT=2T5L*=Z?=Q^P)QI2dwsPnd*+LO&`l7W4 zSfH@IWU*WB9H`rU0iJOqb0r?Y&V1IZfMYrDV4rSR~hRJX~!0O`Y zA3y0|aVB=zsyd7-tWuQZqk>Dq|qJoU%!a2NM#w&NGD z!O%(NEgX!Yj{taGoqA<{x@Y2j=b-R_&=RKsNm3$Ii}C5#CTEx<5tvnNCasP6o$xHr zG4qPDxs2G9yPz)@p>eN-tSoXO21~!ynHcmm4F0o>VTh`CM3edcR)-^u-ZGY#H3Eg5 zDQfxSOxuC}@*+qR{JK#)Z_R&&tm>6wh|hp04(W0-bC5IO=O zkA?Cx+nAgfStneEjrgP3@`!HR8C(SVHrygg;sL<@QVG0PdFuWzV`wGhGqOpOAhN*A z9K1fqugO|}J3IsErTFBHfbb4ZR|t$Iwksgm!^hWIGFvJXI)oomXd7 zlddWM4HPa*cw%!<Pu`}F zdPFO^=fE#L+i*;Hd6pCX^AFyiyM{qsZ)Pa|WL55c)M(vPxzrO$y7B$KEDn95DF8nt z6+z?RPJ!1^ltTxP$pwD`_dtnq1@QCxW{4lPOwg0!&h^twaSDxM&{Gt1x(51CubwY0 z7GXSMt2ir=M3L_sEG-e<@$RADe#8OM{DP6nhtV+!Wqjw5{}S z^o)q~kbJ$NZa;f6+;ePwjb>;g z{g~{98}U(7>S1^!g!0!O^72gQc5GH?<1FdB?w2QR$MRg`G>Kd9pd&#w^)nyS!@HQL z8S1a5w}-uvImEkqdmCKeL(crx0^V6pv8)V#ai;F1ntWcq#uD{&KL7mnCo5ah#=q&d zfG@*Ma0V9~rDIFoO*x-qEbS)&7*<9nt^`;S{9f zhLR$P{F8UGI#mNEVLqVbX^zBr{Ee|GeZy@&xoqt)YNl+vTkfO@$}3IMWjOi8_WPa0 zyB%Q6fB=<&*?Rl7ik7&n5NF8Km#Sy@T0c!ISQlrz)Fgi=P7PO_{OK)5k;fkdXD7d0G-iHobILgZyyvK%vHkOd zP;mV35B6-@>z0_z`FHCuMOPA5+HQ?$W^ChfGwK7j#kcZo%fL@AiCDkC>*r;5B+RWE zL6VKwemLr(jE%hk^$7Pa7BZ;3-Pu24WWs;-@+mg8%9^3Y$&S8Oc2!S96~g}KGMWFQ z3Z1?dv2{i%deAa`M$1S!-dY8{X9${&G@El1F!FOKNJ=rCb7X2>S%nt&X_}bHB<96u zBabxAeNL!1kLY@1 zBy9IR-MR@F z+Gg=DC&`V48Ar|L`|ADoAe)bM*!5^*#=MocXdmA`vS>&X@9(X&`rWN=>KH*SFD@@W z1P=c6q?+*AkAYNto;qofF5Z5t9fdDZuh#x>H8U-s3v8);Tna61bV zklS8=?M3K_VhC8m$w-q_b4}}C(Z3$p^zlEs9yDzx9sWY{>7`0DmQ?Wpc|WT)WZZUD z$SqraSbt%FxG#>U-`i^EwK1_GF`t@@zUig5!W^~JeDm(#(T*2?+SMRcFL%QHE4_at zzaZ9iqX+GT1#Uba?=$ucWY7vQ(n-|Ud~#*yJ2_p1>F+8E5YgKOF2E=W?ll7Ue9&DULh;iEO%4KQ^p=)N2RIR zg)~m9a7eY(*R09t;z_&Fbn_{i%c*lhU!Rr{j2r1lW6_$4pU8i7fR@>q9MfDW$alen z3%p+EEuK+ZE_I%Yxp9>-6ydb1!O&Lkef5hclu#RWpNN8&bWHepIu6dF9;JcfAjvYx z#XuMeWW2844*nc1JzXL=AEUX2Se?L)&+Po9O1yh%P3DRa;Qy`vs^3|F)fM(ou!aJ) z7i{4;t7sMhiL6G+MKx*Z?7^lwo|JS#zcz!eM+OB}p^)o2fh^?QIX38k+jU4;`$ah>>2RCuH*-}JV`as~ zTcZn@W=dLnl%HjO8zZZDwQ6ggJAv%UkyW}V@C0*AEEUok^6l7P>+Lj&4ZhtmF*jpH%D-O*~x45 zZ5JVyPl^}odD;M}?)Ubd`72(z_YkDLbm6z%_BYOxi%`cM@}6*5FJIi$>L8mc;G5+8 zAQ-!P8=BjjHhJKYs}0F!J3Dq={CF(A*KkJrY!hURwSy>cmhW$XpJ(u1MIYKqX`t{De=TmmW}^L{1D4cxlM|Bk{;tEh!($bL#I|qJ7bM@tqjxlK1$TKIE0; z&Fpz%Q0T|j*SaYeffY~9_7>G_Mg3~SdIlF6Qs3(x;517XDc%-=4_RN`aDj%UAoq9T zP3vuf_Ox#dDB#f-e+?-r4+qOHl z(Xo9e|37PH);!Ew^LQU_RXx=H&Z)EaIeQ$bfie4CkV_+e^tb<9B1tj-ixv&>RqAHT z3T@zdFII?Te}6c4WtDc)-lol9+`;l4iH_ru1_gbPHenY=XMBgfT^{J?M7v_Z%AC6R zZPK+d)sKu}5QU!e7ru;0F%nlO>S}<3Vue4}*%jtU7oM0%urki`NRvMB!qh5sp$pV! z7ndyCSQHT1Do~mWNIeK5bxl*wdz$yGOHKc+>f1%_1GVoIBV={=1Vc0KVe+Rci`O@F z@x8S526by_BxLH45oD+l>6gFdm5b8Cadl$8&3B9@`9m3$C-$9F>Ls@t2pn``(XFKj(u*|J|b(z3)$X#q;0x=@EJb+ zzN5Nc*foAj3b1V6oVE8Z!yv<4wn5f}LRa>tGtKEqaKeW_v)esdNcoL!u{waFBt#PG zi3zS8%&A)A7hK1$%_%Yj{GaDVYH7*TQQ2aDtTAT(|2d6Z?p2@hyq9?IZmkTvSiSHZ!wh8Jo#+N&_jd=pL>XQ4l|Z9=o?FpZD` z1ei}n8}^6Yck@&Mze^H7gv0HF)LBtTMpAP2A9Wxr1Wez;>Dm~BM5$WZ6!)vR0S=Otff#y1Yb3Cc(0-&mCSke{=O}^ebZ5 zd+Ty_ZIfO2OF}F6+WGC!Oa=RF&O15x!+NYtw5Rscqxn|#ZOPp)<8Du!A}r@)YfW%S zFh;+K|5~E3EHVAV>WIi@zkW}fciMbiSc(l{8%}k({hadDMRy9$_Bf@CnTCfa!J27Z zj|*$lU9%HvnaxYK`d^B`PLOKZvP;00;2Rcxz;1YLMGUfR6@(+Cj1Ng68L6~*06F5p z<2EY%WqZmiE{DuTdvt>myyFD|G7rENTSHg*LWhy-M@d~RMN!;_c&B9YnGkc?e2{%^3q#T2&L#Qh_ITHRzu(wX@i)+cj zpw=UE$V1YH;v*5BX2GNuxS75+syAIRdhY-qup%WfRwZ??slH#ky}5d^OeJiCzL3ra zr?5L&42Af*ioIB>*|CyFE9Q5h!1DKXe5Gg(@1(3s`yoZ0DdUxjN=nkJX~J!- zg1T&DzO>A$+S4FOv`E+nIN+7qVCi~rwtfSb0*PgNdk#Df$5IsTGaWyoNj+#*N+u&i zjHLVTxq-oJtz<#8t+(QT@RHw zhbiVcYfx_0z-GBs6CBc8SBM=aLQ}8gm>vxpqYoJ2S3j7qG*w47fNY$e0hW6nM&A0! z3RU=gHr+^Tl})>yYZw7g@`yuETQ#h<9V9g@;+vz1VEr?lJC668aK50nx8V8<3~uDg z1p{L=iaH5z%$HYp=A52GnftcveC3V~7}f%(Hli-hlNepWxenFcstlI}%6k>iPG7Wb zivqyg9U<-&KW#6cr~3`3#6ou%pSQOOI8xE)^Ej44p3kMVr13wHt!!L-l5=cbiOR~8~N6Ej0(apnW3D>NeBFUU}QrCrCT3$4oj zSiz7dN84RV+#Zn{61a}aXM3rz>2{hS6gU4;l=7VBbo3m4qoI9K+|wYxt@jil`Qc6} z{v_|R1OEM{&<*X~QdknMW zB#~XTKMwWhWKKs%9sKpUm&yOJwuqsI2#J>!IW^QZeo4fksc$bLA39ckZR2 zLr&z?!DjU;5nw~m!=!QGdLp*y)b!8%$Z(bai8#-WQWX3!K7g?*b$>haxcguGOfqfy zFen*l>M(uNbBL}9xu-3QSyW7JW{woPf~|uh2-y6&-P286wtTLj3X>_gDuk{h7^F@N zEHPz~l~pl6Qi`B@+peX2M2@2~o}zeQ3ItC!Y!X>)lU1&!eY*DcA}#tvI`xiikwM)Z zZ)+Ya9f0fm_M3k&XgqFDSi(7qB~JcZ4TA(@R;7j@i7^dZrBk|cTG`)91{eTYe937^ z9+8rDeSpj123N^PG}^NcI3=0rtYUmL(}MfsV5%TDi%KJ}TAGN_9z0qLtpd}>d!Wjf zRWIFfH_e3sJm&bMHNN@ZLz)L``2NLF6D#l2W9Z~|*NZ$wZ?2r^LgNG0XEKAFfWN1J z9JUg_)N^)H(n-pNnBr-U^(q7@bJi6Ry5km}64R&KzX6@nlySp>*RcKHMqV;bUwoQ+iIihlJF?;|>K zX1b8eG_^E!yHJMDm|x*ttV2a&`k3y$JH|yoPnf-2nx6!1cJ5_tKn*m{qaQURMARyE z4T$kEYu*IenkGL>WWUMohtkGX?qU4fqx#f+ykF=7Q^u2^!WdD1yHB&s!Axe*0k04R z>S?P@eL17~e&??_JBr9!z>^N@HQN0++a975NCDhL(c$elR^84r%zQ4EyYg`(Q0MA! zmnd$iTV4$R{(98aSnO&0zj~5?r$Tq68|)m~R=-&2aey_FeSK~bVK_4)4X{IMR40xM zPnL_{B(%x}(NzplkC#)wOkRgD*mEZxQhryQtnLAkh|(Q92c#7B_*yb%gH0GIPpHmR zo2Xy6`K9K6%TBaGcdQhac!@msXK{ zH3!TB>u><0QpM`4v`^3!H5QpSP+K?fBxSRzE3In?Vgaa&;R~31s#pIC4J~*zOWQA zD*gfJpa3NarC>E}4It@$;pk+tP?B#ap#hWXOam3Cs5ov5!I4SVl;{j^aaYbwNg813qhzkv`N^qmsdb6E z&=3@Z_MnY5=1NWRIRDk~T(5!_?w^q{UXG~8P=F^aga-=JS`eZ8rKUutPN!G?1v@6lhv71OhIQMcsd$@15 z3f0+J^~jPHaZ6os{$*1|fUXdjx8O3ey85dd{Ysa{o+^)Yc_?1k$+)CvZs%3h0s%

)*P>rU$d`cIPs_-XTPbxZ6dFV$yBXK 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�&+fnEXh9@=Z$D$s9*_b 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�KM+^PL0% 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 z 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�b!06y?y>W3<25sa= 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¬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 suhCFeiI>% Date: Thu, 27 Nov 2025 02:23:15 +0900 Subject: [PATCH 392/402] =?UTF-8?q?#100=20fix:=20=EC=95=A8=EB=B2=94=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=EC=A0=9C=ED=95=9C=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EB=B3=B5=EA=B5=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cheeeese/album/application/AlbumService.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/cheeeese/album/application/AlbumService.java b/src/main/java/com/cheeeese/album/application/AlbumService.java index 17cbe24..a0f4b35 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumService.java +++ b/src/main/java/com/cheeeese/album/application/AlbumService.java @@ -71,6 +71,8 @@ public class AlbumService { public AlbumCreationResponse createAlbum(User user, AlbumCreationRequest request) { String code = UuidCreator.getTimeOrdered().toString(); + // long createdThisWeek = countUserAlbumsCreatedThisWeek(user); + albumValidator.validateAlbumCreation(request); LocalDateTime expiredAt = LocalDateTime.now().plusDays(7); @@ -269,7 +271,15 @@ private int calculateRemainingUploadSlots(Album album) { return Math.max(0, max - current); } - private User getMaker(Long makerId) { + private long countUserAlbumsCreatedThisWeek(User user) { + return albumRepository.countByUserAndCreatedAtBetween( + user.getId(), + LocalDate.now().with(DayOfWeek.MONDAY).atTime(LocalTime.MIN), + LocalDate.now().with(DayOfWeek.MONDAY).plusWeeks(1).atTime(LocalTime.now()) + ); + } + + private User getMaker(Long makerId) { return userRepository.findById(makerId) .orElseThrow(() -> new UserException(UserErrorCode.USER_NOT_FOUND)); } From 8e29faeb8095bde1223b55adcd8ba47348fc3f71 Mon Sep 17 00:00:00 2001 From: zyovn Date: Thu, 27 Nov 2025 20:56:25 +0900 Subject: [PATCH 393/402] =?UTF-8?q?#79=20test:=20=EC=82=AC=EC=A7=84=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20=EA=B4=80=EB=A0=A8=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cheeeese/album/AlbumServiceTest.java | 8 +- .../com/cheeeese/fixture/FixtureFactory.java | 29 +++++++ .../com/cheeeese/photo/PhotoServiceTest.java | 7 +- .../PhotoQueryServiceIntegrationTest.java | 80 ++++++++++++++++++- 4 files changed, 116 insertions(+), 8 deletions(-) diff --git a/src/test/java/com/cheeeese/album/AlbumServiceTest.java b/src/test/java/com/cheeeese/album/AlbumServiceTest.java index ece0c15..c47ba1c 100644 --- a/src/test/java/com/cheeeese/album/AlbumServiceTest.java +++ b/src/test/java/com/cheeeese/album/AlbumServiceTest.java @@ -1,6 +1,8 @@ package com.cheeeese.album; import com.cheeeese.album.application.AlbumService; +import com.cheeeese.album.application.logger.AlbumLogger; +import com.cheeeese.album.application.support.AlbumReader; import com.cheeeese.album.application.validator.AlbumValidator; import com.cheeeese.album.domain.Album; import com.cheeeese.album.domain.UserAlbum; @@ -54,6 +56,8 @@ class AlbumServiceTest { @Mock private PhotoService photoService; @Mock private AlbumExpirationRedisRepository albumExpirationRedisRepository; @Mock private CdnUrlResolver cdnUrlResolver; + @Mock private AlbumReader albumReader; + @Mock private AlbumLogger albumLogger; @BeforeEach void setUp() { @@ -67,7 +71,9 @@ void setUp() { photoLikesRepository, photoService, albumExpirationRedisRepository, - cdnUrlResolver + cdnUrlResolver, + albumReader, + albumLogger ); } diff --git a/src/test/java/com/cheeeese/fixture/FixtureFactory.java b/src/test/java/com/cheeeese/fixture/FixtureFactory.java index 2ebcfae..e3395d7 100644 --- a/src/test/java/com/cheeeese/fixture/FixtureFactory.java +++ b/src/test/java/com/cheeeese/fixture/FixtureFactory.java @@ -8,7 +8,11 @@ import com.cheeeese.oauth2.domain.OAuth2UserInfo; import com.cheeeese.oauth2.infrastructure.userinfo.KakaoUserInfo; import com.cheeeese.photo.domain.Photo; +import com.cheeeese.photo.domain.PhotoHistory; +import com.cheeeese.photo.domain.PhotoLikes; import com.cheeeese.photo.domain.PhotoStatus; +import com.cheeeese.photo.infrastructure.mapper.PhotoHistoryMapper; +import com.cheeeese.photo.infrastructure.mapper.PhotoLikesMapper; import com.cheeeese.photo.infrastructure.mapper.PhotoMapper; import com.cheeeese.user.domain.User; import com.cheeeese.user.infrastructure.mapper.UserMapper; @@ -97,4 +101,29 @@ public static Photo createPhoto(User user, Album album, LocalDateTime captureTim LocalDateTime.now() ); } + + public static Photo createCompletedPhoto(User user, Album album, LocalDateTime now) { + return Photo.builder() + .user(user) + .album(album) + .imageUrl(null) + .thumbnailUrl(null) + .captureTime(now) + .status(PhotoStatus.COMPLETED) + .build(); + } + + public static PhotoHistory createPhotoHistory(User user, Photo photo) { + return PhotoHistoryMapper.toEntity( + user, + photo + ); + } + + public static PhotoLikes createPhotoLikes(User user, Photo photo) { + return PhotoLikesMapper.toEntity( + user, + photo + ); + } } diff --git a/src/test/java/com/cheeeese/photo/PhotoServiceTest.java b/src/test/java/com/cheeeese/photo/PhotoServiceTest.java index 33e09d0..3d4d6a5 100644 --- a/src/test/java/com/cheeeese/photo/PhotoServiceTest.java +++ b/src/test/java/com/cheeeese/photo/PhotoServiceTest.java @@ -24,6 +24,7 @@ import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.test.util.ReflectionTestUtils; +import java.time.LocalDateTime; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; @@ -56,7 +57,7 @@ void createPresignedUrls_Success() { Album album = Album.builder().makerId(1L).maxPhotoCount(100).build(); PhotoPresignedUrlRequest.FileInfo fileInfo = - new PhotoPresignedUrlRequest.FileInfo("test.jpg", 1000L, "image/jpeg"); + new PhotoPresignedUrlRequest.FileInfo("1.jpg", LocalDateTime.now(), 3000000, "image/jpeg"); PhotoPresignedUrlRequest request = new PhotoPresignedUrlRequest(code, List.of(fileInfo)); @@ -98,8 +99,8 @@ void createPresignedUrls_Fail_MaxCountExceeded() { given(photoRepository.countActivePhotosByAlbumId(eq(1L), anyList())).willReturn(99L); PhotoPresignedUrlRequest request = new PhotoPresignedUrlRequest(code, List.of( - new PhotoPresignedUrlRequest.FileInfo("1.jpg", 100L, "image/jpeg"), - new PhotoPresignedUrlRequest.FileInfo("2.jpg", 100L, "image/jpeg") + new PhotoPresignedUrlRequest.FileInfo("1.jpg", LocalDateTime.now(), 3000000, "image/jpeg"), + new PhotoPresignedUrlRequest.FileInfo("2.jpg", LocalDateTime.now(), 3000000, "image/jpeg") )); // Validator가 예외를 던지도록 설정 (Spy나 실제 객체 사용 시에는 로직에 따라 발생, 여기선 Mock의 행동 정의) diff --git a/src/test/java/com/cheeeese/photo/integration/PhotoQueryServiceIntegrationTest.java b/src/test/java/com/cheeeese/photo/integration/PhotoQueryServiceIntegrationTest.java index 102e015..41ffe74 100644 --- a/src/test/java/com/cheeeese/photo/integration/PhotoQueryServiceIntegrationTest.java +++ b/src/test/java/com/cheeeese/photo/integration/PhotoQueryServiceIntegrationTest.java @@ -1,11 +1,19 @@ package com.cheeeese.photo.integration; import com.cheeeese.album.domain.Album; +import com.cheeeese.album.domain.UserAlbum; +import com.cheeeese.album.domain.type.AlbumSorting; import com.cheeeese.album.infrastructure.persistence.AlbumRepository; +import com.cheeeese.album.infrastructure.persistence.UserAlbumRepository; import com.cheeeese.fixture.FixtureFactory; +import com.cheeeese.photo.application.PhotoInfoService; import com.cheeeese.photo.application.PhotoQueryService; import com.cheeeese.photo.domain.Photo; -import com.cheeeese.photo.dto.response.PhotoDetailResponse; +import com.cheeeese.photo.domain.PhotoHistory; +import com.cheeeese.photo.domain.PhotoLikes; +import com.cheeeese.photo.dto.response.*; +import com.cheeeese.photo.infrastructure.persistence.PhotoHistoryRepository; +import com.cheeeese.photo.infrastructure.persistence.PhotoLikesRepository; import com.cheeeese.photo.infrastructure.persistence.PhotoRepository; import com.cheeeese.user.domain.User; import com.cheeeese.user.infrastructure.persistence.UserRepository; @@ -30,33 +38,97 @@ public class PhotoQueryServiceIntegrationTest { @Autowired private AlbumRepository albumRepository; + @Autowired + private UserAlbumRepository userAlbumRepository; + @Autowired private PhotoRepository photoRepository; + @Autowired + private PhotoHistoryRepository photoHistoryRepository; + + @Autowired + private PhotoLikesRepository photoLikesRepository; + @Autowired private PhotoQueryService photoQueryService; + @Autowired + private PhotoInfoService photoInfoService; + private static User testUser; private static Album testAlbum; + private static UserAlbum testUserAlbum; private static Photo testPhoto; + private static PhotoHistory testPhotoHistory; + private static PhotoLikes testPhotoLikes; @BeforeEach void setUp() { testUser = userRepository.save(FixtureFactory.createKakaoUser()); testAlbum = albumRepository.save(FixtureFactory.createAlbum(testUser.getId())); - testPhoto = photoRepository.save(FixtureFactory.createPhoto(testUser, testAlbum, LocalDateTime.now())); + testUserAlbum = userAlbumRepository.save(FixtureFactory.createHostUserAlbum(testUser, testAlbum)); + for (int i = 1; i <= 3; i++) { + testPhoto = FixtureFactory.createCompletedPhoto(testUser, testAlbum, LocalDateTime.now()); + testPhoto.updateImageUrl("album/" + testAlbum.getId() + "/original/photo_" + i + ".jpg"); + photoRepository.save(testPhoto); + } + photoRepository.flush(); + testPhotoHistory = photoHistoryRepository.save(FixtureFactory.createPhotoHistory(testUser, testPhoto)); + testPhotoLikes = photoLikesRepository.save(FixtureFactory.createPhotoLikes(testUser, testPhoto)); + } + + @Test + @DisplayName("사진 목록 조회 - 페이징 및 CDN URL 변환 확인") + void getPhotoList() { + // when + PhotoPageResponse page = photoQueryService.getPhotoPage( + testUser, testAlbum.getCode(), 0, 20, AlbumSorting.CREATED_AT + ); + + // then + assertThat(page.responses()).hasSize(3); + assertThat(page.responses().getFirst().imageUrl()).contains("say-cheese.edge.naverncp.com"); } @Test - @DisplayName("사진 상세 조회 테스트") - void getPhotoDetailRecentlyDownloaded() { + @DisplayName("사진 상세 조회 테스트 - CDN URL, 최근 다운로드 여부 확인") + void getPhotoDetail() { // given testPhoto.updateImageUrl("album/" + testAlbum.getId() + "/original/test.jpg"); + photoHistoryRepository.save(testPhotoHistory); // when PhotoDetailResponse response = photoQueryService.getPhotoDetail(testUser, testAlbum.getCode(), testPhoto.getId()); // then assertThat(response.imageUrl()).contains("edge.naverncp.com"); + assertThat(response.isRecentlyDownloaded()).isTrue(); + } + + @Test + @DisplayName("띱한 사용자 목록 조회") + void getLikedUserList() { + // when + PhotoLikedUserResponse likedUsers = photoInfoService.getPhotoLikedUsers( + testUser, testAlbum.getCode(), testPhoto.getId() + ); + + // then + assertThat(likedUsers.photoLikers()).hasSize(1); + assertThat(likedUsers.photoLikers().getFirst().name()).isNotBlank(); + } + + @Test + @DisplayName("띱한 사진 목록 조회") + void getUserLikedPhotoList() { + // when + PhotoLikedPageResponse page = photoQueryService.getPhotoLiked( + testUser, testAlbum.getCode(), 0, 10 + ); + + // then + assertThat(page.responses()).hasSize(1); + assertThat(page.responses().getFirst().imageUrl()).contains("say-cheese.edge.naverncp.com"); } } From f18dd029c15442b08b0fcdcaccf85e5e1fa5a5aa Mon Sep 17 00:00:00 2001 From: zyovn Date: Thu, 27 Nov 2025 21:07:28 +0900 Subject: [PATCH 394/402] =?UTF-8?q?#79=20fix:=20=ED=94=BC=EB=93=9C?= =?UTF-8?q?=EB=B0=B1=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cheeeese/fixture/FixtureFactory.java | 2 +- .../PhotoQueryServiceIntegrationTest.java | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/test/java/com/cheeeese/fixture/FixtureFactory.java b/src/test/java/com/cheeeese/fixture/FixtureFactory.java index e3395d7..0564488 100644 --- a/src/test/java/com/cheeeese/fixture/FixtureFactory.java +++ b/src/test/java/com/cheeeese/fixture/FixtureFactory.java @@ -98,7 +98,7 @@ public static Photo createPhoto(User user, Album album, LocalDateTime captureTim return PhotoMapper.toEntity( user, album, - LocalDateTime.now() + captureTime ); } diff --git a/src/test/java/com/cheeeese/photo/integration/PhotoQueryServiceIntegrationTest.java b/src/test/java/com/cheeeese/photo/integration/PhotoQueryServiceIntegrationTest.java index 41ffe74..e3ba9a3 100644 --- a/src/test/java/com/cheeeese/photo/integration/PhotoQueryServiceIntegrationTest.java +++ b/src/test/java/com/cheeeese/photo/integration/PhotoQueryServiceIntegrationTest.java @@ -56,12 +56,12 @@ public class PhotoQueryServiceIntegrationTest { @Autowired private PhotoInfoService photoInfoService; - private static User testUser; - private static Album testAlbum; - private static UserAlbum testUserAlbum; - private static Photo testPhoto; - private static PhotoHistory testPhotoHistory; - private static PhotoLikes testPhotoLikes; + private User testUser; + private Album testAlbum; + private UserAlbum testUserAlbum; + private Photo testPhoto; + private PhotoHistory testPhotoHistory; + private PhotoLikes testPhotoLikes; @BeforeEach void setUp() { From 1729e7380c3efca838a2404dda81482565bbd001 Mon Sep 17 00:00:00 2001 From: Jeongbin Joo <166782961+zyovn@users.noreply.github.com> Date: Thu, 27 Nov 2025 22:40:08 +0900 Subject: [PATCH 395/402] =?UTF-8?q?#103=20docs:=20README=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 1d38a1d..daf7dae 100644 --- a/README.md +++ b/README.md @@ -5,16 +5,16 @@ ## 🧑‍🤝‍🧑 Backend Members -|**우다현** | **주정빈** | -| :--------: |:----------------------------------------------------------------------------------------------------------------:| +|**우다현** | **주정빈** | +| :--------: |:----------:| | | | -| `backend` | `backend` | +| `backend` | `backend` | ## 📜 API 명세서 [[Swagger] 🧀 치이이즈 API 명세서](https://dev.say-cheese.me/swagger-ui/index.html#/) ## 🗃️ ERD -Cheeeese (2) +Cheeeese (1) ## 🏛️ System Architecture image @@ -80,4 +80,4 @@ src | `test` | 테스트 코드 추가 및 수정, 삭제 | | `refactor` | 코드 리팩토링 | | `style` | 코드 포맷팅, 세미콜론 누락 등 기능 변경 없는 스타일 수정 | -| `deploy` | 배포 관련 작업 (CI/CD, 서버 설정, 배포 스크립트 등) | \ No newline at end of file +| `deploy` | 배포 관련 작업 (CI/CD, 서버 설정, 배포 스크립트 등) | From ffd2b5af8747632c6a351ad0c297d24c838c2f83 Mon Sep 17 00:00:00 2001 From: Jeongbin Joo <166782961+zyovn@users.noreply.github.com> Date: Thu, 27 Nov 2025 22:50:07 +0900 Subject: [PATCH 396/402] =?UTF-8?q?#103=20docs:=20README=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index daf7dae..328f1c2 100644 --- a/README.md +++ b/README.md @@ -47,22 +47,21 @@ src └── main └── java └── com.cheeeese - ├── domain # 🧩 도메인 전체 (Bounded Context 모음) - │ ├── album # 📸 앨범 도메인 - │ ├── photo # 🖼️ 사진 도메인 - │ ├── cheese4cut # 🎞️ 치즈네컷 도메인 - │ ├── user # 👤 사용자 도메인 - │ ├── auth # 🔐 인증 / 인가 - │ └── oauth2 # 🔑 소셜 로그인(OAuth2) - │ ├── application # 서비스 / 유스케이스 - │ ├── domain # 엔티티 / 비즈니스 규칙 - │ ├── dto # 요청·응답 DTO - │ ├── exception # 도메인 전용 예외 - │ ├── infrastructure # JPA / 외부 연동 - │ └── presentation # 컨트롤러 / API + ├── album # 📸 앨범 도메인 + ├── photo # 🖼️ 사진 도메인 + ├── cheese4cut # 🎞️ 치즈네컷 도메인 + ├── user # 👤 사용자 도메인 + ├── auth # 🔐 인증 / 인가 + ├── oauth2 # 🔑 소셜 로그인(OAuth2) + │ ├── application # 서비스 / 유스케이스 + │ ├── domain # 엔티티 / 비즈니스 규칙 + │ ├── dto # 요청·응답 DTO + │ ├── exception # 예외 + │ ├── infrastructure # JPA / 외부 연동 + │ └── presentation # 컨트롤러 / API │ - ├── global # 🌍 전역 설정 / 유틸 / AOP / 공통 예외 - └── CheeeeseApplication.java # 🚀 Spring Boot 메인 실행 파일 + ├── global # 🌍 전역 설정 / 유틸 / AOP / 공통 예외 + └── CheeeeseApplication.java # 🚀 메인 실행 파일 ``` From 958b4fa39491fa3696073ea7685bd32bcdcef4e0 Mon Sep 17 00:00:00 2001 From: zyovn Date: Fri, 28 Nov 2025 02:58:32 +0900 Subject: [PATCH 397/402] =?UTF-8?q?#109=20docs:=20=EC=95=A8=EB=B2=94=20?= =?UTF-8?q?=EB=82=B4=20=EC=82=AC=EC=A7=84=20=EC=A1=B0=ED=9A=8C=20=EC=97=85?= =?UTF-8?q?=EB=A1=9C=EB=8D=94=20=ED=94=84=EB=A1=9C=ED=95=84=20=EC=9D=B4?= =?UTF-8?q?=EB=AF=B8=EC=A7=80=20schema=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cheeeese/photo/dto/response/PhotoPageResponse.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/cheeeese/photo/dto/response/PhotoPageResponse.java b/src/main/java/com/cheeeese/photo/dto/response/PhotoPageResponse.java index 731e9ab..ab6187f 100644 --- a/src/main/java/com/cheeeese/photo/dto/response/PhotoPageResponse.java +++ b/src/main/java/com/cheeeese/photo/dto/response/PhotoPageResponse.java @@ -24,6 +24,7 @@ public record PhotoPageResponse( { "name": "주정빈", "photoId": 1, + "profileImage": "https://say-cheese-profile.edge...", "imageUrl": "https://cdn.cheeeese.me/original.jpg", "thumbnailUrl": "https://cdn.cheeeese.me/thumb1.jpg", "likesCnt": 1, From 603026e16aedd37abb6b7994276d32d6e711881f Mon Sep 17 00:00:00 2001 From: zyovn Date: Fri, 28 Nov 2025 03:10:24 +0900 Subject: [PATCH 398/402] =?UTF-8?q?#109=20docs:=20swagger=20=EC=98=A4?= =?UTF-8?q?=ED=83=80=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cheeeese/photo/dto/response/PhotoPageResponse.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/cheeeese/photo/dto/response/PhotoPageResponse.java b/src/main/java/com/cheeeese/photo/dto/response/PhotoPageResponse.java index ab6187f..f62aa19 100644 --- a/src/main/java/com/cheeeese/photo/dto/response/PhotoPageResponse.java +++ b/src/main/java/com/cheeeese/photo/dto/response/PhotoPageResponse.java @@ -27,7 +27,7 @@ public record PhotoPageResponse( "profileImage": "https://say-cheese-profile.edge...", "imageUrl": "https://cdn.cheeeese.me/original.jpg", "thumbnailUrl": "https://cdn.cheeeese.me/thumb1.jpg", - "likesCnt": 1, + "likeCnt": 1, "isLiked": true, "isDownloaded": false, "isRecentlyDownloaded": false From c016303ec5e834b589ed0c67fcfffbb6b6d96c8f Mon Sep 17 00:00:00 2001 From: zyovn Date: Sat, 3 Jan 2026 20:06:21 +0900 Subject: [PATCH 399/402] =?UTF-8?q?#106=20feat:=20=EC=9D=BC=EC=A3=BC?= =?UTF-8?q?=EC=9D=BC=20=EB=82=B4=20=EC=95=A8=EB=B2=94=20=EC=83=9D=EC=84=B1?= =?UTF-8?q?=203=EA=B0=9C=20=EC=A0=9C=ED=95=9C=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cheeeese/album/application/AlbumService.java | 4 ++-- .../album/application/validator/AlbumValidator.java | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/cheeeese/album/application/AlbumService.java b/src/main/java/com/cheeeese/album/application/AlbumService.java index a0f4b35..1df3f2e 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumService.java +++ b/src/main/java/com/cheeeese/album/application/AlbumService.java @@ -71,9 +71,9 @@ public class AlbumService { public AlbumCreationResponse createAlbum(User user, AlbumCreationRequest request) { String code = UuidCreator.getTimeOrdered().toString(); - // long createdThisWeek = countUserAlbumsCreatedThisWeek(user); + long createdThisWeek = countUserAlbumsCreatedThisWeek(user); - albumValidator.validateAlbumCreation(request); + albumValidator.validateAlbumCreation(createdThisWeek, request); LocalDateTime expiredAt = LocalDateTime.now().plusDays(7); diff --git a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java index 21be492..4a598f3 100644 --- a/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java +++ b/src/main/java/com/cheeeese/album/application/validator/AlbumValidator.java @@ -26,7 +26,7 @@ public class AlbumValidator { private final AlbumRepository albumRepository; private final UserAlbumRepository userAlbumRepository; - public void validateAlbumCreation(AlbumCreationRequest request) { + public void validateAlbumCreation(long createdThisWeek, AlbumCreationRequest request) { if (request.themeEmoji() == null || request.themeEmoji().isBlank()) { throw new AlbumException(AlbumErrorCode.ALBUM_THEME_EMOJI_NOT_SELECTED); } @@ -47,9 +47,9 @@ public void validateAlbumCreation(AlbumCreationRequest request) { throw new AlbumException(AlbumErrorCode.ALBUM_INVALID_CAPACITY); } -// if (createdThisWeek >= 3) { -// throw new AlbumException(AlbumErrorCode.ALBUM_CREATION_LIMIT_EXCEEDED); -// } + if (createdThisWeek >= 3) { + throw new AlbumException(AlbumErrorCode.ALBUM_CREATION_LIMIT_EXCEEDED); + } } public Album validateAlbumCode(String code) { From 521073d4395e78fdeb112a24f2254ecc2623da3d Mon Sep 17 00:00:00 2001 From: zyovn Date: Sat, 3 Jan 2026 20:07:15 +0900 Subject: [PATCH 400/402] =?UTF-8?q?#106=20feat:=20=EC=95=A8=EB=B2=94=20?= =?UTF-8?q?=EC=82=AC=EC=A7=84=20=EC=A0=9C=ED=95=9C=202000=EC=9E=A5?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cheeeese/album/infrastructure/mapper/AlbumMapper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java index 57d71b6..d7e35c1 100644 --- a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java +++ b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java @@ -34,7 +34,7 @@ public static Album toEntity( .participant(participant) .currentParticipant(1) .eventDate(eventDate) - .maxPhotoCount(300) + .maxPhotoCount(2000) .currentPhotoCount(0) .isInfoAvailable(isInfoAvailable) .expiredAt(expiredAt) From cededf24c03cf619965fa8a4d147a82a98a49be7 Mon Sep 17 00:00:00 2001 From: zyovn Date: Sat, 3 Jan 2026 20:48:46 +0900 Subject: [PATCH 401/402] =?UTF-8?q?#106=20fix:=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=9E=90=EA=B0=80=20=EB=A7=8C=EB=93=A0=20=EC=8B=9C=EC=A0=90=20?= =?UTF-8?q?=EA=B8=B0=EC=A4=80=EC=9C=BC=EB=A1=9C=20+7=EC=9D=BC=EB=A1=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cheeeese/album/application/AlbumService.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/cheeeese/album/application/AlbumService.java b/src/main/java/com/cheeeese/album/application/AlbumService.java index 1df3f2e..e478ca3 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumService.java +++ b/src/main/java/com/cheeeese/album/application/AlbumService.java @@ -274,8 +274,8 @@ private int calculateRemainingUploadSlots(Album album) { private long countUserAlbumsCreatedThisWeek(User user) { return albumRepository.countByUserAndCreatedAtBetween( user.getId(), - LocalDate.now().with(DayOfWeek.MONDAY).atTime(LocalTime.MIN), - LocalDate.now().with(DayOfWeek.MONDAY).plusWeeks(1).atTime(LocalTime.now()) + LocalDateTime.now().minusDays(7), + LocalDateTime.now() ); } From 58cd043f224efdeb2786cdb865ec8030134df082 Mon Sep 17 00:00:00 2001 From: zyovn Date: Mon, 5 Jan 2026 17:31:27 +0900 Subject: [PATCH 402/402] =?UTF-8?q?[CEEZ-33]=20feat:=20=EC=95=A8=EB=B2=94?= =?UTF-8?q?=20=EC=83=9D=EC=84=B1=20dto=20=EC=88=98=EC=A0=95=20=EB=B0=8F=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=EC=B2=98=EC=9D=8C=20=EC=97=AC=EB=B6=80=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cheeeese/album/application/AlbumService.java | 6 ++++-- .../album/dto/response/AlbumCreationResponse.java | 9 +++++++++ .../album/infrastructure/mapper/AlbumMapper.java | 4 +++- .../infrastructure/persistence/AlbumRepository.java | 1 + 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/cheeeese/album/application/AlbumService.java b/src/main/java/com/cheeeese/album/application/AlbumService.java index a0f4b35..e11ceab 100644 --- a/src/main/java/com/cheeeese/album/application/AlbumService.java +++ b/src/main/java/com/cheeeese/album/application/AlbumService.java @@ -64,7 +64,6 @@ public class AlbumService { private final AlbumExpirationRedisRepository albumExpirationRedisRepository; private final CdnUrlResolver cdnUrlResolver; private final AlbumReader albumReader; - private final AlbumLogger albumLogger; @Transactional @@ -87,6 +86,8 @@ public AlbumCreationResponse createAlbum(User user, AlbumCreationRequest request true, expiredAt ); + boolean isFirst = !albumRepository.existsByMakerId(user.getId()); + albumRepository.save(album); userAlbumRepository.save(UserAlbumMapper.toEntity( @@ -99,7 +100,8 @@ public AlbumCreationResponse createAlbum(User user, AlbumCreationRequest request albumExpirationRedisRepository.registerAlbum(album.getId(), expiredAt); albumLogger.logAlbumCreated(user.getId(), album.getCode(), request.participant()); - return AlbumMapper.toCreationResponse(album); + + return AlbumMapper.toCreationResponse(album, isFirst); } public AlbumInvitationResponse getInvitationInfo(String code) { diff --git a/src/main/java/com/cheeeese/album/dto/response/AlbumCreationResponse.java b/src/main/java/com/cheeeese/album/dto/response/AlbumCreationResponse.java index e151e19..f41d4ec 100644 --- a/src/main/java/com/cheeeese/album/dto/response/AlbumCreationResponse.java +++ b/src/main/java/com/cheeeese/album/dto/response/AlbumCreationResponse.java @@ -4,6 +4,7 @@ import lombok.Builder; import java.time.LocalDate; +import java.time.LocalDateTime; @Builder @Schema( @@ -12,6 +13,8 @@ "themeEmoji", "title", "eventDate", + "createdAt", + "isFirst", "currentPhotoCnt", "code" } @@ -25,6 +28,12 @@ @Schema(description = "행사 날짜", example = "2025.02.01") LocalDate eventDate, + @Schema(description = "앨범 생성일시", example = "2026-01-05T17:23:16.201417") + LocalDateTime createdAt, + + @Schema(description = "해당 사용자가 최초로 생성한 앨범인지 여부", example = "true") + boolean isFirst, + @Schema(description = "현재까지 업로드된 사진 수", example = "1") int currentPhotoCnt, diff --git a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java index 57d71b6..de84301 100644 --- a/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java +++ b/src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java @@ -45,11 +45,13 @@ public static Album toEntity( /** * Album 생성 후, UUID Code 발급 */ - public static AlbumCreationResponse toCreationResponse(Album album) { + public static AlbumCreationResponse toCreationResponse(Album album, boolean isFirst) { return AlbumCreationResponse.builder() .themeEmoji(album.getThemeEmoji()) .title(album.getTitle()) .eventDate(album.getEventDate()) + .createdAt(album.getCreatedAt()) + .isFirst(isFirst) .currentPhotoCnt(album.getCurrentPhotoCount()) .code(album.getCode()) .build(); diff --git a/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumRepository.java b/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumRepository.java index ac62a73..dfcdf04 100644 --- a/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumRepository.java +++ b/src/main/java/com/cheeeese/album/infrastructure/persistence/AlbumRepository.java @@ -49,4 +49,5 @@ long countByUserAndCreatedAtBetween( @Query("SELECT a FROM Album a WHERE a.id = :id") Album findByIdForUpdate(@Param("id") Long id); + boolean existsByMakerId(Long makerId); }

n-QU9I>22mP{Iukkj;+qqkh4`bd3z3BS|NaL3% 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�UzhKeNTLV0^*{3<} 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

n-QU9I>22mP{Iukkj;+qqkh4`bd3z3BS|NaL3% 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�UzhKeNTLV0^*{3<} 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