Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
118 commits
Select commit Hold shift + click to select a range
b7652ec
feat: add logback xml
ArcticFoox May 6, 2025
5e04d58
Merge pull request #113 from Auto-Review/feat/logback
ehgur062300 May 6, 2025
c2e1159
feat: add console log in dev
ArcticFoox May 7, 2025
bf6be7b
Merge pull request #114 from Auto-Review/fix/logback
ehgur062300 May 7, 2025
a93647a
feat: code post 공개 여부 기능 추가
ehgur062300 May 8, 2025
bc5ff76
Merge pull request #115 from Auto-Review/refactor/code-post
ArcticFoox May 8, 2025
a39e9af
refactor: code post 조회 시 응답 값에 댓글 및 리뷰 개수 포함
ehgur062300 May 8, 2025
3345cf4
Merge pull request #116 from Auto-Review/refactor/my
ehgur062300 May 8, 2025
62d59b1
fix: 단일 조회 시 결과값이 1개 이상인 문제 해결
ehgur062300 May 9, 2025
33df41b
Merge pull request #117 from Auto-Review/fix/find-post-detail
ehgur062300 May 9, 2025
7ace391
fix: change file path
ArcticFoox May 9, 2025
061c206
Merge pull request #118 from Auto-Review/fix/logback
ArcticFoox May 9, 2025
54caf53
feat: code post 북마크 기능 구현
ehgur062300 May 9, 2025
8cf061f
refactor: 응답값에 code post id 추가
ehgur062300 May 9, 2025
798e648
Merge pull request #119 from Auto-Review/feat/code-post-bookmark
ArcticFoox May 10, 2025
23af3c3
refactor: code post 섬네일 response dto 통일 및 description 요약 추가
ehgur062300 May 11, 2025
22e6c1a
Merge pull request #120 from Auto-Review/refactor/dto
ehgur062300 May 11, 2025
8be236f
feat: github 연동 기능 추가
ehgur062300 May 14, 2025
db30b34
chore: update submodule pointer for github config
ehgur062300 May 14, 2025
265b568
feat: github 연동 기능 추가
ehgur062300 May 14, 2025
7b58f03
Merge pull request #121 from Auto-Review/feat/github-token
ArcticFoox May 15, 2025
2f357ed
feat: github token 테이블 추가
ehgur062300 May 15, 2025
fa9f4a7
Merge pull request #123 from Auto-Review/feat/github-token
ehgur062300 May 15, 2025
c139ad5
style: 스크립트 파일 오타 수정
ehgur062300 May 15, 2025
ccc264e
feat: github push 기능 구현
ehgur062300 May 16, 2025
36b36ab
Merge pull request #124 from Auto-Review/feat/github-push
ArcticFoox May 16, 2025
3d298df
feat: 전체 조회 정렬 및 필터링 추가
ehgur062300 May 20, 2025
7ebeeec
Merge pull request #126 from Auto-Review/feat/sort
ehgur062300 May 20, 2025
2c723f9
refactor: github push 리팩토링
ehgur062300 May 20, 2025
3442ee4
refactor: 레이어 간 책임 분리 원칙에서 벗어날 여지 제거
ehgur062300 May 21, 2025
19a2f4e
Merge pull request #127 from Auto-Review/refactor/github
ArcticFoox May 21, 2025
4c38529
refactor: 코드 포스트 단일 조회 시 북마크 여부 추가
ehgur062300 Jun 1, 2025
1445574
Merge pull request #128 from Auto-Review/refactor/bookmark
ArcticFoox Jun 1, 2025
a573b35
refactor: 북마크 save or update 동시성 문제 해결
ehgur062300 Jun 1, 2025
ef0abdb
Merge pull request #131 from Auto-Review/refactor/bookmark
ehgur062300 Jun 1, 2025
f493c5b
style: 매개변수 순서 오류 수정
ehgur062300 Jun 1, 2025
d8a9196
Merge pull request #132 from Auto-Review/refactor/bookmark
ehgur062300 Jun 1, 2025
0166889
refactor: package 구조 변경 및 테스트 코드 추가
ehgur062300 Jun 5, 2025
dd04e75
refactor: code post bookmark 단일 & 통합 테스트 코드 작성
ehgur062300 Jun 5, 2025
e3ef7bc
refactor: repository 호출 -> command 호출로 변경
ehgur062300 Jun 7, 2025
c818150
refactor: code post service 단위 & 통합 테스트 작성
ehgur062300 Jun 8, 2025
ae45962
refactor: 테스트 코드 및 더티 체킹 문제 해결
ehgur062300 Jun 8, 2025
0475936
Merge pull request #136 from Auto-Review/refactor/layer
ehgur062300 Jun 8, 2025
4a68d32
refactor: 테스트 실행 전 yml 파일 복사
ehgur062300 Jun 9, 2025
5201d12
Merge pull request #137 from Auto-Review/refactor/layer
ehgur062300 Jun 9, 2025
6040db2
refactor: test 정상 동작을 위한 mySql 설치
ehgur062300 Jun 9, 2025
bee2741
Merge pull request #138 from Auto-Review/refactor/layer
ehgur062300 Jun 9, 2025
d2086f5
refactor: yml 경로 문제 해결
ehgur062300 Jun 9, 2025
2b3e54f
Merge pull request #139 from Auto-Review/refactor/layer
ehgur062300 Jun 9, 2025
20fe220
refactor: dir 없을 경우 생성하도록 수정
ehgur062300 Jun 9, 2025
01e2585
Merge pull request #140 from Auto-Review/refactor/layer
ehgur062300 Jun 9, 2025
f296ee9
refactor: ci test 빌드 수정
ehgur062300 Jun 9, 2025
50566f8
Merge pull request #141 from Auto-Review/refactor/layer
ehgur062300 Jun 9, 2025
b78ce8d
refactor: yml 파일 제대로 생성됐는지 확인
ehgur062300 Jun 9, 2025
5c13320
Merge pull request #142 from Auto-Review/refactor/layer
ehgur062300 Jun 9, 2025
bdf2d9e
refactor: yml 불러오는 방식을 base64 디코딩으로 변경
ehgur062300 Jun 9, 2025
287c41f
Merge pull request #143 from Auto-Review/refactor/layer
ehgur062300 Jun 9, 2025
8341b8c
feat: 검색 및 전체 조회 관련 api에 필터링 기능 추가
ehgur062300 Jun 9, 2025
ab1e49d
Merge pull request #144 from Auto-Review/refactor/code-post
ArcticFoox Jun 9, 2025
5830674
test: code post 댓글 테스트 작성
ehgur062300 Jun 12, 2025
7a80d60
refactor: git actions 가상 머신을 통해 테스트 성공 시도
ehgur062300 Jun 13, 2025
4dd5006
Merge pull request #145 from Auto-Review/test/comment
ehgur062300 Jun 13, 2025
c5a7ec5
refactor: git actions 가상 머신을 통해 테스트 성공 시도
ehgur062300 Jun 13, 2025
0e9d4c9
Merge pull request #146 from Auto-Review/test/comment
ehgur062300 Jun 13, 2025
ec82968
refactor: 오타 수정
ehgur062300 Jun 13, 2025
edf76ad
Merge pull request #147 from Auto-Review/test/comment
ehgur062300 Jun 13, 2025
5a13588
refactor: tcp 강제 지정
ehgur062300 Jun 13, 2025
b8e6f7e
Merge pull request #148 from Auto-Review/test/comment
ehgur062300 Jun 13, 2025
c38f3ad
refactor: test 실행 환경 적용
ehgur062300 Jun 13, 2025
617ab6d
Merge pull request #149 from Auto-Review/test/comment
ehgur062300 Jun 13, 2025
642a816
refactor: 테스트 yml 파일 복사
ehgur062300 Jun 13, 2025
41e9085
Merge pull request #150 from Auto-Review/test/comment
ehgur062300 Jun 13, 2025
617d78a
refactor: test 설정 파일 추가
ehgur062300 Jun 13, 2025
e4b3b66
Merge pull request #151 from Auto-Review/test/comment
ehgur062300 Jun 13, 2025
f594c8a
refactor: test active profile 설정 제거 및 ci.yml 추가
ehgur062300 Jun 13, 2025
f739f5b
Merge pull request #152 from Auto-Review/test/comment
ehgur062300 Jun 13, 2025
1172630
refactor: yml 파일 적용됐는지 테스트
ehgur062300 Jun 14, 2025
606290c
Merge pull request #153 from Auto-Review/test/comment
ehgur062300 Jun 14, 2025
f3b1da1
refactor: test 시 submodule 에 접근하기 위한 토큰 사용 추가
ehgur062300 Jun 14, 2025
a75ab4c
Merge pull request #154 from Auto-Review/test/comment
ehgur062300 Jun 14, 2025
edbde7d
fix: add logback file in ci
ArcticFoox Jun 15, 2025
7f98749
Merge pull request #155 from Auto-Review/fix/logback
ArcticFoox Jun 15, 2025
63de329
refactor: test 실행 시 fcm 설정 파일 생성이 없어서 발생한 문제 해결
ehgur062300 Jun 15, 2025
8eaadf9
Merge pull request #156 from Auto-Review/test/comment
ehgur062300 Jun 15, 2025
51c4a40
refactor: test 실행 코드 중복 해결
ehgur062300 Jun 15, 2025
1f4fecf
Merge pull request #157 from Auto-Review/test/comment
ehgur062300 Jun 15, 2025
099fcfc
fix: change log file name for rolling policies
ArcticFoox Jun 15, 2025
93c9387
Merge pull request #158 from Auto-Review/fix/logback
ArcticFoox Jun 15, 2025
2a34b4a
fix: change log file name for rolling policies &i and exclude commons…
ArcticFoox Jun 15, 2025
7144329
Merge pull request #159 from Auto-Review/fix/logback
ArcticFoox Jun 15, 2025
77273c9
feat: connect volume ec2 and spring docker container
ArcticFoox Jun 16, 2025
2c579f4
Merge pull request #162 from Auto-Review/fix/logback
ArcticFoox Jun 16, 2025
b2e806e
refactor: 테스트 환경 설정 방식 변경
ehgur062300 Jun 17, 2025
4c8321e
Merge pull request #165 from Auto-Review/refactor/test
ehgur062300 Jun 17, 2025
1f921be
refactor: 북마크 전체 조회 시 작성자 정보 오류 수정
ehgur062300 Jun 17, 2025
3b4cc9b
Merge pull request #166 from Auto-Review/refactor/bookmark-list
ehgur062300 Jun 17, 2025
88c58f3
refactor: save or update 메서드 Upsert 기능으로 구현
ehgur062300 Jun 17, 2025
d08eb32
refactor: 테스트 코드 변경 사항 다시 적용
ehgur062300 Jun 17, 2025
6c84353
refactor: 테스트 환경 설정 방식 변경
ehgur062300 Jun 17, 2025
0b832ca
Merge pull request #164 from Auto-Review/refactor/bookmark
ArcticFoox Jun 17, 2025
d324873
refactor: 북마크 전체 조회 수정
ehgur062300 Jun 18, 2025
0c58e3b
Merge pull request #168 from Auto-Review/refactor/bookmark
ehgur062300 Jun 18, 2025
3e2c669
refactor: 북마크 스키마 구조 변경
ehgur062300 Jun 18, 2025
7001f0d
Merge pull request #170 from Auto-Review/refactor/bookmark
ArcticFoox Jun 18, 2025
7774b49
refactor: 북마크 스키마 구조 변경에 따른 테스트 코드 수정
ehgur062300 Jun 18, 2025
7310eee
Merge pull request #171 from Auto-Review/refactor/bookmark
ehgur062300 Jun 18, 2025
0d3bcb5
refactor: flyway 중복 실행 방지 및 회원 외래키 삭제
ehgur062300 Jun 19, 2025
b7623fe
Merge pull request #172 from Auto-Review/test/comment
ehgur062300 Jun 19, 2025
b23bfd3
refactor: changed file name
ArcticFoox Jun 29, 2025
49599c9
Merge pull request #173 from Auto-Review/refactor/logback
ArcticFoox Jun 29, 2025
3429a9d
refactor: flyway version upgrade
ehgur062300 Jul 1, 2025
ad75c8b
Merge pull request #176 from Auto-Review/refactor/flyway
ehgur062300 Jul 1, 2025
2913d11
feat: delete API 구현
ehgur062300 Jul 3, 2025
18675ab
refactor: FcmToken 저장 동시성 처리
ehgur062300 Jul 4, 2025
63944aa
Merge pull request #178 from Auto-Review/feat/fcm
ArcticFoox Jul 4, 2025
2a1e139
refactor: FcmToken 도메인 구조 변경
ehgur062300 Jul 4, 2025
c84895d
refactor: 중복 토큰 저장 시 예외 처리
ehgur062300 Jul 4, 2025
83ac4ce
Merge pull request #180 from Auto-Review/refactor/fcm
ArcticFoox Jul 4, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
97 changes: 89 additions & 8 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,89 @@ on:
- main

