Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
26 changes: 25 additions & 1 deletion src/docs/asciidoc/user-api.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -94,4 +94,28 @@ include::{snippetsDir}/generalUserSignUp/1/response-fields.adoc[]
μ‹€νŒ¨1.
include::{snippetsDir}/generalUserSignUp/2/http-response.adoc[]
μ‹€νŒ¨ 2
include::{snippetsDir}/generalUserSignUp/3/http-response.adoc[]
include::{snippetsDir}/generalUserSignUp/3/http-response.adoc[]


=== **6. μ†Œμ…œ νšŒμ›κ°€μž… api**

μ†Œμ…œ νšŒμ›κ°€μž… apiμž…λ‹ˆλ‹€.

==== Request
**μ†Œμ…œ 둜그인 ν›„ λ°œκΈ‰λœ session idλ₯Ό cookie에 전달**
include::{snippetsDir}/socialUserSignUp/1/http-request.adoc[]

==== Request Body Fields
include::{snippetsDir}/socialUserSignUp/1/request-fields.adoc[]

==== 성곡 Response
include::{snippetsDir}/socialUserSignUp/1/http-response.adoc[]

==== Response Body Fields
include::{snippetsDir}/socialUserSignUp/1/response-fields.adoc[]

==== μ‹€νŒ¨ Response
μ‹€νŒ¨1.
include::{snippetsDir}/socialUserSignUp/2/http-response.adoc[]
μ‹€νŒ¨ 2
include::{snippetsDir}/socialUserSignUp/3/http-response.adoc[]
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.ftm.server.domain.enums.AgeGroup;
import com.ftm.server.domain.enums.HashTag;
import java.util.List;
import lombok.Data;

