Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. Weโ€™ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Dev backend #97

Merged
merged 28 commits into from
Apr 30, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
f65c266
feat: MemberUpdateDto & MemberServiceDto
yeonjy Apr 29, 2024
bbffe99
refactor: jwt -> security directory
yeonjy Apr 30, 2024
55848fc
feat: InvalidTokenException
yeonjy Apr 30, 2024
159a63c
feat: NotFoundEmailException ๊ตฌํ˜„
yeonjy Apr 30, 2024
e63edda
feat: LoginMemberArgumentResolver ๊ตฌํ˜„
yeonjy Apr 30, 2024
d545a6b
feat: OAuth2ProviderService ๊ตฌํ˜„
yeonjy Apr 30, 2024
25a6fff
refactor: AuthService ์œ„์น˜ ๋ณ€๊ฒฝ
yeonjy Apr 30, 2024
f7bdd63
remove: OAuth2 Handler & CustomOAuth2UserService
yeonjy Apr 30, 2024
fe369d3
feat: LoginMemberEmail interface ๊ตฌํ˜„
yeonjy Apr 30, 2024
9357849
refactor: AuthService ๋””๋ ‰ํ„ฐ๋ฆฌ ๋ณ€๊ฒฝ ๋ฐ˜์˜
yeonjy Apr 30, 2024
cdcfca9
chore: webflux ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์˜์กด์„ฑ ์ถ”๊ฐ€
yeonjy Apr 30, 2024
846f135
chore: AuthService ๋””๋ ‰ํ„ฐ๋ฆฌ ๋ณ€๊ฒฝ ๋ฐ˜์˜
yeonjy Apr 30, 2024
53eeeca
feat: updateMember ๊ตฌํ˜„
yeonjy Apr 30, 2024
7e4d2f1
feat: existsMemberByNickname ์ถ”๊ฐ€
yeonjy Apr 30, 2024
c815aec
feat: JpaAuditingConfig ๊ตฌํ˜„
yeonjy Apr 30, 2024
b7c6bd0
feat: AuthController ๊ตฌํ˜„
yeonjy Apr 30, 2024
fc3cedc
fix: secretKey -> secret-key
yeonjy Apr 30, 2024
a4211ef
refactor: refreshtoken ๊ฒ€์ฆ ๋กœ์ง ๋ณ€๊ฒฝ
yeonjy Apr 30, 2024
55dead6
feat: LoginRequest ๊ตฌํ˜„
yeonjy Apr 30, 2024
a4704b0
feat: SocialType ๊ตฌํ˜„
yeonjy Apr 30, 2024
b31af0f
refactor: sdk๋ฅผ ์ด์šฉํ•œ ๋กœ๊ทธ์ธ ์ ์šฉ
yeonjy Apr 30, 2024
1beb7f5
feat: member update ๋กœ์ง ๊ตฌํ˜„
yeonjy Apr 30, 2024
d1855b8
remove: LoginController
yeonjy Apr 30, 2024
a5b27b4
fix: @EnableJpaAuditing ์ œ๊ฑฐ
yeonjy Apr 30, 2024
8656db7
fix: apple silicon chip ์˜ค๋ฅ˜ ํ•ด๊ฒฐ
yeonjy Apr 30, 2024
341fc04
test: Login Token
yeonjy Apr 30, 2024
34b3eaa
hotfix: package ์ถ”๊ฐ€
yeonjy Apr 30, 2024
5a81b46
Merge pull request #96 from tukcomCD2024/refactor/#92-backend-sdk-login
yeonjy Apr 30, 2024
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
8 changes: 8 additions & 0 deletions backend/core/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,9 @@ repositories {
}

