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

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,14 @@
import org.springframework.web.bind.annotation.RestController;

import flipnote.group.api.dto.request.AddPermissionRequestDto;
import flipnote.group.api.dto.request.RemovePermissionRequestDto;
import flipnote.group.api.dto.response.AddPermissionResponseDto;
import flipnote.group.api.dto.response.RemovePermissionResponseDto;
import flipnote.group.application.port.in.AddPermissionUseCase;
import flipnote.group.application.port.in.command.AddPermissionCommand;
import flipnote.group.application.port.in.RemovePermissionUseCase;
import flipnote.group.application.port.in.command.PermissionCommand;
import flipnote.group.application.port.in.result.AddPermissionResult;
import flipnote.group.application.port.in.result.RemovePermissionResult;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;

Expand All @@ -23,6 +27,7 @@
public class PermissionController {

private final AddPermissionUseCase addPermissionUseCase;
private final RemovePermissionUseCase removePermissionUseCase;

/**
* 하위 권한 추가
Expand All @@ -33,7 +38,7 @@ public ResponseEntity<AddPermissionResponseDto> addDownPermission(
@PathVariable("groupId") Long groupId,
@Valid @RequestBody AddPermissionRequestDto req) {

AddPermissionCommand cmd = new AddPermissionCommand(userId, groupId, req.changeRole(), req.permission());
PermissionCommand cmd = new PermissionCommand(userId, groupId, req.changeRole(), req.permission());

AddPermissionResult result = addPermissionUseCase.addPermission(cmd);

Expand All @@ -42,6 +47,28 @@ public ResponseEntity<AddPermissionResponseDto> addDownPermission(
return ResponseEntity.ok(res);
}

/**
* 하위 권한 삭제
* @param userId
* @param groupId
* @param req
* @return
*/
@DeleteMapping("/permissions")
public ResponseEntity<?> changeDownPermission(
@RequestHeader("X-USER-ID") Long userId,
@PathVariable("groupId") Long groupId,
@Valid @RequestBody RemovePermissionRequestDto req) {

PermissionCommand cmd = new PermissionCommand(userId, groupId, req.changeRole(), req.permission());

RemovePermissionResult result = removePermissionUseCase.removePermission(cmd);

RemovePermissionResponseDto res = RemovePermissionResponseDto.from(result);

return ResponseEntity.ok(res);
}


//todo 그룹 멤버 추방

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -166,4 +166,26 @@ public GroupMemberRole findRole(Long userId, Long groupId) {

return groupMember.getRole().getRole();
}

/**
* 권한 삭제
* @param groupId
* @param role
* @param permission
* @return
*/
@Override
public List<GroupPermission> removePermission(Long groupId, GroupMemberRole role, GroupPermission permission) {
RoleEntity roleEntity = groupRoleRepository.findByGroupIdAndRole(groupId, role).orElseThrow(
() -> new IllegalArgumentException("not exists member")
);

groupRolePermissionRepository.deleteByGroupRoleIdAndPermission(roleEntity.getId(), permission);

List<PermissionEntity> permissions = groupRolePermissionRepository.findAllByGroupRoleId(roleEntity.getId());

return permissions.stream()
.map(PermissionEntity::getPermission)
.toList();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package flipnote.group.api.dto.request;

import flipnote.group.domain.model.member.GroupMemberRole;
import flipnote.group.domain.model.permission.GroupPermission;

public record RemovePermissionRequestDto(
GroupMemberRole changeRole,
GroupPermission permission
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package flipnote.group.api.dto.response;

import java.util.List;

import flipnote.group.application.port.in.result.RemovePermissionResult;
import flipnote.group.domain.model.member.GroupMemberRole;
import flipnote.group.domain.model.permission.GroupPermission;

public record RemovePermissionResponseDto(
GroupMemberRole role,
List<GroupPermission> permissions
) {
public static RemovePermissionResponseDto from(RemovePermissionResult result) {
return new RemovePermissionResponseDto(result.role(), result.groupPermissions());
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package flipnote.group.application.port.in;

import flipnote.group.application.port.in.command.AddPermissionCommand;
import flipnote.group.application.port.in.command.PermissionCommand;
import flipnote.group.application.port.in.result.AddPermissionResult;

public interface AddPermissionUseCase {
AddPermissionResult addPermission(AddPermissionCommand cmd);
AddPermissionResult addPermission(PermissionCommand cmd);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package flipnote.group.application.port.in;

import flipnote.group.application.port.in.command.PermissionCommand;
import flipnote.group.application.port.in.result.RemovePermissionResult;

public interface RemovePermissionUseCase {
RemovePermissionResult removePermission(PermissionCommand cmd);
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import flipnote.group.domain.model.member.GroupMemberRole;
import flipnote.group.domain.model.permission.GroupPermission;

public record AddPermissionCommand(
public record PermissionCommand(
Long userId,
Long groupId,
GroupMemberRole changeRole,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package flipnote.group.application.port.in.result;

import java.util.List;

import flipnote.group.domain.model.member.GroupMemberRole;
import flipnote.group.domain.model.permission.GroupPermission;

public record RemovePermissionResult(
List<GroupPermission> groupPermissions,
GroupMemberRole role
) {
public static RemovePermissionResult of(List<GroupPermission> groupPermissions, GroupMemberRole role) {
return new RemovePermissionResult(groupPermissions, role);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ public interface GroupRoleRepositoryPort {

boolean existPermission(GroupMemberRole groupMemberRole, Long aLong, GroupPermission permission);

List<GroupPermission> removePermission(Long groupId, GroupMemberRole role, GroupPermission permission);

RoleEntity findByIdAndRole(Long id, GroupMemberRole groupMemberRole);

GroupMemberRole findRole(Long userId, Long groupId);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import org.springframework.transaction.annotation.Transactional;

import flipnote.group.application.port.in.AddPermissionUseCase;
import flipnote.group.application.port.in.command.AddPermissionCommand;
import flipnote.group.application.port.in.command.PermissionCommand;
import flipnote.group.application.port.in.result.AddPermissionResult;
import flipnote.group.application.port.out.GroupRoleRepositoryPort;
import flipnote.group.domain.model.member.GroupMemberRole;
Expand All @@ -26,7 +26,7 @@ public class AddPermissionService implements AddPermissionUseCase {
*/
@Override
@Transactional
public AddPermissionResult addPermission(AddPermissionCommand cmd) {
public AddPermissionResult addPermission(PermissionCommand cmd) {

GroupMemberRole role = groupRoleRepository.findRole(cmd.userId(), cmd.groupId());

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package flipnote.group.application.service;

import java.util.List;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import flipnote.group.application.port.in.RemovePermissionUseCase;
import flipnote.group.application.port.in.command.PermissionCommand;
import flipnote.group.application.port.in.result.AddPermissionResult;
import flipnote.group.application.port.in.result.RemovePermissionResult;
import flipnote.group.application.port.out.GroupRoleRepositoryPort;
import flipnote.group.domain.model.member.GroupMemberRole;
import flipnote.group.domain.model.permission.GroupPermission;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Service
@RequiredArgsConstructor
public class RemovePermissionService implements RemovePermissionUseCase {

private final GroupRoleRepositoryPort groupRoleRepository;

@Override
@Transactional
public RemovePermissionResult removePermission(PermissionCommand cmd) {
GroupMemberRole role = groupRoleRepository.findRole(cmd.userId(), cmd.groupId());

//권한이 낮을 경우

log.debug("{} {}", role, cmd.changeRole());

if(!role.isHigherThan(cmd.changeRole())) {
throw new IllegalArgumentException("host lower than changeRole");
}

//호스트의 권한이 있는지
boolean existHostPermission = groupRoleRepository.checkPermission(cmd.userId(), cmd.groupId(), cmd.permission());

if(!existHostPermission) {
throw new IllegalArgumentException("host not exist permission");
}

//바꿀 역할의 권한이 있는지 확인
boolean existPermission = groupRoleRepository.existPermission(cmd.changeRole(), cmd.groupId(), cmd.permission());

if(!existPermission) {
throw new IllegalArgumentException("role not exist permission");
}

List<GroupPermission> groupPermissions = groupRoleRepository.removePermission(cmd.groupId(), cmd.changeRole(),
cmd.permission());

return RemovePermissionResult.of(groupPermissions, cmd.changeRole());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,4 @@ public int getPriority() {
public boolean isHigherThan(GroupMemberRole other) {
return this.priority > other.priority;
}

//권한 이상
public boolean isAtLeast(GroupMemberRole other) {
return this.priority >= other.priority;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,6 @@ public interface GroupRolePermissionRepository extends JpaRepository<PermissionE
boolean existsByGroupRoleIdAndPermission(Long id, GroupPermission permission);

List<PermissionEntity> findAllByGroupRoleId(Long id);

void deleteByGroupRoleIdAndPermission(Long id, GroupPermission permission);
}
2 changes: 1 addition & 1 deletion src/main/resources/application.yml
Original file line number Diff line number Diff line change
Expand Up @@ -52,4 +52,4 @@ image:

logging:
level:
flipnote.image: DEBUG
flipnote.group: DEBUG