diff --git a/poc/admin/build.gradle b/poc/admin/build.gradle index b5451fc..37f5381 100644 --- a/poc/admin/build.gradle +++ b/poc/admin/build.gradle @@ -54,6 +54,16 @@ dependencies { runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.12.5' runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.12.5' + // TEST + testImplementation 'org.junit.jupiter:junit-jupiter' + testImplementation 'org.testcontainers:testcontainers' + testImplementation 'org.testcontainers:junit-jupiter' + // 테스트 컨테이너 DB 의존성 참고 + // MySQL : https://www.testcontainers.org/modules/databases/mysql/ + // MariaDB : https://www.testcontainers.org/modules/databases/mariadb/ + // MongoDB : https://www.testcontainers.org/modules/databases/mongodb/ + // PostgreSQL: https://java.testcontainers.org/modules/databases/postgres/ + testImplementation 'org.testcontainers:mariadb' } diff --git a/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/entity/Role.java b/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/entity/Role.java index b6f4254..b83381f 100644 --- a/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/entity/Role.java +++ b/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/entity/Role.java @@ -2,6 +2,7 @@ package com.bpgroup.poc.admin.domain.admin.entity; import com.bpgroup.poc.admin.domain.BaseEntity; import jakarta.persistence.*; +import lombok.Builder; import lombok.Getter; import java.util.HashSet; @@ -25,4 +26,17 @@ public class Role extends BaseEntity { @OneToMany(mappedBy = "role", fetch = FetchType.LAZY) private Set roleMenus = new HashSet<>(); + @Builder + public static Role of(String name, String description) { + Role role = new Role(); + role.name = name; + role.description = description; + return role; + + } + + public void update(Role updateRole) { + this.name = updateRole.name; + this.description = updateRole.description; + } } diff --git a/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/service/RoleCreateCommand.java b/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/service/RoleCreateCommand.java new file mode 100644 index 0000000..e4ab342 --- /dev/null +++ b/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/service/RoleCreateCommand.java @@ -0,0 +1,33 @@ +package com.bpgroup.poc.admin.domain.admin.service; + +import com.bpgroup.poc.admin.domain.admin.entity.Role; +import jakarta.validation.constraints.NotBlank; +import lombok.Builder; +import lombok.Getter; +import lombok.ToString; + +@Getter +@ToString +public class RoleCreateCommand { + + @NotBlank + private String name; + + private String description; + + @Builder + public static RoleCreateCommand of(String name, String description) { + RoleCreateCommand command = new RoleCreateCommand(); + command.name = name; + command.description = description; + return command; + } + + public Role toEntity() { + return Role.builder() + .name(name) + .description(description) + .build(); + } + +} diff --git a/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/service/RoleUpdateCommand.java b/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/service/RoleUpdateCommand.java new file mode 100644 index 0000000..f352dc6 --- /dev/null +++ b/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/service/RoleUpdateCommand.java @@ -0,0 +1,32 @@ +package com.bpgroup.poc.admin.domain.admin.service; + +import com.bpgroup.poc.admin.domain.admin.entity.Role; +import jakarta.validation.constraints.NotBlank; +import lombok.Builder; +import lombok.Getter; +import lombok.ToString; + +@Getter +@ToString +public class RoleUpdateCommand { + + @NotBlank + private String name; + + private String description; + + @Builder + public static RoleUpdateCommand of(String name, String description) { + RoleUpdateCommand command = new RoleUpdateCommand(); + command.name = name; + command.description = description; + return command; + } + + public Role toEntity() { + return Role.builder() + .name(name) + .description(description) + .build(); + } +} diff --git a/poc/admin/src/main/java/com/bpgroup/poc/admin/web/common/CommonResponse.java b/poc/admin/src/main/java/com/bpgroup/poc/admin/web/common/CommonResponse.java index ca06769..28dfe4e 100644 --- a/poc/admin/src/main/java/com/bpgroup/poc/admin/web/common/CommonResponse.java +++ b/poc/admin/src/main/java/com/bpgroup/poc/admin/web/common/CommonResponse.java @@ -1,8 +1,9 @@ package com.bpgroup.poc.admin.web.common; -public class CommonResponse { +import lombok.Getter; +@Getter +public class CommonResponse { protected String resultCode; protected String resultMessage; - } diff --git a/poc/admin/src/main/java/com/bpgroup/poc/admin/web/main/admin/role/RoleQueryRepository.java b/poc/admin/src/main/java/com/bpgroup/poc/admin/web/main/admin/role/RoleQueryRepository.java new file mode 100644 index 0000000..6340088 --- /dev/null +++ b/poc/admin/src/main/java/com/bpgroup/poc/admin/web/main/admin/role/RoleQueryRepository.java @@ -0,0 +1,13 @@ +package com.bpgroup.poc.admin.web.main.admin.role; + +import com.querydsl.jpa.impl.JPAQueryFactory; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; + +@Repository +@RequiredArgsConstructor +public class RoleQueryRepository { + + private final JPAQueryFactory queryFactory; + +} diff --git a/poc/admin/src/main/java/com/bpgroup/poc/admin/web/main/admin/role/RoleRestController.java b/poc/admin/src/main/java/com/bpgroup/poc/admin/web/main/admin/role/RoleRestController.java new file mode 100644 index 0000000..3849e68 --- /dev/null +++ b/poc/admin/src/main/java/com/bpgroup/poc/admin/web/main/admin/role/RoleRestController.java @@ -0,0 +1,60 @@ +package com.bpgroup.poc.admin.web.main.admin.role; + +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 lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/admin/role") +public class RoleRestController { + + private final RoleService roleService; + + + + /** + * 권한 등록 + */ + @PostMapping("/create") + public ResponseEntity createRole( + @RequestBody @Valid RoleCreate.Request request, + BindingResult bindingResult + ) { + RoleCreate.Response response = roleService.create(request); + return ResponseEntity.ok(response); + } + + /** + * 권한 수정 + */ + @PostMapping("/update") + public ResponseEntity updateRole( + @RequestBody @Valid RoleUpdate.Request request, + BindingResult bindingResult + ) { + RoleUpdate.Response response = roleService.update(request); + return ResponseEntity.ok(response); + } + + /** + * 권한 삭제 + */ + @PostMapping("/delete") + public ResponseEntity deleteRole( + @RequestBody @Valid RoleDelete.Request request, + BindingResult bindingResult + ) { + RoleDelete.Response response = roleService.delete(request); + return ResponseEntity.ok(response); + } + +} diff --git a/poc/admin/src/main/java/com/bpgroup/poc/admin/web/main/admin/role/RoleService.java b/poc/admin/src/main/java/com/bpgroup/poc/admin/web/main/admin/role/RoleService.java new file mode 100644 index 0000000..0579239 --- /dev/null +++ b/poc/admin/src/main/java/com/bpgroup/poc/admin/web/main/admin/role/RoleService.java @@ -0,0 +1,66 @@ +package com.bpgroup.poc.admin.web.main.admin.role; + +import com.bpgroup.poc.admin.domain.admin.entity.Role; +import com.bpgroup.poc.admin.domain.admin.entity.RoleRepository; +import com.bpgroup.poc.admin.domain.admin.service.RoleCreateCommand; +import com.bpgroup.poc.admin.domain.admin.service.RoleUpdateCommand; +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 lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.Optional; + +@Service +@RequiredArgsConstructor +public class RoleService { + + private final RoleRepository repository; + private final RoleQueryRepository queryRepository; + + /** + * ROLE 생성 + */ + public RoleCreate.Response create(RoleCreate.Request request) { + Role role = repository.save( + RoleCreateCommand.builder() + .name(request.getName()) + .description(request.getDescription()) + .build() + .toEntity() + ); + + return RoleCreate.Response.success(role.getId()); + } + + /** + * ROLE 수정 + */ + public RoleUpdate.Response update(RoleUpdate.Request request) { + Optional role = repository.findById(request.getId()); + if (role.isEmpty()) { + return RoleUpdate.Response.fail("ROLE_NOT_FOUND"); + } + + Role findRole = role.get(); + Role updateRole = RoleUpdateCommand.builder() + .name(request.getName()) + .description(request.getDescription()) + .build() + .toEntity(); + + findRole.update(updateRole); + + return RoleUpdate.Response.success(); + } + + public RoleDelete.Response delete(RoleDelete.Request request) { + try { + repository.deleteById(request.getId()); + return RoleDelete.Response.success(); + } catch (Exception e) { + return RoleDelete.Response.fail("Role Delete Fail"); + } + } +} diff --git a/poc/admin/src/main/java/com/bpgroup/poc/admin/web/main/admin/role/reqres/RoleCreate.java b/poc/admin/src/main/java/com/bpgroup/poc/admin/web/main/admin/role/reqres/RoleCreate.java new file mode 100644 index 0000000..9332f34 --- /dev/null +++ b/poc/admin/src/main/java/com/bpgroup/poc/admin/web/main/admin/role/reqres/RoleCreate.java @@ -0,0 +1,42 @@ +package com.bpgroup.poc.admin.web.main.admin.role.reqres; + +import com.bpgroup.poc.admin.web.common.CommonResponse; +import jakarta.validation.constraints.NotBlank; +import lombok.Builder; +import lombok.Data; +import lombok.Getter; +import lombok.ToString; + +public class RoleCreate { + + @Data + public static class Request { + @NotBlank + private String name; + private String description; + } + + @Getter + @ToString + public static class Response extends CommonResponse { + private Long id; + + @Builder + public static RoleCreate.Response success(Long id) { + RoleCreate.Response response = new RoleCreate.Response(); + response.resultCode = "0000"; + response.resultMessage = "Success"; + response.id = id; + return response; + } + + @Builder + public static RoleCreate.Response fail() { + RoleCreate.Response response = new RoleCreate.Response(); + response.resultCode = "9999"; + response.resultMessage = "Fail"; + return response; + } + + } +} diff --git a/poc/admin/src/main/java/com/bpgroup/poc/admin/web/main/admin/role/reqres/RoleDelete.java b/poc/admin/src/main/java/com/bpgroup/poc/admin/web/main/admin/role/reqres/RoleDelete.java new file mode 100644 index 0000000..bd8be52 --- /dev/null +++ b/poc/admin/src/main/java/com/bpgroup/poc/admin/web/main/admin/role/reqres/RoleDelete.java @@ -0,0 +1,36 @@ +package com.bpgroup.poc.admin.web.main.admin.role.reqres; + +import com.bpgroup.poc.admin.web.common.CommonResponse; +import jakarta.validation.constraints.NotNull; +import lombok.Builder; +import lombok.Data; +import lombok.Getter; +import lombok.ToString; + +public class RoleDelete { + @Data + public static class Request { + @NotNull + private Long id; + } + + @Getter + @ToString + public static class Response extends CommonResponse { + @Builder + public static RoleDelete.Response success() { + RoleDelete.Response response = new RoleDelete.Response(); + response.resultCode = "0000"; + response.resultMessage = "Success"; + return response; + } + + @Builder + public static RoleDelete.Response fail(String resultMessage) { + RoleDelete.Response response = new RoleDelete.Response(); + response.resultCode = "9999"; + response.resultMessage = resultMessage; + return response; + } + } +} diff --git a/poc/admin/src/main/java/com/bpgroup/poc/admin/web/main/admin/role/reqres/RoleUpdate.java b/poc/admin/src/main/java/com/bpgroup/poc/admin/web/main/admin/role/reqres/RoleUpdate.java new file mode 100644 index 0000000..a5af759 --- /dev/null +++ b/poc/admin/src/main/java/com/bpgroup/poc/admin/web/main/admin/role/reqres/RoleUpdate.java @@ -0,0 +1,41 @@ +package com.bpgroup.poc.admin.web.main.admin.role.reqres; + +import com.bpgroup.poc.admin.web.common.CommonResponse; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Builder; +import lombok.Data; +import lombok.Getter; +import lombok.ToString; + +public class RoleUpdate { + + @Data + public static class Request { + @NotNull + private Long id; + @NotBlank + private String name; + private String description; + } + + @Getter + @ToString + public static class Response extends CommonResponse { + @Builder + public static RoleUpdate.Response success() { + RoleUpdate.Response response = new RoleUpdate.Response(); + response.resultCode = "0000"; + response.resultMessage = "Success"; + return response; + } + + @Builder + public static RoleUpdate.Response fail(String resultMessage) { + RoleUpdate.Response response = new RoleUpdate.Response(); + response.resultCode = "9999"; + response.resultMessage = resultMessage; + return response; + } + } +} diff --git a/poc/admin/src/test/java/com/bpgroup/poc/admin/AdminApplicationTests.java b/poc/admin/src/test/java/com/bpgroup/poc/admin/AdminApplicationTests.java deleted file mode 100644 index 6295bf7..0000000 --- a/poc/admin/src/test/java/com/bpgroup/poc/admin/AdminApplicationTests.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.bpgroup.poc.admin; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class AdminApplicationTests { - - @Test - void contextLoads() { - } - -} diff --git a/poc/admin/src/test/java/com/bpgroup/poc/admin/env/MariaDBTestEnv.java b/poc/admin/src/test/java/com/bpgroup/poc/admin/env/MariaDBTestEnv.java index 8322b8c..c48a70e 100644 --- a/poc/admin/src/test/java/com/bpgroup/poc/admin/env/MariaDBTestEnv.java +++ b/poc/admin/src/test/java/com/bpgroup/poc/admin/env/MariaDBTestEnv.java @@ -1,7 +1,9 @@ package com.bpgroup.poc.admin.env; +import jakarta.persistence.EntityManager; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.DynamicPropertyRegistry; import org.springframework.test.context.DynamicPropertySource; import org.testcontainers.containers.MariaDBContainer; @@ -10,6 +12,14 @@ import static org.assertj.core.api.Assertions.assertThat; public class MariaDBTestEnv extends IntegrateTestEnv { + @Autowired + private EntityManager em; + + public void flushAndClear() { + em.flush(); + em.clear(); + } + private static final String MARIA_DB_IMAGE = "mariadb:10.11.7"; static MariaDBContainer mariadb = new MariaDBContainer<>(MARIA_DB_IMAGE) diff --git a/poc/admin/src/test/java/com/bpgroup/poc/admin/web/main/admin/role/RoleServiceTest.java b/poc/admin/src/test/java/com/bpgroup/poc/admin/web/main/admin/role/RoleServiceTest.java new file mode 100644 index 0000000..3c5a5e5 --- /dev/null +++ b/poc/admin/src/test/java/com/bpgroup/poc/admin/web/main/admin/role/RoleServiceTest.java @@ -0,0 +1,103 @@ +package com.bpgroup.poc.admin.web.main.admin.role; + +import com.bpgroup.poc.admin.domain.admin.entity.Role; +import com.bpgroup.poc.admin.domain.admin.entity.RoleRepository; +import com.bpgroup.poc.admin.domain.admin.service.RoleCreateCommand; +import com.bpgroup.poc.admin.env.MariaDBTestEnv; +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.persistence.EntityManager; +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; + +@Transactional +@DisplayName("Role Service 테스트") +class RoleServiceTest extends MariaDBTestEnv { + + @Autowired + private EntityManager entityManager; + + @Autowired + private RoleService roleService; + + @Autowired + private RoleRepository roleRepository; + + @BeforeEach + void setUp() { + roleRepository.deleteAll(); + } + + @Test + @DisplayName("Role 생성 테스트") + void createRoleTest() { + // given + RoleCreate.Request request = new RoleCreate.Request(); + request.setName("TEST"); + request.setDescription("TEST"); + + // when + RoleCreate.Response response = roleService.create(request); + + // then + assertThat(response.getId()).isNotNull(); + assertThat(response.getResultCode()).isEqualTo("0000"); + } + + @Test + @DisplayName("Role 수정 테스트") + void updateRoleTest() { + // given + Role createRole = roleRepository.save(RoleCreateCommand.builder() + .name("TEST") + .description("TEST") + .build() + .toEntity()); + + RoleUpdate.Request request = new RoleUpdate.Request(); + request.setId(createRole.getId()); + request.setName("TEST2"); + request.setDescription("TEST2"); + + // when + RoleUpdate.Response response = roleService.update(request); + + // then + assertThat(response.getResultCode()).isEqualTo("0000"); + + flushAndClear(); + + Role findRole = roleRepository.findById(createRole.getId()).orElseThrow(); + assertThat(findRole.getName()).isEqualTo("TEST2"); + assertThat(findRole.getDescription()).isEqualTo("TEST2"); + } + + @Test + @DisplayName("Role 삭제 테스트") + void deleteRoleTest() { + // given + Role createRole = roleRepository.save(RoleCreateCommand.builder() + .name("TEST") + .description("TEST") + .build() + .toEntity()); + + RoleDelete.Request request = new RoleDelete.Request(); + request.setId(createRole.getId()); + + // when + RoleDelete.Response response = roleService.delete(request); + + // then + assertThat(response.getResultCode()).isEqualTo("0000"); + + flushAndClear(); + assertThat(roleRepository.findById(createRole.getId())).isEmpty(); + } +}