admin: web / domain layer 분리

This commit is contained in:
geonhos 2024-05-17 10:14:59 +09:00
parent 2c27f7a53d
commit f66c5afe0a
58 changed files with 852 additions and 760 deletions

View File

@ -0,0 +1,52 @@
package com.bpgroup.poc.admin.domain.base.admin.entity;
import com.bpgroup.poc.admin.domain.entity.BaseEntity;
import jakarta.persistence.*;
import lombok.Builder;
import lombok.Getter;
@Getter
@Entity
@Table(name = "admin")
public class Admin extends BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "login_id", length = 100, nullable = false)
private String loginId;
@Column(name = "password", length = 255, nullable = false)
private String password;
@Column(name = "email", length = 100, nullable = false)
private String email;
@Column(name = "name", length = 100, nullable = false)
private String name;
@Embedded
private AdminRole adminRole;
@Builder
public static Admin of(String loginId, String password, String email, String name) {
Admin admin = new Admin();
admin.loginId = loginId;
admin.password = password;
admin.email = email;
admin.name = name;
return admin;
}
public void update(Admin admin) {
this.password = admin.password;
this.email = admin.email;
this.name = admin.name;
this.adminRole = admin.adminRole;
}
public void setAdminRole(AdminRole adminRole) {
this.adminRole = adminRole;
}
}

View File

@ -0,0 +1,9 @@
package com.bpgroup.poc.admin.domain.base.admin.entity;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.Optional;
public interface AdminRepository extends JpaRepository<Admin, Long> {
Optional<Admin> findByLoginId(String loginId);
}

View File

@ -0,0 +1,22 @@
package com.bpgroup.poc.admin.domain.base.admin.entity;
import com.bpgroup.poc.admin.domain.base.role.entity.Role;
import jakarta.persistence.*;
import lombok.Builder;
import lombok.Getter;
@Getter
@Embeddable
public class AdminRole {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "role_id", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
private Role role;
@Builder
public static AdminRole of(Role role) {
AdminRole adminRole = new AdminRole();
adminRole.role = role;
return adminRole;
}
}

View File

