From 30ac738e1b526013a0df5924d7b36670882c4c76 Mon Sep 17 00:00:00 2001 From: Dan Percic Date: Fri, 1 Oct 2021 20:16:04 +0300 Subject: [PATCH] move create or update dossier to dossiers service --- .../team-members-manager.component.ts | 29 ++++++-------- .../add-dossier-dialog.component.html | 2 +- .../add-dossier-dialog.component.ts | 25 ++++++------ ...edit-dossier-download-package.component.ts | 6 +-- .../edit-dossier-general-info.component.ts | 8 ++-- .../dossier-details.component.ts | 2 +- .../dossier/services/dossiers.service.ts | 38 ++++++++++++------- .../file-actions/file-actions.component.ts | 2 +- .../red-ui/src/app/state/app-state.service.ts | 23 +---------- 9 files changed, 61 insertions(+), 74 deletions(-) diff --git a/apps/red-ui/src/app/modules/dossier/components/team-members-manager/team-members-manager.component.ts b/apps/red-ui/src/app/modules/dossier/components/team-members-manager/team-members-manager.component.ts index be438a273..fbdeb4479 100644 --- a/apps/red-ui/src/app/modules/dossier/components/team-members-manager/team-members-manager.component.ts +++ b/apps/red-ui/src/app/modules/dossier/components/team-members-manager/team-members-manager.component.ts @@ -1,11 +1,11 @@ import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; -import { IDossier } from '@redaction/red-ui-http'; -import { AppStateService } from '@state/app-state.service'; +import { DossierRequest, IDossier } from '@redaction/red-ui-http'; import { UserService } from '@services/user.service'; import { Toaster } from '@iqser/common-ui'; import { FormBuilder, FormGroup, Validators } from '@angular/forms'; import { Dossier } from '@state/model/dossier'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; +import { DossiersService } from '../../services/dossiers.service'; @Component({ selector: 'redaction-team-members-manager', @@ -28,7 +28,7 @@ export class TeamMembersManagerComponent implements OnInit { readonly userService: UserService, private readonly _toaster: Toaster, private readonly _formBuilder: FormBuilder, - private readonly _appStateService: AppStateService + private readonly _dossiersService: DossiersService ) {} get selectedOwnerId(): string { @@ -52,22 +52,17 @@ export class TeamMembersManagerComponent implements OnInit { } async saveMembers() { - let result; - try { - const ownerId = this.selectedOwnerId; - const memberIds = this.selectedMembersList; - const approverIds = this.selectedApproversList; - const dw = { - ...this.dossier, - memberIds, - approverIds, - ownerId - }; - result = await this._appStateService.createOrUpdateDossier(dw); + const dossier = { + ...this.dossier, + memberIds: this.selectedMembersList, + approverIds: this.selectedApproversList, + ownerId: this.selectedOwnerId + } as DossierRequest; + + const result = await this._dossiersService.createOrUpdate(dossier).toPromise(); + if (result) { this.save.emit(result); this._updateChanged(); - } catch (error) { - this._toaster.error(_('error.http.generic'), { params: error }); } } diff --git a/apps/red-ui/src/app/modules/dossier/dialogs/add-dossier-dialog/add-dossier-dialog.component.html b/apps/red-ui/src/app/modules/dossier/dialogs/add-dossier-dialog/add-dossier-dialog.component.html index c0c360868..88a3666fd 100644 --- a/apps/red-ui/src/app/modules/dossier/dialogs/add-dossier-dialog/add-dossier-dialog.component.html +++ b/apps/red-ui/src/app/modules/dossier/dialogs/add-dossier-dialog/add-dossier-dialog.component.html @@ -83,7 +83,7 @@ @@ -67,17 +75,10 @@ export class AddDossierDialogComponent { reportTemplateValueMapper = (reportTemplate: ReportTemplate) => reportTemplate.templateId; - async saveDossier() { - const savedDossier = await this._appStateService.createOrUpdateDossier(this._formToObject()); + async saveDossier(addMembers = false) { + const savedDossier = await this._dossiersService.createOrUpdate(this._formToObject()).toPromise(); if (savedDossier) { - this.dialogRef.close({ dossier: savedDossier }); - } - } - - async saveDossierAndAddMembers() { - const savedDossier = await this._appStateService.createOrUpdateDossier(this._formToObject()); - if (savedDossier) { - this.dialogRef.close({ addMembers: true, dossier: savedDossier }); + this.dialogRef.close({ dossier: savedDossier, addMembers }); } } @@ -116,7 +117,7 @@ export class AddDossierDialogComponent { }); } - private _formToObject(): Partial { + private _formToObject(): DossierRequest { return { dossierName: this.dossierForm.get('dossierName').value, description: this.dossierForm.get('description').value, diff --git a/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/download-package/edit-dossier-download-package.component.ts b/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/download-package/edit-dossier-download-package.component.ts index 7e0f91e9f..b1d2a77ae 100644 --- a/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/download-package/edit-dossier-download-package.component.ts +++ b/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/download-package/edit-dossier-download-package.component.ts @@ -1,10 +1,10 @@ import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; import { DownloadFileType, ReportTemplate, ReportTemplateControllerService } from '@redaction/red-ui-http'; import { FormBuilder, FormGroup } from '@angular/forms'; -import { AppStateService } from '@state/app-state.service'; import { Dossier } from '@state/model/dossier'; import { EditDossierSectionInterface } from '../edit-dossier-section.interface'; import { downloadTypesTranslations } from '../../../../../translations/download-types-translations'; +import { DossiersService } from '../../../services/dossiers.service'; @Component({ selector: 'redaction-edit-dossier-download-package', @@ -23,7 +23,7 @@ export class EditDossierDownloadPackageComponent implements OnInit, EditDossierS @Output() readonly updateDossier = new EventEmitter(); constructor( - private readonly _appStateService: AppStateService, + private readonly _dossiersService: DossiersService, private readonly _reportTemplateController: ReportTemplateControllerService, private readonly _formBuilder: FormBuilder ) {} @@ -87,7 +87,7 @@ export class EditDossierDownloadPackageComponent implements OnInit, EditDossierS downloadFileTypes: this.dossierForm.get('downloadFileTypes').value, reportTemplateIds: this.dossierForm.get('reportTemplateIds').value }; - await this._appStateService.createOrUpdateDossier(dossier); + await this._dossiersService.createOrUpdate(dossier).toPromise(); this.updateDossier.emit(); } diff --git a/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/general-info/edit-dossier-general-info.component.ts b/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/general-info/edit-dossier-general-info.component.ts index 251f29e57..f2971fb72 100644 --- a/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/general-info/edit-dossier-general-info.component.ts +++ b/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/general-info/edit-dossier-general-info.component.ts @@ -1,5 +1,5 @@ import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; -import { IDossierTemplate } from '@redaction/red-ui-http'; +import { DossierRequest, IDossierTemplate } from '@redaction/red-ui-http'; import { FormBuilder, FormGroup, Validators } from '@angular/forms'; import { AppStateService } from '@state/app-state.service'; import * as moment from 'moment'; @@ -13,6 +13,7 @@ import { EditDossierDialogComponent } from '../edit-dossier-dialog.component'; import { IconButtonTypes, Toaster } from '@iqser/common-ui'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { ConfirmationDialogInput, TitleColors } from '@shared/dialogs/confirmation-dialog/confirmation-dialog.component'; +import { DossiersService } from '../../../services/dossiers.service'; @Component({ selector: 'redaction-edit-dossier-general-info', @@ -32,6 +33,7 @@ export class EditDossierGeneralInfoComponent implements OnInit, EditDossierSecti constructor( readonly permissionsService: PermissionsService, private readonly _appStateService: AppStateService, + private readonly _dossiersService: DossiersService, private readonly _formBuilder: FormBuilder, private readonly _dialogService: DossiersDialogService, private readonly _router: Router, @@ -100,8 +102,8 @@ export class EditDossierGeneralInfoComponent implements OnInit, EditDossierSecti watermarkEnabled: this.dossierForm.get('watermarkEnabled').value, dueDate: this.hasDueDate ? this.dossierForm.get('dueDate').value : undefined, dossierTemplateId: this.dossierForm.get('dossierTemplateId').value - }; - await this._appStateService.createOrUpdateDossier(dossier); + } as DossierRequest; + await this._dossiersService.createOrUpdate(dossier).toPromise(); this.updateDossier.emit(); } diff --git a/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/components/dossier-details/dossier-details.component.ts b/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/components/dossier-details/dossier-details.component.ts index f254ec539..f8b58d874 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/components/dossier-details/dossier-details.component.ts +++ b/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/components/dossier-details/dossier-details.component.ts @@ -78,7 +78,7 @@ export class DossierDetailsComponent implements OnInit { this.owner = typeof user === 'string' ? this._userService.getRedUserById(user) : user; const activeDossier = this.dossiersService.activeDossier; const dossierRequest: DossierRequest = { ...activeDossier, dossierId: activeDossier.dossierId, ownerId: this.owner.id }; - await this.appStateService.createOrUpdateDossier(dossierRequest); + await this.dossiersService.createOrUpdate(dossierRequest).toPromise(); const ownerName = this._userService.getNameForId(this.owner.id); const dossierName = activeDossier.dossierName; diff --git a/apps/red-ui/src/app/modules/dossier/services/dossiers.service.ts b/apps/red-ui/src/app/modules/dossier/services/dossiers.service.ts index eb27dc6fd..c29175844 100644 --- a/apps/red-ui/src/app/modules/dossier/services/dossiers.service.ts +++ b/apps/red-ui/src/app/modules/dossier/services/dossiers.service.ts @@ -1,14 +1,15 @@ import { Injectable, Injector } from '@angular/core'; import { DossierRequest, IDossier } from '@redaction/red-ui-http'; -import { EntitiesService, List, QueryParam, RequiredParam, Validate } from '@iqser/common-ui'; +import { EntitiesService, List, QueryParam, RequiredParam, Toaster, Validate } from '@iqser/common-ui'; import { Dossier } from '@state/model/dossier'; -import { filter, map } from 'rxjs/operators'; +import { catchError, filter, map, tap } from 'rxjs/operators'; import { TEMPORARY_INJECTOR } from './injector'; -import { BehaviorSubject, Observable } from 'rxjs'; +import { BehaviorSubject, Observable, of, Subject } from 'rxjs'; import { ActivationEnd, Router } from '@angular/router'; import { BaseScreenComponent } from '@components/base-screen/base-screen.component'; import { File } from '@models/file/file'; import { DictionaryService } from '@shared/services/dictionary.service'; +import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; export interface IDossiersStats { totalPeople: number; @@ -16,6 +17,8 @@ export interface IDossiersStats { } const getRelatedEvents = filter(event => event instanceof ActivationEnd && event.snapshot.component !== BaseScreenComponent); +const DOSSIER_EXISTS_MSG = _('add-dossier-dialog.errors.dossier-already-exists'); +const GENERIC_MGS = _('add-dossier-dialog.errors.generic'); @Injectable({ providedIn: 'root' @@ -23,12 +26,14 @@ const getRelatedEvents = filter(event => event instanceof ActivationEnd && event export class DossiersService extends EntitiesService { readonly stats$ = this.all$.pipe(map(entities => this._computeStats(entities))); readonly activeDossier$: Observable; + readonly dossierChanged$ = new Subject(); private readonly _activeDossier$ = new BehaviorSubject(undefined); constructor( protected readonly _injector: Injector, private readonly _router: Router, - private readonly _dictionaryService: DictionaryService + private readonly _dictionaryService: DictionaryService, + private readonly _toaster: Toaster ) { super(TEMPORARY_INJECTOR(_injector), 'dossier'); this.activeDossier$ = this._activeDossier$.asObservable(); @@ -72,22 +77,20 @@ export class DossiersService extends EntitiesService { } find(dossierId: string): Dossier | undefined; - find(dossierId: string, fileId: string): File | undefined; - find(dossierId: string, fileId?: string): Dossier | File | undefined { - const getDossier = () => this.all.find(dossier => dossier.dossierId === dossierId); - if (!fileId) { - return getDossier(); - } - - return getDossier().files.find(file => file.fileId === fileId); + const dossier = this.all.find(item => item.dossierId === dossierId); + return fileId ? dossier?.files.find(file => file.fileId === fileId) : dossier; } replace(newDossier: Dossier) { const dossiers = this.all.filter(dossier => dossier.dossierId !== newDossier.dossierId); dossiers.push(newDossier); this.setEntities(dossiers); + this.dossierChanged$.next(newDossier); + if (newDossier.dossierId === this.activeDossierId) { + this._activeDossier$.next(newDossier); + } } has(dossierId: string): boolean { @@ -111,8 +114,15 @@ export class DossiersService extends EntitiesService { } @Validate() - createOrUpdate(@RequiredParam() dossier: DossierRequest): Promise { - return this._post(dossier).toPromise(); + createOrUpdate(@RequiredParam() dossier: DossierRequest): Observable { + return this._post(dossier).pipe( + map(updatedDossier => new Dossier(updatedDossier, this.find(updatedDossier.dossierId)?.files ?? [])), + tap(newDossier => this.replace(newDossier)), + catchError(error => { + this._toaster.error(error.status === 409 ? DOSSIER_EXISTS_MSG : GENERIC_MGS); + return of(undefined); + }) + ); } getDeleted(): Promise { diff --git a/apps/red-ui/src/app/modules/dossier/shared/components/file-actions/file-actions.component.ts b/apps/red-ui/src/app/modules/dossier/shared/components/file-actions/file-actions.component.ts index 1231ca8c9..ab7cb82d2 100644 --- a/apps/red-ui/src/app/modules/dossier/shared/components/file-actions/file-actions.component.ts +++ b/apps/red-ui/src/app/modules/dossier/shared/components/file-actions/file-actions.component.ts @@ -97,7 +97,7 @@ export class FileActionsComponent extends AutoUnsubscribe implements OnInit, OnD this._setup(); }); - this.addSubscription = this.appStateService.dossierChanged$.subscribe(() => { + this.addSubscription = this.dossiersService.dossierChanged$.subscribe(() => { this._setup(); }); } 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 f304c051f..7680baba7 100644 --- a/apps/red-ui/src/app/state/app-state.service.ts +++ b/apps/red-ui/src/app/state/app-state.service.ts @@ -1,5 +1,5 @@ import { Injectable } from '@angular/core'; -import { Colors, DossierRequest, IFile, ReanalysisControllerService } from '@redaction/red-ui-http'; +import { Colors, IFile, ReanalysisControllerService } from '@redaction/red-ui-http'; import { Toaster } from '@iqser/common-ui'; import { TranslateService } from '@ngx-translate/core'; import { Event, NavigationEnd, ResolveStart, Router } from '@angular/router'; @@ -32,7 +32,6 @@ export interface AppState { export class AppStateService { readonly fileChanged$ = new Subject(); readonly fileReanalysed$ = new Subject(); - readonly dossierChanged$ = new Subject(); readonly dossierTemplateChanged$ = new Subject(); private _appState: AppState; @@ -269,26 +268,6 @@ export class AppStateService { ); } - async createOrUpdateDossier(dossier: DossierRequest) { - try { - const updatedDossier = await this._dossiersService.createOrUpdate(dossier); - let foundDossier = this._dossiersService.find(updatedDossier.dossierId); - if (foundDossier) { - foundDossier = new Dossier(updatedDossier, foundDossier.files); - } else { - foundDossier = new Dossier(updatedDossier, []); - } - - this._dossiersService.replace(foundDossier); - this.dossierChanged$.next(foundDossier); - return foundDossier; - } catch (error) { - this._toaster.error( - error.status === 409 ? _('add-dossier-dialog.errors.dossier-already-exists') : _('add-dossier-dialog.errors.generic') - ); - } - } - async reloadActiveDossierFiles() { if (this._dossiersService.activeDossierId) { await this.getFiles();