Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.doubleo.adminservice.domain.admin.controller;

import com.doubleo.adminservice.domain.admin.dto.request.AdminPwUpdateRequest;
import com.doubleo.adminservice.domain.admin.dto.response.AdminInfoResponse;
import com.doubleo.adminservice.domain.admin.service.AdminService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

@Tag(name = "1-1. Admin API", description = "๊ด€๋ฆฌ์ž API")
@RestController
@RequiredArgsConstructor
@RequestMapping("/admins")
public class AdminController {
private final AdminService adminService;

@Operation(summary = "๊ด€๋ฆฌ์ž ๋ณธ์ธ ์ •๋ณด ์กฐํšŒ", description = "๊ด€๋ฆฌ์ž ๋ณธ์ธ ์ •๋ณด๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.")
@GetMapping("/me")
public AdminInfoResponse adminGet(@RequestHeader("X-Admin-Id") Long adminId) {
return adminService.getAdminInfo(adminId);
}

@Operation(summary = "๊ด€๋ฆฌ์ž ๋น„๋ฐ€๋ฒˆํ˜ธ ์—…๋ฐ์ดํŠธ", description = "๊ด€๋ฆฌ์ž ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.")
@PatchMapping("/me/password")
public ResponseEntity<Void> adminPasswordUpdate(
@RequestHeader("X-Admin-Id") Long adminId,
@Valid @RequestBody AdminPwUpdateRequest request) {
adminService.updateAdminPassword(adminId, request);
return ResponseEntity.ok().build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,26 +23,27 @@ public class Admin extends BaseTimeEntity {
@Column(name = "admin_password", nullable = false, length = 100)
private String password;

@Column(name = "admin_name", nullable = false)
private String name;
@Column(name = "admin_affiliation", nullable = false)
private String affiliation;

@Column(name = "admin_contact", nullable = false)
private String contact;
@Column(name = "admin_affiliation_id", nullable = false)
private String affiliationId;

@Builder(access = AccessLevel.PRIVATE)
private Admin(String username, String password, String name, String contact) {
private Admin(String username, String password, String affiliation, String affiliationId) {
this.username = username;
this.password = password;
this.name = name;
this.contact = contact;
this.affiliation = affiliation;
this.affiliationId = affiliationId;
}

public static Admin createAdmin(String username, String password, String name, String contact) {
public static Admin createAdmin(
String username, String password, String affiliation, String affiliationId) {
return Admin.builder()
.username(username)
.password(password)
.name(name)
.contact(contact)
.affiliation(affiliation)
.affiliationId(affiliationId)
.build();
}

Expand Down
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.doubleo.adminservice.domain.admin.dto.request;

import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;

public record AdminPwUpdateRequest(
@Schema(description = "๊ด€๋ฆฌ์ž ๊ธฐ์กด ํŒจ์Šค์›Œ๋“œ", example = "pw12345")
@NotBlank(message = "๊ธฐ์กด ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค.")
String passwordOriginal,
@Schema(description = "๊ด€๋ฆฌ์ž ์‹ ๊ทœ ํŒจ์Šค์›Œ๋“œ", example = "pw67890")
@NotBlank(message = "์‹ ๊ทœ ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค.")
String passwordNew) {}
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.doubleo.adminservice.domain.admin.dto.response;

import com.doubleo.adminservice.domain.admin.domain.Admin;
import io.swagger.v3.oas.annotations.media.Schema;

public record AdminInfoResponse(
@Schema(description = "๊ด€๋ฆฌ์ž ID", example = "1") Long adminId,
@Schema(description = "๊ด€๋ฆฌ์ž username", example = "admin1") String username,
@Schema(description = "๊ด€๋ฆฌ์ž ์†Œ์† ๋ณ‘์›", example = "์„œ์šธ์•„์‚ฐ๋ณ‘์›") String affiliation,
@Schema(description = "๊ด€๋ฆฌ์ž ์†Œ์† ๋ณ‘์› ๊ตฌ๋ถ„ ID", example = "TSEO09AS") String affiliationId) {
public static AdminInfoResponse of(Admin admin) {
return new AdminInfoResponse(
admin.getId(),
admin.getUsername(),
admin.getAffiliation(),
admin.getAffiliationId());
}
}
Empty file.
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.doubleo.adminservice.domain.admin.service;

import com.doubleo.adminservice.domain.admin.dto.request.AdminPwUpdateRequest;
import com.doubleo.adminservice.domain.admin.dto.response.AdminInfoResponse;

public interface AdminService {

AdminInfoResponse getAdminInfo(Long adminId);

void updateAdminPassword(Long adminId, AdminPwUpdateRequest request);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package com.doubleo.adminservice.domain.admin.service;

import com.doubleo.adminservice.domain.admin.domain.Admin;
import com.doubleo.adminservice.domain.admin.dto.request.AdminPwUpdateRequest;
import com.doubleo.adminservice.domain.admin.dto.response.AdminInfoResponse;
import com.doubleo.adminservice.domain.admin.repository.AdminRepository;
import com.doubleo.adminservice.global.exception.CommonException;
import com.doubleo.adminservice.global.exception.errorcode.AdminErrorCode;
import jakarta.transaction.Transactional;
import lombok.RequiredArgsConstructor;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;

@Service
@Transactional
@RequiredArgsConstructor
public class AdminServiceImpl implements AdminService {

private final AdminRepository adminRepository;
private final BCryptPasswordEncoder passwordEncoder;

@Override
public AdminInfoResponse getAdminInfo(Long adminId) {
Admin admin = findAdmin(adminId);
return AdminInfoResponse.of(admin);
}

public void updateAdminPassword(Long adminId, AdminPwUpdateRequest request) {
Admin admin = findAdmin(adminId);
validateAdminPassword(request.passwordOriginal(), admin.getPassword());
isPasswordNew(request.passwordNew(), admin.getPassword());
admin.updateAdminPassword(passwordEncoder.encode(request.passwordNew()));
}

// util
private Admin findAdmin(Long adminId) {
return adminRepository
.findById(adminId)
.orElseThrow(() -> new CommonException(AdminErrorCode.ADMIN_NOT_FOUND));
}

private void validateAdminPassword(String raw, String encoded) {
if (!passwordEncoder.matches(raw, encoded)) {
throw new CommonException(AdminErrorCode.INVALID_PASSWORD);
}
}

private void isPasswordNew(String raw, String encoded) {
if (passwordEncoder.matches(raw, encoded)) {
throw new CommonException(AdminErrorCode.DUPLICATED_PASSWORD);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
import org.springframework.web.bind.annotation.*;
import org.springframework.web.util.WebUtils;

@Tag(name = "1-2. Auth API", description = "ํšŒ์› ๋กœ๊ทธ์ธ/๋กœ๊ทธ์•„์›ƒ/Refresh Token ๊ด€๋ จ API")
@Tag(name = "1-2. Auth API", description = "๊ด€๋ฆฌ์ž ๋กœ๊ทธ์ธ/๋กœ๊ทธ์•„์›ƒ/Refresh Token ๊ด€๋ จ API")
@RestController
@RequiredArgsConstructor
@RequestMapping("/auth")
Expand All @@ -30,7 +30,7 @@ public class AuthController {
private final CookieUtil cookieUtil;
private final JwtTokenService jwtTokenService;

@Operation(summary = "ํšŒ์› ๋กœ๊ทธ์ธ", description = "ํšŒ์› ๋กœ๊ทธ์ธ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.")
@Operation(summary = "๊ด€๋ฆฌ์ž ๋กœ๊ทธ์ธ", description = "๊ด€๋ฆฌ์ž ๋กœ๊ทธ์ธ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.")
@PostMapping("/login")
public ResponseEntity<LoginResponse> adminLogin(@RequestBody LoginRequest request) {
LoginResponse response = authService.loginAdmin(request);
Expand All @@ -40,7 +40,7 @@ public ResponseEntity<LoginResponse> adminLogin(@RequestBody LoginRequest reques
return ResponseEntity.ok().headers(headers).body(response);
}

@Operation(summary = "ํšŒ์› ๋กœ๊ทธ์•„์›ƒ", description = "ํšŒ์› ๋กœ๊ทธ์•„์›ƒ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.")
@Operation(summary = "๊ด€๋ฆฌ์ž ๋กœ๊ทธ์•„์›ƒ", description = "๊ด€๋ฆฌ์ž ๋กœ๊ทธ์•„์›ƒ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.")
@PostMapping("/logout")
public ResponseEntity<Void> adminLogout(
@RequestHeader(HttpHeaders.AUTHORIZATION) String authorizationHeader,
Expand Down
78 changes: 78 additions & 0 deletions src/main/resources/data.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
-- ์„œ์šธ๊ถŒ (14๊ฐœ)
INSERT INTO admin (admin_username, admin_password, admin_affiliation, admin_affiliation_id) VALUES

('admin1', '$2a$10$r8KNcU9cEEuNzBPmCCt8EeNH08JXt8krEWCLU9Yko73jWX7jc3Ehe', '๊ฐ•๋ถ์‚ผ์„ฑ๋ณ‘์›', 'TSEO01KS'),
('admin2', '$2a$10$r8KNcU9cEEuNzBPmCCt8EeNH08JXt8krEWCLU9Yko73jWX7jc3Ehe', '๊ฑด๊ตญ๋Œ€ํ•™๊ต๋ณ‘์›', 'TSEO02KK'),
('admin3', '$2a$10$r8KNcU9cEEuNzBPmCCt8EeNH08JXt8krEWCLU9Yko73jWX7jc3Ehe', '๊ฒฝํฌ๋Œ€ํ•™๊ต๋ณ‘์›', 'TSEO03KH'),
('admin4', '$2a$10$r8KNcU9cEEuNzBPmCCt8EeNH08JXt8krEWCLU9Yko73jWX7jc3Ehe', '๊ณ ๋ ค๋Œ€ ๊ตฌ๋กœ๋ณ‘์›', 'TSEO04KU'),
('admin5', '$2a$10$r8KNcU9cEEuNzBPmCCt8EeNH08JXt8krEWCLU9Yko73jWX7jc3Ehe', '์‚ผ์„ฑ์„œ์šธ๋ณ‘์›', 'TSEO05SS'),
('admin6', '$2a$10$r8KNcU9cEEuNzBPmCCt8EeNH08JXt8krEWCLU9Yko73jWX7jc3Ehe', '์„œ์šธ๋Œ€ํ•™๊ต๋ณ‘์›', 'TSEO06SN'),
('admin7', '$2a$10$r8KNcU9cEEuNzBPmCCt8EeNH08JXt8krEWCLU9Yko73jWX7jc3Ehe', '์—ฐ์„ธ๋Œ€ ์‹ ์ดŒ์„ธ๋ธŒ๋ž€์Šค', 'TSEO07YS'),
('admin8', '$2a$10$r8KNcU9cEEuNzBPmCCt8EeNH08JXt8krEWCLU9Yko73jWX7jc3Ehe', '์ดํ™”์—ฌ๋Œ€ ๋ชฉ๋™๋ณ‘์›', 'TSEO08EW'),
('admin9', '$2a$10$r8KNcU9cEEuNzBPmCCt8EeNH08JXt8krEWCLU9Yko73jWX7jc3Ehe', '์„œ์šธ์•„์‚ฐ๋ณ‘์›', 'TSEO09AS'),
('admin10', '$2a$10$r8KNcU9cEEuNzBPmCCt8EeNH08JXt8krEWCLU9Yko73jWX7jc3Ehe', '์ค‘์•™๋Œ€ํ•™๊ต๋ณ‘์›', 'TSEO10CU'),
('admin11', '$2a$10$r8KNcU9cEEuNzBPmCCt8EeNH08JXt8krEWCLU9Yko73jWX7jc3Ehe', '๊ณ ๋ ค๋Œ€ ์•ˆ์•”๋ณ‘์›', 'TSEO11KA'),
('admin12', '$2a$10$r8KNcU9cEEuNzBPmCCt8EeNH08JXt8krEWCLU9Yko73jWX7jc3Ehe', '๊ฐ€ํ†จ๋ฆญ ์„œ์šธ์„ฑ๋ชจ', 'TSEO12CS'),
('admin13', '$2a$10$r8KNcU9cEEuNzBPmCCt8EeNH08JXt8krEWCLU9Yko73jWX7jc3Ehe', '์—ฐ์„ธ๋Œ€ ๋ถ„๋‹น์„ธ๋ธŒ๋ž€์Šค', 'TSEO13YS'),
('admin14', '$2a$10$r8KNcU9cEEuNzBPmCCt8EeNH08JXt8krEWCLU9Yko73jWX7jc3Ehe', 'ํ•œ์–‘๋Œ€ํ•™๊ต๋ณ‘์›', 'TSEO14HY');

-- ๊ฒฝ๊ธฐ ์„œ๋ถ๊ถŒ (4๊ฐœ)
INSERT INTO admin (admin_username, admin_password, admin_affiliation, admin_affiliation_id) VALUES
('admin15', '$2a$10$r8KNcU9cEEuNzBPmCCt8EeNH08JXt8krEWCLU9Yko73jWX7jc3Ehe', '๊ฐ€ํ†จ๋ฆญ ์ธ์ฒœ์„ฑ๋ชจ๋ณ‘์›', 'TGYW01CI'),
('admin16', '$2a$10$r8KNcU9cEEuNzBPmCCt8EeNH08JXt8krEWCLU9Yko73jWX7jc3Ehe', '์ˆœ์ฒœํ–ฅ ๋ถ€์ฒœ๋ณ‘์›', 'TGYW02SC'),
('admin17', '$2a$10$r8KNcU9cEEuNzBPmCCt8EeNH08JXt8krEWCLU9Yko73jWX7jc3Ehe', '๊ธธ๋ณ‘์›', 'TGYW03GL'),
('admin18', '$2a$10$r8KNcU9cEEuNzBPmCCt8EeNH08JXt8krEWCLU9Yko73jWX7jc3Ehe', '์ธํ•˜๋Œ€๋ณ‘์›', 'TGYW04IH');

-- ๊ฒฝ๊ธฐ ๋‚จ๋ถ€๊ถŒ (4๊ฐœ)
INSERT INTO admin (admin_username, admin_password, admin_affiliation, admin_affiliation_id) VALUES
('admin19', '$2a$10$r8KNcU9cEEuNzBPmCCt8EeNH08JXt8krEWCLU9Yko73jWX7jc3Ehe', '๊ณ ๋ ค๋Œ€ ์•ˆ์‚ฐ๋ณ‘์›', 'TGYS01KA'),
('admin20', '$2a$10$r8KNcU9cEEuNzBPmCCt8EeNH08JXt8krEWCLU9Yko73jWX7jc3Ehe', '๋ถ„๋‹น์„œ์šธ๋Œ€๋ณ‘์›', 'TGYS02SU'),
('admin21', '$2a$10$r8KNcU9cEEuNzBPmCCt8EeNH08JXt8krEWCLU9Yko73jWX7jc3Ehe', '์•„์ฃผ๋Œ€ํ•™๊ต๋ณ‘์›', 'TGYS03AJ'),
('admin22', '$2a$10$r8KNcU9cEEuNzBPmCCt8EeNH08JXt8krEWCLU9Yko73jWX7jc3Ehe', 'ํ•œ๋ฆผ๋Œ€ ์„ฑ์‹ฌ๋ณ‘์›', 'TGYS04HL');

-- ๊ฐ•์›๊ถŒ (2๊ฐœ)
INSERT INTO admin (admin_username, admin_password, admin_affiliation, admin_affiliation_id) VALUES
('admin23', '$2a$10$r8KNcU9cEEuNzBPmCCt8EeNH08JXt8krEWCLU9Yko73jWX7jc3Ehe', '๊ฐ•๋ฆ‰์•„์‚ฐ๋ณ‘์›', 'TGWN01GA'),
('admin24', '$2a$10$r8KNcU9cEEuNzBPmCCt8EeNH08JXt8krEWCLU9Yko73jWX7jc3Ehe', '์„ธ๋ธŒ๋ž€์Šค ์›์ฃผ', 'TGWN02YW');

-- ์ถฉ๋ถ๊ถŒ (1๊ฐœ)
INSERT INTO admin (admin_username, admin_password, admin_affiliation, admin_affiliation_id) VALUES
('admin25', '$2a$10$r8KNcU9cEEuNzBPmCCt8EeNH08JXt8krEWCLU9Yko73jWX7jc3Ehe', '์ถฉ๋ถ๋Œ€ํ•™๊ต๋ณ‘์›', 'TCBK01CU');

-- ์ถฉ๋‚จ๊ถŒ (3๊ฐœ)
INSERT INTO admin (admin_username, admin_password, admin_affiliation, admin_affiliation_id) VALUES
('admin26', '$2a$10$r8KNcU9cEEuNzBPmCCt8EeNH08JXt8krEWCLU9Yko73jWX7jc3Ehe', '๋‹จ๊ตญ๋Œ€๋ณ‘์›', 'TCNM01DK'),
('admin27', '$2a$10$r8KNcU9cEEuNzBPmCCt8EeNH08JXt8krEWCLU9Yko73jWX7jc3Ehe', '์ˆœ์ฒœํ–ฅ ์ฒœ์•ˆ๋ณ‘์›', 'TCNM02SC'),
('admin28', '$2a$10$r8KNcU9cEEuNzBPmCCt8EeNH08JXt8krEWCLU9Yko73jWX7jc3Ehe', '์ถฉ๋‚จ๋Œ€ํ•™๊ต๋ณ‘์›', 'TCNM03CN');

-- ์ „๋ถ๊ถŒ (2๊ฐœ)
INSERT INTO admin (admin_username, admin_password, admin_affiliation, admin_affiliation_id) VALUES
('admin29', '$2a$10$r8KNcU9cEEuNzBPmCCt8EeNH08JXt8krEWCLU9Yko73jWX7jc3Ehe', '์›๊ด‘๋Œ€ํ•™๊ต๋ณ‘์›', 'TJBK01WK'),
('admin30', '$2a$10$r8KNcU9cEEuNzBPmCCt8EeNH08JXt8krEWCLU9Yko73jWX7jc3Ehe', '์ „๋ถ๋Œ€ํ•™๊ต๋ณ‘์›', 'TJBK02JB');

-- ์ „๋‚จ๊ถŒ (3๊ฐœ)
INSERT INTO admin (admin_username, admin_password, admin_affiliation, admin_affiliation_id) VALUES
('admin31', '$2a$10$r8KNcU9cEEuNzBPmCCt8EeNH08JXt8krEWCLU9Yko73jWX7jc3Ehe', '์ „๋‚จ๋Œ€ํ•™๊ต๋ณ‘์›', 'TJNM01JN'),
('admin32', '$2a$10$r8KNcU9cEEuNzBPmCCt8EeNH08JXt8krEWCLU9Yko73jWX7jc3Ehe', '์กฐ์„ ๋Œ€ํ•™๊ต๋ณ‘์›', 'TJNM02CS'),
('admin33', '$2a$10$r8KNcU9cEEuNzBPmCCt8EeNH08JXt8krEWCLU9Yko73jWX7jc3Ehe', 'ํ™”์ˆœ์ „๋‚จ๋Œ€๋ณ‘์›', 'TJNM03HS');

-- ๊ฒฝ๋ถ๊ถŒ (5๊ฐœ)
INSERT INTO admin (admin_username, admin_password, admin_affiliation, admin_affiliation_id) VALUES
('admin34', '$2a$10$r8KNcU9cEEuNzBPmCCt8EeNH08JXt8krEWCLU9Yko73jWX7jc3Ehe', '๊ฒฝ๋ถ๋Œ€ํ•™๊ต๋ณ‘์›', 'TGBK01KB'),
('admin35', '$2a$10$r8KNcU9cEEuNzBPmCCt8EeNH08JXt8krEWCLU9Yko73jWX7jc3Ehe', '๊ณ„๋ช…๋Œ€ ๋™์‚ฐ๋ณ‘์›', 'TGBK02KM'),
('admin36', '$2a$10$r8KNcU9cEEuNzBPmCCt8EeNH08JXt8krEWCLU9Yko73jWX7jc3Ehe', '๋Œ€๊ตฌ๊ฐ€ํ†จ๋ฆญ๋Œ€๋ณ‘์›', 'TGBK03DC'),
('admin37', '$2a$10$r8KNcU9cEEuNzBPmCCt8EeNH08JXt8krEWCLU9Yko73jWX7jc3Ehe', '์˜๋‚จ๋Œ€ํ•™๊ต๋ณ‘์›', 'TGBK04YN'),
('admin38', '$2a$10$r8KNcU9cEEuNzBPmCCt8EeNH08JXt8krEWCLU9Yko73jWX7jc3Ehe', '์น ๊ณก๊ฒฝ๋ถ๋Œ€๋ณ‘์›', 'TGBK05CB');

-- ๊ฒฝ๋‚จ ๋™๋ถ€๊ถŒ (5๊ฐœ)
INSERT INTO admin (admin_username, admin_password, admin_affiliation, admin_affiliation_id) VALUES
('admin39', '$2a$10$r8KNcU9cEEuNzBPmCCt8EeNH08JXt8krEWCLU9Yko73jWX7jc3Ehe', '๋™์•„๋Œ€ํ•™๊ต๋ณ‘์›', 'TGNE01DA'),
('admin40', '$2a$10$r8KNcU9cEEuNzBPmCCt8EeNH08JXt8krEWCLU9Yko73jWX7jc3Ehe', '๋ถ€์‚ฐ๋Œ€ํ•™๊ต๋ณ‘์›', 'TGNE02PU'),
('admin41', '$2a$10$r8KNcU9cEEuNzBPmCCt8EeNH08JXt8krEWCLU9Yko73jWX7jc3Ehe', '์–‘์‚ฐ๋ถ€์‚ฐ๋Œ€๋ณ‘์›', 'TGNE03YA'),
('admin42', '$2a$10$r8KNcU9cEEuNzBPmCCt8EeNH08JXt8krEWCLU9Yko73jWX7jc3Ehe', '๋ถ€์‚ฐ๋ฐฑ๋ณ‘์›', 'TGNE04IB'),
('admin43', '$2a$10$r8KNcU9cEEuNzBPmCCt8EeNH08JXt8krEWCLU9Yko73jWX7jc3Ehe', '์šธ์‚ฐ๋Œ€๋ณ‘์›', 'TGNE05UI');

-- ๊ฒฝ๋‚จ ์„œ๋ถ€๊ถŒ (2๊ฐœ)
INSERT INTO admin (admin_username, admin_password, admin_affiliation, admin_affiliation_id) VALUES
('admin44', '$2a$10$r8KNcU9cEEuNzBPmCCt8EeNH08JXt8krEWCLU9Yko73jWX7jc3Ehe', '๊ฒฝ์ƒ๋Œ€๋ณ‘์›', 'TGNW01GS'),
('admin45', '$2a$10$r8KNcU9cEEuNzBPmCCt8EeNH08JXt8krEWCLU9Yko73jWX7jc3Ehe', '์„ฑ๊ท ๊ด€๋Œ€ ์‚ผ์„ฑ์ฐฝ์›๋ณ‘์›','TGNW02SC');
118 changes: 118 additions & 0 deletions src/test/java/com/doubleo/adminservice/service/AdminServiceTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
package com.doubleo.adminservice.service;

import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
import static org.mockito.BDDMockito.*;

import com.doubleo.adminservice.domain.admin.domain.Admin;
import com.doubleo.adminservice.domain.admin.dto.request.AdminPwUpdateRequest;
import com.doubleo.adminservice.domain.admin.dto.response.AdminInfoResponse;
import com.doubleo.adminservice.domain.admin.repository.AdminRepository;
import com.doubleo.adminservice.domain.admin.service.AdminServiceImpl;
import com.doubleo.adminservice.global.exception.CommonException;
import com.doubleo.adminservice.global.exception.errorcode.AdminErrorCode;
import java.util.Optional;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.test.util.ReflectionTestUtils;

@ExtendWith(MockitoExtension.class)
public class AdminServiceTest {

@InjectMocks private AdminServiceImpl adminService;

@Mock private AdminRepository adminRepository;

@Mock private BCryptPasswordEncoder bCryptPasswordEncoder;

private final String username = "test@test.com";
private final String password = "password";
private final String affiliation = "์„œ์šธ์•„์‚ฐ๋ณ‘์›";
private final String affiliationId = "000413";

private Admin admin;

@BeforeEach
void setUp() {
admin = Admin.createAdmin(username, "encoded", affiliation, affiliationId);
ReflectionTestUtils.setField(admin, "id", 1L);
}

@Nested
class getAdminInfo {

@Test
void ๊ด€๋ฆฌ์ž์ •๋ณด_์กฐํšŒํ•˜๋ฉด_์ •์ƒ์ ์œผ๋กœ_๋ฐ˜ํ™˜๋œ๋‹ค() {
// given
given(adminRepository.findById(1L)).willReturn(Optional.of(admin));

// when
AdminInfoResponse response = adminService.getAdminInfo(admin.getId());

// then
assertThat(response.adminId()).isEqualTo(admin.getId());
assertThat(response.username()).isEqualTo(admin.getUsername());
assertThat(response.affiliation()).isEqualTo(admin.getAffiliation());
assertThat(response.affiliationId()).isEqualTo(admin.getAffiliationId());
}
}

@Nested
class updateAdminPassword {

@Test
void ๋น„๋ฐ€๋ฒˆํ˜ธ_๋ณ€๊ฒฝํ•˜๋ฉด_์ •์ƒ์ ์œผ๋กœ_๋ณ€๊ฒฝ๋œ๋‹ค() {
// given
String newPassword = "newPassword";
String encodedNewPassword = "encodedNew";

given(adminRepository.findById(1L)).willReturn(Optional.of(admin));
given(bCryptPasswordEncoder.matches(password, "encoded")).willReturn(true);
given(bCryptPasswordEncoder.encode(newPassword)).willReturn(encodedNewPassword);

// when
adminService.updateAdminPassword(1L, new AdminPwUpdateRequest(password, newPassword));

// then
assertThat(admin.getPassword()).isEqualTo(encodedNewPassword);
}

@Test
void ๊ธฐ์กด_๋น„๋ฐ€๋ฒˆํ˜ธ_์œ ํšจํ•˜์ง€_์•Š์œผ๋ฉด_์˜ค๋ฅ˜_๋ฐœ์ƒํ•œ๋‹ค() {
// given
given(adminRepository.findById(1L)).willReturn(Optional.of(admin));
given(bCryptPasswordEncoder.matches("wrongPassword", "encoded")).willReturn(false);

// when & then
assertThatThrownBy(
() ->
adminService.updateAdminPassword(
1L,
new AdminPwUpdateRequest(
"wrongPassword", "newPassword")))
.isInstanceOf(CommonException.class)
.hasMessage(AdminErrorCode.INVALID_PASSWORD.getMessage());
}

@Test
void ๊ธฐ์กด_๋น„๋ฐ€๋ฒˆํ˜ธ์™€_์‹ ๊ทœ_๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€_๋™์ผํ•˜๋ฉด_์˜ค๋ฅ˜_๋ฐœ์ƒํ•œ๋‹ค() {
// given
given(adminRepository.findById(1L)).willReturn(Optional.of(admin));
given(bCryptPasswordEncoder.matches(password, "encoded")).willReturn(true);

// when & then
assertThatThrownBy(
() ->
adminService.updateAdminPassword(
1L, new AdminPwUpdateRequest(password, password)))
.isInstanceOf(CommonException.class)
.hasMessage(AdminErrorCode.DUPLICATED_PASSWORD.getMessage());
}
}
}
Loading