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
38 changes: 37 additions & 1 deletion src/docs/asciidoc/index.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
:toclevels: 3
:source-highlighter: highlightjs
:sectlinks:
:snippetsDir: build/generated-snippets
:snippetsDir: ../../../build/generated-snippets

= **FitTheMan API Document**

Expand Down Expand Up @@ -163,6 +163,42 @@ include::{snippetsDir}/emailCodeVerification/1/http-response.adoc[]
include::{snippetsDir}/emailCodeVerification/1/response-fields.adoc[]


=== **4. νšŒμ›κ°€μž…μ‹œ ν•„μš”ν•œ 정보 λͺ©λ‘ 쑰회 api**

νšŒμ›κ°€μž…μ‹œ μ‚¬μš©μžμ—κ²Œ μž…λ ₯ λ°›λŠ” μ—°λ ΉλŒ€ 정보와 관심 ν•΄μ‹œνƒœκ·Έ 정보 μ˜΅μ…˜λ“€μ„ μ‘°νšŒν•©λ‹ˆλ‹€.


==== Request
include::{snippetsDir}/userSignupOptions/1/http-request.adoc[]

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

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


=== **5. 일반 νšŒμ›κ°€μž… api**

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

==== Request
include::{snippetsDir}/generalUserSignUp/1/http-request.adoc[]

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

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

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

==== μ‹€νŒ¨ Response
μ‹€νŒ¨1.
include::{snippetsDir}/generalUserSignUp/2/http-response.adoc[]
μ‹€νŒ¨ 2
include::{snippetsDir}/generalUserSignUp/3/http-response.adoc[]
== 인증/인가

=== **1. μœ μ € 둜그인**
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.ftm.server.adapter.controller.user;