jobs:
test:
runs-on: ubuntu-latest

services:
mysql:
image: mysql:8.0
ports:
- 3306:3306
env:
MYSQL_ROOT_PASSWORD: ${{ secrets.TEST_DB_PASSWORD}}
MYSQL_DATABASE: test
MYSQL_USER: tester
MYSQL_PASSWORD: ${{ secrets.TEST_DB_PASSWORD}}
options: >-
--health-cmd "mysqladmin ping -h localhost"
--health-interval 10s
--health-timeout 5s
--health-retries 5

redis:
image: redis:7.0
ports:
- 6379:6379
options: >-
--health-cmd "redis-cli ping"
--health-interval 10s
--health-timeout 5s
--health-retries 5

steps:
- uses: actions/checkout@v3
with:
fetch-depth: 0
submodules: 'recursive'
token: ${{ secrets.ACTION_TOKEN }}

- name: MySQL 연결 확인
run: |
sudo apt-get update && sudo apt-get install -y mysql-client
mysql -h127.0.0.1 -P3306 -utester -p${{ secrets.TEST_DB_PASSWORD }} -e "SHOW DATABASES;"

- name: Redis 연결 확인
run: |
sudo apt-get update && sudo apt-get install -y redis-tools
redis-cli -h localhost ping

- name: Copy private ci resources
run: ./gradlew copyCiYml --no-daemon