@ -1,6 +1,6 @@
package com.bpgroup.poc.admin.web.main.admin.management.service;
package com.bpgroup.poc.admin.domain.base.admin.service;
import com.bpgroup.poc.admin.domain.entity.administrator.Administrator;
import com.bpgroup.poc.admin.domain.base.admin.entity.Admin;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Builder;
@ -9,7 +9,7 @@ import lombok.ToString;
@Getter
@ToString
public class AdministratorCreateCommand {
public class AdminCreateCommand {
@NotBlank
private String loginId;
@NotBlank
@ -22,8 +22,8 @@ public class AdministratorCreateCommand {
private Long roleId;
@Builder
public static AdministratorCreateCommand of(String loginId, String password, String email, String name, Long roleId) {
AdministratorCreateCommand command = new AdministratorCreateCommand();
public static AdminCreateCommand of(String loginId, String password, String email, String name, Long roleId) {
AdminCreateCommand command = new AdminCreateCommand();
command.loginId = loginId;
command.password = password;
command.email = email;
@ -32,8 +32,8 @@ public class AdministratorCreateCommand {
return command;
}
public Administrator toEntity() {
return Administrator.builder()
public Admin toEntity() {
return Admin.builder()
.loginId(loginId)
.password(password)
.email(email)

View File

@ -0,0 +1,18 @@
package com.bpgroup.poc.admin.domain.base.admin.service;
import lombok.Builder;
import lombok.Getter;
import lombok.ToString;
@Getter
@ToString
public class AdminCreateResult {
private Long id;
@Builder
public static AdminCreateResult of(Long id) {
AdminCreateResult result = new AdminCreateResult();
result.id = id;
return result;
}
}

View File

@ -0,0 +1,79 @@
package com.bpgroup.poc.admin.domain.base.admin.service;
import com.bpgroup.poc.admin.domain.base.admin.entity.Admin;
import com.bpgroup.poc.admin.domain.base.admin.entity.AdminRepository;
import com.bpgroup.poc.admin.domain.base.admin.entity.AdminRole;
import com.bpgroup.poc.admin.domain.base.role.entity.Role;
import com.bpgroup.poc.admin.domain.base.role.entity.RoleRepository;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import java.util.Optional;
@Service
@RequiredArgsConstructor
@Validated
@Transactional
public class AdminService {
private final AdminRepository adminRepository;
private final RoleRepository roleRepository;
public AdminCreateResult create(
@NotNull @Valid AdminCreateCommand command
) {
Optional<Role> findRole = roleRepository.findById(command.getRoleId());
if (findRole.isEmpty()) {
throw new IllegalArgumentException("Not found role");
}
Role role = findRole.get();
Admin admin = command.toEntity();
admin.setAdminRole(
AdminRole.builder()
.role(role)
.build()
);
Admin savedAdmin = adminRepository.save(admin);
return AdminCreateResult.builder()
.id(savedAdmin.getId())
.build();
}
public void update(
@NotNull @Valid AdminUpdateCommand command
) {
Optional<Admin> findAdmin = adminRepository.findById(command.getId());
if (findAdmin.isEmpty()) {
throw new IllegalArgumentException("Not found admin");
}
Optional<Role> findRole = roleRepository.findById(command.getRoleId());
if (findRole.isEmpty()) {
throw new IllegalArgumentException("Not found role");
}
Role role = findRole.get();
Admin admin = findAdmin.get();
admin.setAdminRole(
AdminRole.builder()
.role(role)
.build()
);
admin.update(admin);
}
public void delete(@NotNull Long id) {
Optional<Admin> findAdmin = adminRepository.findById(id);
if (findAdmin.isEmpty()) {
throw new IllegalArgumentException("Not found admin");
}
adminRepository.deleteById(id);
}
}

View File

@ -1,6 +1,6 @@
package com.bpgroup.poc.admin.web.main.admin.management.service;
package com.bpgroup.poc.admin.domain.base.admin.service;
import com.bpgroup.poc.admin.domain.entity.administrator.Administrator;
import com.bpgroup.poc.admin.domain.base.admin.entity.Admin;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Builder;
@ -9,7 +9,7 @@ import lombok.ToString;
@Getter
@ToString
public class AdministratorUpdateCommand {
public class AdminUpdateCommand {
@NotNull
private Long id;
@NotBlank
@ -22,8 +22,8 @@ public class AdministratorUpdateCommand {
private Long roleId;
@Builder
public static AdministratorUpdateCommand of(Long id, String password, String email, String name, Long roleId) {
AdministratorUpdateCommand command = new AdministratorUpdateCommand();
public static AdminUpdateCommand of(Long id, String password, String email, String name, Long roleId) {
AdminUpdateCommand command = new AdminUpdateCommand();
command.id = id;
command.password = password;
command.email = email;
@ -32,8 +32,8 @@ public class AdministratorUpdateCommand {
return command;
}
public Administrator toEntity() {
return Administrator.builder()
public Admin toEntity() {
return Admin.builder()
.password(password)
.email(email)
.name(name)

View File

@ -1,4 +1,4 @@
package com.bpgroup.poc.admin.domain.entity.menu;
package com.bpgroup.poc.admin.domain.base.role.entity;
import com.bpgroup.poc.admin.domain.entity.BaseEntity;
import jakarta.persistence.*;

View File

@ -1,4 +1,4 @@
package com.bpgroup.poc.admin.domain.entity.menu;
package com.bpgroup.poc.admin.domain.base.role.entity;
import com.bpgroup.poc.admin.domain.entity.BaseEntity;
import jakarta.persistence.*;

View File

@ -1,4 +1,4 @@
package com.bpgroup.poc.admin.domain.entity.menu;
package com.bpgroup.poc.admin.domain.base.role.entity;
import org.springframework.data.jpa.repository.JpaRepository;

View File

@ -1,4 +1,4 @@
package com.bpgroup.poc.admin.domain.entity.menu;
package com.bpgroup.poc.admin.domain.base.role.entity;
import org.springframework.data.jpa.repository.JpaRepository;

View File

@ -1,4 +1,4 @@
package com.bpgroup.poc.admin.domain.entity.role;
package com.bpgroup.poc.admin.domain.base.role.entity;
import com.bpgroup.poc.admin.domain.entity.BaseEntity;
import jakarta.persistence.*;

View File

@ -1,7 +1,6 @@
package com.bpgroup.poc.admin.domain.entity.role;
package com.bpgroup.poc.admin.domain.base.role.entity;
import com.bpgroup.poc.admin.domain.entity.BaseEntity;
import com.bpgroup.poc.admin.domain.entity.menu.Menu;
import jakarta.persistence.*;
import lombok.Builder;
import lombok.Getter;

View File

@ -1,4 +1,4 @@
package com.bpgroup.poc.admin.domain.entity.role;
package com.bpgroup.poc.admin.domain.base.role.entity;
import org.springframework.data.jpa.repository.JpaRepository;

View File

@ -1,4 +1,4 @@
package com.bpgroup.poc.admin.domain.entity.role;
package com.bpgroup.poc.admin.domain.base.role.entity;
import org.springframework.data.jpa.repository.JpaRepository;

View File

@ -1,6 +1,6 @@
package com.bpgroup.poc.admin.web.main.admin.menu.service;
package com.bpgroup.poc.admin.domain.base.role.service;
import com.bpgroup.poc.admin.domain.entity.menu.Menu;
import com.bpgroup.poc.admin.domain.base.role.entity.Menu;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Builder;

View File

@ -1,6 +1,6 @@
package com.bpgroup.poc.admin.web.main.admin.menu.service;
package com.bpgroup.poc.admin.domain.base.role.service;
import com.bpgroup.poc.admin.domain.entity.menu.MenuGroup;
import com.bpgroup.poc.admin.domain.base.role.entity.MenuGroup;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Builder;

View File

@ -1,6 +1,6 @@
package com.bpgroup.poc.admin.web.main.admin.menu.service;
package com.bpgroup.poc.admin.domain.base.role.service;
import com.bpgroup.poc.admin.domain.entity.menu.MenuGroup;
import com.bpgroup.poc.admin.domain.base.role.entity.MenuGroup;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Builder;

View File

@ -1,9 +1,9 @@
package com.bpgroup.poc.admin.web.main.admin.menu.service;
package com.bpgroup.poc.admin.domain.base.role.service;
import com.bpgroup.poc.admin.domain.entity.menu.Menu;
import com.bpgroup.poc.admin.domain.entity.menu.MenuGroup;
import com.bpgroup.poc.admin.domain.entity.menu.MenuGroupRepository;
import com.bpgroup.poc.admin.domain.entity.menu.MenuRepository;
import com.bpgroup.poc.admin.domain.base.role.entity.Menu;
import com.bpgroup.poc.admin.domain.base.role.entity.MenuGroup;
import com.bpgroup.poc.admin.domain.base.role.entity.MenuGroupRepository;
import com.bpgroup.poc.admin.domain.base.role.entity.MenuRepository;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor;
@ -82,4 +82,8 @@ public class MenuService {
menuRepository.deleteById(id);
}
public Optional<Menu> findById(Long menuId) {
return menuRepository.findById(menuId);
}
}

View File

@ -1,6 +1,6 @@
package com.bpgroup.poc.admin.web.main.admin.menu.service;
package com.bpgroup.poc.admin.domain.base.role.service;
import com.bpgroup.poc.admin.domain.entity.menu.Menu;
import com.bpgroup.poc.admin.domain.base.role.entity.Menu;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Builder;

View File

@ -1,4 +1,4 @@
package com.bpgroup.poc.admin.web.main.admin.role.service;
package com.bpgroup.poc.admin.domain.base.role.service;
import jakarta.validation.constraints.NotNull;
import lombok.Builder;

View File

@ -1,6 +1,6 @@
package com.bpgroup.poc.admin.web.main.admin.role.service;
package com.bpgroup.poc.admin.domain.base.role.service;
import com.bpgroup.poc.admin.domain.entity.role.Role;
import com.bpgroup.poc.admin.domain.base.role.entity.Role;
import jakarta.validation.constraints.NotBlank;
import lombok.Builder;
import lombok.Getter;

View File

@ -1,4 +1,4 @@
package com.bpgroup.poc.admin.web.main.admin.role.service;
package com.bpgroup.poc.admin.domain.base.role.service;
import lombok.Builder;
import lombok.Getter;

View File

@ -1,11 +1,11 @@
package com.bpgroup.poc.admin.web.main.admin.role.service;
package com.bpgroup.poc.admin.domain.base.role.service;
import com.bpgroup.poc.admin.domain.entity.menu.Menu;
import com.bpgroup.poc.admin.domain.entity.menu.MenuRepository;
import com.bpgroup.poc.admin.domain.entity.role.Role;
import com.bpgroup.poc.admin.domain.entity.role.RoleMenu;
import com.bpgroup.poc.admin.domain.entity.role.RoleMenuRepository;
import com.bpgroup.poc.admin.domain.entity.role.RoleRepository;
import com.bpgroup.poc.admin.domain.base.role.entity.RoleMenuRepository;
import com.bpgroup.poc.admin.domain.base.role.entity.Menu;
import com.bpgroup.poc.admin.domain.base.role.entity.MenuRepository;
import com.bpgroup.poc.admin.domain.base.role.entity.Role;
import com.bpgroup.poc.admin.domain.base.role.entity.RoleMenu;
import com.bpgroup.poc.admin.domain.base.role.entity.RoleRepository;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor;

View File

@ -1,6 +1,6 @@
package com.bpgroup.poc.admin.web.main.admin.role.service;
package com.bpgroup.poc.admin.domain.base.role.service;
import com.bpgroup.poc.admin.domain.entity.role.Role;
import com.bpgroup.poc.admin.domain.base.role.entity.Role;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Builder;

View File

@ -1,52 +0,0 @@
package com.bpgroup.poc.admin.domain.entity.administrator;
import com.bpgroup.poc.admin.domain.entity.BaseEntity;
import jakarta.persistence.*;
import lombok.Builder;
import lombok.Getter;
@Getter
@Entity
@Table(name = "administrator")
public class Administrator extends BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "login_id", length = 100, nullable = false)
private String loginId;
@Column(name = "password", length = 255, nullable = false)
private String password;
@Column(name = "email", length = 100, nullable = false)
private String email;
@Column(name = "name", length = 100, nullable = false)
private String name;
@Embedded
private AdministratorRole administratorRole;
@Builder
public static Administrator of(String loginId, String password, String email, String name) {
Administrator administrator = new Administrator();
administrator.loginId = loginId;
administrator.password = password;
administrator.email = email;
administrator.name = name;
return administrator;
}
public void update(Administrator administrator) {
this.password = administrator.password;
this.email = administrator.email;
this.name = administrator.name;
this.administratorRole = administrator.administratorRole;
}
public void setAdministratorRole(AdministratorRole administratorRole) {
this.administratorRole = administratorRole;
}
}

View File

@ -1,9 +0,0 @@
package com.bpgroup.poc.admin.domain.entity.administrator;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.Optional;
public interface AdministratorRepository extends JpaRepository<Administrator, Long> {
Optional<Administrator> findByLoginId(String loginId);
}

View File

@ -1,22 +0,0 @@
package com.bpgroup.poc.admin.domain.entity.administrator;
import com.bpgroup.poc.admin.domain.entity.role.Role;
import jakarta.persistence.*;
import lombok.Builder;
import lombok.Getter;
@Getter
@Embeddable
public class AdministratorRole {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "role_id", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
private Role role;
@Builder
public static AdministratorRole of(Role role) {
AdministratorRole administratorRole = new AdministratorRole();
administratorRole.role = role;
return administratorRole;
}
}

View File

@ -1,7 +0,0 @@
package com.bpgroup.poc.admin.domain.entity.exception;
public class DuplicationAdministratorException extends RuntimeException {
public DuplicationAdministratorException(String loginId) {
super("이미 존재하는 아이디 입니다. : " + loginId);
}
}

View File

@ -1,9 +0,0 @@
package com.bpgroup.poc.admin.domain.entity.exception;
import com.bpgroup.poc.admin.domain.DomainException;
public class NotFoundAdministratorException extends DomainException {
public NotFoundAdministratorException() {
super();
}
}

View File

@ -1,6 +1,6 @@
package com.bpgroup.poc.admin.security.authentication;
import com.bpgroup.poc.admin.security.authentication.service.exception.AdministratorNotFoundException;
import com.bpgroup.poc.admin.security.authentication.service.exception.AdminNotFoundException;
import com.bpgroup.poc.admin.security.authentication.service.exception.DoNotHaveAnyMenuException;
import com.bpgroup.poc.admin.security.authentication.service.exception.InvalidPasswordException;
import lombok.Getter;
@ -17,7 +17,7 @@ public enum AuthenticationFailReason {
private final String message;
public static AuthenticationFailReason from(Exception e) {
if (e instanceof AdministratorNotFoundException) {
if (e instanceof AdminNotFoundException) {
return WRONG_LOGIN_ID;
} else if (e instanceof InvalidPasswordException) {
return WRONG_PASSWORD;

View File

@ -1,8 +1,8 @@
package com.bpgroup.poc.admin.security.authentication.service;
import com.bpgroup.poc.admin.domain.entity.administrator.Administrator;
import com.bpgroup.poc.admin.domain.entity.administrator.AdministratorRepository;
import com.bpgroup.poc.admin.security.authentication.service.exception.AdministratorNotFoundException;
import com.bpgroup.poc.admin.domain.base.admin.entity.Admin;
import com.bpgroup.poc.admin.domain.base.admin.entity.AdminRepository;
import com.bpgroup.poc.admin.security.authentication.service.exception.AdminNotFoundException;
import com.bpgroup.poc.admin.security.authentication.service.exception.DoNotHaveAnyMenuException;
import com.bpgroup.poc.admin.security.authentication.service.exception.InvalidPasswordException;
import lombok.RequiredArgsConstructor;
@ -16,25 +16,25 @@ import java.util.Optional;
@RequiredArgsConstructor
public class LoginService {
private final AdministratorRepository administratorRepository;
private final AdminRepository adminRepository;
private final PasswordEncoder passwordEncoder;
@Transactional
public LoginResult login(String username, String password) throws AdministratorNotFoundException, InvalidPasswordException, DoNotHaveAnyMenuException {
Optional<Administrator> administrator = administratorRepository.findByLoginId(username);
if (administrator.isEmpty()) {
throw new AdministratorNotFoundException(username);
public LoginResult login(String username, String password) throws AdminNotFoundException, InvalidPasswordException, DoNotHaveAnyMenuException {
Optional<Admin> admin = adminRepository.findByLoginId(username);
if (admin.isEmpty()) {
throw new AdminNotFoundException(username);
}
if (!passwordEncoder.matches(password, administrator.get().getPassword())) {
if (!passwordEncoder.matches(password, admin.get().getPassword())) {
throw new InvalidPasswordException(username);
}
return LoginResult.of(
administrator.get().getId(),
administrator.get().getLoginId(),
administrator.get().getName(),
administrator.get().getLoginId()
admin.get().getId(),
admin.get().getLoginId(),
admin.get().getName(),
admin.get().getLoginId()
);
}

View File

@ -0,0 +1,7 @@
package com.bpgroup.poc.admin.security.authentication.service.exception;
public class AdminNotFoundException extends Exception {
public AdminNotFoundException(String message) {
super(message);
}
}

View File

@ -1,7 +0,0 @@
package com.bpgroup.poc.admin.security.authentication.service.exception;
public class AdministratorNotFoundException extends Exception {
public AdministratorNotFoundException(String message) {
super(message);
}
}

View File

@ -7,12 +7,12 @@ import org.springframework.stereotype.Repository;
import java.util.*;
import static com.bpgroup.poc.admin.domain.entity.administrator.QAdministrator.administrator;
import static com.bpgroup.poc.admin.domain.entity.administrator.QAdministratorRole.administratorRole;
import static com.bpgroup.poc.admin.domain.entity.menu.QMenu.menu;
import static com.bpgroup.poc.admin.domain.entity.menu.QMenuGroup.menuGroup;
import static com.bpgroup.poc.admin.domain.entity.role.QRole.role;
import static com.bpgroup.poc.admin.domain.entity.role.QRoleMenu.roleMenu;
import static com.bpgroup.poc.admin.domain.base.admin.entity.QAdmin.admin;
import static com.bpgroup.poc.admin.domain.base.admin.entity.QAdminRole.adminRole;
import static com.bpgroup.poc.admin.domain.base.role.entity.QMenu.menu;
import static com.bpgroup.poc.admin.domain.base.role.entity.QMenuGroup.menuGroup;
import static com.bpgroup.poc.admin.domain.base.role.entity.QRole.role;
import static com.bpgroup.poc.admin.domain.base.role.entity.QRoleMenu.roleMenu;
@Repository
@RequiredArgsConstructor
@ -29,12 +29,12 @@ public class MenuQueryRepository {
roleMenu.menu.name,
roleMenu.menu.sortOrder
)
.from(administrator)
.innerJoin(administratorRole.role, role)
.from(admin)
.innerJoin(adminRole.role, role)
.innerJoin(role.roleMenus, roleMenu)
.innerJoin(roleMenu.menu, menu)
.innerJoin(menu.menuGroup, menuGroup)
.where(administrator.loginId.eq("admin"))
.where(admin.loginId.eq("admin"))
.orderBy(menuGroup.sortOrder.asc(), roleMenu.menu.sortOrder.asc())
.fetch();

View File

@ -6,10 +6,10 @@ import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/admin/management")
public class AdministratorManagementController {
public class AdminManagementController {
@GetMapping
public String administratorManagementPage() {
public String adminManagementPage() {
return "main/admin/management/list";
}

View File

@ -0,0 +1,41 @@
package com.bpgroup.poc.admin.web.main.admin.management;
import com.bpgroup.poc.admin.web.main.admin.management.reqres.AdminFind;
import com.querydsl.core.types.Projections;
import com.querydsl.jpa.impl.JPAQueryFactory;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
import java.util.List;
import static com.bpgroup.poc.admin.domain.base.admin.entity.QAdmin.admin;
@Repository
@RequiredArgsConstructor
public class AdminManagementQueryRepository {
private final JPAQueryFactory queryFactory;
public List<AdminFind.Response> findAll() {
return queryFactory.select(Projections.fields(AdminFind.Response.class,
admin.id,
admin.loginId,
admin.email,
admin.name))
.from(admin)
.fetch();
}
public AdminFind.Response findByLoginId(String loginId) {
return queryFactory.select(Projections.fields(AdminFind.Response.class,
admin.id,
admin.loginId,
admin.email,
admin.name))
.from(admin)
.where(admin.loginId.eq(loginId))
.fetchOne();
}
}

View File

@ -0,0 +1,83 @@
package com.bpgroup.poc.admin.web.main.admin.management;
import com.bpgroup.poc.admin.web.main.admin.management.reqres.AdminCreate;
import com.bpgroup.poc.admin.web.main.admin.management.reqres.AdminDelete;
import com.bpgroup.poc.admin.web.main.admin.management.reqres.AdminFind;
import com.bpgroup.poc.admin.web.main.admin.management.reqres.AdminUpdate;
import jakarta.validation.constraints.NotBlank;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequiredArgsConstructor
@RequestMapping("/admin/management")
public class AdminManagementRestController {
private final AdminManagementWebService adminManagementWebService;
/**
* 전체 조회
*
* @return 응답
*/
@GetMapping("/list")
public ResponseEntity<?> getAdmins() {
List<AdminFind.Response> response = adminManagementWebService.findAll();
return ResponseEntity.ok(response);
}
/**
* 조회
*
* @param loginId 관리자 ID
* @return 응답
*/
@GetMapping("/{loginId}")
public ResponseEntity<?> getAdmin(@PathVariable @NotBlank String loginId) {
AdminFind.Response response = adminManagementWebService.find(loginId);
return ResponseEntity.ok(response);
}
/**
* 관리자 등록
*
* @param request 요청
* @param bindingResult Validation 결과
* @return 응답
*/
@PostMapping("/create")
public ResponseEntity<?> createAdmin(
@RequestBody @Validated AdminCreate.Request request,
BindingResult bindingResult
) {
AdminCreate.Response response = adminManagementWebService.create(request);
return ResponseEntity.ok(response);
}
@PostMapping("/update")
public ResponseEntity<?> updateAdmin(
@RequestBody @Validated AdminUpdate.Request request,
BindingResult bindingResult
) {
AdminUpdate.Response response = adminManagementWebService.update(request);
return ResponseEntity.ok(response);
}
/**
* 관리자 삭제
*/
@PostMapping("/delete")
public ResponseEntity<?> deleteAdmin(
@RequestBody @Validated AdminDelete.Request request,
BindingResult bindingResult
) {
AdminDelete.Response response = adminManagementWebService.delete(request);
return ResponseEntity.ok(response);
}
}

View File

@ -0,0 +1,64 @@
package com.bpgroup.poc.admin.web.main.admin.management;
import com.bpgroup.poc.admin.domain.base.admin.service.AdminCreateCommand;
import com.bpgroup.poc.admin.domain.base.admin.service.AdminCreateResult;
import com.bpgroup.poc.admin.domain.base.admin.service.AdminService;
import com.bpgroup.poc.admin.domain.base.admin.service.AdminUpdateCommand;
import com.bpgroup.poc.admin.web.main.admin.management.reqres.AdminCreate;
import com.bpgroup.poc.admin.web.main.admin.management.reqres.AdminDelete;
import com.bpgroup.poc.admin.web.main.admin.management.reqres.AdminFind;
import com.bpgroup.poc.admin.web.main.admin.management.reqres.AdminUpdate;
import lombok.RequiredArgsConstructor;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
@RequiredArgsConstructor
public class AdminManagementWebService {
private final PasswordEncoder passwordEncoder;
private final AdminService adminService;
private final AdminManagementQueryRepository queryRepository;
public List<AdminFind.Response> findAll() {
return queryRepository.findAll();
}
public AdminFind.Response find(String loginId) {
return queryRepository.findByLoginId(loginId);
}
public AdminCreate.Response create(AdminCreate.Request request) {
AdminCreateResult adminCreateResult = adminService.create(
AdminCreateCommand.builder()
.loginId(request.getLoginId())
.password(passwordEncoder.encode(request.getPassword()))
.email(request.getEmail())
.name(request.getName())
.build()
);
return AdminCreate.Response.success(adminCreateResult.getId());
}
public AdminUpdate.Response update(AdminUpdate.Request request) {
adminService.update(
AdminUpdateCommand.builder()
.id(request.getId())
.roleId(request.getRoleId())
.email(request.getEmail())
.name(request.getName())
.build()
);
return AdminUpdate.Response.success();
}
public AdminDelete.Response delete(AdminDelete.Request request) {
adminService.delete(request.getId());
return AdminDelete.Response.success();
}
}

View File

@ -1,41 +0,0 @@
package com.bpgroup.poc.admin.web.main.admin.management;
import com.bpgroup.poc.admin.web.main.admin.management.reqres.AdministratorFind;
import com.querydsl.core.types.Projections;
import com.querydsl.jpa.impl.JPAQueryFactory;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
import java.util.List;
import static com.bpgroup.poc.admin.domain.entity.administrator.QAdministrator.administrator;
@Repository
@RequiredArgsConstructor
public class AdministratorManagementQueryRepository {
private final JPAQueryFactory queryFactory;
public List<AdministratorFind.Response> findAll() {
return queryFactory.select(Projections.fields(AdministratorFind.Response.class,
administrator.id,
administrator.loginId,
administrator.email,
administrator.name))
.from(administrator)
.fetch();
}
public AdministratorFind.Response find(String loginId) {
return queryFactory.select(Projections.fields(AdministratorFind.Response.class,
administrator.id,
administrator.loginId,
administrator.email,
administrator.name))
.from(administrator)
.where(administrator.loginId.eq(loginId))
.fetchOne();
}
}

View File

@ -1,110 +0,0 @@
package com.bpgroup.poc.admin.web.main.admin.management;
import com.bpgroup.poc.admin.web.main.admin.management.reqres.AdministratorCreate;
import com.bpgroup.poc.admin.web.main.admin.management.reqres.AdministratorDelete;
import com.bpgroup.poc.admin.web.main.admin.management.reqres.AdministratorFind;
import com.bpgroup.poc.admin.web.main.admin.management.reqres.AdministratorUpdate;
import com.bpgroup.poc.admin.web.main.admin.management.service.AdministratorCreateCommand;
import com.bpgroup.poc.admin.web.main.admin.management.service.AdministratorCreateResult;
import com.bpgroup.poc.admin.web.main.admin.management.service.AdministratorManagementService;
import com.bpgroup.poc.admin.web.main.admin.management.service.AdministratorUpdateCommand;
import jakarta.validation.constraints.NotBlank;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequiredArgsConstructor
@RequestMapping("/admin/management")
public class AdministratorManagementRestController {
private final PasswordEncoder passwordEncoder;
private final AdministratorManagementService service;
private final AdministratorManagementQueryRepository queryRepository;
/**
* 전체 조회
*
* @return 응답
*/
@GetMapping("/list")
public ResponseEntity<?> getAdministrators() {
List<AdministratorFind.Response> response = queryRepository.findAll();
return ResponseEntity.ok(response);
}
/**
* 조회
*
* @param loginId 관리자 ID
* @return 응답
*/
@GetMapping("/{loginId}")
public ResponseEntity<?> getAdministrator(@PathVariable @NotBlank String loginId) {
AdministratorFind.Response response = queryRepository.find(loginId);
return ResponseEntity.ok(response);
}
/**
* 관리자 등록
*
* @param request 요청
* @param bindingResult Validation 결과
* @return 응답
*/
@PostMapping("/create")
public ResponseEntity<?> createAdministrator(
@RequestBody @Validated AdministratorCreate.Request request,
BindingResult bindingResult
) {
AdministratorCreateResult result = service.create(
AdministratorCreateCommand.builder()
.loginId(request.getLoginId())
.password(passwordEncoder.encode(request.getPassword()))
.email(request.getEmail())
.name(request.getName())
.build()
);
return ResponseEntity.ok(AdministratorCreate.Response.success(result.getId()));
}
@PostMapping("/update")
public ResponseEntity<?> updateAdministrator(
@RequestBody @Validated AdministratorUpdate.Request request,
BindingResult bindingResult
) {
service.update(
AdministratorUpdateCommand.builder()
.password(passwordEncoder.encode(request.getPassword()))
.name(request.getName())
.email(request.getEmail())
.roleId(request.getRoleId())
.build()
);
return ResponseEntity.ok(AdministratorUpdate.Response.success());
}
/**
* 관리자 삭제
*
* @param request 요청
* @param bindingResult Validation 결과
* @return 응답
*/
@PostMapping("/delete")
public ResponseEntity<?> deleteAdministrator(
@RequestBody @Validated AdministratorDelete.Request request,
BindingResult bindingResult
) {
service.delete(request.getId());
return ResponseEntity.ok(AdministratorDelete.Response.success());
}
}

View File

@ -7,7 +7,7 @@ import lombok.Data;
import lombok.Getter;
import lombok.ToString;
public class AdministratorCreate {
public class AdminCreate {
@Data
public static class Request {

View File

@ -7,7 +7,7 @@ import lombok.Data;
import lombok.Getter;
import lombok.ToString;
public class AdministratorDelete {
public class AdminDelete {
@Data
public static class Request {
@ -19,16 +19,16 @@ public class AdministratorDelete {
@ToString
public static class Response extends CommonResponse {
@Builder
public static AdministratorDelete.Response success() {
AdministratorDelete.Response response = new AdministratorDelete.Response();
public static AdminDelete.Response success() {
AdminDelete.Response response = new AdminDelete.Response();
response.resultCode = "0000";
response.resultMessage = "Success";
return response;
}
@Builder
public static AdministratorDelete.Response fail(String resultMessage) {
AdministratorDelete.Response response = new AdministratorDelete.Response();
public static AdminDelete.Response fail(String resultMessage) {
AdminDelete.Response response = new AdminDelete.Response();
response.resultCode = "9999";
response.resultMessage = resultMessage;
return response;

View File

@ -3,7 +3,7 @@ package com.bpgroup.poc.admin.web.main.admin.management.reqres;
import lombok.Getter;
import lombok.ToString;
public class AdministratorFind {
public class AdminFind {
@Getter
@ToString

View File

@ -8,7 +8,7 @@ import lombok.Data;
import lombok.Getter;
import lombok.ToString;
public class AdministratorUpdate {
public class AdminUpdate {
@Data
public static class Request {
@ -28,16 +28,16 @@ public class AdministratorUpdate {
@ToString
public static class Response extends CommonResponse {
@Builder
public static AdministratorUpdate.Response success() {
AdministratorUpdate.Response response = new AdministratorUpdate.Response();
public static AdminUpdate.Response success() {
AdminUpdate.Response response = new AdminUpdate.Response();
response.resultCode = "0000";
response.resultMessage = "Success";
return response;
}
@Builder
public static AdministratorUpdate.Response fail(String resultMessage) {
AdministratorUpdate.Response response = new AdministratorUpdate.Response();
public static AdminUpdate.Response fail(String resultMessage) {
AdminUpdate.Response response = new AdminUpdate.Response();
response.resultCode = "9999";
response.resultMessage = resultMessage;
return response;

View File

@ -1,18 +0,0 @@
package com.bpgroup.poc.admin.web.main.admin.management.service;
import lombok.Builder;
import lombok.Getter;
import lombok.ToString;
@Getter
@ToString
public class AdministratorCreateResult {
private Long id;
@Builder
public static AdministratorCreateResult of(Long id) {
AdministratorCreateResult result = new AdministratorCreateResult();
result.id = id;
return result;
}
}

View File

@ -1,79 +0,0 @@
package com.bpgroup.poc.admin.web.main.admin.management.service;
import com.bpgroup.poc.admin.domain.entity.administrator.Administrator;
import com.bpgroup.poc.admin.domain.entity.administrator.AdministratorRepository;
import com.bpgroup.poc.admin.domain.entity.administrator.AdministratorRole;
import com.bpgroup.poc.admin.domain.entity.role.Role;
import com.bpgroup.poc.admin.domain.entity.role.RoleRepository;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import java.util.Optional;
@Service
@RequiredArgsConstructor
@Validated
@Transactional
public class AdministratorManagementService {
private final AdministratorRepository administratorRepository;
private final RoleRepository roleRepository;
public AdministratorCreateResult create(
@NotNull @Valid AdministratorCreateCommand command
) {
Optional<Role> findRole = roleRepository.findById(command.getRoleId());
if (findRole.isEmpty()) {
throw new IllegalArgumentException("Not found role");
}
Role role = findRole.get();
Administrator administrator = command.toEntity();
administrator.setAdministratorRole(
AdministratorRole.builder()
.role(role)
.build()
);
Administrator savedAdministrator = administratorRepository.save(administrator);
return AdministratorCreateResult.builder()
.id(savedAdministrator.getId())
.build();
}
public void update(
@NotNull @Valid AdministratorUpdateCommand command
) {
Optional<Administrator> findAdministrator = administratorRepository.findById(command.getId());
if (findAdministrator.isEmpty()) {
throw new IllegalArgumentException("Not found administrator");
}
Optional<Role> findRole = roleRepository.findById(command.getRoleId());
if (findRole.isEmpty()) {
throw new IllegalArgumentException("Not found role");
}
Role role = findRole.get();
Administrator administrator = findAdministrator.get();
administrator.setAdministratorRole(
AdministratorRole.builder()
.role(role)
.build()
);
administrator.update(administrator);
}
public void delete(@NotNull Long id) {
Optional<Administrator> findAdministrator = administratorRepository.findById(id);
if (findAdministrator.isEmpty()) {
throw new IllegalArgumentException("Not found administrator");
}
administratorRepository.deleteById(id);
}
}

View File

@ -1,6 +1,5 @@
package com.bpgroup.poc.admin.web.main.admin.menu;
import com.bpgroup.poc.admin.web.main.admin.menu.service.*;
import com.bpgroup.poc.admin.web.main.admin.menu.reqres.*;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
@ -13,95 +12,64 @@ import org.springframework.web.bind.annotation.RestController;
@RestController
@RequiredArgsConstructor
@RequestMapping("/admin/menu")
@RequestMapping("/admin")
public class MenuRestController {
private final MenuService service;
private final MenuWebService menuWebService;
@PostMapping("/menu-group/create")
@PostMapping("/create/menu-group")
public ResponseEntity<?> createMenuGroup(
@RequestBody @Valid MenuGroupCreate.Request request,
BindingResult bindingResult
) {
service.createMenuGroup(
MenuGroupCreateCommand.builder()
.name(request.getName())
.uri(request.getUri())
.sortOrder(request.getSortOrder())
.build()
);
return ResponseEntity.ok(MenuGroupCreate.Response.success());
MenuGroupCreate.Response response = menuWebService.createMenuGroup(request);
return ResponseEntity.ok(response);
}
@PostMapping("/update/menu-group")
@PostMapping("/menu-group/update")
public ResponseEntity<?> updateMenuGroup(
@RequestBody @Valid MenuGroupUpdate.Request request,
BindingResult bindingResult
) {
service.updateMenuGroup(
MenuGroupUpdateCommand.builder()
.id(request.getId())
.name(request.getName())
.uri(request.getUri())
.sortOrder(request.getSortOrder())
.build()
);
return ResponseEntity.ok(MenuGroupCreate.Response.success());
MenuGroupUpdate.Response response = menuWebService.updateMenuGroup(request);
return ResponseEntity.ok(response);
}
@PostMapping("/delete/menu-group")
@PostMapping("/menu-group/delete")
public ResponseEntity<?> deleteMenuGroup(
@RequestBody @Valid MenuGroupDelete.Request request,
BindingResult bindingResult
) {
service.deleteMenuGroup(request.getId());
return ResponseEntity.ok(MenuGroupDelete.Response.success());
MenuGroupDelete.Response response = menuWebService.deleteMenuGroup(request);
return ResponseEntity.ok(response);
}
@PostMapping("/create/menu")
@PostMapping("/menu/create")
public ResponseEntity<?> createMenu(
@RequestBody @Valid MenuCreate.Request request,
BindingResult bindingResult
) {
service.createMenu(
MenuCreateCommand.builder()
.menuGroupId(request.getMenuGroupId())
.name(request.getName())
.uri(request.getUri())
.sortOrder(request.getSortOrder())
.build()
);
return ResponseEntity.ok(MenuCreate.Response.success());
MenuCreate.Response response = menuWebService.createMenu(request);
return ResponseEntity.ok(response);
}
@PostMapping("/update/menu")
@PostMapping("/menu/update")
public ResponseEntity<?> updateMenu(
@RequestBody @Valid MenuUpdate.Request request,
BindingResult bindingResult
) {
service.updateMenu(
MenuUpdateCommand.builder()
.id(request.getId())
.name(request.getName())
.uri(request.getUri())
.sortOrder(request.getSortOrder())
.build()
);
return ResponseEntity.ok(MenuGroupCreate.Response.success());
MenuUpdate.Response response = menuWebService.updateMenu(request);
return ResponseEntity.ok(response);
}
@PostMapping("/delete/menu")
@PostMapping("/menu/delete")
public ResponseEntity<?> deleteMenu(
@RequestBody @Valid MenuDelete.Request request,
BindingResult bindingResult
) {
service.deleteMenu(request.getId());
return ResponseEntity.ok(MenuDelete.Response.success());
MenuDelete.Response response = menuWebService.deleteMenu(request);
return ResponseEntity.ok(response);
}
}

View File

@ -0,0 +1,74 @@
package com.bpgroup.poc.admin.web.main.admin.menu;
import com.bpgroup.poc.admin.domain.base.role.service.*;
import com.bpgroup.poc.admin.web.main.admin.menu.reqres.*;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
@Service
@RequiredArgsConstructor
public class MenuWebService {
private final MenuService menuService;
public MenuGroupCreate.Response createMenuGroup(MenuGroupCreate.Request request) {
menuService.createMenuGroup(
MenuGroupCreateCommand.builder()
.name(request.getName())
.uri(request.getUri())
.sortOrder(request.getSortOrder())
.build()
);
return MenuGroupCreate.Response.success();
}
public MenuGroupUpdate.Response updateMenuGroup(MenuGroupUpdate.Request request) {
menuService.updateMenuGroup(
MenuGroupUpdateCommand.builder()
.id(request.getId())
.name(request.getName())
.uri(request.getUri())
.sortOrder(request.getSortOrder())
.build()
);
return MenuGroupUpdate.Response.success();
}
public MenuGroupDelete.Response deleteMenuGroup(MenuGroupDelete.Request request) {
menuService.deleteMenuGroup(request.getId());
return MenuGroupDelete.Response.success();
}
public MenuCreate.Response createMenu(MenuCreate.Request request) {
menuService.createMenu(
MenuCreateCommand.builder()
.menuGroupId(request.getMenuGroupId())
.uri(request.getUri())
.name(request.getName())
.sortOrder(request.getSortOrder())
.build()
);
return MenuCreate.Response.success();
}
public MenuUpdate.Response updateMenu(MenuUpdate.Request request) {
menuService.updateMenu(
MenuUpdateCommand.builder()
.id(request.getId())
.uri(request.getUri())
.name(request.getName())
.sortOrder(request.getSortOrder())
.build()
);
return MenuUpdate.Response.success();
}
public MenuDelete.Response deleteMenu(MenuDelete.Request request) {
menuService.deleteMenu(request.getId());
return MenuDelete.Response.success();
}
}

View File

@ -4,7 +4,6 @@ import com.bpgroup.poc.admin.web.main.admin.role.reqres.RoleAddMenu;
import com.bpgroup.poc.admin.web.main.admin.role.reqres.RoleCreate;
import com.bpgroup.poc.admin.web.main.admin.role.reqres.RoleDelete;
import com.bpgroup.poc.admin.web.main.admin.role.reqres.RoleUpdate;
import com.bpgroup.poc.admin.web.main.admin.role.service.*;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
@ -14,17 +13,12 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
@RestController
@RequiredArgsConstructor
@RequestMapping("/admin/role")
public class RoleRestController {
private final RoleService roleService;
private final RoleWebService roleWebService;
/**
* 권한 등록
@ -34,14 +28,8 @@ public class RoleRestController {
@RequestBody @Valid RoleCreate.Request request,
BindingResult bindingResult
) {
RoleCreateResult result = roleService.create(
RoleCreateCommand.builder()
.name(request.getName())
.description(request.getDescription())
.build()
);
return ResponseEntity.ok(RoleCreate.Response.success(result.getId()));
RoleCreate.Response response = roleWebService.create(request);
return ResponseEntity.ok(response);
}
/**
@ -52,14 +40,7 @@ public class RoleRestController {
@RequestBody @Valid RoleUpdate.Request request,
BindingResult bindingResult
) {
roleService.update(
RoleUpdateCommand.builder()
.id(request.getId())
.name(request.getName())
.description(request.getDescription())
.build()
);
roleWebService.update(request);
return ResponseEntity.ok(RoleUpdate.Response.success());
}
@ -71,31 +52,19 @@ public class RoleRestController {
@RequestBody @Valid RoleDelete.Request request,
BindingResult bindingResult
) {
roleService.delete(request.getId());
roleWebService.delete(request);
return ResponseEntity.ok(RoleDelete.Response.success());
}
/**
* 권한 메뉴 추가
* DELETE -> INSERT
*/
@PostMapping("/put/menu")
public ResponseEntity<?> addMenu(
@RequestBody @Valid List<RoleAddMenu.Request> request,
@RequestBody @Valid RoleAddMenu.Request request,
BindingResult bindingResult
) {
roleService.deleteRoleMenu(request.get(0).getRoleId());
Set<RoleAddMenuCommand> commands = request.stream()
.map(c -> RoleAddMenuCommand.builder()
.roleId(c.getRoleId())
.menuId(c.getMenuId())
.build()
)
.collect(Collectors.toSet());
roleService.addRoleMenu(commands);
roleWebService.putMenu(request);
return ResponseEntity.ok(RoleAddMenu.Response.success());
}

View File

@ -0,0 +1,60 @@
package com.bpgroup.poc.admin.web.main.admin.role;
import com.bpgroup.poc.admin.domain.base.role.service.*;
import com.bpgroup.poc.admin.web.main.admin.role.reqres.RoleAddMenu;
import com.bpgroup.poc.admin.web.main.admin.role.reqres.RoleCreate;
import com.bpgroup.poc.admin.web.main.admin.role.reqres.RoleDelete;
import com.bpgroup.poc.admin.web.main.admin.role.reqres.RoleUpdate;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.Set;
import java.util.stream.Collectors;
@Service
@RequiredArgsConstructor
public class RoleWebService {
private final RoleService roleService;
public RoleCreate.Response create(RoleCreate.Request request) {
RoleCreateResult createResult = roleService.create(
RoleCreateCommand.builder()
.name(request.getName())
.description(request.getDescription())
.build()
);
return RoleCreate.Response.success(createResult.getId());
}
public void update(RoleUpdate.Request request) {
roleService.update(
RoleUpdateCommand.builder()
.id(request.getId())
.name(request.getName())
.description(request.getDescription())
.build()
);
}
public void delete(RoleDelete.Request request) {
roleService.delete(request.getId());
}
public void putMenu(@NotNull @Valid RoleAddMenu.Request request) {
roleService.deleteRoleMenu(request.getRoleId());
Set<RoleAddMenuCommand> commands = request.getMenuIds().stream()
.map(menuId -> RoleAddMenuCommand.builder()
.roleId(request.getRoleId())
.menuId(menuId)
.build()
)
.collect(Collectors.toSet());
roleService.addRoleMenu(commands);
}
}

View File

@ -2,11 +2,15 @@ package com.bpgroup.poc.admin.web.main.admin.role.reqres;
import com.bpgroup.poc.admin.web.common.CommonResponse;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import lombok.Builder;
import lombok.Data;
import lombok.Getter;
import lombok.ToString;
import java.util.HashSet;
import java.util.Set;
public class RoleAddMenu {
@Data
@ -14,7 +18,8 @@ public class RoleAddMenu {
@NotNull
private Long roleId;
@NotNull
private Long menuId;
@Size(min = 1)
private Set<Long> menuIds = new HashSet<>();
}

View File

@ -1,14 +1,10 @@
INSERT INTO `administrator` (`login_id`, `password`, `email`, `name`, `create_date`, `update_date`)
VALUES ('admin', '$2a$10$g6UOrQ/OS8o5r5CJk7C5juVFaItQ62U3EIn8zLPzkFplM3wVLvKZ2', 'admin@admin.com', '홍길동', CURDATE(),
CURDATE());
INSERT INTO `role` (`name`, `description`, `create_date`, `update_date`)
VALUES ('SUPER_ADMIN', '최고 관리자', CURDATE(), CURDATE()),
('ADMIN', '관리자', CURDATE(), CURDATE()),
('CLIENT', '고객', CURDATE(), CURDATE());
INSERT INTO `administrator_role` (`administrator_id`, `role_id`, `create_date`, `update_date`)
VALUES ('1', '1', CURDATE(), CURDATE());
INSERT INTO `admin` (`login_id`, `password`, `email`, `name`, `role_id`, `create_date`, `update_date`)
VALUES ('admin', '$2a$10$g6UOrQ/OS8o5r5CJk7C5juVFaItQ62U3EIn8zLPzkFplM3wVLvKZ2', 'admin@admin.com', '홍길동', 1, CURDATE(), CURDATE());
INSERT INTO `menu_group` (`uri`, `name`, `sort_order`, `create_date`, `update_date`)
VALUES ('/admin', '관리자 관리', 2, CURDATE(), CURDATE()),

View File

@ -16,8 +16,8 @@
<h4>관리자 조회</h4>
<div class="tb_wrapper">
<label for="selAdministrator">관리자: </label>
<select id="selAdministrator" class="table_select_box">
<label for="selAdmin">관리자: </label>
<select id="selAdmin" class="table_select_box">
<option value="">선택</option>
</select>
<button type="button" id="btnFindAll" class="btn_confirm" data-bs-dismiss="modal">조회</button>
@ -55,7 +55,7 @@
document.getElementById('iptUpdateName').value = '';
document.getElementById('iptDeleteId').value = '';
document.getElementById('iptDeleteLoginId').value = '';
document.getElementById('selAdministrator').innerHTML = '<option value="">선택</option>';
document.getElementById('selAdmin').innerHTML = '<option value="">선택</option>';
}
/**
@ -105,20 +105,20 @@
document.getElementById('btnFindAll').addEventListener(('click'), function () {
const requestUri = /*[[@{/admin/management/list}]]*/ '';
Reqhelper.reqGetJson(requestUri, (res) => {
const selAdministrator = document.getElementById('selAdministrator');
selAdministrator.innerHTML = '<option value="">선택</option>';
const selAdmin = document.getElementById('selAdmin');
selAdmin.innerHTML = '<option value="">선택</option>';
res.forEach(item => {
const option = document.createElement('option');
option.value = item.id;
option.text = item.loginId;
selAdministrator.appendChild(option);
selAdmin.appendChild(option);
});
}, () => {
PageHelper.showErrorModal('데이터 조회에 실패했습니다.');
});
});
document.getElementById('selAdministrator').addEventListener(('change'), function () {
document.getElementById('selAdmin').addEventListener(('change'), function () {
document.getElementById('iptUpdateId').value = this.value;
document.getElementById('iptUpdateLoginId').value = this.options[this.selectedIndex].text;
document.getElementById('iptDeleteId').value = this.value;

View File

@ -0,0 +1,194 @@
package com.bpgroup.poc.admin.domain.base.admin.service;
import com.bpgroup.poc.admin.domain.base.admin.entity.Admin;
import com.bpgroup.poc.admin.domain.base.admin.entity.AdminRepository;
import com.bpgroup.poc.admin.domain.base.admin.entity.AdminRole;
import com.bpgroup.poc.admin.domain.base.role.entity.Role;
import com.bpgroup.poc.admin.domain.base.role.entity.RoleRepository;
import com.bpgroup.poc.admin.env.MariaDBTestEnv;
import jakarta.validation.ConstraintViolationException;
import org.jetbrains.annotations.NotNull;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
@Transactional
@DisplayName("AdminService 테스트")
class AdminServiceTest extends MariaDBTestEnv {
@Autowired
private AdminService service;
@Autowired
private AdminRepository adminRepository;
@Autowired
private RoleRepository roleRepository;
@BeforeEach
void setUp() {
adminRepository.deleteAll();
roleRepository.deleteAll();
}
@Test
void createAdminTest() {
Role role = getSaveRole();
flushAndClear();
// when
AdminCreateResult createResult = service.create(
AdminCreateCommand.builder()
.loginId("test")
.password("test")
.email("test")
.name("test")
.roleId(role.getId())
.build()
);
flushAndClear();
// then
assertThat(createResult.getId()).isNotNull();
Admin findAdmin = adminRepository.findById(createResult.getId()).orElseThrow();
assertThat(findAdmin.getAdminRole().getRole().getName()).isEqualTo("test");
}
@DisplayName("Admin 수정 테스트")
@Test
void updateAdminTest() {
// given
Role saveRole = getSaveRole();
flushAndClear();
Admin saveAdmin = createAdmin(saveRole);
flushAndClear();
Role updateRole = roleRepository.save(
Role.builder()
.name("test2")
.description("test2")
.build()
);
flushAndClear();
// when
service.update(
AdminUpdateCommand.builder()
.id(saveAdmin.getId())
.password("test2")
.email("test2")
.name("test2")
.roleId(updateRole.getId())
.build()
);
flushAndClear();
// then
Admin findAdmin = adminRepository.findById(saveAdmin.getId()).orElseThrow();
assertThat(findAdmin.getPassword()).isEqualTo("test2");
assertThat(findAdmin.getEmail()).isEqualTo("test2");
assertThat(findAdmin.getName()).isEqualTo("test2");
assertThat(findAdmin.getAdminRole().getRole().getName()).isEqualTo("test2");
}
@DisplayName("Admin 삭제 테스트")
@Test
void deleteAdminTest() {
// given
Role saveRole = getSaveRole();
flushAndClear();
Admin saveAdmin = createAdmin(saveRole);
flushAndClear();
// when
service.delete(saveAdmin.getId());
flushAndClear();
// then
assertThat(adminRepository.findById(saveAdmin.getId())).isEmpty();
}
@DisplayName("Admin 삭제 시 Admin 동시 삭제 테스트")
@Test
void deleteAdminAndAdminRoleTest() {
// given
Role saveRole = getSaveRole();
flushAndClear();
Admin saveAdmin = createAdmin(saveRole);
flushAndClear();
// when
service.delete(saveAdmin.getId());
flushAndClear();
// then
assertThat(adminRepository.findById(saveAdmin.getId())).isEmpty();
}
@NotNull
private Role getSaveRole() {
return roleRepository.save(
Role.builder()
.name("test")
.description("test")
.build()
);
}
@NotNull
private Admin createAdmin(Role role) {
Admin admin = Admin.builder()
.loginId("test2")
.password("test2")
.email("test2")
.name("test2")
.build();
admin.setAdminRole(
AdminRole.builder()
.role(role)
.build()
);
return adminRepository.save(admin);
}
@Test
@DisplayName("AdminService method 호출 유효성 검사 테스트")
void validationTest() {
// create
assertThatThrownBy(() -> service.create(AdminCreateCommand.builder().loginId(null).password("password").email("email").name("name").roleId(1L).build())).isInstanceOf(ConstraintViolationException.class);
assertThatThrownBy(() -> service.create(AdminCreateCommand.builder().loginId("").password("password").email("email").name("name").roleId(1L).build())).isInstanceOf(ConstraintViolationException.class);
assertThatThrownBy(() -> service.create(AdminCreateCommand.builder().loginId("loginId").password(null).email("email").name("name").roleId(1L).build())).isInstanceOf(ConstraintViolationException.class);
assertThatThrownBy(() -> service.create(AdminCreateCommand.builder().loginId("loginId").password("").email("email").name("name").roleId(1L).build())).isInstanceOf(ConstraintViolationException.class);
assertThatThrownBy(() -> service.create(AdminCreateCommand.builder().loginId("loginId").password("password").email(null).name("name").roleId(1L).build())).isInstanceOf(ConstraintViolationException.class);
assertThatThrownBy(() -> service.create(AdminCreateCommand.builder().loginId("loginId").password("password").email("").name("name").roleId(1L).build())).isInstanceOf(ConstraintViolationException.class);
assertThatThrownBy(() -> service.create(AdminCreateCommand.builder().loginId("loginId").password("password").email("email").name(null).roleId(1L).build())).isInstanceOf(ConstraintViolationException.class);
assertThatThrownBy(() -> service.create(AdminCreateCommand.builder().loginId("loginId").password("password").email("email").name("").roleId(1L).build())).isInstanceOf(ConstraintViolationException.class);
assertThatThrownBy(() -> service.create(AdminCreateCommand.builder().loginId("loginId").password("password").email("email").name("name").roleId(null).build())).isInstanceOf(ConstraintViolationException.class);
// update
assertThatThrownBy(() -> service.update(AdminUpdateCommand.builder().id(null).password("password").email("email").name("name").roleId(1L).build())).isInstanceOf(ConstraintViolationException.class);
assertThatThrownBy(() -> service.update(AdminUpdateCommand.builder().id(1L).password(null).email("email").name("name").roleId(1L).build())).isInstanceOf(ConstraintViolationException.class);
assertThatThrownBy(() -> service.update(AdminUpdateCommand.builder().id(1L).password("").email("email").name("name").roleId(1L).build())).isInstanceOf(ConstraintViolationException.class);
assertThatThrownBy(() -> service.update(AdminUpdateCommand.builder().id(1L).password("password").email(null).name("name").roleId(1L).build())).isInstanceOf(ConstraintViolationException.class);
assertThatThrownBy(() -> service.update(AdminUpdateCommand.builder().id(1L).password("password").email("").name("name").roleId(1L).build())).isInstanceOf(ConstraintViolationException.class);
assertThatThrownBy(() -> service.update(AdminUpdateCommand.builder().id(1L).password("password").email("email").name(null).roleId(1L).build())).isInstanceOf(ConstraintViolationException.class);
assertThatThrownBy(() -> service.update(AdminUpdateCommand.builder().id(1L).password("password").email("email").name("").roleId(1L).build())).isInstanceOf(ConstraintViolationException.class);
assertThatThrownBy(() -> service.update(AdminUpdateCommand.builder().id(1L).password("password").email("email").name("name").roleId(null).build())).isInstanceOf(ConstraintViolationException.class);
// delete
assertThatThrownBy(() -> service.delete(null)).isInstanceOf(ConstraintViolationException.class);
}
}

View File

@ -1,11 +1,11 @@
package com.bpgroup.poc.admin.web.main.admin.menu;
package com.bpgroup.poc.admin.domain.base.menu.service;
import com.bpgroup.poc.admin.domain.entity.menu.Menu;
import com.bpgroup.poc.admin.domain.entity.menu.MenuGroup;
import com.bpgroup.poc.admin.domain.entity.menu.MenuGroupRepository;
import com.bpgroup.poc.admin.domain.entity.menu.MenuRepository;
import com.bpgroup.poc.admin.domain.base.role.entity.Menu;
import com.bpgroup.poc.admin.domain.base.role.entity.MenuGroup;
import com.bpgroup.poc.admin.domain.base.role.entity.MenuGroupRepository;
import com.bpgroup.poc.admin.domain.base.role.entity.MenuRepository;
import com.bpgroup.poc.admin.domain.base.role.service.*;
import com.bpgroup.poc.admin.env.MariaDBTestEnv;
import com.bpgroup.poc.admin.web.main.admin.menu.service.*;
import jakarta.validation.ConstraintViolationException;
import org.assertj.core.api.Assertions;
import org.jetbrains.annotations.NotNull;

View File

@ -1,15 +1,15 @@
package com.bpgroup.poc.admin.web.main.admin.role;
package com.bpgroup.poc.admin.domain.base.role.service;
import com.bpgroup.poc.admin.domain.entity.menu.Menu;
import com.bpgroup.poc.admin.domain.entity.menu.MenuGroup;
import com.bpgroup.poc.admin.domain.entity.menu.MenuGroupRepository;
import com.bpgroup.poc.admin.domain.entity.menu.MenuRepository;
import com.bpgroup.poc.admin.domain.entity.role.Role;
import com.bpgroup.poc.admin.domain.entity.role.RoleMenu;
import com.bpgroup.poc.admin.domain.entity.role.RoleMenuRepository;
import com.bpgroup.poc.admin.domain.entity.role.RoleRepository;
import com.bpgroup.poc.admin.domain.base.role.entity.Role;
import com.bpgroup.poc.admin.domain.base.role.entity.RoleMenu;
import com.bpgroup.poc.admin.domain.base.role.entity.RoleMenuRepository;
import com.bpgroup.poc.admin.domain.base.role.entity.RoleRepository;
import com.bpgroup.poc.admin.domain.base.role.service.*;
import com.bpgroup.poc.admin.domain.base.role.entity.Menu;
import com.bpgroup.poc.admin.domain.base.role.entity.MenuGroup;
import com.bpgroup.poc.admin.domain.base.role.entity.MenuGroupRepository;
import com.bpgroup.poc.admin.domain.base.role.entity.MenuRepository;
import com.bpgroup.poc.admin.env.MariaDBTestEnv;
import com.bpgroup.poc.admin.web.main.admin.role.service.*;
import jakarta.validation.ConstraintViolationException;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;

View File

@ -1,198 +0,0 @@
package com.bpgroup.poc.admin.web.main.admin.administrator;
import com.bpgroup.poc.admin.domain.entity.administrator.Administrator;
import com.bpgroup.poc.admin.domain.entity.administrator.AdministratorRepository;
import com.bpgroup.poc.admin.domain.entity.administrator.AdministratorRole;
import com.bpgroup.poc.admin.domain.entity.role.Role;
import com.bpgroup.poc.admin.domain.entity.role.RoleRepository;
import com.bpgroup.poc.admin.env.MariaDBTestEnv;
import com.bpgroup.poc.admin.web.main.admin.management.service.AdministratorCreateCommand;
import com.bpgroup.poc.admin.web.main.admin.management.service.AdministratorCreateResult;
import com.bpgroup.poc.admin.web.main.admin.management.service.AdministratorManagementService;
import com.bpgroup.poc.admin.web.main.admin.management.service.AdministratorUpdateCommand;
import jakarta.validation.ConstraintViolationException;
import org.jetbrains.annotations.NotNull;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
@Transactional
@DisplayName("AdministratorService 테스트")
class AdministratorServiceTest extends MariaDBTestEnv {
@Autowired
private AdministratorManagementService service;
@Autowired
private AdministratorRepository administratorRepository;
@Autowired
private RoleRepository roleRepository;
@BeforeEach
void setUp() {
administratorRepository.deleteAll();
roleRepository.deleteAll();
}
@Test
void createAdministratorTest() {
Role role = getSaveRole();
flushAndClear();
// when
AdministratorCreateResult createResult = service.create(
AdministratorCreateCommand.builder()
.loginId("test")
.password("test")
.email("test")
.name("test")
.roleId(role.getId())
.build()
);
flushAndClear();
// then
assertThat(createResult.getId()).isNotNull();
Administrator findAdministrator = administratorRepository.findById(createResult.getId()).orElseThrow();
assertThat(findAdministrator.getAdministratorRole().getRole().getName()).isEqualTo("test");
}
@DisplayName("Administrator 수정 테스트")
@Test
void updateAdministratorTest() {
// given
Role saveRole = getSaveRole();
flushAndClear();
Administrator saveAdministrator = createAdministrator(saveRole);
flushAndClear();
Role updateRole = roleRepository.save(
Role.builder()
.name("test2")
.description("test2")
.build()
);
flushAndClear();
// when
service.update(
AdministratorUpdateCommand.builder()
.id(saveAdministrator.getId())
.password("test2")
.email("test2")
.name("test2")
.roleId(updateRole.getId())
.build()
);
flushAndClear();
// then
Administrator findAdministrator = administratorRepository.findById(saveAdministrator.getId()).orElseThrow();
assertThat(findAdministrator.getPassword()).isEqualTo("test2");
assertThat(findAdministrator.getEmail()).isEqualTo("test2");
assertThat(findAdministrator.getName()).isEqualTo("test2");
assertThat(findAdministrator.getAdministratorRole().getRole().getName()).isEqualTo("test2");
}
@DisplayName("Administrator 삭제 테스트")
@Test
void deleteAdministratorTest() {
// given
Role saveRole = getSaveRole();
flushAndClear();
Administrator saveAdministrator = createAdministrator(saveRole);
flushAndClear();
// when
service.delete(saveAdministrator.getId());
flushAndClear();
// then
assertThat(administratorRepository.findById(saveAdministrator.getId())).isEmpty();
}
@DisplayName("Administrator 삭제 시 Administrator 동시 삭제 테스트")
@Test
void deleteAdministratorAndAdministratorRoleTest() {
// given
Role saveRole = getSaveRole();
flushAndClear();
Administrator saveAdministrator = createAdministrator(saveRole);
flushAndClear();
// when
service.delete(saveAdministrator.getId());
flushAndClear();
// then
assertThat(administratorRepository.findById(saveAdministrator.getId())).isEmpty();
}
@NotNull
private Role getSaveRole() {
return roleRepository.save(
Role.builder()
.name("test")
.description("test")
.build()
);
}
@NotNull
private Administrator createAdministrator(Role role) {
Administrator administrator = Administrator.builder()
.loginId("test2")
.password("test2")
.email("test2")
.name("test2")
.build();
administrator.setAdministratorRole(
AdministratorRole.builder()
.role(role)
.build()
);
return administratorRepository.save(administrator);
}
@Test
@DisplayName("AdministratorService method 호출 유효성 검사 테스트")
void validationTest() {
// create
assertThatThrownBy(() -> service.create(AdministratorCreateCommand.builder().loginId(null).password("password").email("email").name("name").roleId(1L).build())).isInstanceOf(ConstraintViolationException.class);
assertThatThrownBy(() -> service.create(AdministratorCreateCommand.builder().loginId("").password("password").email("email").name("name").roleId(1L).build())).isInstanceOf(ConstraintViolationException.class);
assertThatThrownBy(() -> service.create(AdministratorCreateCommand.builder().loginId("loginId").password(null).email("email").name("name").roleId(1L).build())).isInstanceOf(ConstraintViolationException.class);
assertThatThrownBy(() -> service.create(AdministratorCreateCommand.builder().loginId("loginId").password("").email("email").name("name").roleId(1L).build())).isInstanceOf(ConstraintViolationException.class);
assertThatThrownBy(() -> service.create(AdministratorCreateCommand.builder().loginId("loginId").password("password").email(null).name("name").roleId(1L).build())).isInstanceOf(ConstraintViolationException.class);
assertThatThrownBy(() -> service.create(AdministratorCreateCommand.builder().loginId("loginId").password("password").email("").name("name").roleId(1L).build())).isInstanceOf(ConstraintViolationException.class);
assertThatThrownBy(() -> service.create(AdministratorCreateCommand.builder().loginId("loginId").password("password").email("email").name(null).roleId(1L).build())).isInstanceOf(ConstraintViolationException.class);
assertThatThrownBy(() -> service.create(AdministratorCreateCommand.builder().loginId("loginId").password("password").email("email").name("").roleId(1L).build())).isInstanceOf(ConstraintViolationException.class);
assertThatThrownBy(() -> service.create(AdministratorCreateCommand.builder().loginId("loginId").password("password").email("email").name("name").roleId(null).build())).isInstanceOf(ConstraintViolationException.class);
// update
assertThatThrownBy(() -> service.update(AdministratorUpdateCommand.builder().id(null).password("password").email("email").name("name").roleId(1L).build())).isInstanceOf(ConstraintViolationException.class);
assertThatThrownBy(() -> service.update(AdministratorUpdateCommand.builder().id(1L).password(null).email("email").name("name").roleId(1L).build())).isInstanceOf(ConstraintViolationException.class);
assertThatThrownBy(() -> service.update(AdministratorUpdateCommand.builder().id(1L).password("").email("email").name("name").roleId(1L).build())).isInstanceOf(ConstraintViolationException.class);
assertThatThrownBy(() -> service.update(AdministratorUpdateCommand.builder().id(1L).password("password").email(null).name("name").roleId(1L).build())).isInstanceOf(ConstraintViolationException.class);
assertThatThrownBy(() -> service.update(AdministratorUpdateCommand.builder().id(1L).password("password").email("").name("name").roleId(1L).build())).isInstanceOf(ConstraintViolationException.class);
assertThatThrownBy(() -> service.update(AdministratorUpdateCommand.builder().id(1L).password("password").email("email").name(null).roleId(1L).build())).isInstanceOf(ConstraintViolationException.class);
assertThatThrownBy(() -> service.update(AdministratorUpdateCommand.builder().id(1L).password("password").email("email").name("").roleId(1L).build())).isInstanceOf(ConstraintViolationException.class);
assertThatThrownBy(() -> service.update(AdministratorUpdateCommand.builder().id(1L).password("password").email("email").name("name").roleId(null).build())).isInstanceOf(ConstraintViolationException.class);
// delete
assertThatThrownBy(() -> service.delete(null)).isInstanceOf(ConstraintViolationException.class);
}
}