@Data
Expand All @@ -10,10 +11,14 @@ public class GeneralUserCreationCommand {
private final String password;
private final String nickName;
private final AgeGroup ageGroup;
private final HashTag[] hashTags;
private final List<HashTag> hashtags;

public static GeneralUserCreationCommand of(
String email, String password, String nickName, AgeGroup ageGroup, HashTag[] hashTag) {
return new GeneralUserCreationCommand(email, password, nickName, ageGroup, hashTag);
String email,
String password,
String nickName,
AgeGroup ageGroup,
List<HashTag> hashtag) {
return new GeneralUserCreationCommand(email, password, nickName, ageGroup, hashtag);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.ftm.server.application.dto.command;

import com.ftm.server.domain.enums.AgeGroup;
import com.ftm.server.domain.enums.HashTag;
import com.ftm.server.domain.enums.SocialProvider;
import java.util.List;
import lombok.Data;

@Data
public class SocialUserCreationCommand {
private final SocialProvider provider;
private final String socialId;
private final String nickname;
private final AgeGroup age;
private final List<HashTag> hashtags;

public static SocialUserCreationCommand of(
SocialProvider provider,
String socialId,
String nickname,
AgeGroup age,
List<HashTag> hashTags) {
return new SocialUserCreationCommand(provider, socialId, nickname, age, hashTags);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.ftm.server.application.dto.command;

import com.ftm.server.domain.enums.AgeGroup;
import com.ftm.server.domain.enums.HashTag;
import com.ftm.server.domain.enums.SocialProvider;
import com.ftm.server.domain.vo.PendingSocialUserVo;
import com.ftm.server.web.dto.request.SocialUserSignupRequest;
import java.util.List;
import lombok.Data;

@Data
public class SocialUserSignupCommand {
private final SocialProvider socialProvider;
private final String socialId;
private final AgeGroup age;
private final List<HashTag> hashtags;

public static SocialUserSignupCommand from(
SocialUserSignupRequest request, PendingSocialUserVo vo) {
return new SocialUserSignupCommand(
vo.getSocialProvider(), vo.getSocialId(), request.getAge(), request.getHashtags());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.ftm.server.application.dto.query;

import com.ftm.server.domain.enums.SocialProvider;
import lombok.Data;

@Data
public class FindBySocialValueQuery {

private final SocialProvider socialProvider;
private final String socialId;

public static FindBySocialValueQuery of(SocialProvider socialProvider, String socialId) {
return new FindBySocialValueQuery(socialProvider, socialId);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,6 @@ public interface UserRepository extends JpaRepository<User, Long> {
Optional<User> findByEmail(String email);

Optional<User> findBySocialProviderAndSocialId(SocialProvider socialProvider, String socialId);

Boolean existsBySocialIdAndSocialProvider(String socialId, SocialProvider socialProvider);
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,9 @@ public UserImage queryUserImageByUserId(FindByUserIdQuery query) {
.orElseThrow(() -> new CustomException(ErrorResponseCode.USER_IMAGE_NOT_FOUND));
}

public void saveUserDefaultImage(User user) {
public UserImage saveUserDefaultImage(User user) {
UserImage userImage = UserImage.createUserImage(user);
userImageRepository.save(userImage);
return userImage;
}
}
13 changes: 13 additions & 0 deletions src/main/java/com/ftm/server/application/service/UserService.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package com.ftm.server.application.service;

import com.ftm.server.application.dto.command.GeneralUserCreationCommand;
import com.ftm.server.application.dto.command.SocialUserCreationCommand;
import com.ftm.server.application.dto.query.FindByEmailQuery;
import com.ftm.server.application.dto.query.FindByIdQuery;
import com.ftm.server.application.dto.query.FindBySocialValueQuery;
import com.ftm.server.application.dto.query.FindSocialUserQuery;
import com.ftm.server.application.port.repository.UserRepository;
import com.ftm.server.common.exception.CustomException;
Expand Down Expand Up @@ -41,6 +43,17 @@ public User createGeneralUser(GeneralUserCreationCommand command) {
return user;
}

public User createSocialUser(SocialUserCreationCommand command) {
User user = User.createSocailUser(command);
userRepository.save(user);
return user;
}

public Boolean userCheckBySocialValue(FindBySocialValueQuery query) {
return userRepository.existsBySocialIdAndSocialProvider(
query.getSocialId(), query.getSocialProvider());
}

public Boolean userCheckByEmail(FindByEmailQuery query) {
return userRepository.existsByEmail(query.getEmail());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,11 @@
import java.time.LocalDateTime;
import java.util.Optional;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@UseCase
@RequiredArgsConstructor
@Slf4j
public class EmailAuthenticationUseCase {

private final MailSenderPort mailSenderPort;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
import com.ftm.server.common.utils.RandomNickNameCreator;
import com.ftm.server.domain.entity.EmailVerificationLogs;
import com.ftm.server.domain.entity.User;
import com.ftm.server.domain.enums.HashTag;
import java.util.Optional;
import lombok.RequiredArgsConstructor;

Expand Down Expand Up @@ -45,15 +44,14 @@ public void execute(GeneralUserSignupCommand command) {
}

String nickname = RandomNickNameCreator.generateNickname(); // random λ‹‰λ„€μž„ 생성
int size = command.getHashtags().size();

GeneralUserCreationCommand convertedCommand =
GeneralUserCreationCommand.of(
command.getEmail(),
authenticationPort.passwordEncode(command.getPassword()),
nickname,
command.getAge(),
command.getHashtags().toArray(new HashTag[size]));
command.getHashtags());

User user = userService.createGeneralUser(convertedCommand);
userImageService.saveUserDefaultImage(user);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package com.ftm.server.application.usecase.user;

import com.ftm.server.application.dto.command.SocialUserCreationCommand;
import com.ftm.server.application.dto.command.SocialUserSignupCommand;
import com.ftm.server.application.dto.query.FindBySocialValueQuery;
import com.ftm.server.application.service.UserImageService;
import com.ftm.server.application.service.UserService;
import com.ftm.server.common.annotation.UseCase;
import com.ftm.server.common.exception.CustomException;
import com.ftm.server.common.response.enums.ErrorResponseCode;
import com.ftm.server.common.utils.RandomNickNameCreator;
import com.ftm.server.domain.entity.User;
import com.ftm.server.domain.entity.UserImage;
import com.ftm.server.domain.vo.SocialUserSignupSummaryVo;
import lombok.RequiredArgsConstructor;

@UseCase
@RequiredArgsConstructor
public class SocialUserSignupUseCase {

private final UserService userService;
private final UserImageService userImageService;

public SocialUserSignupSummaryVo execute(SocialUserSignupCommand command) {

// 이미 κ°€μž…λœ νšŒμ›μΈμ§€ ν•œλ²ˆ 더 확인
if (userService.userCheckBySocialValue(
FindBySocialValueQuery.of(command.getSocialProvider(), command.getSocialId()))) {
throw new CustomException(ErrorResponseCode.USER_ALREADY_EXISTS);
}

String nickname = RandomNickNameCreator.generateNickname();

SocialUserCreationCommand command1 =
SocialUserCreationCommand.of(
command.getSocialProvider(),
command.getSocialId(),
nickname,
command.getAge(),
command.getHashtags());

User user = userService.createSocialUser(command1);

UserImage userImage = userImageService.saveUserDefaultImage(user);

return SocialUserSignupSummaryVo.of(user, userImage.getObjectKey());
}
}
19 changes: 19 additions & 0 deletions src/main/java/com/ftm/server/common/consts/PropertiesHolder.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.ftm.server.common.consts;

import jakarta.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class PropertiesHolder {

@Value("${cdn.path.root}")
private String cdnPathValue;

public static String CDN_PATH;

@PostConstruct
public void init() {
CDN_PATH = cdnPathValue;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ public enum ErrorResponseCode {
// 400번
INVALID_REQUEST_ARGUMENT(
HttpStatus.BAD_REQUEST, "E400_001", "ν΄λΌμ΄μ–ΈνŠΈ μš”μ²­κ°’μ˜ 일뢀가 잘λͺ»λœ ν˜•μ‹μ΄κ±°λ‚˜, ν•„μˆ˜ 데이터가 λˆ„λ½λ˜μ—ˆμŠ΅λ‹ˆλ‹€."),
INVALID_SEESION_FOR_SOCIAL_USER_SIGNUP(
HttpStatus.BAD_REQUEST, "E400_002", "μ†Œμ…œ νšŒμ›κ°€μž…μ„ μœ„ν•œ session 값이 잘λͺ»λ¨"),

// 401번
NOT_AUTHENTICATED(HttpStatus.UNAUTHORIZED, "E401_001", "μΈμ¦λ˜μ§€ μ•Šμ€ μ‚¬μš©μžμž…λ‹ˆλ‹€."),
Expand Down
29 changes: 28 additions & 1 deletion src/main/java/com/ftm/server/domain/entity/User.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.ftm.server.domain.entity;

import com.ftm.server.application.dto.command.GeneralUserCreationCommand;
import com.ftm.server.application.dto.command.SocialUserCreationCommand;
import com.ftm.server.domain.enums.AgeGroup;
import com.ftm.server.domain.enums.HashTag;
import com.ftm.server.domain.enums.SocialProvider;
Expand Down Expand Up @@ -107,12 +108,38 @@ private User(
}

public static User createGeneralUser(GeneralUserCreationCommand command) {

HashTag[] hashTags = null;

if (command.getHashtags() != null && command.getHashtags().isEmpty()) {
hashTags = command.getHashtags().toArray(new HashTag[0]);
}
return User.builder()
.email(command.getEmail())
.password(command.getPassword())
.nickname(command.getNickName())
.ageGroup(command.getAgeGroup())
.favoriteHashtags(command.getHashTags())
.favoriteHashtags(hashTags)
.groomingScore(0)
.isDeleted(false)
.role(UserRole.USER)
.build();
}

public static User createSocailUser(SocialUserCreationCommand command) {

HashTag[] hashTags = null;

if (command.getHashtags() != null && command.getHashtags().isEmpty()) {
hashTags = command.getHashtags().toArray(new HashTag[0]);
}

return User.builder()
.socialProvider(command.getProvider())
.socialId(command.getSocialId())
.nickname(command.getNickname())
.ageGroup(command.getAge())
.favoriteHashtags(hashTags)
.groomingScore(0)
.isDeleted(false)
.role(UserRole.USER)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.ftm.server.domain.vo;

import com.ftm.server.common.consts.PropertiesHolder;
import com.ftm.server.domain.entity.User;
import com.ftm.server.domain.enums.SocialProvider;
import lombok.Data;

@Data
public class SocialUserSignupSummaryVo {
private final User user;
private final Long id;
private final String nickname;
private final SocialProvider socialProvider;
private final String profileImageUrl;
private final String mildLevelName;
private final String spicyLevelName;

public static SocialUserSignupSummaryVo of(User user, String userImage) {
String mildLevelName = null;
String spicyLevelName = null;
if (user.getGroomingLevel() != null) {
mildLevelName = user.getGroomingLevel().getMildLevelName();
spicyLevelName = user.getGroomingLevel().getMildLevelName();
}
return new SocialUserSignupSummaryVo(
user,
user.getId(),
user.getNickname(),
user.getSocialProvider(),
PropertiesHolder.CDN_PATH + "/" + userImage,
mildLevelName,
spicyLevelName);
}
}
7 changes: 6 additions & 1 deletion src/main/java/com/ftm/server/domain/vo/UserSummaryVo.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.ftm.server.domain.vo;

import com.ftm.server.common.consts.PropertiesHolder;
import com.ftm.server.domain.entity.GroomingLevel;
import com.ftm.server.domain.entity.User;
import com.ftm.server.domain.entity.UserImage;
Expand All @@ -17,7 +18,11 @@ public class UserSummaryVo {
private UserSummaryVo(User user, UserImage userImage, GroomingLevel groomingLevel) {
this.id = user.getId();
this.nickname = user.getNickname();
this.profileImageUrl = userImage.getObjectKey(); // TODO: μΆ”ν›„ CDN μ£Όμ†Œ + getObjectKey() 둜 변경해야함
this.profileImageUrl =
PropertiesHolder.CDN_PATH
+ "/"
+ userImage
.getObjectKey(); // TODO: μΆ”ν›„ CDN μ£Όμ†Œ + getObjectKey() 둜 변경해야함 -> λ³€κ²½μ™„λ£Œ
this.mildLevelName = groomingLevel != null ? groomingLevel.getMildLevelName() : null;
this.spicyLevelName = groomingLevel != null ? groomingLevel.getSpicyLevelName() : null;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,8 @@ public class SecurityConfig {
"/api/users/email/authentication",
"/api/users/email/authentication/code",
"/api/auth/login/**",
"/api/users"
"/api/users",
"/api/users/social"
};

private static final String[] ANONYMOUS_MATCHERS = {"/docs/**"};
Expand Down
Loading