- name: Create Firebase JSON file
run: |
echo '{
"type": "${{ secrets.FIREBASE_TYPE }}",
"project_id": "${{ secrets.FIREBASE_PROJECT_ID }}",
"private_key_id": "${{ secrets.FIREBASE_PRIVATE_KEY_ID }}",
"private_key": "${{ secrets.FIREBASE_PRIVATE_KEY }}",
"client_email": "${{ secrets.FIREBASE_CLIENT_EMAIL }}",
"client_id": "${{ secrets.FIREBASE_CLIENT_ID }}",
"auth_uri": "${{ secrets.FIREBASE_AUTH_URI }}",
"token_uri": "${{ secrets.FIREBASE_TOKEN_URI }}",
"auth_provider_x509_cert_url": "${{ secrets.FIREBASE_AUTH_PROVIDER_CERT_URL }}",
"client_x509_cert_url": "${{ secrets.FIREBASE_CLIENT_CERT_URL }}",
"universe_domain": "${{ secrets.FIREBASE_UNIVERSE_DOMAIN }}"
}' > src/main/resources/ori-push-notification-firebase-adminsdk-k9qqe-d0581b0c52.json

- name: 테스트 실행
run: ./gradlew test
env:
SPRING_PROFILES_ACTIVE: ci
DB_HOST: 127.0.0.1
DB_PORT: 3306
DB_NAME: test
DB_USER: tester
DB_PASSWORD: ${{ secrets.TEST_DB_PASSWORD }}
REDIS_HOST: 127.0.0.1
REDIS_PORT: 6379

