Skip to content

Commit f1cc2c0

Browse files
Merge pull request #39 from prgrms-web-devcourse-final-project/feature/EA3-99-member-api
[EA3-99] 회원 관련 swagger 구현
2 parents 9a23f38 + 68b4f52 commit f1cc2c0

File tree

15 files changed

+260
-48
lines changed

15 files changed

+260
-48
lines changed

src/main/java/grep/neogul_coder/domain/prtemplate/entity/PrTemplate.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,14 @@ public class PrTemplate extends BaseEntity {
99

1010
@Id
1111
@GeneratedValue(strategy = GenerationType.AUTO)
12-
Long templateId;
12+
private Long templateId;
1313

14-
Long userId;
14+
private Long userId;
1515

16-
String introductionContent;
16+
private String introductionContent;
1717

18-
String introductionDetail;
18+
private String introductionDetail;
1919

20-
String location;
20+
private String location;
2121

2222
}
Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,57 @@
11
package grep.neogul_coder.domain.users.controller;
22

3+
import grep.neogul_coder.domain.users.controller.dto.UpdatePasswordRequest;
4+
import grep.neogul_coder.domain.users.controller.dto.UpdateProfileRequest;
5+
import grep.neogul_coder.domain.users.controller.dto.PasswordRequest;
36
import grep.neogul_coder.global.response.ApiResponse;
47
import grep.neogul_coder.domain.users.controller.dto.SignUpRequest;
58
import grep.neogul_coder.domain.users.service.UserService;
69
import jakarta.validation.Valid;
710
import lombok.RequiredArgsConstructor;
811
import org.springframework.http.HttpStatus;
12+
import org.springframework.web.bind.annotation.DeleteMapping;
13+
import org.springframework.web.bind.annotation.PathVariable;
914
import org.springframework.web.bind.annotation.PostMapping;
15+
import org.springframework.web.bind.annotation.PutMapping;
1016
import org.springframework.web.bind.annotation.RequestBody;
1117
import org.springframework.web.bind.annotation.RequestMapping;
18+
import org.springframework.web.bind.annotation.RequestParam;
1219
import org.springframework.web.bind.annotation.ResponseStatus;
1320
import org.springframework.web.bind.annotation.RestController;
1421

