[api] admin/member/add

회원 정보 등록 추가
This commit is contained in:
2026-06-23 10:27:18 +09:00
parent 4b65caee2b
commit 35b89d861c
5 changed files with 177 additions and 1 deletions
@@ -57,6 +57,23 @@ public class AdminMemberController {
return ApiResponse.entity(adminMemberViewVo, ApiResponseCode.CODE_2001, "회원");
}
@Operation(
summary = "회원 등록"
, description = "관리자가 교사 또는 학생 회원을 등록합니다. 아이디 중복 시 오류를 반환합니다."
)
@PostMapping("/add")
public ResponseEntity<ApiResponse<AdminMemberAddVo>> 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 기준으로 회원 기본 정보와 권한 정보를 수정합니다."
@@ -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;
}
@@ -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;
}
}
@@ -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);
@@ -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;
}