RED-4590: Refactor annotation permissions - fix sonar cube issues

This commit is contained in:
Adina Țeudan 2023-06-26 16:23:05 +03:00
parent 24c06a868c
commit f1b0d27a67
2 changed files with 83 additions and 42 deletions

View File

@ -0,0 +1,55 @@
import { AnnotationWrapper } from '@models/file/annotation.wrapper';
import { AnnotationPermissions } from '@models/file/annotation.permissions';
import { Dictionary } from '@red/domain';
export const canUndo = (annotation: AnnotationWrapper, isApprover: boolean) =>
!isApprover && (annotation.isSuggestion || annotation.pending);
export const canAcceptSuggestion = (annotation: AnnotationWrapper, isApprover: boolean, canProcessManualRedaction: boolean) => {
const can = isApprover && (annotation.isSuggestion || annotation.isDeclinedSuggestion);
return annotation.isSuggestionAdd || annotation.isSuggestionRemoveDictionary ? can && canProcessManualRedaction : can;
};
export const canRejectSuggestion = (annotation: AnnotationWrapper, isApprover: boolean, canProcessManualRedaction: boolean) => {
const can = isApprover && annotation.isSuggestion;
return annotation.isSuggestionAdd || annotation.isSuggestionRemoveDictionary ? can && canProcessManualRedaction : can;
};
export const canForceHint = (annotation: AnnotationWrapper, canAddOrRequestRedaction: boolean) =>
canAddOrRequestRedaction && annotation.isIgnoredHint && !annotation.pending;
export const canForceRedaction = (annotation: AnnotationWrapper, canAddOrRequestRedaction: boolean) =>
canAddOrRequestRedaction && annotation.isSkipped && !annotation.isFalsePositive && !annotation.pending;
export const canAcceptRecommendation = (annotation: AnnotationWrapper) => annotation.isRecommendation && !annotation.pending;
export const canMarkAsFalsePositive = (annotation: AnnotationWrapper, annotationEntity: Dictionary) =>
annotation.canBeMarkedAsFalsePositive && annotationEntity.hasDictionary;
export const canRemoveOrSuggestToRemoveOnlyHere = (annotation: AnnotationWrapper, canAddOrRequestRedaction: boolean) =>
canAddOrRequestRedaction && !annotation.pending && (annotation.isRedacted || (annotation.isHint && !annotation.isImage));
export const canRemoveOrSuggestToRemoveFromDictionary = (annotation: AnnotationWrapper) =>
annotation.isModifyDictionary &&
(annotation.isRedacted || annotation.isSkipped || annotation.isHint) &&
!annotation.pending &&
!annotation.hasBeenResized;
export const canRemoveOrSuggestToRemoveRedaction = (annotations: AnnotationWrapper[], permissions: AnnotationPermissions) =>
annotations.length === 1 &&
(permissions.canRemoveOrSuggestToRemoveOnlyHere ||
permissions.canRemoveOrSuggestToRemoveFromDictionary ||
permissions.canMarkAsFalsePositive);
export const canChangeLegalBasis = (annotation: AnnotationWrapper, canAddOrRequestRedaction: boolean) =>
canAddOrRequestRedaction && annotation.isRedacted && !annotation.pending;
export const canRecategorizeImage = (annotation: AnnotationWrapper) =>
((annotation.isImage && !annotation.isSuggestion) || annotation.isSuggestionRecategorizeImage) && !annotation.pending;
export const canResizeAnnotation = (annotation: AnnotationWrapper, canAddOrRequestRedaction: boolean) =>
canAddOrRequestRedaction &&
(((annotation.isRedacted || annotation.isImage) && !annotation.isSuggestion) ||
annotation.isSuggestionResize ||
annotation.isRecommendation) &&
!annotation.pending;

View File