- name: Grant execute permission for gradlew
run: chmod +x ./gradlew

- name: 어플리케이션 실행 테스트(테스트 코드 제외하고 실행)
run: ./gradlew clean build --exclude-task test

build:
name: Run on Ubuntu
runs-on: ubuntu-latest
Expand All @@ -28,8 +111,10 @@ jobs:
run: chmod +x ./gradlew

- name: Copy private resources
run: |
./gradlew copyYml --no-daemon
run: ./gradlew copyYml --no-daemon

- name: Copy private logback config
run: ./gradlew copyLog --no-daemon

- name: Create Firebase JSON file
run: |
Expand Down Expand Up @@ -58,7 +143,6 @@ jobs:
if: github.ref == 'refs/heads/main'
run: docker build . --tag ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPOSITORY_NAME }}:prod -f Dockerfile.prod


- name: Push Dev Docker image
if: github.ref == 'refs/heads/dev'
run: |
Expand All @@ -70,7 +154,6 @@ jobs:
run: |
echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin
docker push ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPOSITORY_NAME }}:prod


deploy:
runs-on: ubuntu-latest
Expand All @@ -95,11 +178,10 @@ jobs:
username: ${{ secrets.DEV_USERNAME }}
key: ${{ secrets.DEV_PRIVATE_KEY }}
script: |
# 도커 컨테이너 재배포
sudo docker stop ${{ secrets.DOCKER_CONTAINER_NAME }}
sudo docker rm ${{ secrets.DOCKER_CONTAINER_NAME }}
sudo docker rmi ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPOSITORY_NAME }}:dev
sudo docker run -d --name ${{ secrets.DOCKER_CONTAINER_NAME }} --network ${{ secrets.DOCKER_NETWORK_NAME }} -p 8080:8080 ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPOSITORY_NAME }}:dev
sudo docker run -d --name ${{ secrets.DOCKER_CONTAINER_NAME }} --volume /ori/log:/ori/log --network ${{ secrets.DOCKER_NETWORK_NAME }} -p 8080:8080 ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPOSITORY_NAME }}:dev

