From 1bbe74dda904e9b843bdbd79277b2742ed0e02c0 Mon Sep 17 00:00:00 2001 From: Dan Percic Date: Fri, 11 Jun 2021 17:32:17 +0300 Subject: [PATCH 1/2] update permissions service code --- .../src/app/services/permissions.service.ts | 301 ++++-------------- .../red-ui/src/app/state/app-state.service.ts | 4 +- 2 files changed, 67 insertions(+), 238 deletions(-) diff --git a/apps/red-ui/src/app/services/permissions.service.ts b/apps/red-ui/src/app/services/permissions.service.ts index 3db02bc14..c9afaf879 100644 --- a/apps/red-ui/src/app/services/permissions.service.ts +++ b/apps/red-ui/src/app/services/permissions.service.ts @@ -11,71 +11,44 @@ import { DossierWrapper } from '@state/model/dossier.wrapper'; export class PermissionsService { constructor( private readonly _appStateService: AppStateService, - private _userService: UserService + private readonly _userService: UserService ) {} - get currentUser() { + get currentUser(): UserWrapper { return this._userService.user; } - get currentUserId() { - return this._userService.userId; - } - isManager(user?: User) { return this._userService.isManager(user); } - isReviewerOrApprover(fileStatus?: FileStatusWrapper) { + isReviewerOrApprover(fileStatus?: FileStatusWrapper): boolean { return this.isFileReviewer(fileStatus) || this.isApprover(); } - dossierReanalysisRequired(dossier?: DossierWrapper) { - for (const file of dossier.files) { - const fileReanalysisRequired = this.fileRequiresReanalysis(file); - if (fileReanalysisRequired) { - return true; - } - } + dossierReanalysisRequired(dossier: DossierWrapper): boolean { + for (const file of dossier.files) if (this.fileRequiresReanalysis(file)) return true; } - fileRequiresReanalysis(fileStatus?: FileStatusWrapper) { - if (!fileStatus) { - fileStatus = this._appStateService.activeFile; - } - if (!fileStatus) { - return false; - } + fileRequiresReanalysis(fileStatus = this._activeFile): boolean { return fileStatus.analysisRequired; } - displayReanalyseBtn(dossier?: DossierWrapper) { - if (!dossier) { - dossier = this._appStateService.activeDossier; - } - if (!dossier) { - return false; - } + displayReanalyseBtn(dossier = this._activeDossier): boolean { return ( this.isApprover(dossier) && dossier.files.filter(file => this.fileRequiresReanalysis(file)).length > 0 ); } - canToggleAnalysis(fileStatus: FileStatusWrapper) { + canToggleAnalysis(fileStatus: FileStatusWrapper): boolean { return ( this.isManager() && ['UNASSIGNED', 'UNDER_REVIEW', 'UNDER_APPROVAL'].includes(fileStatus.status) ); } - canReanalyseFile(fileStatus?: FileStatusWrapper) { - if (!fileStatus) { - fileStatus = this._appStateService.activeFile; - } - if (!fileStatus) { - return false; - } + canReanalyseFile(fileStatus = this._activeFile): boolean { return ( (this.fileRequiresReanalysis(fileStatus) && (this.isReviewerOrApprover(fileStatus) || fileStatus.isUnassigned)) || @@ -83,38 +56,19 @@ export class PermissionsService { ); } - isFileReviewer(fileStatus?: FileStatusWrapper) { - if (!fileStatus) { - fileStatus = this._appStateService.activeFile; - } - if (!fileStatus) { - return false; - } + isFileReviewer(fileStatus = this._activeFile): boolean { return fileStatus.currentReviewer === this._userService.userId; } - canDeleteFile(fileStatus?: FileStatusWrapper, dossier?: DossierWrapper) { + canDeleteFile(fileStatus = this._activeFile, dossier?: DossierWrapper): boolean { return this.isOwner(dossier) || fileStatus.isUnassigned; } - isApprovedOrUnderApproval(fileStatus?: FileStatusWrapper) { - if (!fileStatus) { - fileStatus = this._appStateService.activeFile; - } - if (!fileStatus) { - return false; - } + isApprovedOrUnderApproval(fileStatus = this._activeFile): boolean { return fileStatus.isApprovedOrUnderApproval; } - canAssignToSelf(fileStatus?: FileStatusWrapper) { - if (!fileStatus) { - fileStatus = this._appStateService.activeFile; - } - if (!fileStatus) { - return false; - } - + canAssignToSelf(fileStatus = this._activeFile): boolean { const precondition = this.isDossierMember() && !fileStatus.isProcessing && @@ -134,14 +88,7 @@ export class PermissionsService { return false; } - canAssignUser(fileStatus?: FileStatusWrapper) { - if (!fileStatus) { - fileStatus = this._appStateService.activeFile; - } - if (!fileStatus) { - return false; - } - + canAssignUser(fileStatus = this._activeFile): boolean { const precondition = this.isDossierMember() && !fileStatus.isProcessing && @@ -152,237 +99,119 @@ export class PermissionsService { if (precondition) { if ( (fileStatus.isUnassigned || fileStatus.isUnderReview) && - this._appStateService.activeDossier.hasMoreThanOneReviewer + this._activeDossier.hasMoreThanOneReviewer ) { return true; } - if ( - fileStatus.isUnderApproval && - this.isApprover() && - this._appStateService.activeDossier.hasMoreThanOneApprover - ) { + if (fileStatus.isUnderApproval && this._activeDossier.hasMoreThanOneApprover) { return true; } } return false; } - canSetUnderReview(fileStatus?: FileStatusWrapper) { - if (!fileStatus) { - fileStatus = this._appStateService.activeFile; - } - if (!fileStatus) { - return false; - } - return fileStatus.isUnderApproval && this.isApprover(); + canSetUnderReview(fileStatus = this._activeFile): boolean { + return fileStatus?.isUnderApproval && this.isApprover(); } - isReadyForApproval(fileStatus?: FileStatusWrapper) { - if (!fileStatus) { - fileStatus = this._appStateService.activeFile; - } - if (!fileStatus) { - return false; - } + isReadyForApproval(fileStatus = this._activeFile): boolean { return this.canSetUnderReview(fileStatus); } - canApprove(fileStatus?: FileStatusWrapper) { - if (!fileStatus) { - fileStatus = this._appStateService.activeFile; - } - if (!fileStatus) { - return false; - } - return !fileStatus.analysisRequired; + canApprove(fileStatus = this._activeFile): boolean { + return !fileStatus?.analysisRequired; } - canSetUnderApproval(fileStatus?: FileStatusWrapper) { - if (!fileStatus) { - fileStatus = this._appStateService.activeFile; - } - if (!fileStatus) { - return false; - } - return fileStatus.isUnderReview && this.isReviewerOrApprover(fileStatus); + canSetUnderApproval(fileStatus = this._activeFile): boolean { + return fileStatus?.isUnderReview && this.isReviewerOrApprover(fileStatus); } - isOwner(dossier?: DossierWrapper, user?: UserWrapper) { - if (!user) { - user = this._userService.user; - } - if (!dossier) { - dossier = this._appStateService.activeDossier; - } - if (!dossier) { - return false; - } - return dossier.ownerId === user.id; + isOwner(dossier = this._activeDossier, user = this.currentUser): boolean { + return dossier?.ownerId === user.id; } - isApprover(dossier?: DossierWrapper, user?: UserWrapper) { - if (!user) { - user = this._userService.user; - } - if (!dossier) { - dossier = this._appStateService.activeDossier; - } - if (!dossier) { - return false; - } - return dossier.approverIds?.indexOf(user.id) >= 0; + isApprover(dossier = this._activeDossier, user = this.currentUser): boolean { + return dossier?.approverIds.indexOf(user.id) >= 0; } - isDossierMember(dossier?: DossierWrapper, user?: UserWrapper) { - if (!user) { - user = this._userService.user; - } - if (!dossier) { - dossier = this._appStateService.activeDossier; - } - if (!dossier) { - return false; - } - return dossier.memberIds?.includes(user.id); + isReviewer(dossier = this._activeDossier, user = this.currentUser): boolean { + return this.isDossierMember(dossier, user) && !this.isApprover(dossier, user); } - canPerformAnnotationActions(fileStatus?: FileStatusWrapper) { - if (!fileStatus) { - fileStatus = this._appStateService.activeFile; - } - if (!fileStatus) { - return false; - } + isDossierMember(dossier = this._activeDossier, user = this.currentUser): boolean { + return dossier?.memberIds.includes(user.id); + } + + canPerformAnnotationActions(fileStatus = this._activeFile): boolean { return ( - (fileStatus.status === 'UNDER_APPROVAL' || fileStatus.status === 'UNDER_REVIEW') && + ['UNDER_REVIEW', 'UNDER_APPROVAL'].includes(fileStatus?.status) && this.isFileReviewer(fileStatus) ); } - canOpenFile(fileStatus: FileStatusWrapper) { - if (!fileStatus) { - fileStatus = this._appStateService.activeFile; - } - if (!fileStatus) { - return false; - } - return !fileStatus.isError && !fileStatus.isProcessing && !fileStatus.isPending; + canOpenFile(fileStatus = this._activeFile): boolean { + return !fileStatus?.isError && !fileStatus?.isProcessing && !fileStatus?.isPending; } - canUndoApproval(fileStatus: FileStatusWrapper) { - if (!fileStatus) { - fileStatus = this._appStateService.activeFile; - } - if (!fileStatus) { - return false; - } - return fileStatus.status === 'APPROVED' && this.isApprover(); + canUndoApproval(fileStatus = this._activeFile): boolean { + return fileStatus?.isApproved && this.isApprover(); } - canUndoUnderApproval(fileStatus: any) { - if (!fileStatus) { - fileStatus = this._appStateService.activeFile; - } - if (!fileStatus) { - return false; - } - return fileStatus.status === 'UNDER_APPROVAL' && this.isDossierMember(); + canUndoUnderApproval(fileStatus = this._activeFile): boolean { + return fileStatus?.isUnderApproval && this.isDossierMember(); } - canMarkPagesAsViewed(fileStatus?: FileStatusWrapper) { - if (!fileStatus) { - fileStatus = this._appStateService.activeFile; - } - if (!fileStatus) { - return false; - } + canMarkPagesAsViewed(fileStatus = this._activeFile): boolean { return ( - (fileStatus.status === 'UNDER_REVIEW' || fileStatus.status === 'UNDER_APPROVAL') && + ['UNDER_REVIEW', 'UNDER_APPROVAL'].includes(fileStatus?.status) && this.isFileReviewer(fileStatus) ); } - canDownloadFiles(fileStatus: FileStatusWrapper) { - if (!fileStatus) { - fileStatus = this._appStateService.activeFile; - } - if (!fileStatus) { - return false; - } - const dossier = this._appStateService.getDossierById(fileStatus.dossierId); - if (!dossier) { - return false; - } - return fileStatus.status === 'APPROVED' && this.isApprover(dossier); + canDownloadFiles(fileStatus = this._activeFile): boolean { + const dossier = this._appStateService.getDossierById(fileStatus?.dossierId); + if (!dossier) return false; + + return fileStatus.isApproved && this.isApprover(dossier); } - canDeleteDossier(dossier?: DossierWrapper) { - if (!dossier) { - dossier = this._appStateService.activeDossier; - } - if (!dossier) { - return false; - } - return dossier.files.reduce((acc, file) => acc && this.canDeleteFile(file, dossier), true); + canDeleteDossier(dossier = this._activeDossier): boolean { + return dossier?.files.reduce((acc, file) => acc && this.canDeleteFile(file, dossier), true); } - isAdmin(user?: UserWrapper) { - if (!user) { - user = this._userService.user; - } - if (!user) { - return false; - } + isAdmin(user = this.currentUser): boolean { return user.isAdmin; } - isUserAdmin(user?: UserWrapper) { - if (!user) { - user = this._userService.user; - } - if (!user) { - return false; - } + isUserAdmin(user = this.currentUser): boolean { return user.isUserAdmin; } - isUser(user?: UserWrapper) { - if (!user) { - user = this._userService.user; - } - if (!user) { - return false; - } + isUser(user = this.currentUser): boolean { return user.isUser; } - canOcrFile(fileStatus?: FileStatusWrapper) { - if (!fileStatus) { - fileStatus = this._appStateService.activeFile; - } - if (!fileStatus) { - return false; - } + canOcrFile(fileStatus = this._activeFile): boolean { return ( !fileStatus.isExcluded && !fileStatus.ocrTime && - (fileStatus.status === 'UNASSIGNED' || - fileStatus.status === 'UNDER_REVIEW' || - fileStatus.status === 'UNDER_APPROVAL') + ['UNASSIGNED', 'UNDER_REVIEW', 'UNDER_APPROVAL'].includes(fileStatus.status) ); } - canManageUsers(user?: UserWrapper) { + canManageUsers(user?: UserWrapper): boolean { return this.isUserAdmin(user); } - canAddComment(fileStatus?: FileStatusWrapper) { - if (!fileStatus) { - fileStatus = this._appStateService.activeFile; - } - if (!fileStatus) { - return false; - } + canAddComment(fileStatus = this._activeFile): boolean { return this.isFileReviewer(fileStatus) || this.isApprover(); } + + private get _activeFile(): FileStatusWrapper | undefined { + return this._appStateService.activeFile; + } + + private get _activeDossier(): DossierWrapper | undefined { + return this._appStateService.activeDossier; + } } diff --git a/apps/red-ui/src/app/state/app-state.service.ts b/apps/red-ui/src/app/state/app-state.service.ts index a2042ba35..05575bbf6 100644 --- a/apps/red-ui/src/app/state/app-state.service.ts +++ b/apps/red-ui/src/app/state/app-state.service.ts @@ -127,7 +127,7 @@ export class AppStateService { return this._appState.activeDossierId; } - get activeDossier(): DossierWrapper { + get activeDossier(): DossierWrapper | undefined { return this._appState.dossiers.find(p => p.dossierId === this.activeDossierId); } @@ -139,7 +139,7 @@ export class AppStateService { return this.allDossiers?.length > 0; } - get activeFile(): FileStatusWrapper { + get activeFile(): FileStatusWrapper | undefined { return this.activeDossier?.files.find(f => f.fileId === this.activeFileId); } From f435cdd3032db5e5c5a7f07184dc3d6d0b4d1ce3 Mon Sep 17 00:00:00 2001 From: Dan Percic Date: Fri, 11 Jun 2021 17:57:19 +0300 Subject: [PATCH 2/2] user can self assign to unassigned documents --- apps/red-ui/src/app/services/permissions.service.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/apps/red-ui/src/app/services/permissions.service.ts b/apps/red-ui/src/app/services/permissions.service.ts index c9afaf879..78cbb68cd 100644 --- a/apps/red-ui/src/app/services/permissions.service.ts +++ b/apps/red-ui/src/app/services/permissions.service.ts @@ -79,8 +79,11 @@ export class PermissionsService { if (precondition) { if ( - (fileStatus.isUnassigned || (fileStatus.isUnderReview && !this.isFileReviewer())) && - (this.isApprover() || isTheOnlyReviewer) + (fileStatus.isUnassigned || + (fileStatus.isUnderReview && !this.isFileReviewer(fileStatus))) && + (this.isApprover() || + isTheOnlyReviewer || + (this.isDossierReviewer() && fileStatus.isUnassigned)) ) { return true; } @@ -134,7 +137,7 @@ export class PermissionsService { return dossier?.approverIds.indexOf(user.id) >= 0; } - isReviewer(dossier = this._activeDossier, user = this.currentUser): boolean { + isDossierReviewer(dossier = this._activeDossier, user = this.currentUser): boolean { return this.isDossierMember(dossier, user) && !this.isApprover(dossier, user); }