@ -3,6 +3,21 @@ import { Dictionary } from '@red/domain';
import { isArray } from 'lodash-es';
import { IqserPermissionsService } from '@iqser/common-ui';
import { Roles } from '@users/roles';
import {
canAcceptRecommendation,
canAcceptSuggestion,
canChangeLegalBasis,
canForceHint,
canForceRedaction,
canMarkAsFalsePositive,
canRecategorizeImage,
canRejectSuggestion,
canRemoveOrSuggestToRemoveFromDictionary,
canRemoveOrSuggestToRemoveOnlyHere,
canRemoveOrSuggestToRemoveRedaction,
canResizeAnnotation,
canUndo,
} from './annotation-permissions.utils';
export class AnnotationPermissions {
canUndo = true;
@ -37,50 +52,21 @@ export class AnnotationPermissions {
for (const annotation of annotations) {
const permissions: AnnotationPermissions = new AnnotationPermissions();
permissions.canUndo = !isApprover && (annotation.isSuggestion || annotation.pending);
permissions.canAcceptSuggestion = isApprover && (annotation.isSuggestion || annotation.isDeclinedSuggestion);
if (annotation.isSuggestionAdd || annotation.isSuggestionRemoveDictionary) {
permissions.canAcceptSuggestion = permissions.canAcceptSuggestion && canProcessManualRedaction;
}
permissions.canRejectSuggestion = isApprover && annotation.isSuggestion;
if (annotation.isSuggestionAdd || annotation.isSuggestionRemoveDictionary) {
permissions.canRejectSuggestion = permissions.canRejectSuggestion && canProcessManualRedaction;
}
permissions.canForceHint = canAddOrRequestRedaction && annotation.isIgnoredHint && !annotation.pending;
permissions.canForceRedaction =
canAddOrRequestRedaction && annotation.isSkipped && !annotation.isFalsePositive && !annotation.pending;
permissions.canAcceptRecommendation = annotation.isRecommendation && !annotation.pending;
const annotationEntity = entities.find(entity => entity.type === annotation.type);
permissions.canMarkAsFalsePositive = annotation.canBeMarkedAsFalsePositive && annotationEntity.hasDictionary;
permissions.canRemoveOrSuggestToRemoveOnlyHere =
canAddOrRequestRedaction && !annotation.pending && (annotation.isRedacted || (annotation.isHint && !annotation.isImage));
permissions.canRemoveOrSuggestToRemoveFromDictionary =
annotation.isModifyDictionary &&
(annotation.isRedacted || annotation.isSkipped || annotation.isHint) &&
!annotation.pending &&
!annotation.hasBeenResized;
permissions.canRemoveOrSuggestToRemoveRedaction =
annotations.length === 1 &&
(permissions.canRemoveOrSuggestToRemoveOnlyHere ||
permissions.canRemoveOrSuggestToRemoveFromDictionary ||
permissions.canMarkAsFalsePositive);
permissions.canChangeLegalBasis = canAddOrRequestRedaction && annotation.isRedacted && !annotation.pending;
permissions.canRecategorizeImage =
((annotation.isImage && !annotation.isSuggestion) || annotation.isSuggestionRecategorizeImage) && !annotation.pending;
permissions.canResizeAnnotation =
canAddOrRequestRedaction &&
(((annotation.isRedacted || annotation.isImage) && !annotation.isSuggestion) ||
annotation.isSuggestionResize ||
annotation.isRecommendation) &&
!annotation.pending;
permissions.canUndo = canUndo(annotation, isApprover);
permissions.canAcceptSuggestion = canAcceptSuggestion(annotation, isApprover, canProcessManualRedaction);
permissions.canRejectSuggestion = canRejectSuggestion(annotation, isApprover, canProcessManualRedaction);
permissions.canForceHint = canForceHint(annotation, canAddOrRequestRedaction);
permissions.canForceRedaction = canForceRedaction(annotation, canAddOrRequestRedaction);
permissions.canAcceptRecommendation = canAcceptRecommendation(annotation);
permissions.canMarkAsFalsePositive = canMarkAsFalsePositive(annotation, annotationEntity);
permissions.canRemoveOrSuggestToRemoveOnlyHere = canRemoveOrSuggestToRemoveOnlyHere(annotation, canAddOrRequestRedaction);
permissions.canRemoveOrSuggestToRemoveFromDictionary = canRemoveOrSuggestToRemoveFromDictionary(annotation);
permissions.canRemoveOrSuggestToRemoveRedaction = canRemoveOrSuggestToRemoveRedaction(annotations, permissions);
permissions.canChangeLegalBasis = canChangeLegalBasis(annotation, canAddOrRequestRedaction);
permissions.canRecategorizeImage = canRecategorizeImage(annotation);
permissions.canResizeAnnotation = canResizeAnnotation(annotation, canAddOrRequestRedaction);
summedPermissions._merge(permissions);
}