1522
@RestController
1623
@RequiredArgsConstructor
1724
@RequestMapping("/api/users")
18-
public class UserController {
25+
public class UserController implements UserSpecification {
1926

2027
private final UserService usersService;
2128

2229
@PostMapping("/signup")
2330
@ResponseStatus(HttpStatus.CREATED)
2431
public ApiResponse<Void> signUp(@Valid @RequestBody SignUpRequest request) {
2532
usersService.signUp(request);
26-
return ApiResponse.noContent("회원가입이 정상적으로 처리되었습니다.");
33+
return ApiResponse.noContent();
34+
}
35+
36+
@PutMapping("/{id}")
37+
public ApiResponse<Void> updateProfile(@PathVariable("id") Long id,
38+
@RequestBody UpdateProfileRequest request) {
39+
usersService.updateProfile(id,request.getNickname(),request.getProfileImgUrl());
40+
return ApiResponse.noContent();
41+
}
42+
43+
@PutMapping("/password/{id}")
44+
public ApiResponse<Void> updatePassword(@PathVariable("id") Long id,
45+
@Valid @RequestBody UpdatePasswordRequest request) {
46+
usersService.updatePassword(id,request.getPassword(),request.getNewPassword(),request.getNewPasswordCheck());
47+
return ApiResponse.noContent();
48+
}
49+
50+
@DeleteMapping("/{id}")
51+
public ApiResponse<Void> delete(@PathVariable("id") Long id,
52+
@Valid @RequestParam PasswordRequest request) {
53+
usersService.deleteUser(id,request.getPassword());
54+
return ApiResponse.noContent();
2755
}
2856

2957
}
Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,27 @@
11
package grep.neogul_coder.domain.users.controller;
22

3+
import grep.neogul_coder.domain.users.controller.dto.PasswordRequest;
34
import grep.neogul_coder.domain.users.controller.dto.SignUpRequest;
5+
import grep.neogul_coder.domain.users.controller.dto.UpdatePasswordRequest;
6+
import grep.neogul_coder.domain.users.controller.dto.UpdateProfileRequest;
47
import grep.neogul_coder.global.response.ApiResponse;
58
import io.swagger.v3.oas.annotations.Operation;
9+
import io.swagger.v3.oas.annotations.parameters.RequestBody;
610
import io.swagger.v3.oas.annotations.tags.Tag;
11+
import org.springframework.web.bind.annotation.PathVariable;
712

813
@Tag(name = "User", description = "회원 API")
914
public interface UserSpecification {
1015

1116
@Operation(summary = "회원 가입", description = "회원 정보를 저장합니다.")
12-
ApiResponse<Void> signUp(SignUpRequest request);
17+
ApiResponse<Void> signUp(@RequestBody SignUpRequest request);
1318

19+
@Operation(summary = "회원 프로필 수정", description = "회원 프로필을 수정합니다.")
20+
ApiResponse<Void> updateProfile(@PathVariable Long id,@RequestBody UpdateProfileRequest request);
21+
22+
@Operation(summary = "회원 비밀번호 수정", description = "회원 비밀번호를 수정합니다.")
23+
ApiResponse<Void> updatePassword(@PathVariable Long id, @RequestBody UpdatePasswordRequest request);
24+
25+
@Operation(summary = "회원 상태 삭제로 변경", description = "회원 상태를 삭제로 변경합니다.")
26+
ApiResponse<Void> delete(@PathVariable Long id, @RequestBody PasswordRequest request);
1427
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package grep.neogul_coder.domain.users.controller.dto;
2+
3+
import jakarta.validation.constraints.NotBlank;
4+
import lombok.Data;
5+
6+
@Data
7+
public class PasswordRequest {
8+
9+
@NotBlank(message = "비밀번호를 입력하세요")
10+
String password;
11+
12+
}

src/main/java/grep/neogul_coder/domain/users/controller/dto/SignUpRequest.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,23 +7,25 @@
77
import lombok.Data;
88

99
@Data
10+
@Schema(description = "회원가입")
1011
public class SignUpRequest {
1112

1213
@NotBlank(message = "이메일을 입력해주세요.")
1314
@Email
14-
@Schema(example = "[email protected]")
15+
@Schema(description = "이메일", example = "[email protected]")
1516
private String email;
1617

1718
@NotBlank(message = "비밀번호를 입력해주세요")
19+
@Schema(description = "비밀번호", example = "example123")
1820
private String password;
1921

2022
@NotBlank(message = "비밀번호 확인을 입력해주세요.")
21-
@Schema(description = "비밀번호 확인")
23+
@Schema(description = "비밀번호 확인", example = "example123")
2224
private String passwordCheck;
2325

2426
@NotBlank(message = "닉네임은 필수 입력 사항입니다.")
25-
@Size(min = 2, max = 8, message = "닉네임은 최소 2자, 최대 10자까지 입력 가능합니다.")
26-
@Schema(example = "홍길동")
27+
@Size(min = 2, max = 10, message = "닉네임은 최소 2자, 최대 10자까지 입력 가능합니다.")
28+
@Schema(description = "닉네임", example = "홍길동")
2729
private String nickname;
2830

29-
}
31+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package grep.neogul_coder.domain.users.controller.dto;
2+
3+
import io.swagger.v3.oas.annotations.media.Schema;
4+
import jakarta.validation.constraints.NotBlank;
5+
import lombok.Data;
6+
7+
@Data
8+
@Schema(description = "비밀번호 변경")
9+
public class UpdatePasswordRequest {
10+
11+
@NotBlank(message = "현재 비밀번호를 입력해주세요")
12+
@Schema(description = "현재 비밀번호", example = "oldPassword")
13+
String password;
14+
15+
@NotBlank(message = "변겯할 비밀번호를 입력해주세요")
16+
@Schema(description = "새 비밀번호", example = "newPassword")
17+
String newPassword;
18+
19+
@NotBlank(message = "비밀번호 확인을 입력해주세요")
20+
@Schema(description = "새 비밀번호 확인", example = "newPassword")
21+
String newPasswordCheck;
22+
23+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package grep.neogul_coder.domain.users.controller.dto;
2+
3+
import io.swagger.v3.oas.annotations.media.Schema;
4+
import lombok.Data;
5+
6+
@Data
7+
@Schema(description = "유저 프로필 변경")
8+
public class UpdateProfileRequest {
9+
10+
@Schema(description = "닉네임", example = "example")
11+
String nickname;
12+
13+
@Schema(description = "프로필 이미지")
14+
String profileImgUrl;
15+
16+
}

src/main/java/grep/neogul_coder/domain/users/entity/User.java

Lines changed: 36 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -8,42 +8,63 @@
88
import jakarta.persistence.GeneratedValue;
99
import jakarta.persistence.GenerationType;
1010
import jakarta.persistence.Id;
11+
import jakarta.persistence.Table;
1112
import jakarta.validation.constraints.Email;
12-
import jakarta.validation.constraints.NotBlank;
1313
import lombok.Builder;
1414
import lombok.Getter;
1515

1616
@Entity
1717
@Getter
18-
@Builder
18+
@Table(name = "member")
1919
public class User extends BaseEntity {
2020

2121
@Id
2222
@GeneratedValue(strategy = GenerationType.IDENTITY)
23-
Long id;
23+
private Long id;
2424

25-
String oauthId;
25+
private String oauthId;
2626

27-
String oauthProvider;
27+
private String oauthProvider;
2828

29-
@NotBlank
3029
@Email
31-
String email;
30+
private String email;
3231

33-
@NotBlank
34-
String password;
32+
private String password;
3533

36-
@NotBlank
37-
String nickname;
34+
private String nickname;
3835

39-
String profileImageUrl;
36+
private String profileImageUrl;
4037

4138
@Enumerated(EnumType.STRING)
42-
Role role;
39+
private Role role;
4340

44-
Boolean isDeleted;
41+
private Boolean isDeleted;
4542

46-
protected User(Long id, String oauthId, String oauthProvider, String email, String password,
43+
public static User UserInit(String email, String password, String nickname) {
44+
return User.builder()
45+
.email(email)
46+
.password(password)
47+
.nickname(nickname)
48+
.isDeleted(false)
49+
.role(Role.ROLE_USER)
50+
.build();
51+
}
52+
53+
public void updateProfile(String nickname, String profileImageUrl) {
54+
this.nickname = nickname;
55+
this.profileImageUrl = profileImageUrl;
56+
}
57+
58+
public void updatePassword(String password) {
59+
this.password = password;
60+
}
61+
62+
public void delete() {
63+
this.isDeleted = true;
64+
}
65+
66+
@Builder
67+
private User(Long id, String oauthId, String oauthProvider, String email, String password,
4768
String nickname, String profileImageUrl, Role role, Boolean isDeleted) {
4869
this.id = id;
4970
this.oauthId = oauthId;
@@ -58,14 +79,4 @@ protected User(Long id, String oauthId, String oauthProvider, String email, Stri
5879

5980
protected User() {
6081
}
61-
62-
public static User UserInit(String email, String password, String nickname) {
63-
return User.builder()
64-
.email(email)
65-
.password(password)
66-
.nickname(nickname)
67-
.isDeleted(false)
68-
.role(Role.ROLE_USER)
69-
.build();
70-
}
7182
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
11
package grep.neogul_coder.domain.users.repository;
22

33
import grep.neogul_coder.domain.users.entity.User;
4+
import jakarta.validation.constraints.NotBlank;
45
import java.util.Optional;
56
import org.springframework.data.jpa.repository.JpaRepository;
7+
import org.springframework.data.jpa.repository.Modifying;
8+
import org.springframework.data.jpa.repository.Query;
69
import org.springframework.stereotype.Repository;
710

811
@Repository
912
public interface UserRepository extends JpaRepository<User, Long> {
1013
Optional<User> findByEmail(String email);
14+
Optional<User> findByNickname(String nickname);
15+
1116
}

0 commit comments

Comments
 (0)