feature/admin #6

Merged
gh.yeom merged 8 commits from feature/admin into main 2024-05-14 16:51:29 +09:00
14 changed files with 463 additions and 15 deletions
Showing only changes of commit 5c319a2ae3 - Show all commits

View File

@ -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'
}

View File

@ -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<RoleMenu> 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;
}
}

View File

@ -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();
}
}

View File

@ -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();
}
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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);
}
}

View File

@ -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> 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");
}
}
}

View File

@ -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;
}
}
}

View File

@ -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;
}
}
}

View File

@ -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;
}
}
}

View File

@ -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() {
}
}

View File

@ -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)

View File

@ -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();
}
}