diff --git a/src/main/java/in/koreatech/koin/admin/manager/controller/AdminApi.java b/src/main/java/in/koreatech/koin/admin/manager/controller/AdminApi.java index a5a0e99fd1..42b2a7b54b 100644 --- a/src/main/java/in/koreatech/koin/admin/manager/controller/AdminApi.java +++ b/src/main/java/in/koreatech/koin/admin/manager/controller/AdminApi.java @@ -14,6 +14,7 @@ import in.koreatech.koin.admin.abtest.useragent.UserAgentInfo; import in.koreatech.koin.admin.history.aop.AdminActivityLogging; import in.koreatech.koin.admin.history.enums.DomainType; +import in.koreatech.koin.admin.manager.dto.request.AdminAuthenticationStatusUpdateRequest; import in.koreatech.koin.admin.manager.dto.request.AdminLoginRequest; import in.koreatech.koin.admin.manager.dto.request.AdminPasswordChangeRequest; import in.koreatech.koin.admin.manager.dto.request.AdminPermissionUpdateRequest; @@ -49,7 +50,13 @@ public interface AdminApi { @ApiResponse(responseCode = "409", content = @Content(schema = @Schema(hidden = true))), } ) - @Operation(summary = "어드민 회원가입") + @Operation(summary = "어드민 회원가입", description = """ + ### track_name + - ANDROID, BACKEND, FRONTEND, GAME, PM, PL, DESIGN, IOS, DA, SECURITY + + ### team_name + - KOIN, BUSINESS, CAMPUS, USER + """) @PostMapping("/admin") ResponseEntity createAdmin( @RequestBody @Valid CreateAdminRequest request, @@ -178,6 +185,7 @@ ResponseEntity getAdmins( @PutMapping("/admin/{id}/authed") @AdminActivityLogging(domain = DomainType.ADMIN, domainIdParam = "id") ResponseEntity adminAuthenticate( + @RequestBody @Valid AdminAuthenticationStatusUpdateRequest request, @PathVariable Integer id, @Auth(permit = {ADMIN}) Integer adminId ); diff --git a/src/main/java/in/koreatech/koin/admin/manager/controller/AdminController.java b/src/main/java/in/koreatech/koin/admin/manager/controller/AdminController.java index 7968c013d2..5e6a6badc5 100644 --- a/src/main/java/in/koreatech/koin/admin/manager/controller/AdminController.java +++ b/src/main/java/in/koreatech/koin/admin/manager/controller/AdminController.java @@ -17,6 +17,7 @@ import in.koreatech.koin.admin.abtest.useragent.UserAgentInfo; import in.koreatech.koin.admin.history.aop.AdminActivityLogging; import in.koreatech.koin.admin.history.enums.DomainType; +import in.koreatech.koin.admin.manager.dto.request.AdminAuthenticationStatusUpdateRequest; import in.koreatech.koin.admin.manager.dto.request.AdminLoginRequest; import in.koreatech.koin.admin.manager.dto.request.AdminPasswordChangeRequest; import in.koreatech.koin.admin.manager.dto.request.AdminPermissionUpdateRequest; @@ -122,10 +123,11 @@ public ResponseEntity getAdmins( @PutMapping("/admin/{id}/authed") @AdminActivityLogging(domain = DomainType.ADMIN, domainIdParam = "id") public ResponseEntity adminAuthenticate( + @RequestBody @Valid AdminAuthenticationStatusUpdateRequest request, @PathVariable Integer id, @Auth(permit = {ADMIN}) Integer adminId ) { - adminService.adminAuthenticate(id, adminId); + adminService.adminAuthenticate(request, id, adminId); return ResponseEntity.ok().build(); } diff --git a/src/main/java/in/koreatech/koin/admin/manager/dto/request/AdminAuthenticationStatusUpdateRequest.java b/src/main/java/in/koreatech/koin/admin/manager/dto/request/AdminAuthenticationStatusUpdateRequest.java new file mode 100644 index 0000000000..ba723775f9 --- /dev/null +++ b/src/main/java/in/koreatech/koin/admin/manager/dto/request/AdminAuthenticationStatusUpdateRequest.java @@ -0,0 +1,17 @@ +package in.koreatech.koin.admin.manager.dto.request; + +import static com.fasterxml.jackson.databind.PropertyNamingStrategies.SnakeCaseStrategy; +import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED; + +import com.fasterxml.jackson.databind.annotation.JsonNaming; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; + +@JsonNaming(value = SnakeCaseStrategy.class) +public record AdminAuthenticationStatusUpdateRequest( + @Schema(description = "인증 상태", example = "true", requiredMode = REQUIRED) + @NotNull(message = "인증 상태는 필수 입력 사항입니다.") + Boolean isAuthed +) { +} diff --git a/src/main/java/in/koreatech/koin/admin/manager/dto/request/AdminPermissionUpdateRequest.java b/src/main/java/in/koreatech/koin/admin/manager/dto/request/AdminPermissionUpdateRequest.java index 6ec54d752b..ea752694ed 100644 --- a/src/main/java/in/koreatech/koin/admin/manager/dto/request/AdminPermissionUpdateRequest.java +++ b/src/main/java/in/koreatech/koin/admin/manager/dto/request/AdminPermissionUpdateRequest.java @@ -10,10 +10,6 @@ @JsonNaming(value = SnakeCaseStrategy.class) public record AdminPermissionUpdateRequest( - @Schema(description = "어드민 생성 권한", example = "false", requiredMode = REQUIRED) - @NotNull(message = "어드민 생성 권한은 필수 입력 사항입니다") - Boolean canCreateAdmin, - @Schema(description = "슈퍼 어드민 권한", example = "false", requiredMode = REQUIRED) @NotNull(message = "슈퍼 어드민 권한은 필수 입력 사항입니다") Boolean superAdmin diff --git a/src/main/java/in/koreatech/koin/admin/manager/dto/request/AdminUpdateRequest.java b/src/main/java/in/koreatech/koin/admin/manager/dto/request/AdminUpdateRequest.java index 8f0efd2a87..601b3c7978 100644 --- a/src/main/java/in/koreatech/koin/admin/manager/dto/request/AdminUpdateRequest.java +++ b/src/main/java/in/koreatech/koin/admin/manager/dto/request/AdminUpdateRequest.java @@ -3,9 +3,9 @@ import static com.fasterxml.jackson.databind.PropertyNamingStrategies.SnakeCaseStrategy; import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED; +import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.annotation.JsonNaming; -import in.koreatech.koin.admin.manager.enums.TeamType; import in.koreatech.koin.admin.manager.enums.TrackType; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotBlank; @@ -19,10 +19,7 @@ public record AdminUpdateRequest( @Schema(description = "트랙 타입", example = "BACKEND", requiredMode = REQUIRED) @NotNull(message = "트랙 타입은 필수 입력 사항입니다.") - TrackType trackType, - - @Schema(description = "팀 타입", example = "USER", requiredMode = REQUIRED) - @NotNull(message = "팀 타입은 필수 입력 사항입니다.") - TeamType teamType + @JsonProperty(value = "track_name") + TrackType trackType ) { } diff --git a/src/main/java/in/koreatech/koin/admin/manager/dto/response/AdminResponse.java b/src/main/java/in/koreatech/koin/admin/manager/dto/response/AdminResponse.java index 66883086ac..0aceb649cc 100644 --- a/src/main/java/in/koreatech/koin/admin/manager/dto/response/AdminResponse.java +++ b/src/main/java/in/koreatech/koin/admin/manager/dto/response/AdminResponse.java @@ -23,12 +23,6 @@ public record AdminResponse( @Schema(description = "트랙 이름", example = "Backend", requiredMode = REQUIRED) String trackName, - @Schema(description = "팀 이름", example = "User", requiredMode = REQUIRED) - String teamName, - - @Schema(description = "어드민 생성 권한", example = "false", requiredMode = REQUIRED) - Boolean canCreateAdmin, - @Schema(description = "슈퍼 어드민 권한", example = "false", requiredMode = REQUIRED) Boolean superAdmin ) { @@ -40,8 +34,6 @@ public static AdminResponse from(Admin admin) { admin.getEmail(), user.getName(), admin.getTrackType().getValue(), - admin.getTeamType().getValue(), - admin.isCanCreateAdmin(), admin.isSuperAdmin() ); } diff --git a/src/main/java/in/koreatech/koin/admin/manager/dto/response/AdminsResponse.java b/src/main/java/in/koreatech/koin/admin/manager/dto/response/AdminsResponse.java index ca43dc011b..b64464f5e5 100644 --- a/src/main/java/in/koreatech/koin/admin/manager/dto/response/AdminsResponse.java +++ b/src/main/java/in/koreatech/koin/admin/manager/dto/response/AdminsResponse.java @@ -45,12 +45,6 @@ public record InnerAdminsResponse( @Schema(description = "트랙 이름", example = "Backend", requiredMode = REQUIRED) String trackName, - @Schema(description = "팀 이름", example = "User", requiredMode = REQUIRED) - String teamName, - - @Schema(description = "어드민 생성 권한", example = "false", requiredMode = REQUIRED) - Boolean canCreateAdmin, - @Schema(description = "슈퍼 어드민 권한", example = "false", requiredMode = REQUIRED) Boolean superAdmin ) { @@ -62,8 +56,6 @@ public static InnerAdminsResponse from(Admin admin) { admin.getEmail(), user.getName(), admin.getTrackType().getValue(), - admin.getTeamType().getValue(), - admin.isCanCreateAdmin(), admin.isSuperAdmin() ); } diff --git a/src/main/java/in/koreatech/koin/admin/manager/dto/response/CreateAdminRequest.java b/src/main/java/in/koreatech/koin/admin/manager/dto/response/CreateAdminRequest.java index e882146dde..56554919ad 100644 --- a/src/main/java/in/koreatech/koin/admin/manager/dto/response/CreateAdminRequest.java +++ b/src/main/java/in/koreatech/koin/admin/manager/dto/response/CreateAdminRequest.java @@ -1,14 +1,15 @@ package in.koreatech.koin.admin.manager.dto.response; import static com.fasterxml.jackson.databind.PropertyNamingStrategies.SnakeCaseStrategy; +import static in.koreatech.koin.admin.manager.enums.TeamType.KOIN; import static in.koreatech.koin.domain.user.model.UserType.ADMIN; import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED; import org.springframework.security.crypto.password.PasswordEncoder; +import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.annotation.JsonNaming; -import in.koreatech.koin.admin.manager.enums.TeamType; import in.koreatech.koin.admin.manager.enums.TrackType; import in.koreatech.koin.admin.manager.model.Admin; import in.koreatech.koin.domain.user.model.User; @@ -34,11 +35,8 @@ public record CreateAdminRequest( @Schema(description = "트랙 타입", example = "BACKEND", requiredMode = REQUIRED) @NotNull(message = "트랙 타입을 입력해주세요.") - TrackType trackType, - - @Schema(description = "팀 타입", example = "USER", requiredMode = REQUIRED) - @NotNull(message = "팀 타입을 입력해주세요.") - TeamType teamType + @JsonProperty(value = "track_name") + TrackType trackType ) { public Admin toAdmin(PasswordEncoder passwordEncoder) { @@ -47,7 +45,7 @@ public Admin toAdmin(PasswordEncoder passwordEncoder) { .loginPw(passwordEncoder.encode(password)) .name(name) .userType(ADMIN) - .isAuthed(false) + .isAuthed(true) .isDeleted(false) .build(); @@ -55,7 +53,7 @@ public Admin toAdmin(PasswordEncoder passwordEncoder) { .email(email) .loginId(loginId) .trackType(trackType) - .teamType(teamType) + .teamType(KOIN) .user(user) .build(); } diff --git a/src/main/java/in/koreatech/koin/admin/manager/model/Admin.java b/src/main/java/in/koreatech/koin/admin/manager/model/Admin.java index d1f82f5178..c2922bec93 100644 --- a/src/main/java/in/koreatech/koin/admin/manager/model/Admin.java +++ b/src/main/java/in/koreatech/koin/admin/manager/model/Admin.java @@ -40,19 +40,11 @@ public class Admin { @Column(name = "login_id", nullable = false, unique = true, length = 30) private String loginId; - @NotNull - @Enumerated(EnumType.STRING) - @Column(name = "team_type", nullable = false) - private TeamType teamType; - @NotNull @Enumerated(EnumType.STRING) @Column(name = "track_type", nullable = false) private TrackType trackType; - @Column(name = "can_create_admin", columnDefinition = "TINYINT") - private boolean canCreateAdmin = false; - @Column(name = "super_admin", columnDefinition = "TINYINT") private boolean superAdmin = false; @@ -61,6 +53,16 @@ public class Admin { @JoinColumn(name = "user_id", referencedColumnName = "id") private User user; + // 레거시 필드 + + @NotNull + @Enumerated(EnumType.STRING) + @Column(name = "team_type", nullable = false) + private TeamType teamType; + + @Column(name = "can_create_admin", columnDefinition = "TINYINT") + private boolean canCreateAdmin = false; + @Builder private Admin( Integer id, @@ -82,14 +84,12 @@ private Admin( this.user = user; } - public void updateTeamTrack(TeamType teamName, TrackType trackName) { - this.teamType = teamName; + public void updateTrack(TrackType trackName) { this.trackType = trackName; } /* 어드민 권한이 추가 되면, 해당 메소드에도 추가해야 합니다. */ - public void updatePermission(boolean canCreateAdmin, boolean superAdmin) { - this.canCreateAdmin = canCreateAdmin; + public void updatePermission(boolean superAdmin) { this.superAdmin = superAdmin; } } diff --git a/src/main/java/in/koreatech/koin/admin/manager/service/AdminService.java b/src/main/java/in/koreatech/koin/admin/manager/service/AdminService.java index 343d635cd1..b9fdd7ba59 100644 --- a/src/main/java/in/koreatech/koin/admin/manager/service/AdminService.java +++ b/src/main/java/in/koreatech/koin/admin/manager/service/AdminService.java @@ -2,6 +2,7 @@ import java.time.LocalDateTime; +import org.springframework.context.ApplicationEventPublisher; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.security.crypto.password.PasswordEncoder; @@ -9,6 +10,7 @@ import org.springframework.transaction.annotation.Transactional; import in.koreatech.koin.admin.abtest.useragent.UserAgentInfo; +import in.koreatech.koin.admin.manager.dto.request.AdminAuthenticationStatusUpdateRequest; import in.koreatech.koin.admin.manager.dto.request.AdminLoginRequest; import in.koreatech.koin.admin.manager.dto.request.AdminPasswordChangeRequest; import in.koreatech.koin.admin.manager.dto.request.AdminPermissionUpdateRequest; @@ -23,6 +25,8 @@ import in.koreatech.koin.admin.manager.model.Admin; import in.koreatech.koin.admin.manager.repository.AdminRepository; import in.koreatech.koin.admin.user.repository.AdminUserRepository; +import in.koreatech.koin.common.event.AdminAuthenticationStatusChangeEvent; +import in.koreatech.koin.common.event.AdminRegisterEvent; import in.koreatech.koin.common.model.Criteria; import in.koreatech.koin.domain.user.model.User; import in.koreatech.koin.domain.user.service.RefreshTokenService; @@ -41,17 +45,24 @@ public class AdminService { private final AdminValidation adminValidation; private final RefreshTokenService refreshTokenService; private final AdminUserRepository adminUserRepository; + private final ApplicationEventPublisher applicationEventPublisher; @Transactional public AdminResponse createAdmin(CreateAdminRequest request, Integer adminId) { Admin admin = adminRepository.getById(adminId); - if (!admin.isCanCreateAdmin() || !admin.isSuperAdmin()) { + if (!admin.isSuperAdmin()) { throw new AuthorizationException("어드민 계정 생성 권한이 없습니다."); } adminValidation.validateEmailForAdminCreated(request.email()); Admin savedAdmin = adminRepository.save(request.toAdmin(passwordEncoder)); + applicationEventPublisher.publishEvent(new AdminRegisterEvent( + admin.getLoginId(), + admin.getUser().getName(), + savedAdmin.getLoginId(), + savedAdmin.getUser().getName() + )); return AdminResponse.from(savedAdmin); } @@ -106,14 +117,23 @@ public AdminsResponse getAdmins(AdminsCondition adminsCondition) { } @Transactional - public void adminAuthenticate(Integer id, Integer adminId) { + public void adminAuthenticate(AdminAuthenticationStatusUpdateRequest request, Integer id, Integer adminId) { Admin admin = adminRepository.getById(adminId); if (!admin.isSuperAdmin()) { throw new AuthorizationException("어드민 승인 권한이 없습니다."); } - User user = adminRepository.getById(id).getUser(); - user.permitAuth(); + Admin targetAdmin = adminRepository.getById(id); + User user = targetAdmin.getUser(); + user.updateAuthenticationStatus(request.isAuthed()); + + applicationEventPublisher.publishEvent(new AdminAuthenticationStatusChangeEvent( + admin.getLoginId(), + admin.getUser().getName(), + targetAdmin.getLoginId(), + targetAdmin.getUser().getName(), + request.isAuthed() + )); } @Transactional @@ -122,7 +142,7 @@ public void updateAdmin(AdminUpdateRequest request, Integer id) { User user = admin.getUser(); user.updateName(request.name()); - admin.updateTeamTrack(request.teamType(), request.trackType()); + admin.updateTrack(request.trackType()); } @Transactional @@ -132,6 +152,6 @@ public void updateAdminPermission(AdminPermissionUpdateRequest request, Integer throw new AuthorizationException("슈퍼 어드민 권한이 없습니다."); } - adminRepository.getById(id).updatePermission(request.canCreateAdmin(), request.superAdmin()); + adminRepository.getById(id).updatePermission(request.superAdmin()); } } diff --git a/src/main/java/in/koreatech/koin/common/event/AdminAuthenticationStatusChangeEvent.java b/src/main/java/in/koreatech/koin/common/event/AdminAuthenticationStatusChangeEvent.java new file mode 100644 index 0000000000..54bdb3811c --- /dev/null +++ b/src/main/java/in/koreatech/koin/common/event/AdminAuthenticationStatusChangeEvent.java @@ -0,0 +1,11 @@ +package in.koreatech.koin.common.event; + +public record AdminAuthenticationStatusChangeEvent( + String changedByAdminId, + String changedByAdminName, + String targetAdminId, + String targetAdminName, + Boolean isAuthed +) { + +} diff --git a/src/main/java/in/koreatech/koin/common/event/AdminRegisterEvent.java b/src/main/java/in/koreatech/koin/common/event/AdminRegisterEvent.java new file mode 100644 index 0000000000..9549e07617 --- /dev/null +++ b/src/main/java/in/koreatech/koin/common/event/AdminRegisterEvent.java @@ -0,0 +1,10 @@ +package in.koreatech.koin.common.event; + +public record AdminRegisterEvent( + String creatorId, + String creatorName, + String newAdminId, + String newAdminName +) { + +} diff --git a/src/main/java/in/koreatech/koin/domain/user/model/User.java b/src/main/java/in/koreatech/koin/domain/user/model/User.java index 97089bbc18..4775d2a563 100644 --- a/src/main/java/in/koreatech/koin/domain/user/model/User.java +++ b/src/main/java/in/koreatech/koin/domain/user/model/User.java @@ -195,6 +195,10 @@ public void permitAuth() { this.isAuthed = true; } + public void updateAuthenticationStatus(boolean isAuthed) { + this.isAuthed = isAuthed; + } + public void permitNotification(String deviceToken) { this.deviceToken = deviceToken; } diff --git a/src/main/java/in/koreatech/koin/infrastructure/slack/eventlistener/AdminEventListener.java b/src/main/java/in/koreatech/koin/infrastructure/slack/eventlistener/AdminEventListener.java new file mode 100644 index 0000000000..bcfaafc3b4 --- /dev/null +++ b/src/main/java/in/koreatech/koin/infrastructure/slack/eventlistener/AdminEventListener.java @@ -0,0 +1,46 @@ +package in.koreatech.koin.infrastructure.slack.eventlistener; + +import org.springframework.context.annotation.Profile; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; +import org.springframework.transaction.event.TransactionalEventListener; + +import in.koreatech.koin.common.event.AdminAuthenticationStatusChangeEvent; +import in.koreatech.koin.common.event.AdminRegisterEvent; +import in.koreatech.koin.infrastructure.slack.client.SlackClient; +import in.koreatech.koin.infrastructure.slack.model.SlackNotificationFactory; +import lombok.RequiredArgsConstructor; + +@Component +@Profile("!test") +@RequiredArgsConstructor +public class AdminEventListener { + + private final SlackClient slackClient; + private final SlackNotificationFactory slackNotificationFactory; + + @Async + @TransactionalEventListener + public void onAdminRegisterEvent(AdminRegisterEvent event) { + var notification = slackNotificationFactory.generateAdminCreateSendNotification( + event.creatorId(), + event.creatorName(), + event.newAdminId(), + event.newAdminName() + ); + slackClient.sendMessage(notification); + } + + @Async + @TransactionalEventListener + public void onAdminAuthenticationStatusChangeEvent(AdminAuthenticationStatusChangeEvent event) { + var notification = slackNotificationFactory.generateAdminAuthenticationStatusChangeSendNotification( + event.changedByAdminId(), + event.changedByAdminName(), + event.targetAdminId(), + event.targetAdminName(), + event.isAuthed() + ); + slackClient.sendMessage(notification); + } +} diff --git a/src/main/java/in/koreatech/koin/infrastructure/slack/model/SlackNotificationFactory.java b/src/main/java/in/koreatech/koin/infrastructure/slack/model/SlackNotificationFactory.java index 8c418fc1ba..9b543c06af 100644 --- a/src/main/java/in/koreatech/koin/infrastructure/slack/model/SlackNotificationFactory.java +++ b/src/main/java/in/koreatech/koin/infrastructure/slack/model/SlackNotificationFactory.java @@ -249,4 +249,40 @@ public SlackNotification generateClubCreateSendNotification( ) .build(); } + + /** + * 코인 어드민 생성 알림 + */ + public SlackNotification generateAdminCreateSendNotification( + String creatorId, + String creatorName, + String newAdminId, + String newAdminName + ) { + return SlackNotification.builder() + .slackUrl(eventNotificationUrl) + .text(String.format(""" + `%s(%s)님이 %s(%s) 어드민 계정을 생성했습니다.` + """, creatorName, creatorId, newAdminName, newAdminId)) + .build(); + } + + /** + * 코인 어드민 인증 상태 변경 알림 + */ + public SlackNotification generateAdminAuthenticationStatusChangeSendNotification( + String changedByAdminId, + String changedByAdminName, + String targetAdminId, + String targetAdminName, + Boolean isAuthed + ) { + String action = isAuthed ? "활성화" : "비활성화"; + return SlackNotification.builder() + .slackUrl(eventNotificationUrl) + .text(String.format(""" + `%s(%s)님이 %s(%s) 어드민 계정을 %s했습니다.` + """, changedByAdminName, changedByAdminId, targetAdminName, targetAdminId, action)) + .build(); + } } diff --git a/src/test/java/in/koreatech/koin/acceptance/admin/AdminManagerApiTest.java b/src/test/java/in/koreatech/koin/acceptance/admin/AdminManagerApiTest.java index ba9fa0ef2c..c437af92ae 100644 --- a/src/test/java/in/koreatech/koin/acceptance/admin/AdminManagerApiTest.java +++ b/src/test/java/in/koreatech/koin/acceptance/admin/AdminManagerApiTest.java @@ -163,8 +163,7 @@ void setup() { "email": "koin01234@koreatech.ac.kr", "password": "cd06f8c2b0dd065faf6ef910c7f15934363df71c33740fd245590665286ed268", "name": "신관규", - "track_type": "BACKEND", - "team_type": "USER" + "track_name": "BACKEND" } """) .contentType(MediaType.APPLICATION_JSON) @@ -185,8 +184,7 @@ void setup() { "email": "koin12345@koreatech.ac.kr", "password": "cd06f8c2b0dd065faf6ef910c7f15934363df71c33740fd245590665286ed268", "name": "신관규", - "track_type": "BACKEND", - "team_type": "USER" + "track_name": "BACKEND" } """) .contentType(MediaType.APPLICATION_JSON) @@ -207,8 +205,7 @@ void setup() { "account": "admin123456@koreatech.ac.kr", "password": "cd06f8c2b0dd065faf6ef910c7f15934363df71c33740fd245590665286ed268", "name": "신관규", - "track_type": "BACKEND", - "team_type": "USER" + "track_name": "BACKEND" } """) .contentType(MediaType.APPLICATION_JSON) @@ -234,8 +231,6 @@ void setup() { "email": "koinadmin1@koreatech.ac.kr", "name": "테스트용_코인운영자", "track_name": "Backend", - "team_name": "Business", - "can_create_admin": false, "super_admin": false } """, admin1.getId()))); @@ -265,27 +260,21 @@ void setup() { "id": %d, "email": "juno@koreatech.ac.kr", "name": "테스트용_코인운영자", - "team_name": "User", "track_name": "Backend", - "can_create_admin": true, "super_admin": true }, { "id": %d, "email": "koinadmin1@koreatech.ac.kr", "name": "테스트용_코인운영자", - "team_name": "Business", "track_name": "Backend", - "can_create_admin": false, "super_admin": false }, { "id": %d, "email": "koinadmin2@koreatech.ac.kr", "name": "테스트용_코인운영자", - "team_name": "Campus", "track_name": "Backend", - "can_create_admin": true, "super_admin": false } ] @@ -302,6 +291,12 @@ void setup() { mockMvc.perform( put("/admin/{id}/authed", admin1.getId()) .header("Authorization", "Bearer " + token) + .contentType(MediaType.APPLICATION_JSON) + .content(""" + { + "is_authed": true + } + """) ) .andExpect(status().isOk()); @@ -310,15 +305,24 @@ void setup() { } @Test - void 관리자가_관리자_계정_권한을_승인한다() throws Exception { - Admin admin = userFixture.영희_운영자(); + void 슈퍼_관리자가_관리자_계정_권한을_비활성화한다() throws Exception { + Admin admin = userFixture.코인_운영자(); String token = userFixture.getToken(admin.getUser()); Admin admin1 = userFixture.진구_운영자(); mockMvc.perform( put("/admin/{id}/authed", admin1.getId()) .header("Authorization", "Bearer " + token) + .contentType(MediaType.APPLICATION_JSON) + .content(""" + { + "is_authed": false + } + """) ) - .andExpect(status().isForbidden()); + .andExpect(status().isOk()); + + Admin updateAdmin = adminRepository.getById(admin1.getId()); + assertThat(updateAdmin.getUser().isAuthed()).isFalse(); } }