import com.ftm.server.adapter.dto.request.GeneralUserSignupRequest;
import com.ftm.server.common.response.ApiResponse;
import com.ftm.server.common.response.enums.SuccessResponseCode;
import com.ftm.server.domain.dto.command.GeneralUserSignupCommand;
import com.ftm.server.domain.usecase.user.GeneralUserSignupUseCase;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequiredArgsConstructor
public class GeneralUserSignupController {

private final GeneralUserSignupUseCase generalUserSignupUseCase;

@PostMapping("/api/users")
public ResponseEntity<ApiResponse> createGeneralUser(
@Valid @RequestBody GeneralUserSignupRequest request) {
generalUserSignupUseCase.execute(GeneralUserSignupCommand.from(request));
return ResponseEntity.status(HttpStatus.CREATED)
.body(ApiResponse.success(SuccessResponseCode.CREATED));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.ftm.server.adapter.controller.user;

import com.ftm.server.adapter.dto.response.UserSignupOptionsResponse;
import com.ftm.server.common.response.ApiResponse;
import com.ftm.server.common.response.enums.SuccessResponseCode;
import com.ftm.server.domain.usecase.user.GetUserSignupOptionsUseCase;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequiredArgsConstructor
public class GetUserSignupOptionsController {

private final GetUserSignupOptionsUseCase getUserSignupOptionsUseCase;

@GetMapping("/api/users/options")
public ResponseEntity<ApiResponse<UserSignupOptionsResponse>> getUserSignupOptions() {
UserSignupOptionsResponse response =
UserSignupOptionsResponse.from(getUserSignupOptionsUseCase.execute());
return ResponseEntity.status(HttpStatus.OK)
.body(ApiResponse.success(SuccessResponseCode.OK, response));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.ftm.server.adapter.dto.request;

import com.ftm.server.entity.enums.AgeGroup;
import com.ftm.server.entity.enums.HashTag;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Pattern;
import java.util.List;
import lombok.Data;

@Data
public class GeneralUserSignupRequest {

@Pattern(
regexp = "^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+$",
message = "이메일 ν˜•μ‹μ΄ μ˜¬λ°”λ₯΄μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.")
private final String email;

@NotBlank private final String password;

@NotNull private final AgeGroup age;

private final List<HashTag> hashtags;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.ftm.server.adapter.dto.response;

import com.ftm.server.domain.dto.vo.UserSignupOptionsVo;
import com.ftm.server.entity.enums.AgeGroup;
import com.ftm.server.entity.enums.HashTag;
import java.util.List;
import lombok.Data;

@Data
public class UserSignupOptionsResponse {

private final List<EnumDescriptors> ages;
private final List<EnumDescriptors> hashtags;

public static UserSignupOptionsResponse from(UserSignupOptionsVo vo) {
return new UserSignupOptionsResponse(vo.getAges(), vo.getHashtags());
}

public record EnumDescriptors(String value, String description) {
public static EnumDescriptors from(HashTag hashTag) {
return new EnumDescriptors(hashTag.name(), hashTag.getValue());
}

public static EnumDescriptors from(AgeGroup ageGroup) {
return new EnumDescriptors(ageGroup.name(), ageGroup.getValue());
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,6 @@ void saveAuthenticatedSession(
Authentication authentication,
HttpServletRequest request,
HttpServletResponse response);

String passwordEncode(String password);
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,6 @@ public interface EmailVerificationLogsRepository

Optional<EmailVerificationLogs> findByVerificationCodeAndEmail(
String verificationCode, String email);

Optional<EmailVerificationLogs> findByEmailAndIsVerified(String email, Boolean isVerified);
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ public enum ErrorResponseCode {
USER_ALREADY_EXISTS(HttpStatus.CONFLICT, "E409_001", "이미 μ‘΄μž¬ν•˜λŠ” μ‚¬μš©μžμž…λ‹ˆλ‹€."),
PASSWORD_NOT_MATCHED(HttpStatus.CONFLICT, "E409_002", "λΉ„λ°€λ²ˆν˜Έκ°€ μΌμΉ˜ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€."),
EXCEED_NUMBER_OF_TRIAL(HttpStatus.CONFLICT, "E409_003", "μ‹œλ„ κ°€λŠ₯ 횟수λ₯Ό μ΄ˆκ³Όν–ˆμŠ΅λ‹ˆλ‹€. μž μ‹œ 후에 λ‹€μ‹œ μ‹œλ„ ν•΄ μ£Όμ„Έμš”."),
EMAIL_NOT_VERIFIED(HttpStatus.CONFLICT, "E409_004", "이메일 인증이 μ™„λ£Œλ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€."),

// 500번
UNKNOWN_SERVER_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "E500_001", "μ•Œ 수 μ—†λŠ” μ„œλ²„ μ—λŸ¬κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€."),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package com.ftm.server.common.utils;

import java.util.List;
import java.util.concurrent.ThreadLocalRandom;

public class RandomNickNameCreator {

private static final int ADJECTIVE_SIZE = 100;
private static final int ANIMAL_SIZE = 100;

private static final List<String> ADJECTIVES =
List.of(
"κ·€μ—¬μš΄", "λ©‹μ§„", "μ‚¬λž‘μŠ€λŸ¬μš΄", "μΉœμ ˆν•œ", "μ”©μ”©ν•œ", "ν™œλ°œν•œ", "상λƒ₯ν•œ", "μœ μΎŒν•œ", "μ›ƒκΈ°λŠ”", "μ—‰λš±ν•œ", "λ„λ„ν•œ",
"μ‹œν¬ν•œ", "κΉœμ°ν•œ", "μ°©ν•œ", "λ§λ§Žμ€", "μš©κ°ν•œ", "μ²œμ§„λ‚œλ§Œν•œ", "μ—‰μ„±ν•œ", "λ“¬μ§ν•œ", "λ‹¬μ½€ν•œ", "λΆ€λ“œλŸ¬μš΄", "μ˜λ¦¬ν•œ",
"총λͺ…ν•œ", "톡톡 νŠ€λŠ”", "재빠λ₯Έ", "κ³ μš”ν•œ", "μ„¬μ„Έν•œ", "λ°˜μ§μ΄λŠ”", "νŠΌνŠΌν•œ", "λ‹¨λ‹¨ν•œ", "ν™œκΈ°μ°¬", "μ²­λŸ‰ν•œ", "μš©κ°ν•œ",
"κΉ¨λ—ν•œ", "μƒμΎŒν•œ", "애ꡐ λ§Žμ€", "μ‹ μ€‘ν•œ", "λ¬΄λšλšν•œ", "μ΅μ‚΄μŠ€λŸ¬μš΄", "μ–΄λ¦¬μˆ™ν•œ", "λˆˆλΆ€μ‹ ", "자유둜운", "ν‰ν™”λ‘œμš΄",
"λŠκΈ‹ν•œ", "λ°œλž„ν•œ", "λŠ λ¦„ν•œ", "μƒˆμΉ¨ν•œ", "μ •λ§Žμ€", "μƒνΌν•œ", "λ†€λΌμš΄", "ν–‰λ³΅ν•œ", "κ³ μ§‘μžˆλŠ”", "μ§„μ§€ν•œ", "λͺ…λž‘ν•œ",
"κ±΄κ°•ν•œ", "감성적인", "논리적인", "ν™œλ‹¬ν•œ", "κΈ°νŠΉν•œ", "μ˜¨μˆœν•œ", "열정적인", "기운찬", "κ·Όμ—„ν•œ", "μž₯λ‚œμŠ€λŸ¬μš΄",
"μ°¨λΆ„ν•œ", "μ—‰λš±λ°œλž„ν•œ", "ν’λΆ€ν•œ", "λ‹€μ •ν•œ", "μˆœμˆ˜ν•œ", "ν˜„λͺ…ν•œ", "ν˜„μ‹€μ μΈ", "적극적인", "λ‚™μ²œμ μΈ", "이성적인",
"창의적인", "겁먹은", "λ°˜μ§λ°˜μ§ν•œ", "λŒ€λ‹΄ν•œ", "μΉœκ·Όν•œ", "μžμ‹ κ°λ„˜μΉ˜λŠ”", "λ°°λ € κΉŠμ€", "μΎŒν™œν•œ", "λ‚­λ§Œμ μΈ", "κ°•μ§ν•œ",
"κ·Όλ©΄ν•œ", "μš©μ˜μ£Όλ„ν•œ", "깨방정인", "ν™œμ§μ›ƒλŠ”", "λ°°μ§±μžˆλŠ”", "μš΄λ™μ€‘μΈ", "λ°˜μ§μ΄λŠ”", "μ°¨κ°€μš΄", "λ”°λœ»ν•œ", "달빛 같은",
"λΉ›λ‚˜λŠ”", "μ‹ λΉ„λ‘œμš΄", "μ—΄λ ¬ν•œ", "야무진", "λ¬Όλ¨ΉλŠ”", "λ°₯λ¨ΉλŠ”");

private static final List<String> ANIMALS =
List.of(
"고양이", "κ°•μ•„μ§€", "ν˜Έλž‘μ΄", "μ‚¬μž", "토끼", "κ³°", "뢀엉이", "올빼미", "μ—¬μš°", "λŠ‘λŒ€", "λ‹€λžŒμ₯", "κ³ μŠ΄λ„μΉ˜",
"νŒλ‹€", "ν–„μŠ€ν„°", "코끼리", "κΈ°λ¦°", "ν•˜λ§ˆ", "μ›μˆ­μ΄", "돼지", "μ†Œ", "λ‹­", "였리", "νŽ­κ·„", "돌고래", "고래",
"상어", "물개", "λ°”λ‹€ν‘œλ²”", "λ„ˆκ΅¬λ¦¬", "슀컹크", "μΉ˜νƒ€", "μž¬κ·œμ–΄", "카피바라", "μ•ŒνŒŒμΉ΄", "라마", "낙타",
"ν•˜μ΄μ—λ‚˜", "μΊ₯거루", "μ™ˆλΌλΉ„", "μ΄κ΅¬μ•„λ‚˜", "카멜레온", "μ•…μ–΄", "λ„λ§ˆλ±€", "μ½”μ•ŒλΌ", "μˆ˜λ‹¬", "λ„ˆμšΈκ³ λž˜", "μ‘±μ œλΉ„",
"μ‚΅", "λ‹΄λΉ„", "멧돼지", "μ²­μ„€λͺ¨", "기러기", "기러기", "μ°Έμƒˆ", "κΉŒλ§ˆκ·€", "까치", "μ•΅λ¬΄μƒˆ", "홍학", "μ²­λ‘₯였리",
"ν™©μƒˆ", "λ§€", "λ…μˆ˜λ¦¬", "μˆ˜λ¦¬λΆ€μ—‰μ΄", "μ œλΉ„", "해달", "ν•΄νŒŒλ¦¬", "λ¬Έμ–΄", "λ‚™μ§€", "거뢁이", "자라", "이빨고기",
"볡어", "λΆˆκ°€μ‚¬λ¦¬", "μ—°μ–΄", "μž‰μ–΄", "피라냐", "참치", "κ°€μ˜€λ¦¬", "λ„μš”μƒˆ", "두루미", "삡쾑이", "λ°”λ‹€μ‚¬μž", "μ‚¬μŠ΄",
"노루", "μ—Όμ†Œ", "μ–‘", "라마", "λ“€μ†Œ", "야크", "λ°”μ΄μŠ¨", "κ³ λΌλ‹ˆ", "μ•„λ₯΄λ§ˆλ”œλ‘œ", "λ„ˆκ΅¬λ¦¬", "ν”„λ ˆλ¦¬λ„κ·Έ", "페럿",
"κ³ λž˜μƒμ–΄", "벌", "λ‚˜λΉ„", "잠자리", "λ”±μ •λ²Œλ ˆ");

public static String generateNickname() {
String adjective = ADJECTIVES.get(randomIndex(ADJECTIVE_SIZE));
String animal = ANIMALS.get(randomIndex(ANIMAL_SIZE));
int number = ThreadLocalRandom.current().nextInt(0, 1000); // 0~999

return String.format("%s%s%d", adjective, animal, number);
}

private static int randomIndex(int size) {
return ThreadLocalRandom.current().nextInt(size);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.ftm.server.domain.dto.command;

import com.ftm.server.entity.enums.AgeGroup;
import com.ftm.server.entity.enums.HashTag;
import lombok.Data;

@Data
public class GeneralUserCreationCommand {
private final String email;
private final String password;
private final String nickName;
private final AgeGroup ageGroup;
private final HashTag[] hashTags;

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

import com.ftm.server.adapter.dto.request.GeneralUserSignupRequest;
import com.ftm.server.entity.enums.AgeGroup;
import com.ftm.server.entity.enums.HashTag;
import java.util.List;
import lombok.Data;

@Data
public class GeneralUserSignupCommand {

private final String email;
private final String password;
private final AgeGroup age;
private final List<HashTag> hashtags;

public static GeneralUserSignupCommand from(GeneralUserSignupRequest request) {
return new GeneralUserSignupCommand(
request.getEmail(), request.getPassword(), request.getAge(), request.getHashtags());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.ftm.server.domain.dto.query;

import lombok.Data;

@Data
public class FindEmailVerificationLogsByEmailQuery {
private final String email;

public static FindEmailVerificationLogsByEmailQuery of(String email) {
return new FindEmailVerificationLogsByEmailQuery(email);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.ftm.server.domain.dto.vo;

import com.ftm.server.adapter.dto.response.UserSignupOptionsResponse;
import java.util.List;
import lombok.Data;

@Data
public class UserSignupOptionsVo {

private final List<UserSignupOptionsResponse.EnumDescriptors> ages;
private final List<UserSignupOptionsResponse.EnumDescriptors> hashtags;

public static UserSignupOptionsVo of(
List<UserSignupOptionsResponse.EnumDescriptors> ages,
List<UserSignupOptionsResponse.EnumDescriptors> hashtags) {
return new UserSignupOptionsVo(ages, hashtags);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import com.ftm.server.domain.dto.command.EmailVerificationLogCreationCommand;
import com.ftm.server.domain.dto.query.EmailCodeVerificationQuery;
import com.ftm.server.domain.dto.query.FindByEmailQuery;
import com.ftm.server.domain.dto.query.FindEmailVerificationLogsByEmailQuery;
import com.ftm.server.entity.entities.EmailVerificationLogs;
import java.util.Optional;
import lombok.RequiredArgsConstructor;
Expand All @@ -28,4 +29,9 @@ public Optional<EmailVerificationLogs> findByAuthenticationCode(
return emailVerificationLogsRepository.findByVerificationCodeAndEmail(
query.getCode(), query.getEmail());
}

public Optional<EmailVerificationLogs> findVerifiedOneByEmail(
FindEmailVerificationLogsByEmailQuery query) {
return emailVerificationLogsRepository.findByEmailAndIsVerified(query.getEmail(), true);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.ftm.server.adapter.gateway.repository.UserImageRepository;
import com.ftm.server.domain.dto.query.FindByUserIdQuery;
import com.ftm.server.entity.entities.User;
import com.ftm.server.entity.entities.UserImage;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
Expand All @@ -17,4 +18,9 @@ public UserImage queryUserImageByUserId(FindByUserIdQuery query) {
.findByUserId(query.getUserId())
.orElseThrow(() -> new RuntimeException(""));
}

public void saveUserDefaultImage(User user) {
UserImage userImage = UserImage.createUserImage(user);
userImageRepository.save(userImage);
}
}
13 changes: 13 additions & 0 deletions src/main/java/com/ftm/server/domain/service/UserService.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,18 @@

import com.ftm.server.adapter.gateway.repository.UserRepository;
import com.ftm.server.common.exception.CustomException;
import com.ftm.server.domain.dto.command.GeneralUserCreationCommand;
import com.ftm.server.domain.dto.query.FindByEmailQuery;
import com.ftm.server.domain.dto.query.FindByIdQuery;
import com.ftm.server.domain.dto.vo.EmailDuplicationVo;
import com.ftm.server.entity.entities.User;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
@Slf4j
public class UserService {

private final UserRepository userRepository;
Expand All @@ -24,4 +27,14 @@ public User queryUser(FindByIdQuery query) {
.findById(query.getId())
.orElseThrow(() -> CustomException.USER_NOT_FOUND);
}

public User createGeneralUser(GeneralUserCreationCommand command) {
User user = User.createGeneralUser(command);
userRepository.save(user);
return user;
}

public Boolean userCheckByEmail(FindByEmailQuery query) {
return userRepository.existsByEmail(query.getEmail());
}
}
Loading