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
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@
<dependency>
<groupId>dev.vality</groupId>
<artifactId>org-management-proto</artifactId>
<version>1.22-4a6c2e7</version>
<version>1.23-e544bc9</version>
<exclusions>
<exclusion>
<groupId>dev.vality</groupId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
import dev.vality.orgmanagement.Member;
import dev.vality.orgmanagement.MemberRole;
import dev.vality.orgmanagement.Organization;
import dev.vality.orgmanagement.OrganizationRole;
import dev.vality.orgmanagement.OrganizationStatus;
import dev.vality.orgmanagement.RoleAssignment;
import dev.vality.orgmanagement.RoleScope;
Expand All @@ -14,7 +13,6 @@
import dev.vality.orgmanager.entity.MemberEntity;
import dev.vality.orgmanager.entity.MemberRoleEntity;
import dev.vality.orgmanager.entity.OrganizationEntity;
import dev.vality.orgmanager.entity.OrganizationRoleEntity;
import dev.vality.orgmanager.entity.StoredInvitationStatus;
import dev.vality.orgmanager.service.dto.MemberWithRoleDto;
import dev.vality.orgmanager.service.dto.UserDto;
Expand All @@ -29,7 +27,6 @@
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Objects;

@Component
public class AdminManagementConverter {
Expand Down Expand Up @@ -158,15 +155,6 @@ public InvitationStatus effectiveInvitationStatus(InvitationEntity entity) {
return storedStatus;
}

public OrganizationRole toOrganizationRole(OrganizationRoleEntity entity) {
List<String> scopeIds = collectionOrEmpty(entity.getPossibleScopes()).stream()
.map(scope -> scope.getId())
.filter(Objects::nonNull)
.sorted()
.toList();
return new OrganizationRole(entity.getRoleId(), entity.getName(), scopeIds);
}

private RoleScope toRoleScope(String scopeId, String resourceId) {
RoleScope scope = new RoleScope(scopeId);
if (resourceId != null) {
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -5,20 +5,14 @@
import dev.vality.orgmanagement.RoleScope;
import dev.vality.orgmanager.entity.MemberRoleEntity;
import dev.vality.orgmanager.entity.OrganizationEntity;
import dev.vality.orgmanager.entity.OrganizationRoleEntity;
import dev.vality.orgmanager.entity.ScopeEntity;
import dev.vality.orgmanager.repository.OrganizationRepository;
import dev.vality.orgmanager.repository.OrganizationRoleRepository;
import dev.vality.orgmanager.util.JsonCodec;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.Collection;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.UUID;
import java.util.stream.Collectors;

@Service
@RequiredArgsConstructor
Expand All @@ -28,7 +22,6 @@ public class AdminCommonService {
public static final int MAX_PAGE_LIMIT = 1000;

private final OrganizationRepository organizationRepository;
private final OrganizationRoleRepository organizationRoleRepository;
private final JsonCodec jsonCodec;

public OrganizationEntity findOrganization(String organizationId) throws OrganizationNotFound {
Expand All @@ -55,30 +48,14 @@ public String requireText(String value, String field) throws InvalidRequest {
}

/**
* Проверяет, что назначение роли опирается на каталог ролей организации: сама роль в нём есть,
* а указанный scope_id входит в её список допустимых областей действия.
* Область действия без resource_id не ограничивает роль, поэтому такое назначение отклоняется.
*/
public void validateRoleAssignment(String organizationId, String roleId, RoleScope scope)
throws InvalidRequest {
public void validateRoleAssignment(String roleId, RoleScope scope) throws InvalidRequest {
requireText(roleId, "Role id");
OrganizationRoleEntity role = organizationRoleRepository
.findByOrganizationIdAndRoleId(organizationId, roleId)
.orElseThrow(() -> new InvalidRequest(
"Role " + roleId + " is not present in the organization role catalog"));
if (scope == null) {
return;
if (scope != null) {
requireText(scope.getScopeId(), "Scope id");
requireText(scope.getResourceId(), "Scope resource id");
}
String scopeId = requireText(scope.getScopeId(), "Scope id");
if (!allowedScopeIds(role).contains(scopeId)) {
throw new InvalidRequest("Scope " + scopeId + " is not allowed for role " + roleId);
}
}

public Set<String> allowedScopeIds(OrganizationRoleEntity role) {
return collectionOrEmpty(role.getPossibleScopes()).stream()
.map(ScopeEntity::getId)
.filter(Objects::nonNull)
.collect(Collectors.toSet());
}

public MemberRoleEntity toMemberRoleEntity(String organizationId, String roleId, RoleScope scope) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ public Invitation create(String organizationId, CreateInvitationRequest request)
String metadata = commonService.toStoredMetadata(request.getMetadata());
Set<MemberRoleEntity> roles = new LinkedHashSet<>();
for (RoleAssignment role : collectionOrEmpty(request.getRoles())) {
commonService.validateRoleAssignment(organizationId, role.getRoleId(), role.getScope());
commonService.validateRoleAssignment(role.getRoleId(), role.getScope());
roles.add(commonService.toMemberRoleEntity(organizationId, role.getRoleId(), role.getScope()));
}
LocalDateTime now = LocalDateTime.now();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
@RequiredArgsConstructor
public class AdminManagementService implements AdminManagementSrv.Iface {
Expand Down Expand Up @@ -64,23 +62,6 @@ public User getUser(String userId) throws UnknownUser {
return adminUserService.get(userId);
}

@Override
public OrganizationRole getOrganizationRole(String organizationId, String roleId)
throws OrganizationNotFound, RoleNotFound {
return adminOrganizationService.getRole(organizationId, roleId);
}

@Override
public List<OrganizationRole> listOrganizationRoles(String organizationId) throws OrganizationNotFound {
return adminOrganizationService.listRoles(organizationId);
}

@Override
public OrganizationRole setOrganizationRole(String organizationId, SetOrganizationRoleRequest request)
throws OrganizationNotFound, InvalidRequest {
return adminOrganizationService.setRole(organizationId, request);
}

@Override
public Member getMember(String organizationId, String userId) throws OrganizationNotFound, MemberNotFound {
return adminMemberService.get(organizationId, userId);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ public MemberRole assignRole(
organizationId, userId, request.getRoleId());
OrganizationEntity organization = commonService.findOrganization(organizationId);
MemberEntity member = findMember(organization, userId);
commonService.validateRoleAssignment(organizationId, request.getRoleId(), request.getScope());
commonService.validateRoleAssignment(request.getRoleId(), request.getScope());
MemberRoleEntity role = commonService.toMemberRoleEntity(
organizationId, request.getRoleId(), request.getScope());
role = memberRoleRepository.save(role);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,18 +8,11 @@
import dev.vality.orgmanagement.ModifyOrganizationRequest;
import dev.vality.orgmanagement.Organization;
import dev.vality.orgmanagement.OrganizationNotFound;
import dev.vality.orgmanagement.OrganizationRole;
import dev.vality.orgmanagement.PartyAlreadyBound;
import dev.vality.orgmanagement.RoleNotFound;
import dev.vality.orgmanagement.SetOrganizationRoleRequest;
import dev.vality.orgmanager.converter.AdminManagementConverter;
import dev.vality.orgmanager.entity.OrganizationEntity;
import dev.vality.orgmanager.entity.OrganizationRoleEntity;
import dev.vality.orgmanager.entity.ScopeEntity;
import dev.vality.orgmanager.entity.StoredOrganizationStatus;
import dev.vality.orgmanager.repository.OrganizationRepository;
import dev.vality.orgmanager.repository.OrganizationRoleRepository;
import dev.vality.orgmanager.repository.ScopeRepository;
import dev.vality.orgmanager.service.dto.AdminPage;
import jakarta.persistence.criteria.Predicate;
import lombok.RequiredArgsConstructor;
Expand All @@ -34,28 +27,22 @@

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import java.util.UUID;

import static dev.vality.orgmanager.service.AdminCommonService.collectionOrEmpty;
import static dev.vality.orgmanager.service.AdminCommonService.pageLimit;
import static java.util.Objects.requireNonNullElseGet;

/**
* Организации и их роли в административном контракте.
* Организации в административном контракте.
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class AdminOrganizationService {

private final OrganizationRepository organizationRepository;
private final OrganizationRoleRepository organizationRoleRepository;
private final ScopeRepository scopeRepository;
private final AdminManagementConverter converter;
private final AdminCommonService commonService;

Expand Down Expand Up @@ -143,62 +130,6 @@ public Organization activate(String organizationId) throws OrganizationNotFound,
return changeStatus(organizationId, StoredOrganizationStatus.DEACTIVATED, StoredOrganizationStatus.ACTIVE);
}

@Transactional(readOnly = true)
public OrganizationRole getRole(String organizationId, String roleId)
throws OrganizationNotFound, RoleNotFound {
log.info("Get organization role: organizationId={}, roleId={}", organizationId, roleId);
commonService.findOrganization(organizationId);
OrganizationRoleEntity role = organizationRoleRepository.findByOrganizationIdAndRoleId(organizationId, roleId)
.orElseThrow(RoleNotFound::new);
return converter.toOrganizationRole(role);
}

@Transactional(readOnly = true)
public List<OrganizationRole> listRoles(String organizationId) throws OrganizationNotFound {
log.info("List organization roles: organizationId={}", organizationId);
OrganizationEntity organization = commonService.findOrganization(organizationId);
return collectionOrEmpty(organization.getRoles()).stream()
.sorted(Comparator.comparing(OrganizationRoleEntity::getRoleId))
.map(converter::toOrganizationRole)
.toList();
}

/**
* Создаёт либо обновляет роль в каталоге ролей организации. Каталог задаёт, какие роли
* и области действия допустимы в AssignMemberRole и CreateInvitation
*/
@Transactional
public OrganizationRole setRole(String organizationId, SetOrganizationRoleRequest request)
throws OrganizationNotFound, InvalidRequest {
log.info("Set organization role: organizationId={}, request={}", organizationId, request);
if (request == null) {
throw new InvalidRequest("Request must not be null");
}
commonService.findOrganization(organizationId);
String roleId = commonService.requireText(request.getRoleId(), "Role id");
String name = commonService.requireText(request.getName(), "Role name");
OrganizationRoleEntity role = organizationRoleRepository
.findByOrganizationIdAndRoleId(organizationId, roleId)
.orElseGet(() -> OrganizationRoleEntity.builder()
.id(UUID.randomUUID().toString())
.organizationId(organizationId)
.roleId(roleId)
.build());
role.setName(name);
role.setPossibleScopes(resolveScopes(request.getScopeIds()));
return converter.toOrganizationRole(organizationRoleRepository.save(role));
}

private Set<ScopeEntity> resolveScopes(List<String> scopeIds) throws InvalidRequest {
Set<ScopeEntity> scopes = new LinkedHashSet<>();
for (String scopeId : scopeIds == null ? List.<String>of() : scopeIds) {
commonService.requireText(scopeId, "Scope id");
scopes.add(scopeRepository.findById(scopeId)
.orElseGet(() -> scopeRepository.save(ScopeEntity.builder().id(scopeId).build())));
}
return scopes;
}

private Specification<OrganizationEntity> specification(ListOrganizationsRequest request) {
return (root, query, builder) -> {
List<Predicate> predicates = new ArrayList<>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,10 +48,17 @@ public void setUp() throws Exception {
invitationRepository.deleteAll();
memberContextRepository.deleteAll();
organizationRoleRepository.deleteAll();
organizationRepository.deleteAll();
// Связи с каскадом PERSIST иначе отменяют удаление при flush
var organizations = organizationRepository.findAll();
organizations.forEach(it -> it.getMembers().clear());
organizationRepository.saveAll(organizations);
var members = memberRepository.findAll();
members.forEach(it -> it.getRoles().clear());
members.forEach(it -> {
it.getRoles().clear();
it.getOrganizations().clear();
});
memberRepository.saveAll(members);
organizationRepository.deleteAll();
memberRepository.deleteAll();
memberRoleRepository.deleteAll();
}
Expand Down
Loading
Loading