Skip to content
Open
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
2 changes: 2 additions & 0 deletions src/main/java/doit/blog/BlogApplication.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;

@SpringBootApplication
@EnableJpaAuditing
public class BlogApplication {

public static void main(String[] args) {
Expand Down
3 changes: 2 additions & 1 deletion src/main/java/doit/blog/common/config/SecurityConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,8 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti
session.sessionFixation(SessionFixationConfigurer::migrateSession)
)
.authorizeHttpRequests(request -> request
.requestMatchers( "/api/**", "/h2-console/**","/swagger-ui/**","/v3/api-docs/**").permitAll()
.requestMatchers( "/api/**", "/h2-console/**","/swagger-ui/**","/v3/api-docs/**")
.permitAll()
.anyRequest().authenticated())
.headers(headers -> headers.frameOptions(HeadersConfigurer.FrameOptionsConfig::disable))
;
Expand Down
34 changes: 29 additions & 5 deletions src/main/java/doit/blog/controller/user/UserController.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
package doit.blog.controller.user;

import doit.blog.controller.user.dto.UserInfoResponse;
import doit.blog.controller.user.dto.UserLoginRequest;
import doit.blog.controller.user.dto.UserIdResponse;
import doit.blog.controller.user.dto.UserSignUpRequest;
import doit.blog.controller.user.dto.*;
import doit.blog.repository.UserRepository;
import doit.blog.service.UserService;
import jakarta.servlet.http.HttpSession;
import lombok.RequiredArgsConstructor;
Expand All @@ -16,13 +14,14 @@ public class UserController implements UserControllerDocs {

private final UserService userService;
private final HttpSession session;
private final UserRepository userRepository;

@PostMapping("/validate")
public void checkDuplicateId(@RequestParam String id) {
userService.validateDuplicateId(id);
}

@PostMapping("/signup")
@PostMapping("/")
public UserIdResponse signUp(@RequestBody UserSignUpRequest userSignUpRequest) {
return userService.signUp(userSignUpRequest);
}
Expand All @@ -34,9 +33,34 @@ public UserIdResponse login(@RequestBody UserLoginRequest userLoginRequest) {
return response;
}

@PostMapping("/logout")
public void logout() {
Long userId = (Long)session.getAttribute("user");
if (userId != null) {
session.invalidate();
}
}

@GetMapping("/info")
public UserInfoResponse getUserInfo() {
Long userId = (Long)session.getAttribute("user");
return userService.getUserInfo(userId);
}

@GetMapping("/info/{userId}")
public UserInfoResponse getOtherUserInfo(@PathVariable Long userId) {
return userService.getUserInfo(userId);
}

@PutMapping("/info")
public UserIdResponse updateUserInfo(@RequestBody UserInfoUpdateRequest userInfoUpdateRequest) {
Long userId = (Long)session.getAttribute("user");
return userService.updateUserInfo(userId, userInfoUpdateRequest);
}

@DeleteMapping("/info")
public void deleteUserInfo() {
Long userId = (Long)session.getAttribute("user");
userService.deleteUserInfo(userId);
}
}
36 changes: 30 additions & 6 deletions src/main/java/doit/blog/controller/user/UserControllerDocs.java
Original file line number Diff line number Diff line change
@@ -1,27 +1,25 @@
package doit.blog.controller.user;

import doit.blog.controller.user.dto.UserInfoResponse;
import doit.blog.controller.user.dto.UserLoginRequest;
import doit.blog.controller.user.dto.UserIdResponse;
import doit.blog.controller.user.dto.UserSignUpRequest;
import doit.blog.controller.user.dto.*;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.web.bind.annotation.PathVariable;

@Tag(name = "User", description = "유저 관련 API")
interface UserControllerDocs {

@Operation(summary = "아이디 중복 확인", description = "회원가입 시 아이디 중복을 확인한다.")
@ApiResponse(responseCode = "200", description = "아이디 중복 확인 성공")
@ApiResponse(responseCode = "200", description = "아이디 중복 확인 성공", useReturnTypeSchema = true)
@ApiResponse(responseCode = "400", description = "아이디 중복 확인 실패")
void checkDuplicateId(
@Schema(description = "중복 확인할 아이디", example = "testId")
String id
);

@Operation(summary = "회원가입", description = "회원가입을 한다.")
@ApiResponse(responseCode = "200", description = "회원가입 성공")
@ApiResponse(responseCode = "200", description = "회원가입 성공", useReturnTypeSchema = true)
@ApiResponse(responseCode = "400", description = "회원가입 실패")
UserIdResponse signUp(
@Schema(description = "회원가입 정보", implementation = UserSignUpRequest.class)
Expand All @@ -41,4 +39,30 @@ UserIdResponse login(
@ApiResponse(responseCode = "400", description = "유저 정보 조회 실패")
UserInfoResponse getUserInfo(
);

@Operation(summary = "유저 정보 조회", description = "유저 정보를 조회한다.")
@ApiResponse(responseCode = "200", description = "유저 정보 조회 성공", useReturnTypeSchema = true)
@ApiResponse(responseCode = "400", description = "유저 정보 조회 실패")
UserInfoResponse getOtherUserInfo(
@PathVariable Long id
);

@Operation(summary = "로그아웃", description = "로그아웃을 한다.")
@ApiResponse(responseCode = "200", description = "로그아웃 성공", useReturnTypeSchema = true)
void logout(
);

@Operation(summary = "유저 정보 수정", description = "유저 정보를 수정한다.")
@ApiResponse(responseCode = "200", description = "유저 정보 수정 성공", useReturnTypeSchema = true)
UserIdResponse updateUserInfo(
@Schema(description = "수정할 정보", implementation = UserInfoUpdateRequest.class)
UserInfoUpdateRequest userInfoUpdateRequest
);

@Operation(summary = "유저 정보 삭제", description = "유저 정보를 삭제한다.")
@ApiResponse(responseCode = "200", description = "유저 정보 삭제 성공", useReturnTypeSchema = true)
void deleteUserInfo(

);

}
24 changes: 24 additions & 0 deletions src/main/java/doit/blog/controller/user/domain/BaseEntity.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package doit.blog.controller.user.domain;

import jakarta.persistence.Column;
import jakarta.persistence.EntityListeners;
import jakarta.persistence.MappedSuperclass;
import lombok.Getter;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import java.time.LocalDateTime;

@EntityListeners(AuditingEntityListener.class)
@Getter
@MappedSuperclass
public abstract class BaseEntity {

@CreatedDate
@Column(nullable = false, updatable = false)
private LocalDateTime createdAt;

@LastModifiedDate
private LocalDateTime updatedAt;
}
30 changes: 18 additions & 12 deletions src/main/java/doit/blog/controller/user/domain/User.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package doit.blog.controller.user.domain;

import doit.blog.controller.user.dto.UserInfoUpdateRequest;

import doit.blog.controller.user.dto.UserSignUpRequest;
import jakarta.persistence.*;
import jakarta.validation.constraints.NotNull;
Expand All @@ -9,9 +11,10 @@
@Entity
@Getter
@AllArgsConstructor
@Builder
@NoArgsConstructor
@Table(name = "users")
public class User {
public class User extends BaseEntity {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Expand All @@ -30,22 +33,25 @@ public class User {

private String userPhoneNumber;

@Builder
private User(String userLoginId, String userPassword, String userName, String userNickname, String userPhoneNumber) {
this.userLoginId = userLoginId;
this.userPassword = userPassword;
this.userName = userName;
this.userNickname = userNickname;
this.userPhoneNumber = userPhoneNumber;
}

public static User create(UserSignUpRequest request,PasswordEncoder passwordEncoder) {
public static User create(UserSignUpRequest request, PasswordEncoder passwordEncoder){
return User.builder().userLoginId(request.userLoginId())
.userPassword(passwordEncoder.encode(request.userPassword()))
.userName(request.userPassword())
.userName(request.userName())
.userNickname(request.userNickname())
.userPhoneNumber(request.userPhoneNumber())
.build();
}

public void UserInfoUpdate(UserInfoUpdateRequest request) {
if (request.userName() != null && !request.userName().isEmpty() && !request.userName().equals(this.userName)) {
this.userName = request.userName();
}
if (request.userNickname() != null && !request.userNickname().isEmpty() && !request.userNickname().equals(this.userNickname)) {
this.userNickname = request.userNickname();
}
if (request.userPhoneNumber() != null && !request.userPhoneNumber().isEmpty() && !request.userPhoneNumber().equals(this.userPhoneNumber)) {
this.userPhoneNumber = request.userPhoneNumber();
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package doit.blog.controller.user.dto;

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

public record UserInfoUpdateRequest(
@Schema(description = "이름", example = "문소현")
String userName,

@Schema(description = "닉네임", example = "문어빵")
String userNickname,

@Schema(description = "전화번호", example = "010-2239-5678")
String userPhoneNumber
) {
}
Original file line number Diff line number Diff line change
@@ -1,18 +1,23 @@
package doit.blog.controller.user.dto;

import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;

public record UserSignUpRequest(

@Schema(description = "아이디", example = "testId")
String userLoginId,

@Schema(description = "비밀번호", example = "testPassword")
@NotBlank
String userPassword,

@Schema(description = "이름", example = "홍길동")
@NotBlank
String userName,

@Schema(description = "닉네임", example = "각시탈")
@NotBlank
String userNickname,

@Schema(description = "전화번호", example = "010-1234-5678")
Expand Down
12 changes: 7 additions & 5 deletions src/main/java/doit/blog/exception/CustomErrorInfo.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,19 +6,21 @@
public enum CustomErrorInfo {

// 400 BAD_REQUEST
INVALID_PASSWORD_FORMAT(400, "올바른 비밀번호 형식이 아닙니다.", 400001),
INVALID_ID_OR_PASSWORD(400,"아이디 또는 비밀번호가 잘못되었습니다.",400002),
ID_DUPLICATION(400, "중복된 아이디입니다.", 400003),
INVALID_ID_OR_PASSWORD(400,"아이디 또는 비밀번호가 잘못되었습니다.",400001),

// 401 UNAUTHORIZED
SESSION_NOT_FOUND(401,"세션이 존재하지 않습니다.",401001),

// 403 FORBIDDEN

// 404 NOT_FOUND
USER_NOT_FOUND(404, "존재하지 않는 멤버입니다.", 404001),
USER_NOT_FOUND(404, "해당하는 유저를 찾을 수 없습니다.", 404002),

// 409 CONFLICT

INVALID_ID_FORMAT(409, "유효하지 않은 아이디 형식입니다. 영문자와 숫자만 사용해주세요.", 409001),
ID_DUPLICATION(409, "중복된 아이디입니다.", 409002),
INVALID_PASSWORD_FORMAT(409, "유효하지 않은 비밀번호 형식입니다. 영문자와 숫자만 사용해주세요.", 409003),
INVALID_ID_OR_PASSWORD_LENGTH(409,"아이디 또는 비밀번호는 5글자 이상 30글자 이하여야 합니다.",409004),

// 500 INTERNAL_SERVER_ERROR
INTERNAL_SERVER_ERROR(500, "서버 내부 오류", 500001);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

Expand All @@ -20,5 +21,4 @@ protected ResponseEntity<ErrorResponseBody> handleCustomException(CustomExceptio
.status(customErrorInfo.getStatusCode())
.body(errorResponseBody);
}

}
8 changes: 4 additions & 4 deletions src/main/java/doit/blog/service/UserService.java
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
package doit.blog.service;

import doit.blog.controller.user.dto.UserIdResponse;
import doit.blog.controller.user.dto.UserInfoResponse;
import doit.blog.controller.user.dto.UserLoginRequest;
import doit.blog.controller.user.dto.UserSignUpRequest;
import doit.blog.controller.user.dto.*;

public interface UserService {
void validateDuplicateId(String userLoginId);
void validateIdOrPasswordFormat(String userLoginId,String userPassword);
UserIdResponse signUp(UserSignUpRequest userSignUpRequest);
UserIdResponse login(UserLoginRequest userLoginRequest);
UserInfoResponse getUserInfo(Long userId);
UserIdResponse updateUserInfo(Long userId, UserInfoUpdateRequest userInfoUpdateRequest);
void deleteUserInfo(Long userId);
}
Loading