From eec77cd819f8087c838233aad275aaaf89ca984d Mon Sep 17 00:00:00 2001 From: HyunA <129165742+10Hyuna@users.noreply.github.com> Date: Tue, 11 Feb 2025 20:10:47 +0900 Subject: [PATCH 01/23] Update auto-branch.yml --- .github/workflows/auto-branch.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/auto-branch.yml b/.github/workflows/auto-branch.yml index 4634d2b..9675686 100644 --- a/.github/workflows/auto-branch.yml +++ b/.github/workflows/auto-branch.yml @@ -15,3 +15,5 @@ jobs: uses: robvanderleek/create-issue-branch@main env: GITHUB_TOKEN: ${{ secrets.TOKEN }} + with: + base-branch: dev From b773dca904c43323264b88a9f66c9bee826441d3 Mon Sep 17 00:00:00 2001 From: HyunA <129165742+10Hyuna@users.noreply.github.com> Date: Tue, 11 Feb 2025 20:17:45 +0900 Subject: [PATCH 02/23] Update auto-branch.yml --- .github/workflows/auto-branch.yml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/.github/workflows/auto-branch.yml b/.github/workflows/auto-branch.yml index 9675686..4b738cd 100644 --- a/.github/workflows/auto-branch.yml +++ b/.github/workflows/auto-branch.yml @@ -17,3 +17,20 @@ jobs: GITHUB_TOKEN: ${{ secrets.TOKEN }} with: base-branch: dev + + - name: Open Pull Request + uses: peter-evans/create-pull-request@v5 + with: + token: ${{ secrets.TOKEN }} + base: dev + branch: "feature-${{ github.event.issue.number }}" + title: "๐Ÿš€ Pull Request #${{ github.event.issue.number }}" + body: | + ๐Ÿ”ฅ **์ด์Šˆ #${{ github.event.issue.number }}์— ๋Œ€ํ•œ PR ์ƒ์„ฑ!** ๐Ÿ”ฅ + + - ์ด์Šˆ ๋งํฌ: #${{ github.event.issue.number }} + - ์ž๋™ ์ƒ์„ฑ๋œ PR์ž…๋‹ˆ๋‹ค. + + ๐Ÿš€ **ํ™•์ธ ํ›„ ๋ฆฌ๋ทฐ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค!** + draft: true + From 431d9d1e3ed71a218c11c0016aaa5f4c38750be0 Mon Sep 17 00:00:00 2001 From: HyunA <129165742+10Hyuna@users.noreply.github.com> Date: Tue, 11 Feb 2025 20:20:19 +0900 Subject: [PATCH 03/23] Update and rename auto-branch.yml to create-branch.yml --- .github/workflows/{auto-branch.yml => create-branch.yml} | 1 - 1 file changed, 1 deletion(-) rename .github/workflows/{auto-branch.yml => create-branch.yml} (99%) diff --git a/.github/workflows/auto-branch.yml b/.github/workflows/create-branch.yml similarity index 99% rename from .github/workflows/auto-branch.yml rename to .github/workflows/create-branch.yml index 4b738cd..49fc1a6 100644 --- a/.github/workflows/auto-branch.yml +++ b/.github/workflows/create-branch.yml @@ -33,4 +33,3 @@ jobs: ๐Ÿš€ **ํ™•์ธ ํ›„ ๋ฆฌ๋ทฐ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค!** draft: true - From cdb8631d956d78a0b04ae2a297db29e850c31890 Mon Sep 17 00:00:00 2001 From: HyunA <129165742+10Hyuna@users.noreply.github.com> Date: Tue, 11 Feb 2025 20:20:52 +0900 Subject: [PATCH 04/23] Create delete-branch.yml --- .github/workflows/delete-branch.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 .github/workflows/delete-branch.yml diff --git a/.github/workflows/delete-branch.yml b/.github/workflows/delete-branch.yml new file mode 100644 index 0000000..5f13dc0 --- /dev/null +++ b/.github/workflows/delete-branch.yml @@ -0,0 +1,14 @@ +name: Delete Merged Branch +on: + pull_request: + types: + - closed + +jobs: + delete_merged_branch: + runs-on: ubuntu-latest + steps: + - name: Delete branch if merged + uses: github-actions/delete-merged-branch@v4 + with: + github_token: ${{ secrets.TOKEN }} From 595f97012cb638fac263f4219c2e3c7434fd3d29 Mon Sep 17 00:00:00 2001 From: HyunA <129165742+10Hyuna@users.noreply.github.com> Date: Tue, 11 Feb 2025 20:21:15 +0900 Subject: [PATCH 05/23] Create close-issue.yml --- .github/workflows/close-issue.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 .github/workflows/close-issue.yml diff --git a/.github/workflows/close-issue.yml b/.github/workflows/close-issue.yml new file mode 100644 index 0000000..cd25d28 --- /dev/null +++ b/.github/workflows/close-issue.yml @@ -0,0 +1,14 @@ +name: Close Issue When PR Merged +on: + pull_request: + types: [closed] + +jobs: + close_issue: + runs-on: ubuntu-latest + steps: + - name: Close linked issue + uses: peter-evans/close-issue@v2 + with: + github_token: ${{ secrets.TOKEN }} + comment: "โœ… PR์ด ๋จธ์ง€๋˜์–ด ํ•ด๋‹น ์ด์Šˆ๋ฅผ ๋‹ซ์Šต๋‹ˆ๋‹ค." From f66b084f7d0f14c117e275430f4dddce31210aa1 Mon Sep 17 00:00:00 2001 From: HyunA <129165742+10Hyuna@users.noreply.github.com> Date: Wed, 12 Feb 2025 00:38:31 +0900 Subject: [PATCH 06/23] Update create-branch.yml --- .github/workflows/create-branch.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/create-branch.yml b/.github/workflows/create-branch.yml index 49fc1a6..e14f789 100644 --- a/.github/workflows/create-branch.yml +++ b/.github/workflows/create-branch.yml @@ -32,4 +32,5 @@ jobs: - ์ž๋™ ์ƒ์„ฑ๋œ PR์ž…๋‹ˆ๋‹ค. ๐Ÿš€ **ํ™•์ธ ํ›„ ๋ฆฌ๋ทฐ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค!** + Closes #${{ github.event.issue.number }} draft: true From 667867142dd2766c5982f0e7812dec03d0578a5a Mon Sep 17 00:00:00 2001 From: HyunA <129165742+10Hyuna@users.noreply.github.com> Date: Wed, 12 Feb 2025 00:41:02 +0900 Subject: [PATCH 07/23] Update delete-branch.yml --- .github/workflows/delete-branch.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/delete-branch.yml b/.github/workflows/delete-branch.yml index 5f13dc0..ad1416a 100644 --- a/.github/workflows/delete-branch.yml +++ b/.github/workflows/delete-branch.yml @@ -1,12 +1,12 @@ name: Delete Merged Branch on: pull_request: - types: - - closed + types: [closed] jobs: delete_merged_branch: runs-on: ubuntu-latest + if: github.event.pull_request.merged == true steps: - name: Delete branch if merged uses: github-actions/delete-merged-branch@v4 From 6c5035d7fbff438515796b2015bbdd1010ca00be Mon Sep 17 00:00:00 2001 From: HyunA <129165742+10Hyuna@users.noreply.github.com> Date: Wed, 12 Feb 2025 00:44:55 +0900 Subject: [PATCH 08/23] Create test-issue-template.yml --- .../ISSUE_TEMPLATE/test-issue-template.yml | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/test-issue-template.yml diff --git a/.github/ISSUE_TEMPLATE/test-issue-template.yml b/.github/ISSUE_TEMPLATE/test-issue-template.yml new file mode 100644 index 0000000..465c4ef --- /dev/null +++ b/.github/ISSUE_TEMPLATE/test-issue-template.yml @@ -0,0 +1,22 @@ +name: "๐Ÿ’ฌ Test" +description: "์ฝ”๋“œ ํ…Œ์ŠคํŠธ" +labels: ["test"] +body: + - type: textarea + attributes: + label: ๐Ÿ“„ ์„ค๋ช… + description: ๊ฒ€์ฆํ•˜๊ณ ์ž ํ•˜๋Š” ์ฝ”๋“œ ๋Œ€ํ•œ ์„ค๋ช…์„ ์ž‘์„ฑํ•ด ์ฃผ์„ธ์š”. + placeholder: ๊ฒ€์ฆํ•˜๊ณ ์ž ํ•˜๋Š” ์ฝ”๋“œ์™€ ๊ฒ€์ฆ ๋ฐฉ์‹์— ๋Œ€ํ•ด ์ตœ๋Œ€ํ•œ ์ž์„ธํžˆ ์ž‘์„ฑํ•ด ์ฃผ์„ธ์š”! + validations: + required: true + - type: textarea + attributes: + label: โœ… ์ž‘์—…ํ•  ๋‚ด์šฉ + description: ํ•  ์ผ์„ ์ฒดํฌ๋ฐ•์Šค ํ˜•ํƒœ๋กœ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”. + placeholder: ์ตœ๋Œ€ํ•œ ์„ธ๋ถ„ํ™” ํ•ด์„œ ์ ์–ด์ฃผ์„ธ์š”! + validations: + required: true + - type: textarea + attributes: + label: ๐Ÿ™‹๐Ÿป ์ฐธ๊ณ  ์ž๋ฃŒ + description: ์ฐธ๊ณ  ์ž๋ฃŒ๊ฐ€ ์žˆ๋‹ค๋ฉด ์ž‘์„ฑํ•ด ์ฃผ์„ธ์š”. From c90c8e04c87311fde5e0707e781462e93cae02f0 Mon Sep 17 00:00:00 2001 From: HyunA <129165742+10Hyuna@users.noreply.github.com> Date: Wed, 12 Feb 2025 01:07:00 +0900 Subject: [PATCH 09/23] Update create-branch.yml --- .github/workflows/create-branch.yml | 33 ++++++++++++++++++----------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/.github/workflows/create-branch.yml b/.github/workflows/create-branch.yml index e14f789..41ef108 100644 --- a/.github/workflows/create-branch.yml +++ b/.github/workflows/create-branch.yml @@ -1,11 +1,11 @@ name: Create Issue Branch on: issues: - types: [ assigned ] + types: [assigned] issue_comment: - types: [ created ] + types: [created] pull_request: - types: [ closed ] + types: [closed] jobs: create_issue_branch_job: @@ -14,23 +14,32 @@ jobs: - name: Create Issue Branch uses: robvanderleek/create-issue-branch@main env: - GITHUB_TOKEN: ${{ secrets.TOKEN }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: base-branch: dev - + branch-name: "feature-${{ github.event.issue.number }}" + overwrite-existing: true # ๊ธฐ์กด ๋ธŒ๋žœ์น˜๊ฐ€ ์žˆ์–ด๋„ ๋ฎ์–ด์“ฐ๊ธฐ + + - name: Check if PR already exists + id: check_pr + run: | + if gh pr list --state open --base dev --head "feature-${{ github.event.issue.number }}" | grep "feature-${{ github.event.issue.number }}"; then + echo "pr_exists=true" >> $GITHUB_ENV + else + echo "pr_exists=false" >> $GITHUB_ENV + fi + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Open Pull Request + if: env.pr_exists == 'false' # PR์ด ์—†์„ ๋•Œ๋งŒ ์‹คํ–‰ uses: peter-evans/create-pull-request@v5 with: - token: ${{ secrets.TOKEN }} + token: ${{ secrets.GITHUB_TOKEN }} base: dev branch: "feature-${{ github.event.issue.number }}" title: "๐Ÿš€ Pull Request #${{ github.event.issue.number }}" body: | ๐Ÿ”ฅ **์ด์Šˆ #${{ github.event.issue.number }}์— ๋Œ€ํ•œ PR ์ƒ์„ฑ!** ๐Ÿ”ฅ - + - ์ด์Šˆ ๋งํฌ: #${{ github.event.issue.number }} - - ์ž๋™ ์ƒ์„ฑ๋œ PR์ž…๋‹ˆ๋‹ค. - - ๐Ÿš€ **ํ™•์ธ ํ›„ ๋ฆฌ๋ทฐ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค!** - Closes #${{ github.event.issue.number }} - draft: true From 499da2aa6ca3a82e68eeb469cbd96a515d67a980 Mon Sep 17 00:00:00 2001 From: HyunA <129165742+10Hyuna@users.noreply.github.com> Date: Wed, 12 Feb 2025 01:11:42 +0900 Subject: [PATCH 10/23] Update create-branch.yml --- .github/workflows/create-branch.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/create-branch.yml b/.github/workflows/create-branch.yml index 41ef108..cc14524 100644 --- a/.github/workflows/create-branch.yml +++ b/.github/workflows/create-branch.yml @@ -11,6 +11,9 @@ jobs: create_issue_branch_job: runs-on: ubuntu-latest steps: + - name: Checkout repository + uses: actions/checkout@v4 + - name: Create Issue Branch uses: robvanderleek/create-issue-branch@main env: @@ -18,7 +21,7 @@ jobs: with: base-branch: dev branch-name: "feature-${{ github.event.issue.number }}" - overwrite-existing: true # ๊ธฐ์กด ๋ธŒ๋žœ์น˜๊ฐ€ ์žˆ์–ด๋„ ๋ฎ์–ด์“ฐ๊ธฐ + overwrite-existing: true - name: Check if PR already exists id: check_pr @@ -32,7 +35,7 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Open Pull Request - if: env.pr_exists == 'false' # PR์ด ์—†์„ ๋•Œ๋งŒ ์‹คํ–‰ + if: env.pr_exists == 'false' uses: peter-evans/create-pull-request@v5 with: token: ${{ secrets.GITHUB_TOKEN }} From dc85ed4fc3668a21c4d3f616723de57557f09fbb Mon Sep 17 00:00:00 2001 From: HyunA <129165742+10Hyuna@users.noreply.github.com> Date: Wed, 12 Feb 2025 01:14:43 +0900 Subject: [PATCH 11/23] Update create-branch.yml --- .github/workflows/create-branch.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/create-branch.yml b/.github/workflows/create-branch.yml index cc14524..82b1b34 100644 --- a/.github/workflows/create-branch.yml +++ b/.github/workflows/create-branch.yml @@ -19,7 +19,7 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - base-branch: dev + default-branch: dev branch-name: "feature-${{ github.event.issue.number }}" overwrite-existing: true From c0f6421e330fc299cef2b217ba8d416d8d3c683c Mon Sep 17 00:00:00 2001 From: HyunA <129165742+10Hyuna@users.noreply.github.com> Date: Wed, 12 Feb 2025 01:18:40 +0900 Subject: [PATCH 12/23] Update create-branch.yml --- .github/workflows/create-branch.yml | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/.github/workflows/create-branch.yml b/.github/workflows/create-branch.yml index 82b1b34..b54f723 100644 --- a/.github/workflows/create-branch.yml +++ b/.github/workflows/create-branch.yml @@ -11,9 +11,17 @@ jobs: create_issue_branch_job: runs-on: ubuntu-latest steps: - - name: Checkout repository + - name: Checkout repository # โœ… ์ €์žฅ์†Œ ๊ฐ€์ ธ์˜ค๊ธฐ (fetch-depth ์„ค์ • ์ถ”๊ฐ€) uses: actions/checkout@v4 - + with: + fetch-depth: 0 # ์ „์ฒด Git ํžˆ์Šคํ† ๋ฆฌ ๊ฐ€์ ธ์˜ค๊ธฐ + + - name: Debug Git repository # โœ… ์›๊ฒฉ ์ €์žฅ์†Œ ๋ฌธ์ œ ํ™•์ธ + run: | + git remote -v + git branch + git status + - name: Create Issue Branch uses: robvanderleek/create-issue-branch@main env: @@ -26,7 +34,7 @@ jobs: - name: Check if PR already exists id: check_pr run: | - if gh pr list --state open --base dev --head "feature-${{ github.event.issue.number }}" | grep "feature-${{ github.event.issue.number }}"; then + if gh pr list --state open --base dev --head "feature-${{ github.event.issue.number }}" --repo ${{ github.repository }} | grep "feature-${{ github.event.issue.number }}"; then echo "pr_exists=true" >> $GITHUB_ENV else echo "pr_exists=false" >> $GITHUB_ENV From 2e3d22a478afb585dd8c79817b00296b93cd60a0 Mon Sep 17 00:00:00 2001 From: HyunA <129165742+10Hyuna@users.noreply.github.com> Date: Wed, 12 Feb 2025 01:27:44 +0900 Subject: [PATCH 13/23] Update create-branch.yml --- .github/workflows/create-branch.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/create-branch.yml b/.github/workflows/create-branch.yml index b54f723..bbceb6f 100644 --- a/.github/workflows/create-branch.yml +++ b/.github/workflows/create-branch.yml @@ -43,7 +43,6 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Open Pull Request - if: env.pr_exists == 'false' uses: peter-evans/create-pull-request@v5 with: token: ${{ secrets.GITHUB_TOKEN }} @@ -54,3 +53,4 @@ jobs: ๐Ÿ”ฅ **์ด์Šˆ #${{ github.event.issue.number }}์— ๋Œ€ํ•œ PR ์ƒ์„ฑ!** ๐Ÿ”ฅ - ์ด์Šˆ ๋งํฌ: #${{ github.event.issue.number }} + delete-branch: false From 52068e671ff4d5ca5317adfa1703c8ae4e0ad012 Mon Sep 17 00:00:00 2001 From: HyunA <129165742+10Hyuna@users.noreply.github.com> Date: Wed, 12 Feb 2025 01:28:47 +0900 Subject: [PATCH 14/23] Update create-branch.yml --- .github/workflows/create-branch.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/create-branch.yml b/.github/workflows/create-branch.yml index bbceb6f..d3c99b5 100644 --- a/.github/workflows/create-branch.yml +++ b/.github/workflows/create-branch.yml @@ -11,12 +11,12 @@ jobs: create_issue_branch_job: runs-on: ubuntu-latest steps: - - name: Checkout repository # โœ… ์ €์žฅ์†Œ ๊ฐ€์ ธ์˜ค๊ธฐ (fetch-depth ์„ค์ • ์ถ”๊ฐ€) + - name: Checkout repository uses: actions/checkout@v4 with: - fetch-depth: 0 # ์ „์ฒด Git ํžˆ์Šคํ† ๋ฆฌ ๊ฐ€์ ธ์˜ค๊ธฐ + fetch-depth: 0 - - name: Debug Git repository # โœ… ์›๊ฒฉ ์ €์žฅ์†Œ ๋ฌธ์ œ ํ™•์ธ + - name: Debug Git repository run: | git remote -v git branch @@ -54,3 +54,4 @@ jobs: - ์ด์Šˆ ๋งํฌ: #${{ github.event.issue.number }} delete-branch: false + allow-empty-commits: true From 8c1f6ce8779eb1b130ef6d8ae7a445efa865eb66 Mon Sep 17 00:00:00 2001 From: HyunA <129165742+10Hyuna@users.noreply.github.com> Date: Wed, 12 Feb 2025 01:36:48 +0900 Subject: [PATCH 15/23] Update create-branch.yml --- .github/workflows/create-branch.yml | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/.github/workflows/create-branch.yml b/.github/workflows/create-branch.yml index d3c99b5..d928698 100644 --- a/.github/workflows/create-branch.yml +++ b/.github/workflows/create-branch.yml @@ -22,19 +22,31 @@ jobs: git branch git status + - name: Determine Branch Name Based on Issue Labels + id: detect_branch + run: | + LABEL=$(echo '${{ toJSON(github.event.issue.labels) }}' | grep -oE '"name":"(refactor|release|test|fix|validation)"' | head -n 1 | cut -d':' -f2 | tr -d '"') + if [[ -z "$LABEL" ]]; then + LABEL="feature" # ๊ธฐ๋ณธ๊ฐ’ ์„ค์ • + fi + BRANCH_NAME="${LABEL}/issue-${{ github.event.issue.number }}" + echo "BRANCH_NAME=$BRANCH_NAME" >> $GITHUB_ENV + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Create Issue Branch uses: robvanderleek/create-issue-branch@main env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: default-branch: dev - branch-name: "feature-${{ github.event.issue.number }}" + branch-name: "${{ env.BRANCH_NAME }}" overwrite-existing: true - name: Check if PR already exists id: check_pr run: | - if gh pr list --state open --base dev --head "feature-${{ github.event.issue.number }}" --repo ${{ github.repository }} | grep "feature-${{ github.event.issue.number }}"; then + if gh pr list --state open --base dev --head "${{ env.BRANCH_NAME }}" --repo ${{ github.repository }} | grep "${{ env.BRANCH_NAME }}"; then echo "pr_exists=true" >> $GITHUB_ENV else echo "pr_exists=false" >> $GITHUB_ENV @@ -47,7 +59,7 @@ jobs: with: token: ${{ secrets.GITHUB_TOKEN }} base: dev - branch: "feature-${{ github.event.issue.number }}" + branch: "${{ env.BRANCH_NAME }}" title: "๐Ÿš€ Pull Request #${{ github.event.issue.number }}" body: | ๐Ÿ”ฅ **์ด์Šˆ #${{ github.event.issue.number }}์— ๋Œ€ํ•œ PR ์ƒ์„ฑ!** ๐Ÿ”ฅ From 334d9f91ee680862e22558b02a4c7785bdf4aa06 Mon Sep 17 00:00:00 2001 From: HyunA <129165742+10Hyuna@users.noreply.github.com> Date: Wed, 12 Feb 2025 01:41:48 +0900 Subject: [PATCH 16/23] Update create-branch.yml --- .github/workflows/create-branch.yml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/workflows/create-branch.yml b/.github/workflows/create-branch.yml index d928698..443c204 100644 --- a/.github/workflows/create-branch.yml +++ b/.github/workflows/create-branch.yml @@ -25,14 +25,13 @@ jobs: - name: Determine Branch Name Based on Issue Labels id: detect_branch run: | - LABEL=$(echo '${{ toJSON(github.event.issue.labels) }}' | grep -oE '"name":"(refactor|release|test|fix|validation)"' | head -n 1 | cut -d':' -f2 | tr -d '"') - if [[ -z "$LABEL" ]]; then + LABEL=$(echo '${{ toJSON(github.event.issue.labels) }}' | jq -r '.[0].name') + if [[ -z "$LABEL" || "$LABEL" == "null" ]]; then LABEL="feature" # ๊ธฐ๋ณธ๊ฐ’ ์„ค์ • fi BRANCH_NAME="${LABEL}/issue-${{ github.event.issue.number }}" echo "BRANCH_NAME=$BRANCH_NAME" >> $GITHUB_ENV - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + echo "๐Ÿ”น Detected branch name: $BRANCH_NAME" - name: Create Issue Branch uses: robvanderleek/create-issue-branch@main From 72c4dad7134374c976d01eb51a93b1223f9ca527 Mon Sep 17 00:00:00 2001 From: 10Hyuna Date: Wed, 19 Feb 2025 01:48:07 +0900 Subject: [PATCH 17/23] =?UTF-8?q?Settings:=20=EA=B8=B0=EB=8A=A5=EC=97=90?= =?UTF-8?q?=20=ED=95=84=EC=9A=94=ED=95=9C=20=ED=8F=B4=EB=8D=94=20=EA=B5=AC?= =?UTF-8?q?=EC=A1=B0=20=EA=B5=AC=EC=B6=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .DS_Store | Bin 6148 -> 6148 bytes build.gradle | 1 + .../bamboo/log/diary/api/DiaryController.java | 4 ++++ .../com/bamboo/log/diary/domain/Diary.java | 4 ++++ .../diary/dto/request/CreateDiaryRequest.java | 4 ++++ .../dto/response/CreateDiaryResponse.java | 4 ++++ .../log/diary/repository/DiaryRepository.java | 4 ++++ .../log/diary/service/DiaryService.java | 4 ++++ .../log/diary/service/DiaryServiceImpl.java | 4 ++++ 9 files changed, 29 insertions(+) create mode 100644 src/main/java/com/bamboo/log/diary/api/DiaryController.java create mode 100644 src/main/java/com/bamboo/log/diary/domain/Diary.java create mode 100644 src/main/java/com/bamboo/log/diary/dto/request/CreateDiaryRequest.java create mode 100644 src/main/java/com/bamboo/log/diary/dto/response/CreateDiaryResponse.java create mode 100644 src/main/java/com/bamboo/log/diary/repository/DiaryRepository.java create mode 100644 src/main/java/com/bamboo/log/diary/service/DiaryService.java create mode 100644 src/main/java/com/bamboo/log/diary/service/DiaryServiceImpl.java diff --git a/.DS_Store b/.DS_Store index dd46a9923d3511c0ddce67c1cc0fd4f8a0b2c125..5770197c32987a55423285d0d1e1dddc77abfd3b 100644 GIT binary patch delta 71 zcmZoMXfc=|#>B)qu~2NHo+2a1#(>?7j2x4BSc)ezvYy!domGHoW5Wif&Fmcf96)88 Z1v$PmPv#eKB!ku~2NHo+2a9#(>?7iw`g}G4f32VJc>1pWMYH6UAu9z`(HVKNtX6 z3=FIcdJLHiDGaF$iJm$6$w@i+NkCBn1_s7yKpItL5<@9aZ4N^Us!9ekph~03B}|v) z*%>?-Tp4^A0)VFGqN`(kx7mVOo@p~X2R{eUotrl@e`lV|FXG6-$iTn^G=gDsgvc6Z E0A!UiL;wH) diff --git a/build.gradle b/build.gradle index b68e796..0b91e79 100644 --- a/build.gradle +++ b/build.gradle @@ -33,6 +33,7 @@ dependencies { annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' + implementation 'org.modelmapper:modelmapper:3.0.0' } tasks.named('test') { diff --git a/src/main/java/com/bamboo/log/diary/api/DiaryController.java b/src/main/java/com/bamboo/log/diary/api/DiaryController.java new file mode 100644 index 0000000..6aedbef --- /dev/null +++ b/src/main/java/com/bamboo/log/diary/api/DiaryController.java @@ -0,0 +1,4 @@ +package com.bamboo.log.diary.api; + +public class DiaryController { +} diff --git a/src/main/java/com/bamboo/log/diary/domain/Diary.java b/src/main/java/com/bamboo/log/diary/domain/Diary.java new file mode 100644 index 0000000..5b556f3 --- /dev/null +++ b/src/main/java/com/bamboo/log/diary/domain/Diary.java @@ -0,0 +1,4 @@ +package com.bamboo.log.diary.domain; + +public class Diary { +} diff --git a/src/main/java/com/bamboo/log/diary/dto/request/CreateDiaryRequest.java b/src/main/java/com/bamboo/log/diary/dto/request/CreateDiaryRequest.java new file mode 100644 index 0000000..5aaff48 --- /dev/null +++ b/src/main/java/com/bamboo/log/diary/dto/request/CreateDiaryRequest.java @@ -0,0 +1,4 @@ +package com.bamboo.log.diary.dto.request; + +public record CreateDiaryRequest() { +} diff --git a/src/main/java/com/bamboo/log/diary/dto/response/CreateDiaryResponse.java b/src/main/java/com/bamboo/log/diary/dto/response/CreateDiaryResponse.java new file mode 100644 index 0000000..13cdbf6 --- /dev/null +++ b/src/main/java/com/bamboo/log/diary/dto/response/CreateDiaryResponse.java @@ -0,0 +1,4 @@ +package com.bamboo.log.diary.dto.response; + +public record CreateDiaryResponse() { +} diff --git a/src/main/java/com/bamboo/log/diary/repository/DiaryRepository.java b/src/main/java/com/bamboo/log/diary/repository/DiaryRepository.java new file mode 100644 index 0000000..977e763 --- /dev/null +++ b/src/main/java/com/bamboo/log/diary/repository/DiaryRepository.java @@ -0,0 +1,4 @@ +package com.bamboo.log.diary.repository; + +public class DiaryRepository { +} diff --git a/src/main/java/com/bamboo/log/diary/service/DiaryService.java b/src/main/java/com/bamboo/log/diary/service/DiaryService.java new file mode 100644 index 0000000..294457e --- /dev/null +++ b/src/main/java/com/bamboo/log/diary/service/DiaryService.java @@ -0,0 +1,4 @@ +package com.bamboo.log.diary.service; + +public interface DiaryService { +} diff --git a/src/main/java/com/bamboo/log/diary/service/DiaryServiceImpl.java b/src/main/java/com/bamboo/log/diary/service/DiaryServiceImpl.java new file mode 100644 index 0000000..d621725 --- /dev/null +++ b/src/main/java/com/bamboo/log/diary/service/DiaryServiceImpl.java @@ -0,0 +1,4 @@ +package com.bamboo.log.diary.service; + +public class DiaryServiceImpl { +} From 0b70c05badae6fa52be8a51fe826f6b6dd016691 Mon Sep 17 00:00:00 2001 From: 10Hyuna Date: Wed, 19 Feb 2025 01:50:05 +0900 Subject: [PATCH 18/23] =?UTF-8?q?feat:=20Request=20Form=20DTO=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 --- .../bamboo/log/diary/dto/request/CreateDiaryRequest.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/bamboo/log/diary/dto/request/CreateDiaryRequest.java b/src/main/java/com/bamboo/log/diary/dto/request/CreateDiaryRequest.java index 5aaff48..084708d 100644 --- a/src/main/java/com/bamboo/log/diary/dto/request/CreateDiaryRequest.java +++ b/src/main/java/com/bamboo/log/diary/dto/request/CreateDiaryRequest.java @@ -1,4 +1,9 @@ package com.bamboo.log.diary.dto.request; -public record CreateDiaryRequest() { +import jakarta.validation.constraints.NotEmpty; + +import java.util.List; + +public record CreateDiaryRequest(@NotEmpty(message = "User's Id shouldn't be empty") String userId, + @NotEmpty(message = "Diary Description shouldn't be empty") String diaryDetail) { } From 1f58a4a6f27dfc3a212a397f87c04b7ff7e30ed2 Mon Sep 17 00:00:00 2001 From: 10Hyuna Date: Wed, 19 Feb 2025 01:50:47 +0900 Subject: [PATCH 19/23] =?UTF-8?q?Feat:=20Response=20Form=20DTO=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 --- .../bamboo/log/diary/dto/response/CreateDiaryResponse.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/bamboo/log/diary/dto/response/CreateDiaryResponse.java b/src/main/java/com/bamboo/log/diary/dto/response/CreateDiaryResponse.java index 13cdbf6..9e994c0 100644 --- a/src/main/java/com/bamboo/log/diary/dto/response/CreateDiaryResponse.java +++ b/src/main/java/com/bamboo/log/diary/dto/response/CreateDiaryResponse.java @@ -1,4 +1,8 @@ package com.bamboo.log.diary.dto.response; -public record CreateDiaryResponse() { +import jakarta.validation.constraints.NotEmpty; + +import java.time.LocalDateTime; + +public record CreateDiaryResponse(@NotEmpty(message = "created shouldn't be empty") LocalDateTime created) { } From 886f64481b5c39d301a5c284d19796749fa28469 Mon Sep 17 00:00:00 2001 From: 10Hyuna Date: Sun, 23 Feb 2025 23:32:43 +0900 Subject: [PATCH 20/23] =?UTF-8?q?Feat:=20Img=20generator=20=EC=9E=84?= =?UTF-8?q?=EC=8B=9C=20=EC=97=B0=EA=B2=B0=20=EB=A1=9C=EC=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 42 ++++++++--- .../bamboo/log/diary/api/DiaryController.java | 29 ++++++++ .../com/bamboo/log/diary/domain/Diary.java | 29 ++++++++ .../bamboo/log/diary/domain/TodaySummary.java | 29 ++++++++ .../log/diary/repository/DiaryRepository.java | 5 +- .../repository/TodaySummaryRepository.java | 7 ++ .../log/diary/service/DiaryService.java | 4 -- .../log/diary/service/DiaryServiceImpl.java | 4 -- .../log/diary/service/diary/DiaryService.java | 10 +++ .../diary/service/diary/DiaryServiceImpl.java | 70 +++++++++++++++++++ .../diary/service/mock/MockUserService.java | 12 ++++ .../log/diary/service/mock/UserService.java | 5 ++ .../service/summary/TodaySummaryService.java | 11 +++ .../summary/TodaySummaryServiceImpl.java | 46 ++++++++++++ .../log/elice/config/RestTemplateConfig.java | 14 ++++ .../elice/service/ImageGenerationService.java | 58 +++++++++++++++ .../com/bamboo/log/utils/ResponseHandler.java | 51 ++++++++++++++ .../com/bamboo/log/utils/SecurityConfig.java | 23 ++++++ .../bamboo/log/utils/dto/DetailResponse.java | 13 ++++ .../bamboo/log/utils/dto/ResponseForm.java | 21 ++++++ src/main/resources/application.yml | 20 ++++-- 21 files changed, 480 insertions(+), 23 deletions(-) create mode 100644 src/main/java/com/bamboo/log/diary/domain/TodaySummary.java create mode 100644 src/main/java/com/bamboo/log/diary/repository/TodaySummaryRepository.java delete mode 100644 src/main/java/com/bamboo/log/diary/service/DiaryService.java delete mode 100644 src/main/java/com/bamboo/log/diary/service/DiaryServiceImpl.java create mode 100644 src/main/java/com/bamboo/log/diary/service/diary/DiaryService.java create mode 100644 src/main/java/com/bamboo/log/diary/service/diary/DiaryServiceImpl.java create mode 100644 src/main/java/com/bamboo/log/diary/service/mock/MockUserService.java create mode 100644 src/main/java/com/bamboo/log/diary/service/mock/UserService.java create mode 100644 src/main/java/com/bamboo/log/diary/service/summary/TodaySummaryService.java create mode 100644 src/main/java/com/bamboo/log/diary/service/summary/TodaySummaryServiceImpl.java create mode 100644 src/main/java/com/bamboo/log/elice/config/RestTemplateConfig.java create mode 100644 src/main/java/com/bamboo/log/elice/service/ImageGenerationService.java create mode 100644 src/main/java/com/bamboo/log/utils/ResponseHandler.java create mode 100644 src/main/java/com/bamboo/log/utils/SecurityConfig.java create mode 100644 src/main/java/com/bamboo/log/utils/dto/DetailResponse.java create mode 100644 src/main/java/com/bamboo/log/utils/dto/ResponseForm.java diff --git a/build.gradle b/build.gradle index 0b91e79..56f4f0e 100644 --- a/build.gradle +++ b/build.gradle @@ -24,16 +24,38 @@ repositories { } dependencies { - implementation 'org.springframework.boot:spring-boot-starter-web' - implementation 'org.springframework.boot:spring-boot-starter-data-jpa' - implementation 'org.springframework.boot:spring-boot-starter-validation' - developmentOnly 'org.springframework.boot:spring-boot-devtools' - 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' - implementation 'org.modelmapper:modelmapper:3.0.0' + implementation 'org.springframework.boot:spring-boot-starter-data-jpa:3.0.4' + implementation 'org.springframework.boot:spring-boot-starter-web:3.1.0' + testImplementation 'org.projectlombok:lombok:1.18.26' + compileOnly 'org.projectlombok:lombok:1.18.26' + runtimeOnly 'com.mysql:mysql-connector-j:8.0.32' + annotationProcessor 'org.projectlombok:lombok:1.18.26' + testImplementation 'org.springframework.boot:spring-boot-starter-test:3.1.0' + + implementation 'org.hibernate.validator:hibernate-validator:8.0.1.Final' + implementation 'jakarta.validation:jakarta.validation-api:3.0.2' + + implementation 'com.squareup.okhttp3:okhttp:4.9.3' + + // Spring Doc + implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.4' + + // Spring Security + implementation 'org.springframework.boot:spring-boot-starter-security:3.0.4' + + // 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' + + // chatGPT API + implementation 'io.github.flashvayne:chatgpt-spring-boot-starter:1.0.4' + + // JSON ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ + implementation 'org.json:json:20230227' + + implementation 'org.springframework:spring-test:6.0.6' + testImplementation 'org.springframework.boot:spring-boot-starter-test:3.1.0' } tasks.named('test') { diff --git a/src/main/java/com/bamboo/log/diary/api/DiaryController.java b/src/main/java/com/bamboo/log/diary/api/DiaryController.java index 6aedbef..0b4e1c5 100644 --- a/src/main/java/com/bamboo/log/diary/api/DiaryController.java +++ b/src/main/java/com/bamboo/log/diary/api/DiaryController.java @@ -1,4 +1,33 @@ package com.bamboo.log.diary.api; +import com.bamboo.log.diary.dto.request.CreateDiaryRequest; +import com.bamboo.log.diary.service.diary.DiaryService; +import com.bamboo.log.utils.ResponseHandler; +import com.bamboo.log.utils.dto.ResponseForm; +import io.swagger.v3.oas.annotations.Operation; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import io.swagger.v3.oas.annotations.tags.Tag; + +import java.util.List; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/diary") +@Tag(name = "Diary API", description = "์ผ๊ธฐ ๊ด€๋ จ API") public class DiaryController { + + private final DiaryService diaryService; + + @Operation(summary = "๋žœ๋ค ์ฃผ์ œ ์กฐํšŒ") + @PostMapping("/create") + public ResponseEntity lookupRandomTopics(@RequestBody CreateDiaryRequest createDiaryRequest) { + try { + return diaryService.createDiary(createDiaryRequest); + } catch (Exception e) { + return ResponseHandler.create500Error(new ResponseForm(), e); + } + } } diff --git a/src/main/java/com/bamboo/log/diary/domain/Diary.java b/src/main/java/com/bamboo/log/diary/domain/Diary.java index 5b556f3..c820a2c 100644 --- a/src/main/java/com/bamboo/log/diary/domain/Diary.java +++ b/src/main/java/com/bamboo/log/diary/domain/Diary.java @@ -1,4 +1,33 @@ package com.bamboo.log.diary.domain; +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@Entity +@Getter +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Table(name = "diaries") public class Diary { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @Column(name = "diary_id") + private Long id; + + @Column(nullable = false) + private String userId; + + @Column(columnDefinition = "TEXT", nullable = false) + private String context; + + @Column(nullable = false) + private LocalDateTime createdAt; + } diff --git a/src/main/java/com/bamboo/log/diary/domain/TodaySummary.java b/src/main/java/com/bamboo/log/diary/domain/TodaySummary.java new file mode 100644 index 0000000..24af228 --- /dev/null +++ b/src/main/java/com/bamboo/log/diary/domain/TodaySummary.java @@ -0,0 +1,29 @@ +package com.bamboo.log.diary.domain; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Builder; +import lombok.NoArgsConstructor; + +@Entity +@Getter +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Table(name = "today_summaries") +public class TodaySummary { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + @Column(nullable = false) + private Long diaryId; + + @Lob + @Column(columnDefinition = "LONGBLOB", nullable = false) + private byte[] imageData; + +} + diff --git a/src/main/java/com/bamboo/log/diary/repository/DiaryRepository.java b/src/main/java/com/bamboo/log/diary/repository/DiaryRepository.java index 977e763..416db42 100644 --- a/src/main/java/com/bamboo/log/diary/repository/DiaryRepository.java +++ b/src/main/java/com/bamboo/log/diary/repository/DiaryRepository.java @@ -1,4 +1,7 @@ package com.bamboo.log.diary.repository; -public class DiaryRepository { +import com.bamboo.log.diary.domain.Diary; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface DiaryRepository extends JpaRepository { } diff --git a/src/main/java/com/bamboo/log/diary/repository/TodaySummaryRepository.java b/src/main/java/com/bamboo/log/diary/repository/TodaySummaryRepository.java new file mode 100644 index 0000000..4093d83 --- /dev/null +++ b/src/main/java/com/bamboo/log/diary/repository/TodaySummaryRepository.java @@ -0,0 +1,7 @@ +package com.bamboo.log.diary.repository; + +import com.bamboo.log.diary.domain.TodaySummary; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface TodaySummaryRepository extends JpaRepository { +} diff --git a/src/main/java/com/bamboo/log/diary/service/DiaryService.java b/src/main/java/com/bamboo/log/diary/service/DiaryService.java deleted file mode 100644 index 294457e..0000000 --- a/src/main/java/com/bamboo/log/diary/service/DiaryService.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.bamboo.log.diary.service; - -public interface DiaryService { -} diff --git a/src/main/java/com/bamboo/log/diary/service/DiaryServiceImpl.java b/src/main/java/com/bamboo/log/diary/service/DiaryServiceImpl.java deleted file mode 100644 index d621725..0000000 --- a/src/main/java/com/bamboo/log/diary/service/DiaryServiceImpl.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.bamboo.log.diary.service; - -public class DiaryServiceImpl { -} diff --git a/src/main/java/com/bamboo/log/diary/service/diary/DiaryService.java b/src/main/java/com/bamboo/log/diary/service/diary/DiaryService.java new file mode 100644 index 0000000..50cb4ac --- /dev/null +++ b/src/main/java/com/bamboo/log/diary/service/diary/DiaryService.java @@ -0,0 +1,10 @@ +package com.bamboo.log.diary.service.diary; + +import com.bamboo.log.diary.dto.request.CreateDiaryRequest; +import org.springframework.http.ResponseEntity; + +public interface DiaryService { + + ResponseEntity createDiary(CreateDiaryRequest createDiaryRequest); + +} diff --git a/src/main/java/com/bamboo/log/diary/service/diary/DiaryServiceImpl.java b/src/main/java/com/bamboo/log/diary/service/diary/DiaryServiceImpl.java new file mode 100644 index 0000000..5c201fd --- /dev/null +++ b/src/main/java/com/bamboo/log/diary/service/diary/DiaryServiceImpl.java @@ -0,0 +1,70 @@ +package com.bamboo.log.diary.service.diary; + +import com.bamboo.log.diary.domain.Diary; +import com.bamboo.log.diary.dto.request.CreateDiaryRequest; +import com.bamboo.log.diary.dto.response.CreateDiaryResponse; +import com.bamboo.log.diary.repository.DiaryRepository; +import com.bamboo.log.diary.repository.TodaySummaryRepository; +import com.bamboo.log.diary.service.mock.UserService; +import com.bamboo.log.diary.service.summary.TodaySummaryService; +import com.bamboo.log.utils.ResponseHandler; +import com.bamboo.log.utils.dto.ResponseForm; +import jakarta.persistence.EntityNotFoundException; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.io.IOException; +import java.time.LocalDateTime; + +@Service +@Transactional +@RequiredArgsConstructor +public class DiaryServiceImpl implements DiaryService { + + private final UserService userService; + private final DiaryRepository diaryRepository; + private final TodaySummaryService todaySummaryService; + + @Override + public ResponseEntity createDiary(CreateDiaryRequest createDiaryRequest) { + + // User ๊ฐ์ฒด ๊ฒ€์ฆ ๋กœ์ง + // ํ•ด๋‹น User ๊ฐ์ฒด ์ฐพ์„ ์ˆ˜ ์—†์„ ๊ฒฝ์šฐ, ์—๋Ÿฌ ๋ฐ˜ํ™˜ + if(userService.existsById(createDiaryRequest.userId())) { + return ResponseHandler.create404Error(new ResponseForm(), new EntityNotFoundException("์ž˜๋ชป๋œ ์œ ์ € ์ •๋ณด์ž…๋‹ˆ๋‹ค.")); + } + + // ํ•ด๋‹น ์‹œ์ ์˜ localDateTime ์ €์žฅ + LocalDateTime localDateTime = LocalDateTime.now(); + + // alice api ์—ฐ๊ฒฐ ํ•จ์ˆ˜ ํ˜ธ์ถœ + + // ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ + Diary diary = saveDiary(createDiaryRequest, localDateTime); + + byte[] todayImage = todaySummaryService.createTodaySummaryImage(createDiaryRequest.diaryDetail()); + + // todaySummaryImage ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ + try { + todaySummaryService.saveTodaySummaryImage(todayImage, diary.getId()); + } catch (IOException e) { + return ResponseHandler.create500Error(new ResponseForm(), e); + } + + // 201 code ๋ฐ˜ํ™˜ + return ResponseHandler.create201Response(new ResponseForm(), new CreateDiaryResponse(localDateTime)); + } + + private Diary saveDiary(CreateDiaryRequest createDiaryRequest, LocalDateTime localDateTime) { + Diary diary = Diary.builder() + .userId(createDiaryRequest.userId()) + .context(createDiaryRequest.diaryDetail()) + .createdAt(localDateTime) + .build(); + + return diaryRepository.save(diary); + } + +} diff --git a/src/main/java/com/bamboo/log/diary/service/mock/MockUserService.java b/src/main/java/com/bamboo/log/diary/service/mock/MockUserService.java new file mode 100644 index 0000000..86824f2 --- /dev/null +++ b/src/main/java/com/bamboo/log/diary/service/mock/MockUserService.java @@ -0,0 +1,12 @@ +package com.bamboo.log.diary.service.mock; + +import org.springframework.stereotype.Service; + +@Service +public class MockUserService implements UserService { + + @Override + public boolean existsById(String userId) { + return true; + } +} diff --git a/src/main/java/com/bamboo/log/diary/service/mock/UserService.java b/src/main/java/com/bamboo/log/diary/service/mock/UserService.java new file mode 100644 index 0000000..0b37f9a --- /dev/null +++ b/src/main/java/com/bamboo/log/diary/service/mock/UserService.java @@ -0,0 +1,5 @@ +package com.bamboo.log.diary.service.mock; + +public interface UserService { + boolean existsById(String userId); +} diff --git a/src/main/java/com/bamboo/log/diary/service/summary/TodaySummaryService.java b/src/main/java/com/bamboo/log/diary/service/summary/TodaySummaryService.java new file mode 100644 index 0000000..598d786 --- /dev/null +++ b/src/main/java/com/bamboo/log/diary/service/summary/TodaySummaryService.java @@ -0,0 +1,11 @@ +package com.bamboo.log.diary.service.summary; + +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; + +public interface TodaySummaryService { + + void saveTodaySummaryImage(byte[] image, Long diaryId) throws IOException; + byte[] createTodaySummaryImage(String prompt); +} diff --git a/src/main/java/com/bamboo/log/diary/service/summary/TodaySummaryServiceImpl.java b/src/main/java/com/bamboo/log/diary/service/summary/TodaySummaryServiceImpl.java new file mode 100644 index 0000000..06df2dd --- /dev/null +++ b/src/main/java/com/bamboo/log/diary/service/summary/TodaySummaryServiceImpl.java @@ -0,0 +1,46 @@ +package com.bamboo.log.diary.service.summary; + +import com.bamboo.log.diary.domain.TodaySummary; +import com.bamboo.log.diary.repository.TodaySummaryRepository; +import com.bamboo.log.elice.service.ImageGenerationService; +import com.bamboo.log.utils.ResponseHandler; +import com.bamboo.log.utils.dto.ResponseForm; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.Optional; + +@Service +@Transactional +@RequiredArgsConstructor +public class TodaySummaryServiceImpl implements TodaySummaryService { + + private final TodaySummaryRepository todaySummaryRepository; + private final ImageGenerationService imageGenerationService; + + @Override + public void saveTodaySummaryImage(byte[] image, Long diaryId) throws IOException { + TodaySummary todaySummary = TodaySummary.builder() + .diaryId(diaryId) + .imageData(image) + .build(); + + todaySummaryRepository.save(todaySummary); + } + + @Override + public byte[] createTodaySummaryImage(String prompt) { + try { + byte[] imageBytes = imageGenerationService.generateImage(prompt); + + return imageBytes; + } catch (IOException e) { + throw new RuntimeException("์ด๋ฏธ์ง€ ์ƒ์„ฑ ์ค‘์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค."); + } + + } + +} diff --git a/src/main/java/com/bamboo/log/elice/config/RestTemplateConfig.java b/src/main/java/com/bamboo/log/elice/config/RestTemplateConfig.java new file mode 100644 index 0000000..0ea3f07 --- /dev/null +++ b/src/main/java/com/bamboo/log/elice/config/RestTemplateConfig.java @@ -0,0 +1,14 @@ +package com.bamboo.log.elice.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.client.RestTemplate; + +@Configuration +public class RestTemplateConfig { + + @Bean + public RestTemplate restTemplate() { + return new RestTemplate(); + } +} diff --git a/src/main/java/com/bamboo/log/elice/service/ImageGenerationService.java b/src/main/java/com/bamboo/log/elice/service/ImageGenerationService.java new file mode 100644 index 0000000..2af0bf5 --- /dev/null +++ b/src/main/java/com/bamboo/log/elice/service/ImageGenerationService.java @@ -0,0 +1,58 @@ +package com.bamboo.log.elice.service; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.*; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + +import okhttp3.*; +import okhttp3.MediaType; + +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Service +public class ImageGenerationService { + + private final RestTemplate restTemplate; + private final String apiKey; + private final String apiUrl; + + public ImageGenerationService(RestTemplate restTemplate, + @Value("${elice.api.key}") String apiKey, + @Value("${elice.api.url}") String apiUrl) { + this.restTemplate = restTemplate; + this.apiKey = apiKey; + this.apiUrl = apiUrl; + } + + public byte[] generateImage(String prompt) throws IOException { + OkHttpClient client = new OkHttpClient(); + + String requestBody = String.format("{\"prompt\":\"%s\",\"style\":\"polaroid\"}", prompt); + + MediaType mediaType = MediaType.parse("application/json"); + RequestBody body = RequestBody.create(requestBody, mediaType); + + Request request = new Request.Builder() + .url(apiUrl) + .post(body) + .addHeader("accept", "application/json") + .addHeader("content-type", "application/json") + .addHeader("Authorization", "Bearer " + apiKey) + .build(); + + Response response = client.newCall(request).execute(); + + if (!response.isSuccessful()) { + throw new IOException("์š”์ฒญ ์‹คํŒจ: " + response.code()); + } + + byte[] imageBytes = response.body().bytes(); // โœ… ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ๋ฅผ byte[]๋กœ ๋ณ€ํ™˜ + response.close(); + return imageBytes; + } +} + diff --git a/src/main/java/com/bamboo/log/utils/ResponseHandler.java b/src/main/java/com/bamboo/log/utils/ResponseHandler.java new file mode 100644 index 0000000..c483a50 --- /dev/null +++ b/src/main/java/com/bamboo/log/utils/ResponseHandler.java @@ -0,0 +1,51 @@ +package com.bamboo.log.utils; + +import com.bamboo.log.utils.dto.DetailResponse; +import com.bamboo.log.utils.dto.ResponseForm; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; + +public class ResponseHandler { + + public static ResponseEntity create500Error(ResponseForm response, Exception e) { + response.of("result", "FAIL"); + response.of("error", DetailResponse.builder().code(500).message(e.getMessage()).build()); + return new ResponseEntity(response, HttpStatus.INTERNAL_SERVER_ERROR); + } + + public static ResponseEntity create400Error(ResponseForm response, Exception e) { + response.of("result", "FAIL"); + response.of("error", DetailResponse.builder().code(400).message(e.getMessage()).build()); + + return new ResponseEntity(response, HttpStatus.BAD_REQUEST); + } + + public static ResponseEntity create404Error(ResponseForm response, Exception e) { + response.of("result", "FAIL"); + response.of("error", DetailResponse.builder().code(404).message(e.getMessage()).build()); + + return new ResponseEntity(response, HttpStatus.NOT_FOUND); + } + + public static ResponseEntity create204Response(ResponseForm response, String message) { + response.of("result", "SUCCESS"); + response.of("code", DetailResponse.builder().code(204).message(message).build()); + + return new ResponseEntity(response, HttpStatus.NO_CONTENT); + } + + public static ResponseEntity create200Response(ResponseForm response, Object object) { + response.of("result", "SUCCESS"); + response.of("code", object); + + return new ResponseEntity(response, HttpStatus.OK); + } + + public static ResponseEntity create201Response(ResponseForm response, Object object) { + response.of("result", "SUCCESS"); + response.of("code", object); + + return new ResponseEntity(response, HttpStatus.CREATED); + } + +} diff --git a/src/main/java/com/bamboo/log/utils/SecurityConfig.java b/src/main/java/com/bamboo/log/utils/SecurityConfig.java new file mode 100644 index 0000000..5d51eb4 --- /dev/null +++ b/src/main/java/com/bamboo/log/utils/SecurityConfig.java @@ -0,0 +1,23 @@ +package com.bamboo.log.utils; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.web.SecurityFilterChain; + +@Configuration +@EnableWebSecurity +public class SecurityConfig { + @Bean + public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { + http + .csrf(csrf -> csrf.disable()) // CSRF ๋น„ํ™œ์„ฑํ™” + .authorizeHttpRequests(auth -> auth + .requestMatchers("/api/images/**").permitAll() // ์ด๋ฏธ์ง€ API ์ธ์ฆ ์—†์ด ํ—ˆ์šฉ + .anyRequest().authenticated() + ); + + return http.build(); + } +} diff --git a/src/main/java/com/bamboo/log/utils/dto/DetailResponse.java b/src/main/java/com/bamboo/log/utils/dto/DetailResponse.java new file mode 100644 index 0000000..61f22cf --- /dev/null +++ b/src/main/java/com/bamboo/log/utils/dto/DetailResponse.java @@ -0,0 +1,13 @@ +package com.bamboo.log.utils.dto; + +import lombok.Builder; +import lombok.Getter; + +@Builder +@Getter +public class DetailResponse { + + private Integer code; + private String message; + +} \ No newline at end of file diff --git a/src/main/java/com/bamboo/log/utils/dto/ResponseForm.java b/src/main/java/com/bamboo/log/utils/dto/ResponseForm.java new file mode 100644 index 0000000..04eccf6 --- /dev/null +++ b/src/main/java/com/bamboo/log/utils/dto/ResponseForm.java @@ -0,0 +1,21 @@ +package com.bamboo.log.utils.dto; + +import lombok.Getter; + +import java.util.HashMap; +import java.util.Map; + +@Getter +public class ResponseForm { + + public ResponseForm() { + response = new HashMap<>(); + } + + public void of(String value1, Object value2) { + response.put(value1, value2); + } + + private Map response; + +} \ No newline at end of file diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 356817f..9fb423e 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,13 +1,25 @@ spring: datasource: - url: jdbc:mysql://${MYSQL_HOST}:${MYSQL_PORT}/${MYSQL_NAME} - username: ${MYSQL_USERNAME} - password: ${MYSQL_PASSWORD} driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://localhost:3306/forrest?useSSL=false&serverTimezone=Asia/Seoul&characterEncoding=UTF-8 + username: root + password: ensharp2005* + jpa: show-sql: true open-in-view: false hibernate: ddl-auto: update properties: - hibernate.dialect: org.hibernate.dialect.MySQL8Dialect \ No newline at end of file + hibernate.dialect: org.hibernate.dialect.MySQL8Dialect + + security: + user: + name: admin + password: admin123 + + +elice: + api: + key: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE3Mzg4MzQxNDgsIm5iZiI6MTczODgzNDE0OCwia2V5X2lkIjoiZTdmNTUxN2MtYzNlZC00ZmVmLWFkNzYtNTUxZjA3ZDJmMjNiIn0.sMIASpWdac5l3GdIXshb7NnuB-PQlHMFyNurcpu4Cms + url: https://api-cloud-function.elice.io/0133c2f7-9f3f-44b6-a3d6-c24ba8ef4510/generate From 8b51911f00652d9ba06e447a3a01aee441c64e71 Mon Sep 17 00:00:00 2001 From: 10Hyuna Date: Mon, 24 Feb 2025 14:03:40 +0900 Subject: [PATCH 21/23] =?UTF-8?q?application.yml=20=ED=8C=8C=EC=9D=BC=20Gi?= =?UTF-8?q?t=EC=97=90=EC=84=9C=20=EC=A0=9C=EC=99=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application.yml | 25 ------------------------- 1 file changed, 25 deletions(-) delete mode 100644 src/main/resources/application.yml diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml deleted file mode 100644 index 9fb423e..0000000 --- a/src/main/resources/application.yml +++ /dev/null @@ -1,25 +0,0 @@ -spring: - datasource: - driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://localhost:3306/forrest?useSSL=false&serverTimezone=Asia/Seoul&characterEncoding=UTF-8 - username: root - password: ensharp2005* - - jpa: - show-sql: true - open-in-view: false - hibernate: - ddl-auto: update - properties: - hibernate.dialect: org.hibernate.dialect.MySQL8Dialect - - security: - user: - name: admin - password: admin123 - - -elice: - api: - key: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE3Mzg4MzQxNDgsIm5iZiI6MTczODgzNDE0OCwia2V5X2lkIjoiZTdmNTUxN2MtYzNlZC00ZmVmLWFkNzYtNTUxZjA3ZDJmMjNiIn0.sMIASpWdac5l3GdIXshb7NnuB-PQlHMFyNurcpu4Cms - url: https://api-cloud-function.elice.io/0133c2f7-9f3f-44b6-a3d6-c24ba8ef4510/generate From a17eab350b0d5891a83590b6ba64217eb5059b62 Mon Sep 17 00:00:00 2001 From: 10Hyuna Date: Mon, 24 Feb 2025 14:15:08 +0900 Subject: [PATCH 22/23] =?UTF-8?q?Settings:=20application.yml=20=ED=99=98?= =?UTF-8?q?=EA=B2=BD=EB=B3=80=EC=88=98=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 +- .../elice/service/ImageGenerationService.java | 2 +- src/main/resources/application.yml | 23 +++++++++++++++++++ 3 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 src/main/resources/application.yml diff --git a/.gitignore b/.gitignore index c2065bc..e48b6be 100644 --- a/.gitignore +++ b/.gitignore @@ -34,4 +34,4 @@ out/ /.nb-gradle/ ### VS Code ### -.vscode/ +.vscode/ \ No newline at end of file diff --git a/src/main/java/com/bamboo/log/elice/service/ImageGenerationService.java b/src/main/java/com/bamboo/log/elice/service/ImageGenerationService.java index 2af0bf5..d7aa11b 100644 --- a/src/main/java/com/bamboo/log/elice/service/ImageGenerationService.java +++ b/src/main/java/com/bamboo/log/elice/service/ImageGenerationService.java @@ -21,7 +21,7 @@ public class ImageGenerationService { private final String apiUrl; public ImageGenerationService(RestTemplate restTemplate, - @Value("${elice.api.key}") String apiKey, + @Value("${elice.api.token}") String apiKey, @Value("${elice.api.url}") String apiUrl) { this.restTemplate = restTemplate; this.apiKey = apiKey; diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml new file mode 100644 index 0000000..317cea6 --- /dev/null +++ b/src/main/resources/application.yml @@ -0,0 +1,23 @@ +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://${MYSQL_HOST}:${MYSQL_PORT}/${MYSQL_NAME} + username: ${MYSQL_USERNAME} + password: ${MYSQL_PASSWORD} + + jpa: + show-sql: true + open-in-view: false + hibernate: + ddl-auto: update + properties: + hibernate.dialect: org.hibernate.dialect.MySQL8Dialect + + +elice: + api: + token: ${API_TOKEN} + url: + face: ${FACE_API_URL} + img: ${IMG_API_URL} + chat: ${CHAT_API_URL} From 94e18ec65308070bf84d267211c7ee2d1f60d824 Mon Sep 17 00:00:00 2001 From: HyunA <129165742+10Hyuna@users.noreply.github.com> Date: Mon, 24 Feb 2025 14:32:00 +0900 Subject: [PATCH 23/23] =?UTF-8?q?Revert=20"[Feature]=20=EC=9D=BC=EA=B8=B0?= =?UTF-8?q?=20=EC=83=9D=EC=84=B1=20API"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .DS_Store | Bin 6148 -> 6148 bytes .gitignore | 2 +- build.gradle | 41 +++------- .../bamboo/log/diary/api/DiaryController.java | 33 --------- .../com/bamboo/log/diary/domain/Diary.java | 33 --------- .../bamboo/log/diary/domain/TodaySummary.java | 29 -------- .../diary/dto/request/CreateDiaryRequest.java | 9 --- .../dto/response/CreateDiaryResponse.java | 8 -- .../log/diary/repository/DiaryRepository.java | 7 -- .../repository/TodaySummaryRepository.java | 7 -- .../log/diary/service/diary/DiaryService.java | 10 --- .../diary/service/diary/DiaryServiceImpl.java | 70 ------------------ .../diary/service/mock/MockUserService.java | 12 --- .../log/diary/service/mock/UserService.java | 5 -- .../service/summary/TodaySummaryService.java | 11 --- .../summary/TodaySummaryServiceImpl.java | 46 ------------ .../log/elice/config/RestTemplateConfig.java | 14 ---- .../elice/service/ImageGenerationService.java | 58 --------------- .../com/bamboo/log/utils/ResponseHandler.java | 51 ------------- .../com/bamboo/log/utils/SecurityConfig.java | 23 ------ .../bamboo/log/utils/dto/DetailResponse.java | 13 ---- .../bamboo/log/utils/dto/ResponseForm.java | 21 ------ src/main/resources/application.yml | 14 +--- 23 files changed, 12 insertions(+), 505 deletions(-) delete mode 100644 src/main/java/com/bamboo/log/diary/api/DiaryController.java delete mode 100644 src/main/java/com/bamboo/log/diary/domain/Diary.java delete mode 100644 src/main/java/com/bamboo/log/diary/domain/TodaySummary.java delete mode 100644 src/main/java/com/bamboo/log/diary/dto/request/CreateDiaryRequest.java delete mode 100644 src/main/java/com/bamboo/log/diary/dto/response/CreateDiaryResponse.java delete mode 100644 src/main/java/com/bamboo/log/diary/repository/DiaryRepository.java delete mode 100644 src/main/java/com/bamboo/log/diary/repository/TodaySummaryRepository.java delete mode 100644 src/main/java/com/bamboo/log/diary/service/diary/DiaryService.java delete mode 100644 src/main/java/com/bamboo/log/diary/service/diary/DiaryServiceImpl.java delete mode 100644 src/main/java/com/bamboo/log/diary/service/mock/MockUserService.java delete mode 100644 src/main/java/com/bamboo/log/diary/service/mock/UserService.java delete mode 100644 src/main/java/com/bamboo/log/diary/service/summary/TodaySummaryService.java delete mode 100644 src/main/java/com/bamboo/log/diary/service/summary/TodaySummaryServiceImpl.java delete mode 100644 src/main/java/com/bamboo/log/elice/config/RestTemplateConfig.java delete mode 100644 src/main/java/com/bamboo/log/elice/service/ImageGenerationService.java delete mode 100644 src/main/java/com/bamboo/log/utils/ResponseHandler.java delete mode 100644 src/main/java/com/bamboo/log/utils/SecurityConfig.java delete mode 100644 src/main/java/com/bamboo/log/utils/dto/DetailResponse.java delete mode 100644 src/main/java/com/bamboo/log/utils/dto/ResponseForm.java diff --git a/.DS_Store b/.DS_Store index 5770197c32987a55423285d0d1e1dddc77abfd3b..dd46a9923d3511c0ddce67c1cc0fd4f8a0b2c125 100644 GIT binary patch delta 200 zcmZoMXfc=|#>B!ku~2NHo+2a9#(>?7iw`g}G4f32VJc>1pWMYH6UAu9z`(HVKNtX6 z3=FIcdJLHiDGaF$iJm$6$w@i+NkCBn1_s7yKpItL5<@9aZ4N^Us!9ekph~03B}|v) z*%>?-Tp4^A0)VFGqN`(kx7mVOo@p~X2R{eUotrl@e`lV|FXG6-$iTn^G=gDsgvc6Z E0A!UiL;wH) delta 71 zcmZoMXfc=|#>B)qu~2NHo+2a1#(>?7j2x4BSc)ezvYy!domGHoW5Wif&Fmcf96)88 Z1v$PmPv#eK { -} diff --git a/src/main/java/com/bamboo/log/diary/repository/TodaySummaryRepository.java b/src/main/java/com/bamboo/log/diary/repository/TodaySummaryRepository.java deleted file mode 100644 index 4093d83..0000000 --- a/src/main/java/com/bamboo/log/diary/repository/TodaySummaryRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.bamboo.log.diary.repository; - -import com.bamboo.log.diary.domain.TodaySummary; -import org.springframework.data.jpa.repository.JpaRepository; - -public interface TodaySummaryRepository extends JpaRepository { -} diff --git a/src/main/java/com/bamboo/log/diary/service/diary/DiaryService.java b/src/main/java/com/bamboo/log/diary/service/diary/DiaryService.java deleted file mode 100644 index 50cb4ac..0000000 --- a/src/main/java/com/bamboo/log/diary/service/diary/DiaryService.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.bamboo.log.diary.service.diary; - -import com.bamboo.log.diary.dto.request.CreateDiaryRequest; -import org.springframework.http.ResponseEntity; - -public interface DiaryService { - - ResponseEntity createDiary(CreateDiaryRequest createDiaryRequest); - -} diff --git a/src/main/java/com/bamboo/log/diary/service/diary/DiaryServiceImpl.java b/src/main/java/com/bamboo/log/diary/service/diary/DiaryServiceImpl.java deleted file mode 100644 index 5c201fd..0000000 --- a/src/main/java/com/bamboo/log/diary/service/diary/DiaryServiceImpl.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.bamboo.log.diary.service.diary; - -import com.bamboo.log.diary.domain.Diary; -import com.bamboo.log.diary.dto.request.CreateDiaryRequest; -import com.bamboo.log.diary.dto.response.CreateDiaryResponse; -import com.bamboo.log.diary.repository.DiaryRepository; -import com.bamboo.log.diary.repository.TodaySummaryRepository; -import com.bamboo.log.diary.service.mock.UserService; -import com.bamboo.log.diary.service.summary.TodaySummaryService; -import com.bamboo.log.utils.ResponseHandler; -import com.bamboo.log.utils.dto.ResponseForm; -import jakarta.persistence.EntityNotFoundException; -import lombok.RequiredArgsConstructor; -import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.io.IOException; -import java.time.LocalDateTime; - -@Service -@Transactional -@RequiredArgsConstructor -public class DiaryServiceImpl implements DiaryService { - - private final UserService userService; - private final DiaryRepository diaryRepository; - private final TodaySummaryService todaySummaryService; - - @Override - public ResponseEntity createDiary(CreateDiaryRequest createDiaryRequest) { - - // User ๊ฐ์ฒด ๊ฒ€์ฆ ๋กœ์ง - // ํ•ด๋‹น User ๊ฐ์ฒด ์ฐพ์„ ์ˆ˜ ์—†์„ ๊ฒฝ์šฐ, ์—๋Ÿฌ ๋ฐ˜ํ™˜ - if(userService.existsById(createDiaryRequest.userId())) { - return ResponseHandler.create404Error(new ResponseForm(), new EntityNotFoundException("์ž˜๋ชป๋œ ์œ ์ € ์ •๋ณด์ž…๋‹ˆ๋‹ค.")); - } - - // ํ•ด๋‹น ์‹œ์ ์˜ localDateTime ์ €์žฅ - LocalDateTime localDateTime = LocalDateTime.now(); - - // alice api ์—ฐ๊ฒฐ ํ•จ์ˆ˜ ํ˜ธ์ถœ - - // ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ - Diary diary = saveDiary(createDiaryRequest, localDateTime); - - byte[] todayImage = todaySummaryService.createTodaySummaryImage(createDiaryRequest.diaryDetail()); - - // todaySummaryImage ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ - try { - todaySummaryService.saveTodaySummaryImage(todayImage, diary.getId()); - } catch (IOException e) { - return ResponseHandler.create500Error(new ResponseForm(), e); - } - - // 201 code ๋ฐ˜ํ™˜ - return ResponseHandler.create201Response(new ResponseForm(), new CreateDiaryResponse(localDateTime)); - } - - private Diary saveDiary(CreateDiaryRequest createDiaryRequest, LocalDateTime localDateTime) { - Diary diary = Diary.builder() - .userId(createDiaryRequest.userId()) - .context(createDiaryRequest.diaryDetail()) - .createdAt(localDateTime) - .build(); - - return diaryRepository.save(diary); - } - -} diff --git a/src/main/java/com/bamboo/log/diary/service/mock/MockUserService.java b/src/main/java/com/bamboo/log/diary/service/mock/MockUserService.java deleted file mode 100644 index 86824f2..0000000 --- a/src/main/java/com/bamboo/log/diary/service/mock/MockUserService.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.bamboo.log.diary.service.mock; - -import org.springframework.stereotype.Service; - -@Service -public class MockUserService implements UserService { - - @Override - public boolean existsById(String userId) { - return true; - } -} diff --git a/src/main/java/com/bamboo/log/diary/service/mock/UserService.java b/src/main/java/com/bamboo/log/diary/service/mock/UserService.java deleted file mode 100644 index 0b37f9a..0000000 --- a/src/main/java/com/bamboo/log/diary/service/mock/UserService.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.bamboo.log.diary.service.mock; - -public interface UserService { - boolean existsById(String userId); -} diff --git a/src/main/java/com/bamboo/log/diary/service/summary/TodaySummaryService.java b/src/main/java/com/bamboo/log/diary/service/summary/TodaySummaryService.java deleted file mode 100644 index 598d786..0000000 --- a/src/main/java/com/bamboo/log/diary/service/summary/TodaySummaryService.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.bamboo.log.diary.service.summary; - -import org.springframework.web.multipart.MultipartFile; - -import java.io.IOException; - -public interface TodaySummaryService { - - void saveTodaySummaryImage(byte[] image, Long diaryId) throws IOException; - byte[] createTodaySummaryImage(String prompt); -} diff --git a/src/main/java/com/bamboo/log/diary/service/summary/TodaySummaryServiceImpl.java b/src/main/java/com/bamboo/log/diary/service/summary/TodaySummaryServiceImpl.java deleted file mode 100644 index 06df2dd..0000000 --- a/src/main/java/com/bamboo/log/diary/service/summary/TodaySummaryServiceImpl.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.bamboo.log.diary.service.summary; - -import com.bamboo.log.diary.domain.TodaySummary; -import com.bamboo.log.diary.repository.TodaySummaryRepository; -import com.bamboo.log.elice.service.ImageGenerationService; -import com.bamboo.log.utils.ResponseHandler; -import com.bamboo.log.utils.dto.ResponseForm; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.multipart.MultipartFile; - -import java.io.IOException; -import java.util.Optional; - -@Service -@Transactional -@RequiredArgsConstructor -public class TodaySummaryServiceImpl implements TodaySummaryService { - - private final TodaySummaryRepository todaySummaryRepository; - private final ImageGenerationService imageGenerationService; - - @Override - public void saveTodaySummaryImage(byte[] image, Long diaryId) throws IOException { - TodaySummary todaySummary = TodaySummary.builder() - .diaryId(diaryId) - .imageData(image) - .build(); - - todaySummaryRepository.save(todaySummary); - } - - @Override - public byte[] createTodaySummaryImage(String prompt) { - try { - byte[] imageBytes = imageGenerationService.generateImage(prompt); - - return imageBytes; - } catch (IOException e) { - throw new RuntimeException("์ด๋ฏธ์ง€ ์ƒ์„ฑ ์ค‘์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค."); - } - - } - -} diff --git a/src/main/java/com/bamboo/log/elice/config/RestTemplateConfig.java b/src/main/java/com/bamboo/log/elice/config/RestTemplateConfig.java deleted file mode 100644 index 0ea3f07..0000000 --- a/src/main/java/com/bamboo/log/elice/config/RestTemplateConfig.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.bamboo.log.elice.config; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.client.RestTemplate; - -@Configuration -public class RestTemplateConfig { - - @Bean - public RestTemplate restTemplate() { - return new RestTemplate(); - } -} diff --git a/src/main/java/com/bamboo/log/elice/service/ImageGenerationService.java b/src/main/java/com/bamboo/log/elice/service/ImageGenerationService.java deleted file mode 100644 index d7aa11b..0000000 --- a/src/main/java/com/bamboo/log/elice/service/ImageGenerationService.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.bamboo.log.elice.service; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.http.*; -import org.springframework.stereotype.Service; -import org.springframework.web.client.RestTemplate; - -import okhttp3.*; -import okhttp3.MediaType; - -import java.io.IOException; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -public class ImageGenerationService { - - private final RestTemplate restTemplate; - private final String apiKey; - private final String apiUrl; - - public ImageGenerationService(RestTemplate restTemplate, - @Value("${elice.api.token}") String apiKey, - @Value("${elice.api.url}") String apiUrl) { - this.restTemplate = restTemplate; - this.apiKey = apiKey; - this.apiUrl = apiUrl; - } - - public byte[] generateImage(String prompt) throws IOException { - OkHttpClient client = new OkHttpClient(); - - String requestBody = String.format("{\"prompt\":\"%s\",\"style\":\"polaroid\"}", prompt); - - MediaType mediaType = MediaType.parse("application/json"); - RequestBody body = RequestBody.create(requestBody, mediaType); - - Request request = new Request.Builder() - .url(apiUrl) - .post(body) - .addHeader("accept", "application/json") - .addHeader("content-type", "application/json") - .addHeader("Authorization", "Bearer " + apiKey) - .build(); - - Response response = client.newCall(request).execute(); - - if (!response.isSuccessful()) { - throw new IOException("์š”์ฒญ ์‹คํŒจ: " + response.code()); - } - - byte[] imageBytes = response.body().bytes(); // โœ… ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ๋ฅผ byte[]๋กœ ๋ณ€ํ™˜ - response.close(); - return imageBytes; - } -} - diff --git a/src/main/java/com/bamboo/log/utils/ResponseHandler.java b/src/main/java/com/bamboo/log/utils/ResponseHandler.java deleted file mode 100644 index c483a50..0000000 --- a/src/main/java/com/bamboo/log/utils/ResponseHandler.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.bamboo.log.utils; - -import com.bamboo.log.utils.dto.DetailResponse; -import com.bamboo.log.utils.dto.ResponseForm; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; - -public class ResponseHandler { - - public static ResponseEntity create500Error(ResponseForm response, Exception e) { - response.of("result", "FAIL"); - response.of("error", DetailResponse.builder().code(500).message(e.getMessage()).build()); - return new ResponseEntity(response, HttpStatus.INTERNAL_SERVER_ERROR); - } - - public static ResponseEntity create400Error(ResponseForm response, Exception e) { - response.of("result", "FAIL"); - response.of("error", DetailResponse.builder().code(400).message(e.getMessage()).build()); - - return new ResponseEntity(response, HttpStatus.BAD_REQUEST); - } - - public static ResponseEntity create404Error(ResponseForm response, Exception e) { - response.of("result", "FAIL"); - response.of("error", DetailResponse.builder().code(404).message(e.getMessage()).build()); - - return new ResponseEntity(response, HttpStatus.NOT_FOUND); - } - - public static ResponseEntity create204Response(ResponseForm response, String message) { - response.of("result", "SUCCESS"); - response.of("code", DetailResponse.builder().code(204).message(message).build()); - - return new ResponseEntity(response, HttpStatus.NO_CONTENT); - } - - public static ResponseEntity create200Response(ResponseForm response, Object object) { - response.of("result", "SUCCESS"); - response.of("code", object); - - return new ResponseEntity(response, HttpStatus.OK); - } - - public static ResponseEntity create201Response(ResponseForm response, Object object) { - response.of("result", "SUCCESS"); - response.of("code", object); - - return new ResponseEntity(response, HttpStatus.CREATED); - } - -} diff --git a/src/main/java/com/bamboo/log/utils/SecurityConfig.java b/src/main/java/com/bamboo/log/utils/SecurityConfig.java deleted file mode 100644 index 5d51eb4..0000000 --- a/src/main/java/com/bamboo/log/utils/SecurityConfig.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.bamboo.log.utils; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.web.SecurityFilterChain; - -@Configuration -@EnableWebSecurity -public class SecurityConfig { - @Bean - public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { - http - .csrf(csrf -> csrf.disable()) // CSRF ๋น„ํ™œ์„ฑํ™” - .authorizeHttpRequests(auth -> auth - .requestMatchers("/api/images/**").permitAll() // ์ด๋ฏธ์ง€ API ์ธ์ฆ ์—†์ด ํ—ˆ์šฉ - .anyRequest().authenticated() - ); - - return http.build(); - } -} diff --git a/src/main/java/com/bamboo/log/utils/dto/DetailResponse.java b/src/main/java/com/bamboo/log/utils/dto/DetailResponse.java deleted file mode 100644 index 61f22cf..0000000 --- a/src/main/java/com/bamboo/log/utils/dto/DetailResponse.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.bamboo.log.utils.dto; - -import lombok.Builder; -import lombok.Getter; - -@Builder -@Getter -public class DetailResponse { - - private Integer code; - private String message; - -} \ No newline at end of file diff --git a/src/main/java/com/bamboo/log/utils/dto/ResponseForm.java b/src/main/java/com/bamboo/log/utils/dto/ResponseForm.java deleted file mode 100644 index 04eccf6..0000000 --- a/src/main/java/com/bamboo/log/utils/dto/ResponseForm.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.bamboo.log.utils.dto; - -import lombok.Getter; - -import java.util.HashMap; -import java.util.Map; - -@Getter -public class ResponseForm { - - public ResponseForm() { - response = new HashMap<>(); - } - - public void of(String value1, Object value2) { - response.put(value1, value2); - } - - private Map response; - -} \ No newline at end of file diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 317cea6..356817f 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,23 +1,13 @@ spring: datasource: - driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://${MYSQL_HOST}:${MYSQL_PORT}/${MYSQL_NAME} username: ${MYSQL_USERNAME} password: ${MYSQL_PASSWORD} - + driver-class-name: com.mysql.cj.jdbc.Driver jpa: show-sql: true open-in-view: false hibernate: ddl-auto: update properties: - hibernate.dialect: org.hibernate.dialect.MySQL8Dialect - - -elice: - api: - token: ${API_TOKEN} - url: - face: ${FACE_API_URL} - img: ${IMG_API_URL} - chat: ${CHAT_API_URL} + hibernate.dialect: org.hibernate.dialect.MySQL8Dialect \ No newline at end of file