diff --git a/src/main/java/com/alist/api/modules/admin/member/AdminMemberController.java b/src/main/java/com/alist/api/modules/admin/member/AdminMemberController.java index d6912e3..19a93c1 100644 --- a/src/main/java/com/alist/api/modules/admin/member/AdminMemberController.java +++ b/src/main/java/com/alist/api/modules/admin/member/AdminMemberController.java @@ -57,6 +57,23 @@ public class AdminMemberController { return ApiResponse.entity(adminMemberViewVo, ApiResponseCode.CODE_2001, "회원"); } + @Operation( + summary = "회원 등록" + , description = "관리자가 교사 또는 학생 회원을 등록합니다. 아이디 중복 시 오류를 반환합니다." + ) + @PostMapping("/add") + public ResponseEntity> adminMemberAdd( + @Valid @RequestBody AdminMemberAddForm adminMemberAddForm + ) { + AdminMemberAddVo adminMemberAddVo = adminMemberService.insertAdminMemberAdd(adminMemberAddForm.toDto()); + + if (adminMemberAddVo.getResultCode() == 2004) { + return ApiResponse.entity(adminMemberAddVo, ApiResponseCode.CODE_2004, "아이디"); + } + + return ApiResponse.entity(adminMemberAddVo, ApiResponseCode.CODE_2002, "회원"); + } + @Operation( summary = "회원 정보 수정" , description = "관리자가 회원 PK 기준으로 회원 기본 정보와 권한 정보를 수정합니다." diff --git a/src/main/java/com/alist/api/modules/admin/member/dto/AdminMemberAddDto.java b/src/main/java/com/alist/api/modules/admin/member/dto/AdminMemberAddDto.java new file mode 100644 index 0000000..99f51d2 --- /dev/null +++ b/src/main/java/com/alist/api/modules/admin/member/dto/AdminMemberAddDto.java @@ -0,0 +1,13 @@ +package com.alist.api.modules.admin.member.dto; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class AdminMemberAddDto { + private String id; + private String password; + private String userRole; + private String userType; +} \ No newline at end of file diff --git a/src/main/java/com/alist/api/modules/admin/member/form/AdminMemberAddForm.java b/src/main/java/com/alist/api/modules/admin/member/form/AdminMemberAddForm.java new file mode 100644 index 0000000..04358ec --- /dev/null +++ b/src/main/java/com/alist/api/modules/admin/member/form/AdminMemberAddForm.java @@ -0,0 +1,91 @@ +package com.alist.api.modules.admin.member.form; + +import com.alist.api.modules.admin.member.dto.AdminMemberAddDto; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.AssertTrue; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Pattern; +import jakarta.validation.constraints.Size; +import lombok.Getter; +import lombok.Setter; + +@Schema(description = "관리자 회원 등록 요청 폼") +@Getter +@Setter +public class AdminMemberAddForm { + + @Schema( + description = "회원 아이디" + , example = "teacher01" + , requiredMode = Schema.RequiredMode.REQUIRED + ) + @NotBlank(message = "아이디를 입력해주세요.") + private String id; + + @Schema( + description = "비밀번호(8~64자, 영문과 숫자 포함, 공백 불가)" + , example = "pass1234" + , requiredMode = Schema.RequiredMode.REQUIRED + ) + @NotBlank(message = "비밀번호를 입력해주세요.") + @Size(min = 8, max = 64, message = "비밀번호는 8~64자여야 합니다.") + @Pattern( + regexp = "^(?=.*[A-Za-z])(?=.*\\d)\\S+$" + , message = "비밀번호는 영문과 숫자를 포함하고 공백이 없어야 합니다." + ) + private String password; + + @Schema( + description = "회원 권한 코드. 교사: CCM/SCM/I, 학생: R/E" + , example = "I" + , requiredMode = Schema.RequiredMode.REQUIRED + ) + @NotBlank(message = "회원 권한을 입력해주세요.") + @Pattern( + regexp = "^(CCM|SCM|I|R|E)$" + , message = "회원 권한은 CCM, SCM, I, R, E만 가능합니다." + ) + private String userRole; + + @Schema( + description = "회원 유형 코드. T: 교사, S: 학생" + , example = "T" + , requiredMode = Schema.RequiredMode.REQUIRED + ) + @NotBlank(message = "회원 유형을 입력해주세요.") + @Pattern( + regexp = "^(T|S)$" + , message = "회원 유형은 T 또는 S만 가능합니다." + ) + private String userType; + + @AssertTrue(message = "회원 유형과 권한 조합을 확인해주세요.") + @Schema(hidden = true) + public boolean isValidUserTypeAndRole() { + if (userType == null || userRole == null) { + return true; + } + + if ("T".equals(userType)) { + return "CCM".equals(userRole) + || "SCM".equals(userRole) + || "I".equals(userRole); + } + + if ("S".equals(userType)) { + return "R".equals(userRole) + || "E".equals(userRole); + } + + return false; + } + + public AdminMemberAddDto toDto() { + AdminMemberAddDto adminMemberAddDto = new AdminMemberAddDto(); + adminMemberAddDto.setId(id.trim()); + adminMemberAddDto.setPassword(password); + adminMemberAddDto.setUserRole(userRole); + adminMemberAddDto.setUserType(userType); + return adminMemberAddDto; + } +} \ No newline at end of file diff --git a/src/main/java/com/alist/api/modules/admin/member/service/AdminMemberService.java b/src/main/java/com/alist/api/modules/admin/member/service/AdminMemberService.java index 420c8f6..48ee939 100644 --- a/src/main/java/com/alist/api/modules/admin/member/service/AdminMemberService.java +++ b/src/main/java/com/alist/api/modules/admin/member/service/AdminMemberService.java @@ -3,6 +3,9 @@ package com.alist.api.modules.admin.member.service; import com.alist.api.modules.admin.member.dto.*; import com.alist.api.modules.admin.member.mapper.AdminMemberMapper; import com.alist.api.modules.admin.member.vo.*; +import com.alist.api.modules.front.user.dto.UserDto; +import com.alist.api.modules.front.user.service.UserService; +import com.alist.api.modules.front.user.vo.UserVo; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -11,9 +14,11 @@ import java.util.List; @Service public class AdminMemberService { private final AdminMemberMapper adminMemberMapper; + private final UserService userService; - public AdminMemberService(AdminMemberMapper adminMemberMapper) { + public AdminMemberService(AdminMemberMapper adminMemberMapper, UserService userService) { this.adminMemberMapper = adminMemberMapper; + this.userService = userService; } @Transactional(readOnly = true) @@ -33,6 +38,28 @@ public class AdminMemberService { return adminMemberMapper.selectAdminMemberView(userIdx); } + @Transactional + public AdminMemberAddVo insertAdminMemberAdd( + AdminMemberAddDto adminMemberAddDto + ) { + UserDto userDto = new UserDto(); + userDto.setId(adminMemberAddDto.getId()); + userDto.setPassword(adminMemberAddDto.getPassword()); + userDto.setUserRole(adminMemberAddDto.getUserRole()); + userDto.setUserType(adminMemberAddDto.getUserType()); + + UserVo userVo = userService.insertUserAdd(userDto); + + AdminMemberAddVo adminMemberAddVo = new AdminMemberAddVo(); + adminMemberAddVo.setUserIdx(userVo.getUserIdx()); + adminMemberAddVo.setId(userVo.getId()); + adminMemberAddVo.setUserRole(userVo.getUserRole()); + adminMemberAddVo.setUserType(userVo.getUserType()); + adminMemberAddVo.setResultCode(userVo.getResultCode()); + + return adminMemberAddVo; + } + @Transactional public AdminMemberModifyVo updateAdminMemberModify(AdminMemberModifyDto adminMemberModifyDto) { int updateCount = adminMemberMapper.updateAdminMemberModify(adminMemberModifyDto); diff --git a/src/main/java/com/alist/api/modules/admin/member/vo/AdminMemberAddVo.java b/src/main/java/com/alist/api/modules/admin/member/vo/AdminMemberAddVo.java new file mode 100644 index 0000000..3118f53 --- /dev/null +++ b/src/main/java/com/alist/api/modules/admin/member/vo/AdminMemberAddVo.java @@ -0,0 +1,28 @@ +package com.alist.api.modules.admin.member.vo; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +@Schema(description = "관리자 회원 등록 응답") +@Getter +@Setter +public class AdminMemberAddVo { + + @Schema(description = "회원 PK", example = "15") + private Integer userIdx; + + @Schema(description = "회원 아이디", example = "teacher01") + private String id; + + @Schema(description = "회원 권한 코드", example = "I") + private String userRole; + + @Schema(description = "회원 유형 코드. T: 교사, S: 학생", example = "T") + private String userType; + + @JsonIgnore + @Schema(hidden = true) + private int resultCode; +} \ No newline at end of file