DocumentAuthorizationService.java

package com.tdmconsult.ete.documents;

import com.tdmconsult.ete.configuration.CustomJwtAuthenticationToken;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class DocumentAuthorizationService {

    private final FinancialDocumentRepository financialDocumentRepository;

    public static final String AUTH_FINANCIAL_DOCUMENT_SHOW = "ete:financial_document_show";
    public static final String AUTH_FINANCIAL_DOCUMENT_SHOW_OWN = "ete:financial_document_show_own";
    public static final String AUTH_FINANCIAL_DOCUMENT_EDIT = "ete:financial_document_edit";
    public static final String AUTH_FINANCIAL_DOCUMENT_EDIT_OWN = "ete:financial_document_edit_own";

    public boolean isAllowedToCreateDocument(final CustomJwtAuthenticationToken.CustomUserPrincipal userDetails) {
        return userDetails.hasAuthority("ete:financial_document_upload");
    }

    public boolean isAllowedToListDocuments(final CustomJwtAuthenticationToken.CustomUserPrincipal userDetails) {
        final var show = userDetails.hasAuthority(AUTH_FINANCIAL_DOCUMENT_SHOW);
        final var showOwnOnly = userDetails.hasAuthority(AUTH_FINANCIAL_DOCUMENT_SHOW_OWN);
        return show || showOwnOnly;
    }

    public boolean isAllowedToShowDocument(
            final String publicId,
            final CustomJwtAuthenticationToken.CustomUserPrincipal userDetails) {

        final var show = userDetails.hasAuthority(AUTH_FINANCIAL_DOCUMENT_SHOW);
        final var showOwnOnly = userDetails.hasAuthority(AUTH_FINANCIAL_DOCUMENT_SHOW_OWN);
        return show || (showOwnOnly && financialDocumentRepository.isUploadBy(publicId, userDetails));
    }

    public boolean isAllowedToEditDocument(
            final String publicId,
            final CustomJwtAuthenticationToken.CustomUserPrincipal userDetails) {

        final var edit = userDetails.hasAuthority(AUTH_FINANCIAL_DOCUMENT_EDIT);
        final var editOwnOnly = userDetails.hasAuthority(AUTH_FINANCIAL_DOCUMENT_EDIT_OWN);
        return edit || (editOwnOnly && financialDocumentRepository.isUploadBy(publicId, userDetails));
    }
}