dependencies {
if (isAppleSilicon()) {
runtimeOnly("io.netty:netty-resolver-dns-native-macos:4.1.94.Final:osx-aarch_64")
}
implementation 'com.auth0:java-jwt:4.2.1'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'
Expand All @@ -37,6 +40,7 @@ dependencies {
implementation 'org.jsoup:jsoup:1.15.3'
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.2.0'
implementation 'org.springframework.boot:spring-boot-starter-data-redis:2.3.1.RELEASE'
implementation 'org.springframework.boot:spring-boot-starter-webflux'

annotationProcessor 'org.projectlombok:lombok'
annotationProcessor 'org.mapstruct:mapstruct-processor:1.5.5.Final'
Expand All @@ -52,3 +56,7 @@ tasks.named('bootBuildImage') {
tasks.named('test') {
useJUnitPlatform()
}

def boolean isAppleSilicon() {
return System.getProperty("os.name") == "Mac OS X" && System.getProperty("os.arch") == "aarch64"
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import org.springframework.scheduling.annotation.EnableScheduling;

@EnableJpaAuditing
@EnableScheduling
@SpringBootApplication
public class BackendApplication {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,11 @@
import com.rollthedice.backend.domain.bookmark.entity.Bookmark;
import com.rollthedice.backend.domain.bookmark.repository.BookmarkRepository;
import com.rollthedice.backend.domain.member.entity.Member;
import com.rollthedice.backend.domain.member.query.AuthService;
import com.rollthedice.backend.global.oauth2.service.AuthService;
import com.rollthedice.backend.domain.news.dto.response.NewsResponse;
import com.rollthedice.backend.domain.news.entity.News;
import com.rollthedice.backend.domain.news.mapper.NewsMapper;
import com.rollthedice.backend.domain.news.repository.NewsRepository;
import com.rollthedice.backend.domain.news.service.NewsService;
import jakarta.persistence.EntityNotFoundException;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Pageable;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import com.rollthedice.backend.domain.debate.mapper.DebateRoomMapper;
import com.rollthedice.backend.domain.debate.repository.DebateRoomRepository;
import com.rollthedice.backend.domain.member.entity.Member;
import com.rollthedice.backend.domain.member.query.AuthService;
import com.rollthedice.backend.global.oauth2.service.AuthService;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,20 +1,34 @@
package com.rollthedice.backend.domain.member.controller;

import com.rollthedice.backend.domain.member.dto.MemberServiceDto;
import com.rollthedice.backend.domain.member.dto.MemberUpdateDto;
import com.rollthedice.backend.domain.member.dto.response.MemberResponse;
import com.rollthedice.backend.domain.member.service.MemberService;
import com.rollthedice.backend.global.annotation.LoginMemberEmail;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

@RestController
@RequiredArgsConstructor
@RequestMapping("members")
public class MemberController {
private final MemberService memberService;

@PostMapping
public ResponseEntity<HttpStatus> updateMember(@LoginMemberEmail String email,
@RequestBody MemberUpdateDto memberUpdateDto) {
MemberServiceDto memberServiceDto = memberUpdateDto.toServiceDto(email);

if (memberService.isDuplicatedNickname(memberServiceDto)) {
return ResponseEntity.status(HttpStatus.CONFLICT).build();
}
memberService.update(memberServiceDto);

return ResponseEntity.status(HttpStatus.OK).build();
}

@ResponseStatus(HttpStatus.OK)
@GetMapping("")
public MemberResponse getMemberInfo() {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.rollthedice.backend.domain.member.dto;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;

@Getter
@Builder
@AllArgsConstructor
public class MemberServiceDto {
private String email;
private String nickname;
private String imageUrl;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.rollthedice.backend.domain.member.dto;

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@NoArgsConstructor(access = AccessLevel.PRIVATE)
@AllArgsConstructor
@Schema(description = "๋ฉค๋ฒ„ ์—…๋ฐ์ดํŠธ ํฌ๋งท")
public class MemberUpdateDto {
@Schema(description = "๋ณ€๊ฒฝํ•  ๋‹‰๋„ค์ž„")
private String nickname;
@Schema(description = "๋ณ€๊ฒฝํ•  ์ด๋ฏธ์ง€ S3 Url")
private String imageUrl;

public MemberServiceDto toServiceDto(String email) {
return MemberServiceDto.builder()
.email(email)
.nickname(this.nickname)
.imageUrl(this.imageUrl)
.build();
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.rollthedice.backend.domain.member.entity;

import com.rollthedice.backend.domain.member.dto.MemberServiceDto;
import com.rollthedice.backend.global.config.BaseTimeEntity;
import jakarta.persistence.*;
import lombok.*;
Expand Down Expand Up @@ -29,10 +30,10 @@ public class Member extends BaseTimeEntity {
@Enumerated(EnumType.STRING)
private Status status;

public Member update(String email, String imageUrl) {
this.email = email;
this.imageUrl = imageUrl;
return this;
public void update(MemberServiceDto dto) {
this.email = dto.getEmail();
this.imageUrl = dto.getImageUrl();
this.nickname = dto.getNickname();
}

public void signUp(String nickname) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,20 @@
package com.rollthedice.backend.domain.member.entity;

import com.fasterxml.jackson.annotation.JsonCreator;
import lombok.Getter;
import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor
@Getter
public enum SocialType {
APPLE,
KAKAO
APPLE("https://"),
KAKAO("https://kapi.kakao.com/v2/user/me");


private final String providerUrl;

@JsonCreator
public static SocialType from(String s) {
return SocialType.valueOf(s.toUpperCase());
}
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,6 @@ public interface MemberRepository extends JpaRepository<Member, Long> {
Optional<Member> findByEmail(String email);

Optional<Member> findBySocialTypeAndOauthId(SocialType socialType, String oauthId);

boolean existsMemberByNickname(String nickname);
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
package com.rollthedice.backend.domain.member.service;

import com.rollthedice.backend.domain.member.dto.MemberServiceDto;
import com.rollthedice.backend.domain.member.dto.SignUpDto;
import com.rollthedice.backend.domain.member.dto.response.MemberResponse;
import com.rollthedice.backend.domain.member.entity.Member;
import com.rollthedice.backend.domain.member.query.AuthService;
import com.rollthedice.backend.global.jwt.refresh.service.RefreshTokenService;
import com.rollthedice.backend.global.jwt.service.JwtService;
import com.rollthedice.backend.domain.member.repository.MemberRepository;
import com.rollthedice.backend.global.oauth2.service.AuthService;
import com.rollthedice.backend.global.security.jwt.refresh.service.RefreshTokenService;
import com.rollthedice.backend.global.security.jwt.service.JwtService;
import jakarta.persistence.EntityNotFoundException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
Expand All @@ -20,15 +23,22 @@ public class MemberService {
private final JwtService jwtService;
private final HttpServletRequest request;
private final HttpServletResponse response;
private final MemberRepository memberRepository;


@Transactional(readOnly = true)
public boolean isDuplicatedNickname(MemberServiceDto memberServiceDto) {
return memberRepository.existsMemberByNickname(memberServiceDto.getNickname());
}

@Transactional
public void signUp(SignUpDto dto) {
Member member = authService.getMember();
member.signUp(dto.getNickname());
public void update(MemberServiceDto memberServiceDto) {
findByEmail(memberServiceDto.getEmail()).update(memberServiceDto);
}

String refreshToken = jwtService.createRefreshToken();
jwtService.setRefreshTokenHeader(response, refreshToken);
refreshTokenService.updateToken(member.getEmail(), refreshToken);
@Transactional(readOnly = true)
public Member findByEmail(String email) {
return memberRepository.findByEmail(email).orElseThrow(EntityNotFoundException::new);
}

public MemberResponse getMemberInfo() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import com.rollthedice.backend.domain.bookmark.service.BookmarkService;
import com.rollthedice.backend.domain.member.entity.Member;
import com.rollthedice.backend.domain.member.query.AuthService;
import com.rollthedice.backend.global.oauth2.service.AuthService;
import com.rollthedice.backend.domain.news.contentqueue.ContentProducer;
import com.rollthedice.backend.domain.news.dto.ContentMessageDto;
import com.rollthedice.backend.domain.news.dto.NewsUrlDto;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.rollthedice.backend.global.advice;

import com.rollthedice.backend.global.jwt.exception.NotFoundTokenException;
import com.rollthedice.backend.global.security.jwt.exception.NotFoundTokenException;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.rollthedice.backend.global.annotation;

import java.lang.annotation.*;


@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface LoginMemberEmail {
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.rollthedice.backend.global.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;

@Configuration
@EnableJpaAuditing
public class JpaAuditingConfig {
}
Loading
Loading