- POST /v1/in/account/operator/create (계정 생성 + 비밀번호 설정 이메일) - POST /v1/in/account/operator/delete (Soft Delete, 자기 자신 삭제 방지) - POST /v1/in/account/operator/list (페이징 + role/is_active 필터) - POST /v1/in/account/operator/password/reset (비밀번호 초기화 + 세션 무효화) Closes #134
166 lines
7.4 KiB
C#
166 lines
7.4 KiB
C#
using Microsoft.AspNetCore.Authorization;
|
|
using Microsoft.AspNetCore.Mvc;
|
|
using Swashbuckle.AspNetCore.Annotations;
|
|
using SPMS.Application.DTOs.Account;
|
|
using SPMS.Application.Interfaces;
|
|
using SPMS.Domain.Common;
|
|
|
|
namespace SPMS.API.Controllers;
|
|
|
|
[ApiController]
|
|
[Route("v1/in/account")]
|
|
[ApiExplorerSettings(GroupName = "account")]
|
|
[Authorize(Roles = "Super")]
|
|
public class AccountController : ControllerBase
|
|
{
|
|
private readonly IAccountService _accountService;
|
|
|
|
public AccountController(IAccountService accountService)
|
|
{
|
|
_accountService = accountService;
|
|
}
|
|
|
|
[HttpPost("create")]
|
|
[SwaggerOperation(
|
|
Summary = "운영자 계정 생성",
|
|
Description = "Super Admin이 새로운 운영자(Manager/User) 계정을 생성합니다.")]
|
|
[SwaggerResponse(200, "생성 성공", typeof(ApiResponse<AccountResponseDto>))]
|
|
[SwaggerResponse(400, "잘못된 요청")]
|
|
[SwaggerResponse(401, "인증되지 않은 요청")]
|
|
[SwaggerResponse(403, "권한 없음")]
|
|
[SwaggerResponse(409, "이메일 중복")]
|
|
public async Task<IActionResult> CreateAsync([FromBody] CreateAccountRequestDto request)
|
|
{
|
|
var result = await _accountService.CreateAsync(request);
|
|
return Ok(ApiResponse<AccountResponseDto>.Success(result));
|
|
}
|
|
|
|
[HttpPost("list")]
|
|
[SwaggerOperation(
|
|
Summary = "운영자 목록 조회",
|
|
Description = "Super Admin이 운영자(Manager/User) 목록을 조회합니다. Super Admin은 목록에 포함되지 않습니다.")]
|
|
[SwaggerResponse(200, "조회 성공", typeof(ApiResponse<AccountListResponseDto>))]
|
|
[SwaggerResponse(401, "인증되지 않은 요청")]
|
|
[SwaggerResponse(403, "권한 없음")]
|
|
public async Task<IActionResult> GetListAsync([FromBody] AccountListRequestDto request)
|
|
{
|
|
var result = await _accountService.GetListAsync(request);
|
|
return Ok(ApiResponse<AccountListResponseDto>.Success(result));
|
|
}
|
|
|
|
[HttpPost("{adminCode}")]
|
|
[SwaggerOperation(
|
|
Summary = "운영자 상세 조회",
|
|
Description = "Super Admin이 특정 운영자의 상세 정보를 조회합니다.")]
|
|
[SwaggerResponse(200, "조회 성공", typeof(ApiResponse<AccountResponseDto>))]
|
|
[SwaggerResponse(401, "인증되지 않은 요청")]
|
|
[SwaggerResponse(403, "권한 없음")]
|
|
[SwaggerResponse(404, "운영자를 찾을 수 없음")]
|
|
public async Task<IActionResult> GetByAdminCodeAsync([FromRoute] string adminCode)
|
|
{
|
|
var result = await _accountService.GetByAdminCodeAsync(adminCode);
|
|
return Ok(ApiResponse<AccountResponseDto>.Success(result));
|
|
}
|
|
|
|
[HttpPost("{adminCode}/update")]
|
|
[SwaggerOperation(
|
|
Summary = "운영자 정보 수정",
|
|
Description = "Super Admin이 운영자의 정보(이름, 전화번호, 권한)를 수정합니다.")]
|
|
[SwaggerResponse(200, "수정 성공", typeof(ApiResponse<AccountResponseDto>))]
|
|
[SwaggerResponse(400, "잘못된 요청")]
|
|
[SwaggerResponse(401, "인증되지 않은 요청")]
|
|
[SwaggerResponse(403, "권한 없음")]
|
|
[SwaggerResponse(404, "운영자를 찾을 수 없음")]
|
|
public async Task<IActionResult> UpdateAsync(
|
|
[FromRoute] string adminCode,
|
|
[FromBody] UpdateAccountRequestDto request)
|
|
{
|
|
var result = await _accountService.UpdateAsync(adminCode, request);
|
|
return Ok(ApiResponse<AccountResponseDto>.Success(result));
|
|
}
|
|
|
|
[HttpPost("{adminCode}/delete")]
|
|
[SwaggerOperation(
|
|
Summary = "운영자 계정 삭제",
|
|
Description = "Super Admin이 운영자 계정을 삭제합니다. (Soft Delete)")]
|
|
[SwaggerResponse(200, "삭제 성공")]
|
|
[SwaggerResponse(401, "인증되지 않은 요청")]
|
|
[SwaggerResponse(403, "권한 없음")]
|
|
[SwaggerResponse(404, "운영자를 찾을 수 없음")]
|
|
public async Task<IActionResult> DeleteAsync([FromRoute] string adminCode)
|
|
{
|
|
await _accountService.DeleteAsync(adminCode);
|
|
return Ok(ApiResponse.Success());
|
|
}
|
|
|
|
[HttpPost("operator/create")]
|
|
[SwaggerOperation(
|
|
Summary = "운영자 계정 생성 (이메일 링크)",
|
|
Description = "Super Admin이 운영자 계정을 생성합니다. 비밀번호 설정 이메일이 발송됩니다.")]
|
|
[SwaggerResponse(200, "생성 성공", typeof(ApiResponse<OperatorCreateResponseDto>))]
|
|
[SwaggerResponse(400, "잘못된 요청")]
|
|
[SwaggerResponse(401, "인증되지 않은 요청")]
|
|
[SwaggerResponse(403, "권한 없음")]
|
|
[SwaggerResponse(409, "이메일 중복")]
|
|
public async Task<IActionResult> CreateOperatorAsync([FromBody] OperatorCreateRequestDto request)
|
|
{
|
|
var result = await _accountService.CreateOperatorAsync(request);
|
|
return Ok(ApiResponse<OperatorCreateResponseDto>.Success(result));
|
|
}
|
|
|
|
[HttpPost("operator/delete")]
|
|
[SwaggerOperation(
|
|
Summary = "운영자 계정 삭제",
|
|
Description = "Super Admin이 운영자 계정을 삭제합니다. (Soft Delete) 자기 자신은 삭제할 수 없습니다.")]
|
|
[SwaggerResponse(200, "삭제 성공")]
|
|
[SwaggerResponse(401, "인증되지 않은 요청")]
|
|
[SwaggerResponse(403, "권한 없음 / 자기 자신 삭제 불가")]
|
|
[SwaggerResponse(404, "운영자를 찾을 수 없음")]
|
|
public async Task<IActionResult> DeleteOperatorAsync([FromBody] OperatorDeleteRequestDto request)
|
|
{
|
|
var adminId = GetAdminId();
|
|
await _accountService.DeleteOperatorAsync(request.AdminCode, adminId);
|
|
return Ok(ApiResponse.Success());
|
|
}
|
|
|
|
[HttpPost("operator/list")]
|
|
[SwaggerOperation(
|
|
Summary = "운영자 목록 조회",
|
|
Description = "Super Admin이 운영자(Manager/User) 목록을 조회합니다. is_active 필터로 비활성 운영자도 조회 가능합니다.")]
|
|
[SwaggerResponse(200, "조회 성공", typeof(ApiResponse<OperatorListResponseDto>))]
|
|
[SwaggerResponse(401, "인증되지 않은 요청")]
|
|
[SwaggerResponse(403, "권한 없음")]
|
|
public async Task<IActionResult> GetOperatorListAsync([FromBody] OperatorListRequestDto request)
|
|
{
|
|
var result = await _accountService.GetOperatorListAsync(request);
|
|
return Ok(ApiResponse<OperatorListResponseDto>.Success(result));
|
|
}
|
|
|
|
[HttpPost("operator/password/reset")]
|
|
[SwaggerOperation(
|
|
Summary = "운영자 비밀번호 초기화",
|
|
Description = "Super Admin이 운영자의 비밀번호를 초기화합니다. 비밀번호 재설정 이메일이 발송됩니다.")]
|
|
[SwaggerResponse(200, "초기화 성공", typeof(ApiResponse<OperatorCreateResponseDto>))]
|
|
[SwaggerResponse(401, "인증되지 않은 요청")]
|
|
[SwaggerResponse(403, "권한 없음")]
|
|
[SwaggerResponse(404, "운영자를 찾을 수 없음")]
|
|
public async Task<IActionResult> ResetOperatorPasswordAsync([FromBody] OperatorPasswordResetRequestDto request)
|
|
{
|
|
var result = await _accountService.ResetOperatorPasswordAsync(request.AdminCode);
|
|
return Ok(ApiResponse<OperatorCreateResponseDto>.Success(result));
|
|
}
|
|
|
|
private long GetAdminId()
|
|
{
|
|
var adminIdClaim = User.FindFirst("adminId")?.Value;
|
|
if (string.IsNullOrEmpty(adminIdClaim) || !long.TryParse(adminIdClaim, out var adminId))
|
|
{
|
|
throw new SPMS.Domain.Exceptions.SpmsException(
|
|
ErrorCodes.Unauthorized,
|
|
"인증 정보를 확인할 수 없습니다.",
|
|
401);
|
|
}
|
|
return adminId;
|
|
}
|
|
}
|