From 77c9c04233d4af107a77705709e5afa9cfeb739c Mon Sep 17 00:00:00 2001 From: eeddiinn Date: Tue, 9 Jan 2024 20:38:50 +0900 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=80=20[MERGE]=20=EA=B9=83=20=EC=B6=A9?= =?UTF-8?q?=EB=8F=8C=20=EC=98=A4=EB=A5=98=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/CD.yml | 3 +- .../java/org/sopt/lequuServer/InitDb.java | 40 ++++++++++++++----- .../member/controller/MemberController.java | 14 ++++++- .../dto/request/MemberNicknameRequestDto.java | 11 +++++ .../response/MemberNicknameResponseDto.java | 7 ++++ .../domain/member/model/Member.java | 4 ++ .../domain/member/service/MemberService.java | 10 +++++ .../domain/note/facade/NoteFacade.java | 11 ++++- .../domain/sticker/model/StickerCategory.java | 3 +- .../lequuServer/global/config/WebConfig.java | 2 +- 10 files changed, 90 insertions(+), 15 deletions(-) create mode 100644 src/main/java/org/sopt/lequuServer/domain/member/dto/request/MemberNicknameRequestDto.java create mode 100644 src/main/java/org/sopt/lequuServer/domain/member/dto/response/MemberNicknameResponseDto.java diff --git a/.github/workflows/CD.yml b/.github/workflows/CD.yml index b9281dd..364822c 100644 --- a/.github/workflows/CD.yml +++ b/.github/workflows/CD.yml @@ -71,4 +71,5 @@ jobs: key: ${{ secrets.RELEASE_SERVER_KEY }} script: | cd ~ - ./deploy.sh \ No newline at end of file + ./deploy.sh + docker image prune -f \ No newline at end of file diff --git a/src/main/java/org/sopt/lequuServer/InitDb.java b/src/main/java/org/sopt/lequuServer/InitDb.java index c6bc1df..d01ce21 100644 --- a/src/main/java/org/sopt/lequuServer/InitDb.java +++ b/src/main/java/org/sopt/lequuServer/InitDb.java @@ -12,8 +12,10 @@ import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; -import static org.sopt.lequuServer.domain.sticker.model.StickerCategory.ALPHABET; -import static org.sopt.lequuServer.domain.sticker.model.StickerCategory.BIRTHDAY; +import java.util.Arrays; +import java.util.List; + +import static org.sopt.lequuServer.domain.sticker.model.StickerCategory.*; @Component @RequiredArgsConstructor @@ -25,6 +27,15 @@ public void init() { initService.dbInit(); } + private static final List CHARACTER_STICKERS = Arrays.asList( + "https://lequu-server-bucket.s3.ap-northeast-2.amazonaws.com/stickers/8d83b1c1-1e2c-437b-a2f5-e3ce96ce6d35.jpg", + "https://lequu-server-bucket.s3.ap-northeast-2.amazonaws.com/stickers/0215b8a5-d7a1-40c3-b291-5174b1747074.jpg", + "https://lequu-server-bucket.s3.ap-northeast-2.amazonaws.com/stickers/c446705f-d96f-4cef-b490-62979fc52cd9.jpg", + "https://lequu-server-bucket.s3.ap-northeast-2.amazonaws.com/stickers/1d8ac983-4862-4687-b27a-324a4ecb8ae6.jpg", + "https://lequu-server-bucket.s3.ap-northeast-2.amazonaws.com/stickers/ea9a990a-e6e5-4789-9911-a967095d3cdc.jpg", + "https://lequu-server-bucket.s3.ap-northeast-2.amazonaws.com/stickers/38e4509e-61ba-42e7-a823-8b379c1be022.jpg" + ); + @Component @Transactional @RequiredArgsConstructor @@ -44,7 +55,7 @@ public void dbInit() { Book book1 = Book.builder() .uuid("ee4f66f9-9cf4-4b28-90f4-f71d0ecba021") .favoriteName("LeoJ") - .favoriteImage("https://lequu-server-bucket.s3.ap-northeast-2.amazonaws.com/b4006561-382b-479e-ae1d-e841922e883f.jpg") + .favoriteImage("https://lequu-server-bucket.s3.ap-northeast-2.amazonaws.com/books/favorite_image/b4006561-382b-479e-ae1d-e841922e883f.jpg") .title("1번째 레큐북") .description("레큐북의 내용입니다!") .backgroundColor(1) @@ -56,7 +67,7 @@ public void dbInit() { Book book = Book.builder() .uuid("ee4f66f9-9cf4-4b28-90f4-f71d0ecba02" + String.valueOf(i + 1)) .favoriteName("LeoJ") - .favoriteImage("https://lequu-server-bucket.s3.ap-northeast-2.amazonaws.com/b4006561-382b-479e-ae1d-e841922e883f.jpg") + .favoriteImage("https://lequu-server-bucket.s3.ap-northeast-2.amazonaws.com/books/favorite_image/b4006561-382b-479e-ae1d-e841922e883f.jpg") .title(String.valueOf(i + 1) + "번째 레큐북") .description("레큐북의 내용입니다!") .backgroundColor(1) @@ -69,7 +80,7 @@ public void dbInit() { for (int i = 0; i < 3; i++) { Note note = Note.builder() .content("레큐노트 내용입니다 블라블라블라 블라블라블라 블라블라블라 블라블라블라 블라블라블라 블라블라블라 블라블라블라") - .background("https://lequu-server-bucket.s3.ap-northeast-2.amazonaws.com/676c2ca3-f868-423f-8000-a0bcb67dc797.jpg") + .background("https://lequu-server-bucket.s3.ap-northeast-2.amazonaws.com/notes/background_image/676c2ca3-f868-423f-8000-a0bcb67dc797.jpg") .textColor(i) .member(member1) .book(book1) @@ -90,14 +101,14 @@ public void dbInit() { Sticker sticker1 = Sticker.builder() .bookId(0L) .category(ALPHABET) - .stickerImage("https://lequu-server-bucket.s3.ap-northeast-2.amazonaws.com/8d83b1c1-1e2c-437b-a2f5-e3ce96ce6d35.jpg") + .stickerImage("https://lequu-server-bucket.s3.ap-northeast-2.amazonaws.com/stickers/8d83b1c1-1e2c-437b-a2f5-e3ce96ce6d35.jpg") .build(); em.persist(sticker1); for (int i = 0; i < 3; i++) { Sticker sticker = Sticker.builder() .bookId(0L) .category(ALPHABET) - .stickerImage("https://lequu-server-bucket.s3.ap-northeast-2.amazonaws.com/8d83b1c1-1e2c-437b-a2f5-e3ce96ce6d35.jpg") + .stickerImage("https://lequu-server-bucket.s3.ap-northeast-2.amazonaws.com/stickers/8d83b1c1-1e2c-437b-a2f5-e3ce96ce6d35.jpg") .build(); em.persist(sticker); } @@ -105,15 +116,24 @@ public void dbInit() { Sticker sticker = Sticker.builder() .bookId(0L) .category(BIRTHDAY) - .stickerImage("https://lequu-server-bucket.s3.ap-northeast-2.amazonaws.com/8d83b1c1-1e2c-437b-a2f5-e3ce96ce6d35.jpg") + .stickerImage("https://lequu-server-bucket.s3.ap-northeast-2.amazonaws.com/stickers/8d83b1c1-1e2c-437b-a2f5-e3ce96ce6d35.jpg") + .build(); + em.persist(sticker); + } + for (String characterSticker : CHARACTER_STICKERS) { + Sticker sticker = Sticker.builder() + .bookId(0L) + .category(CHARACTER) + .stickerImage(characterSticker) .build(); em.persist(sticker); } + for (int i = 0; i < 2; i++) { Sticker sticker = Sticker.builder() .bookId(1L) .category(ALPHABET) - .stickerImage("https://lequu-server-bucket.s3.ap-northeast-2.amazonaws.com/8d83b1c1-1e2c-437b-a2f5-e3ce96ce6d35.jpg") + .stickerImage("https://lequu-server-bucket.s3.ap-northeast-2.amazonaws.com/stickers/8d83b1c1-1e2c-437b-a2f5-e3ce96ce6d35.jpg") .build(); em.persist(sticker); } @@ -121,7 +141,7 @@ public void dbInit() { Sticker sticker = Sticker.builder() .bookId(1L) .category(BIRTHDAY) - .stickerImage("https://lequu-server-bucket.s3.ap-northeast-2.amazonaws.com/8d83b1c1-1e2c-437b-a2f5-e3ce96ce6d35.jpg") + .stickerImage("https://lequu-server-bucket.s3.ap-northeast-2.amazonaws.com/stickers/8d83b1c1-1e2c-437b-a2f5-e3ce96ce6d35.jpg") .build(); em.persist(sticker); } diff --git a/src/main/java/org/sopt/lequuServer/domain/member/controller/MemberController.java b/src/main/java/org/sopt/lequuServer/domain/member/controller/MemberController.java index 19a10ec..79a8279 100644 --- a/src/main/java/org/sopt/lequuServer/domain/member/controller/MemberController.java +++ b/src/main/java/org/sopt/lequuServer/domain/member/controller/MemberController.java @@ -1,8 +1,11 @@ package org.sopt.lequuServer.domain.member.controller; +import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; +import org.sopt.lequuServer.domain.member.dto.request.MemberNicknameRequestDto; import org.sopt.lequuServer.domain.member.dto.request.SocialLoginRequestDto; import org.sopt.lequuServer.domain.member.dto.response.MemberLoginResponseDto; +import org.sopt.lequuServer.domain.member.dto.response.MemberNicknameResponseDto; import org.sopt.lequuServer.domain.member.service.MemberService; import org.sopt.lequuServer.global.auth.fegin.kakao.KakaoLoginService; import org.sopt.lequuServer.global.auth.jwt.JwtProvider; @@ -14,6 +17,8 @@ import java.security.Principal; +import static org.sopt.lequuServer.global.exception.enums.SuccessType.SET_MEMBER_NICKNAME_SUCCESS; + @RestController @RequestMapping("/api") @RequiredArgsConstructor @@ -54,4 +59,11 @@ public ApiResponse kakaoAccessToken( return ApiResponse.success(SuccessType.KAKAO_ACCESS_TOKEN_SUCCESS, kakaoLoginService.getKakaoAccessToken(code)); } -} + + @PatchMapping("/nickname") + @ResponseStatus(HttpStatus.OK) + public ApiResponse setMemberNickname(Principal principal, @Valid @RequestBody MemberNicknameRequestDto request) { + + return ApiResponse.success(SET_MEMBER_NICKNAME_SUCCESS, memberService.setMemberNickname(JwtProvider.getUserFromPrincial(principal), request)); + } +} \ No newline at end of file diff --git a/src/main/java/org/sopt/lequuServer/domain/member/dto/request/MemberNicknameRequestDto.java b/src/main/java/org/sopt/lequuServer/domain/member/dto/request/MemberNicknameRequestDto.java new file mode 100644 index 0000000..b3c6d7b --- /dev/null +++ b/src/main/java/org/sopt/lequuServer/domain/member/dto/request/MemberNicknameRequestDto.java @@ -0,0 +1,11 @@ +package org.sopt.lequuServer.domain.member.dto.request; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Size; + +public record MemberNicknameRequestDto( + @NotBlank + @Size(min = 1, max = 8, message = "닉네임은 1글자 이상 8글자 이하여야합니다.") + String nickname +) { +} \ No newline at end of file diff --git a/src/main/java/org/sopt/lequuServer/domain/member/dto/response/MemberNicknameResponseDto.java b/src/main/java/org/sopt/lequuServer/domain/member/dto/response/MemberNicknameResponseDto.java new file mode 100644 index 0000000..8684bb1 --- /dev/null +++ b/src/main/java/org/sopt/lequuServer/domain/member/dto/response/MemberNicknameResponseDto.java @@ -0,0 +1,7 @@ +package org.sopt.lequuServer.domain.member.dto.response; + +public record MemberNicknameResponseDto(Long memberId) { + public static MemberNicknameResponseDto of(Long userId) { + return new MemberNicknameResponseDto(userId); + } +} \ No newline at end of file diff --git a/src/main/java/org/sopt/lequuServer/domain/member/model/Member.java b/src/main/java/org/sopt/lequuServer/domain/member/model/Member.java index d96bd53..3d97c97 100644 --- a/src/main/java/org/sopt/lequuServer/domain/member/model/Member.java +++ b/src/main/java/org/sopt/lequuServer/domain/member/model/Member.java @@ -23,6 +23,10 @@ public class Member extends BaseTimeEntity { private String nickname; + public void updateNickname(String nickname) { + this.nickname = nickname; + } + /** * 소셜 로그인 관련 */ diff --git a/src/main/java/org/sopt/lequuServer/domain/member/service/MemberService.java b/src/main/java/org/sopt/lequuServer/domain/member/service/MemberService.java index afa24fb..6f745e8 100644 --- a/src/main/java/org/sopt/lequuServer/domain/member/service/MemberService.java +++ b/src/main/java/org/sopt/lequuServer/domain/member/service/MemberService.java @@ -1,8 +1,10 @@ package org.sopt.lequuServer.domain.member.service; import lombok.RequiredArgsConstructor; +import org.sopt.lequuServer.domain.member.dto.request.MemberNicknameRequestDto; import org.sopt.lequuServer.domain.member.dto.request.SocialLoginRequestDto; import org.sopt.lequuServer.domain.member.dto.response.MemberLoginResponseDto; +import org.sopt.lequuServer.domain.member.dto.response.MemberNicknameResponseDto; import org.sopt.lequuServer.domain.member.model.Member; import org.sopt.lequuServer.domain.member.model.SocialPlatform; import org.sopt.lequuServer.domain.member.repository.MemberRepository; @@ -100,4 +102,12 @@ private static String parseTokenString(String tokenString) { } return strings[1]; } + + @Transactional + public MemberNicknameResponseDto setMemberNickname(Long memberId, MemberNicknameRequestDto request) { + Member member = memberRepository.findByIdOrThrow(memberId); + member.updateNickname(request.nickname()); + + return MemberNicknameResponseDto.of(memberId); + } } \ No newline at end of file diff --git a/src/main/java/org/sopt/lequuServer/domain/note/facade/NoteFacade.java b/src/main/java/org/sopt/lequuServer/domain/note/facade/NoteFacade.java index 77e31ce..49d437c 100644 --- a/src/main/java/org/sopt/lequuServer/domain/note/facade/NoteFacade.java +++ b/src/main/java/org/sopt/lequuServer/domain/note/facade/NoteFacade.java @@ -9,9 +9,12 @@ import org.sopt.lequuServer.domain.note.dto.response.NoteResponseDto; import org.sopt.lequuServer.domain.note.model.Note; import org.sopt.lequuServer.domain.note.service.NoteService; +import org.sopt.lequuServer.global.s3.service.S3Service; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import static org.sopt.lequuServer.global.s3.enums.ImageFolderName.NOTE_BACKGROUND_IMAGE_FOLDER_NAME; + @Service @RequiredArgsConstructor @Transactional(readOnly = true) @@ -20,11 +23,17 @@ public class NoteFacade { private final MemberRepository memberRepository; private final BookRepository bookRepository; private final NoteService noteService; + private final S3Service s3Service; public NoteResponseDto createNote(Long userId, NoteCreateDto noteCreateDto) { Member member = memberRepository.findByIdOrThrow(userId); Book book = bookRepository.findByIdOrThrow(noteCreateDto.bookId()); - return noteService.saveNote(Note.of(noteCreateDto.content(), noteCreateDto.background(), noteCreateDto.textColor(), member, book), member, book); + String background = noteCreateDto.background(); + if (background.endsWith(".jpg")) { + background = s3Service.getURL(NOTE_BACKGROUND_IMAGE_FOLDER_NAME.getValue() + noteCreateDto.background()); + } + + return noteService.saveNote(Note.of(noteCreateDto.content(), background, noteCreateDto.textColor(), member, book), member, book); } } diff --git a/src/main/java/org/sopt/lequuServer/domain/sticker/model/StickerCategory.java b/src/main/java/org/sopt/lequuServer/domain/sticker/model/StickerCategory.java index 8f5d3e4..8650f6c 100644 --- a/src/main/java/org/sopt/lequuServer/domain/sticker/model/StickerCategory.java +++ b/src/main/java/org/sopt/lequuServer/domain/sticker/model/StickerCategory.java @@ -9,7 +9,8 @@ public enum StickerCategory { ALPHABET("알파벳"), - BIRTHDAY("생일"); + BIRTHDAY("생일"), + CHARACTER("캐릭터"); private final String value; } diff --git a/src/main/java/org/sopt/lequuServer/global/config/WebConfig.java b/src/main/java/org/sopt/lequuServer/global/config/WebConfig.java index c026a97..a7a686b 100644 --- a/src/main/java/org/sopt/lequuServer/global/config/WebConfig.java +++ b/src/main/java/org/sopt/lequuServer/global/config/WebConfig.java @@ -10,7 +10,7 @@ public class WebConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") - .allowedOrigins("**") + .allowedOrigins("http://localhost:5173", "http://localhost:8080") .allowedMethods("GET", "POST", "PUT", "DELETE") .allowCredentials(true) .maxAge(3000);