package com.sb.web.admin.service; import com.sb.web.auth.domain.Member; import com.sb.web.auth.dto.MemberAdminResponse; import com.sb.web.auth.mapper.MemberMapper; import com.sb.web.common.exception.ApiException; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; /** * 관리자용 회원 관리 서비스. (목록/역할/상태/삭제) * 본인 계정에 대한 역할·상태·삭제는 잠금 방지를 위해 차단한다. */ @Service @RequiredArgsConstructor public class MemberAdminService { private final MemberMapper memberMapper; public List list() { return memberMapper.findAll().stream().map(MemberAdminResponse::from).toList(); } @Transactional public MemberAdminResponse updateRole(Long targetId, String role, Long currentAdminId) { Member target = mustFind(targetId); if (targetId.equals(currentAdminId)) { throw new ApiException(HttpStatus.BAD_REQUEST, "본인의 역할은 변경할 수 없습니다."); } memberMapper.updateRole(targetId, role); target.setRole(role); return MemberAdminResponse.from(target); } @Transactional public MemberAdminResponse updatePlan(Long targetId, String plan, Long currentAdminId) { Member target = mustFind(targetId); memberMapper.updatePlan(targetId, plan); target.setPlan(plan); return MemberAdminResponse.from(target); } @Transactional public MemberAdminResponse updateStatus(Long targetId, String status, Long currentAdminId) { Member target = mustFind(targetId); if (targetId.equals(currentAdminId)) { throw new ApiException(HttpStatus.BAD_REQUEST, "본인의 상태는 변경할 수 없습니다."); } memberMapper.updateStatus(targetId, status); target.setStatus(status); return MemberAdminResponse.from(target); } @Transactional public void delete(Long targetId, Long currentAdminId) { mustFind(targetId); if (targetId.equals(currentAdminId)) { throw new ApiException(HttpStatus.BAD_REQUEST, "본인 계정은 삭제할 수 없습니다."); } memberMapper.deleteById(targetId); } private Member mustFind(Long id) { Member m = memberMapper.findById(id); if (m == null) { throw new ApiException(HttpStatus.NOT_FOUND, "회원을 찾을 수 없습니다."); } return m; } }