- name: Deploy to Main Server
if: github.ref == 'refs/heads/main'
Expand All @@ -109,8 +191,7 @@ jobs:
username: ${{ secrets.PROD_USERNAME }}
key: ${{ secrets.PROD_PRIVATE_KEY }}
script: |
# 도커 컨테이너 재배포
sudo docker stop ${{ secrets.DOCKER_CONTAINER_NAME }}
sudo docker rm ${{ secrets.DOCKER_CONTAINER_NAME }}
sudo docker rmi ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPOSITORY_NAME }}:prod
sudo docker run -d --name ${{ secrets.DOCKER_CONTAINER_NAME }} --network ${{ secrets.DOCKER_NETWORK_NAME }} -p 8080:8080 ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPOSITORY_NAME }}:prod
sudo docker run -d --name ${{ secrets.DOCKER_CONTAINER_NAME }} --network ${{ secrets.DOCKER_NETWORK_NAME }} -p 8080:8080 ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPOSITORY_NAME }}:prod
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ out/
### YAML Settings ###
/src/main/resources/*.yml
/src/test/resources/application-test.yml
/src/main/resources/logback-spring.xml

### VS Code ###
.vscode/
Expand Down
26 changes: 23 additions & 3 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ plugins {
id 'java'
id 'org.springframework.boot' version '3.3.4'
id 'io.spring.dependency-management' version '1.1.6'
id 'org.flywaydb.flyway' version '8.5.13'
id 'org.flywaydb.flyway' version '11.10.0'
}

group = 'org.example'
Expand All @@ -26,9 +26,12 @@ repositories {

dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation ('org.springframework.boot:spring-boot-starter-web') {
exclude module: 'commons-logging'
}
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.6.0'
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.boot:spring-boot-starter-webflux'

implementation 'org.springframework.boot:spring-boot-starter-data-redis'

Expand All @@ -44,11 +47,14 @@ dependencies {
implementation 'io.micrometer:micrometer-registry-prometheus'

// Flyway 라이브러리 사용을 위한 기본적인 의존성 추가
implementation 'org.flywaydb:flyway-core'
implementation 'org.flywaydb:flyway-core:11.10.0'

// MySQL 을 사용해야한다면 추가
implementation 'org.flywaydb:flyway-mysql'

// Github API 사용을 위해 추가
implementation 'org.kohsuke:github-api:1.327'


compileOnly 'org.projectlombok:lombok'
runtimeOnly 'com.mysql:mysql-connector-j'
Expand All @@ -68,3 +74,17 @@ tasks.register('copyYml', Copy) {
into 'src/main/resources'
}
}

tasks.register('copyCiYml', Copy) {
from 'security_setting'
include 'application-ci.yml'
into 'src/test/resources'
}

tasks.register('copyLog', Copy) {
copy {
from 'security_setting'
include "logback-spring.xml"
into 'src/main/resources'
}
}
2 changes: 1 addition & 1 deletion security_setting
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package org.example.autoreview.domain.bookmark.CodePostBookmark.controller;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.example.autoreview.domain.bookmark.CodePostBookmark.dto.request.CodePostBookmarkSaveRequestDto;
import org.example.autoreview.domain.bookmark.CodePostBookmark.dto.response.CodePostBookmarkListResponseDto;
import org.example.autoreview.domain.bookmark.CodePostBookmark.service.CodePostBookmarkService;
import org.springframework.data.domain.Pageable;
import org.springframework.data.web.PageableDefault;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@Tag(name = "Code Post Bookmark API", description = "Code Post Bookmark API")
@RequiredArgsConstructor
@RestController
@RequestMapping("/v1/api/post/code/bookmark")
public class CodePostBookmarkController {

private final CodePostBookmarkService codePostBookmarkService;

@Operation(summary = "북마크 저장 또는 수정", description = "soft delete 되었다면 수정, 존재하지 않는다면 저장")
@PutMapping
public ResponseEntity<Long> saveOrUpdate(@RequestBody CodePostBookmarkSaveRequestDto requestDto,
@AuthenticationPrincipal UserDetails userDetails) {
return ResponseEntity.ok().body(codePostBookmarkService.saveOrUpdate(requestDto, userDetails.getUsername()));
}

@Operation(summary = "북마크 전체 조회")
@GetMapping("/list")
public ResponseEntity<CodePostBookmarkListResponseDto> findAll(@AuthenticationPrincipal UserDetails userDetails,
@PageableDefault(page = 0, size = 10) Pageable pageable) {
return ResponseEntity.ok().body(codePostBookmarkService.findAllByEmail(userDetails.getUsername(), pageable));
}

@Operation(summary = "북마크 삭제")
@DeleteMapping
public ResponseEntity<String> deleteExpiredSoftDeletedBookmarks() {
codePostBookmarkService.deleteExpiredSoftDeletedBookmarks();
return ResponseEntity.ok().body("Success Hard Delete");
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package org.example.autoreview.domain.bookmark.CodePostBookmark.dto.request;

import io.swagger.v3.oas.annotations.media.Schema;

public record CodePostBookmarkSaveRequestDto(

@Schema(description = "코드 포스트 아이디", example = "1")
Long codePostId
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package org.example.autoreview.domain.bookmark.CodePostBookmark.dto.response;

import java.util.List;

public record CodePostBookmarkListResponseDto(
List<CodePostBookmarkResponseDto> dtoList,
int totalPage
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package org.example.autoreview.domain.bookmark.CodePostBookmark.dto.response;

import java.time.LocalDateTime;
import lombok.Getter;
import org.example.autoreview.domain.bookmark.CodePostBookmark.entity.CodePostBookmark;
import org.example.autoreview.domain.codepost.entity.CodePost;
import org.example.autoreview.domain.member.entity.Member;

@Getter
public class CodePostBookmarkResponseDto {

private final Long id;
private final Long codePostId;
private final String codePostTitle;
private final int commentCount;
private final String writer;
private final LocalDateTime updateAt;

public CodePostBookmarkResponseDto(CodePostBookmark bookmark, CodePost codePost, Member member) {
this.id = bookmark.getId();
this.codePostId = codePost.getId();
this.codePostTitle = codePost.getTitle();
this.commentCount = codePost.getCodePostCommentList().size();
this.writer = member.getNickname();
this.updateAt = bookmark.getUpdateDate();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package org.example.autoreview.domain.bookmark.CodePostBookmark.entity;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import jakarta.persistence.UniqueConstraint;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.example.autoreview.global.common.basetime.BaseEntity;
import org.hibernate.annotations.ColumnDefault;

@Getter
@NoArgsConstructor
@Table(uniqueConstraints = {@UniqueConstraint(name = "uq_email_codepost",
columnNames = {"email", "code_post_id"})}
)
@Entity
public class CodePostBookmark extends BaseEntity {

@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(nullable = false)
private String email;

@Column(nullable = false)
private Long codePostId;

@ColumnDefault("false")
@Column(nullable = false)
private boolean isDeleted;

@Builder
public CodePostBookmark(Long codePostId, String email, boolean isDeleted) {
this.codePostId = codePostId;
this.email = email;
this.isDeleted = isDeleted;
}

public Long update() {
this.isDeleted = !this.isDeleted;
return this.id;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package org.example.autoreview.domain.bookmark.CodePostBookmark.entity;

import io.lettuce.core.dynamic.annotation.Param;
import java.util.Optional;
import org.example.autoreview.domain.bookmark.CodePostBookmark.dto.response.CodePostBookmarkResponseDto;
import org.springframework.data.domain.Page;
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;

public interface CodePostBookmarkRepository extends JpaRepository<CodePostBookmark,Long> {

@Modifying
@Query(
value = " INSERT INTO code_post_bookmark (email, code_post_id, is_deleted, create_date, update_date) " +
" VALUES (:email, :codePostId, false, NOW(), NOW()) " +
" ON DUPLICATE KEY UPDATE is_deleted = NOT is_deleted, update_date = NOW() ",
nativeQuery = true
)
void upsert(@Param("email") String email, @Param("codePostId") Long codePostId);


@Query("SELECT b FROM CodePostBookmark b WHERE b.email = :email AND b.codePostId = :codePostId")
Optional<CodePostBookmark> findById(@Param("email") String email, @Param("codePostId") Long codePostId);

@Query("SELECT new org.example.autoreview.domain.bookmark.CodePostBookmark.dto.response.CodePostBookmarkResponseDto(b,c,m) from CodePostBookmark b "
+ "JOIN CodePost c ON b.codePostId = c.id JOIN Member m ON m.id = c.writerId WHERE b.isDeleted = FALSE AND b.email = :email")
Page<CodePostBookmarkResponseDto> findAllByEmail(@Param("email") String email, Pageable pageable);

@Modifying
@Query("DELETE FROM CodePostBookmark b WHERE b.isDeleted = TRUE")
void deleteExpiredSoftDeletedBookmarks();
}
Loading