add file attributes service

This commit is contained in:
Dan Percic 2021-09-28 22:10:34 +03:00
parent b556169f31
commit afe0df2931
12 changed files with 213 additions and 117 deletions

View File

@ -1,4 +1,4 @@
import { DownloadFileType, FileAttributesConfig, IDossierTemplate, List } from '@redaction/red-ui-http';
import { DownloadFileType, IDossierTemplate, List } from '@redaction/red-ui-http';
import { IListable } from '@iqser/common-ui';
export class DossierTemplate implements IDossierTemplate, IListable {
@ -16,7 +16,7 @@ export class DossierTemplate implements IDossierTemplate, IListable {
dictionariesCount = 0;
totalDictionaryEntries = 0;
constructor(dossierTemplate: IDossierTemplate, public fileAttributesConfig: FileAttributesConfig) {
constructor(dossierTemplate: IDossierTemplate) {
this.createdBy = dossierTemplate.createdBy;
this.dateAdded = dossierTemplate.dateAdded;
this.dateModified = dossierTemplate.dateModified;

View File

@ -2,17 +2,13 @@ import { Component, Inject, Injector } from '@angular/core';
import { AbstractControl, FormBuilder, FormGroup, ValidatorFn, Validators } from '@angular/forms';
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
import * as Papa from 'papaparse';
import {
FileAttributeConfigType,
FileAttributeConfigTypes,
FileAttributesConfig,
FileAttributesControllerService
} from '@redaction/red-ui-http';
import { FileAttributeConfigType, FileAttributeConfigTypes, FileAttributesConfig } from '@redaction/red-ui-http';
import { Observable } from 'rxjs';
import { map, startWith } from 'rxjs/operators';
import { DefaultListingServices, IListable, ListingComponent, TableColumnConfig, Toaster } from '@iqser/common-ui';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { FileAttributeConfig } from '@models/file/file-attribute-config';
import { FileAttributesService } from '../../../dossier/services/file-attributes.service';
export interface Field extends IListable {
id: string;
@ -47,7 +43,7 @@ export class FileAttributesCsvImportDialogComponent extends ListingComponent<Fie
protected readonly _injector: Injector,
private readonly _formBuilder: FormBuilder,
readonly dialogRef: MatDialogRef<FileAttributesCsvImportDialogComponent>,
private readonly _fileAttributesControllerService: FileAttributesControllerService,
private readonly _fileAttributesService: FileAttributesService,
@Inject(MAT_DIALOG_DATA)
readonly data: {
readonly csv: File;
@ -191,7 +187,7 @@ export class FileAttributesCsvImportDialogComponent extends ListingComponent<Fie
};
try {
await this._fileAttributesControllerService.setFileAttributesConfig(fileAttributes, this.data.dossierTemplateId).toPromise();
await this._fileAttributesService.setFileAttributesConfig(fileAttributes, this.data.dossierTemplateId).toPromise();
this._toaster.success(_('file-attributes-csv-import.save.success'), { params: { count: this.activeFields.length } });
} catch (e) {
this._toaster.error(_('file-attributes-csv-import.save.error'));

View File

@ -9,7 +9,7 @@ import {
TemplateRef,
ViewChild
} from '@angular/core';
import { FileAttributesConfig, FileAttributesControllerService, IFileAttributeConfig } from '@redaction/red-ui-http';
import { FileAttributesConfig, IFileAttributeConfig } from '@redaction/red-ui-http';
import { AppStateService } from '@state/app-state.service';
import { ActivatedRoute } from '@angular/router';
import { AdminDialogService } from '../../services/admin-dialog.service';
@ -25,6 +25,7 @@ import { fileAttributeTypesTranslations } from '../../translations/file-attribut
import { UserService } from '@services/user.service';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { FileAttributeConfig } from '@models/file/file-attribute-config';
import { FileAttributesService } from '../../../dossier/services/file-attributes.service';
@Component({
templateUrl: './file-attributes-listing-screen.component.html',
@ -59,7 +60,7 @@ export class FileAttributesListingScreenComponent extends ListingComponent<FileA
private readonly _loadingService: LoadingService,
private readonly _appStateService: AppStateService,
private readonly _dialogService: AdminDialogService,
private readonly _fileAttributesService: FileAttributesControllerService
private readonly _fileAttributesService: FileAttributesService
) {
super(_injector);
_appStateService.activateDossierTemplate(_activatedRoute.snapshot.params.dossierTemplateId);
@ -78,7 +79,7 @@ export class FileAttributesListingScreenComponent extends ListingComponent<FileA
async newValue => {
this._loadingService.start();
await this._fileAttributesService
.setFileAttributesConfiguration(newValue, this._appStateService.activeDossierTemplateId)
.setFileAttributesConfig(newValue, this._appStateService.activeDossierTemplateId)
.toPromise();
await this._appStateService.refreshDossierTemplate(this._appStateService.activeDossierTemplateId);
await this._loadData();
@ -91,7 +92,7 @@ export class FileAttributesListingScreenComponent extends ListingComponent<FileA
this._loadingService.start();
if (fileAttribute) {
await this._fileAttributesService
.deleteFileAttribute(this._appStateService.activeDossierTemplateId, fileAttribute.id)
.deleteFileAttributes([fileAttribute.id], this._appStateService.activeDossierTemplateId)
.toPromise();
} else {
await this._fileAttributesService
@ -167,7 +168,7 @@ export class FileAttributesListingScreenComponent extends ListingComponent<FileA
try {
const response = await this._fileAttributesService
.getFileAttributesConfiguration(this._appStateService.activeDossierTemplateId)
.getFileAttributesConfig(this._appStateService.activeDossierTemplateId)
.toPromise();
this._existingConfiguration = response;
const fileAttributeConfig = response?.fileAttributeConfigs.map(item => new FileAttributeConfig(item)) || [];

View File

@ -4,6 +4,7 @@ import { AppStateService } from '@state/app-state.service';
import { DossiersDialogService } from '../../services/dossiers-dialog.service';
import { AutoUnsubscribe } from '@iqser/common-ui';
import { File } from '@models/file/file';
import { FileAttributesService } from '../../services/file-attributes.service';
@Component({
selector: 'redaction-document-info',
@ -16,18 +17,14 @@ export class DocumentInfoComponent extends AutoUnsubscribe implements OnInit {
fileAttributesConfig: FileAttributesConfig;
constructor(private readonly _appStateService: AppStateService, private readonly _dialogService: DossiersDialogService) {
constructor(
private readonly _appStateService: AppStateService,
private readonly _fileAttributesService: FileAttributesService,
private readonly _dialogService: DossiersDialogService
) {
super();
}
ngOnInit(): void {
this.fileAttributesConfig = this._appStateService.getFileAttributeConfig(this.file.dossierTemplateId);
this.addSubscription = this._appStateService.dossierTemplateChanged$.subscribe(() => {
this.fileAttributesConfig = this._appStateService.getFileAttributeConfig(this.file.dossierTemplateId);
});
}
get dossier() {
return this._appStateService.getDossierById(this.file.dossierId);
}
@ -36,6 +33,14 @@ export class DocumentInfoComponent extends AutoUnsubscribe implements OnInit {
return this._appStateService.getDossierTemplateById(this.dossier.dossierTemplateId).name;
}
ngOnInit(): void {
this.fileAttributesConfig = this._fileAttributesService.getFileAttributeConfig(this.file.dossierTemplateId);
this.addSubscription = this._appStateService.dossierTemplateChanged$.subscribe(() => {
this.fileAttributesConfig = this._fileAttributesService.getFileAttributeConfig(this.file.dossierTemplateId);
});
}
edit() {
this._dialogService.openDialog('documentInfo', null, this.file);
}

View File

@ -1,9 +1,10 @@
import { Component, Inject, OnInit } from '@angular/core';
import { FormBuilder, FormGroup } from '@angular/forms';
import { FileAttributesControllerService, IFile, IFileAttributeConfig } from '@redaction/red-ui-http';
import { IFile, IFileAttributeConfig } from '@redaction/red-ui-http';
import { AppStateService } from '@state/app-state.service';
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
import { Dossier } from '@state/model/dossier';
import { FileAttributesService } from '../../services/file-attributes.service';
@Component({
templateUrl: './document-info-dialog.component.html',
@ -19,7 +20,7 @@ export class DocumentInfoDialogComponent implements OnInit {
constructor(
private readonly _appStateService: AppStateService,
private readonly _formBuilder: FormBuilder,
private readonly _fileAttributesService: FileAttributesControllerService,
private readonly _fileAttributesService: FileAttributesService,
public dialogRef: MatDialogRef<DocumentInfoDialogComponent>,
@Inject(MAT_DIALOG_DATA) public data: IFile
) {
@ -29,7 +30,7 @@ export class DocumentInfoDialogComponent implements OnInit {
async ngOnInit() {
this.attributes = (
await this._fileAttributesService.getFileAttributesConfiguration(this._dossier.dossierTemplateId).toPromise()
await this._fileAttributesService.getFileAttributesConfig(this._dossier.dossierTemplateId).toPromise()
).fileAttributeConfigs.filter(attr => attr.editable);
const formConfig = this.attributes.reduce(
(acc, attr) => ({

View File

@ -55,6 +55,7 @@ import { RouterHistoryService } from '@services/router-history.service';
import { Dossier } from '@state/model/dossier';
import { Router } from '@angular/router';
import { FileActionService } from '../../services/file-action.service';
import { FileAttributesService } from '../../services/file-attributes.service';
@Component({
templateUrl: './dossier-overview-screen.component.html',
@ -112,11 +113,12 @@ export class DossierOverviewScreenComponent extends ListingComponent<File> imple
private readonly _statusOverlayService: StatusOverlayService,
private readonly _fileDropOverlayService: FileDropOverlayService,
private readonly _dossierAttributesService: DossierAttributesService,
private readonly _fileActionService: FileActionService
private readonly _fileActionService: FileActionService,
private readonly _fileAttributesService: FileAttributesService
) {
super(_injector);
this._loadEntitiesFromState();
this.fileAttributeConfigs = this._appStateService.getFileAttributeConfig(
this.fileAttributeConfigs = this._fileAttributesService.getFileAttributeConfig(
this.currentDossier.dossierTemplateId
).fileAttributeConfigs;
this.workflowConfig = {
@ -228,7 +230,7 @@ export class DossierOverviewScreenComponent extends ListingComponent<File> imple
});
this.addSubscription = this._appStateService.dossierTemplateChanged$.subscribe(() => {
this.fileAttributeConfigs = this._appStateService.getFileAttributeConfig(
this.fileAttributeConfigs = this._fileAttributesService.getFileAttributeConfig(
this.currentDossier.dossierTemplateId
).fileAttributeConfigs;
});

View File

@ -0,0 +1,36 @@
import { EntitiesService } from '@iqser/common-ui';
import { DossierTemplate } from '@models/file/dossier-template';
import { IDossierTemplate } from '@redaction/red-ui-http';
import { Injectable, Injector } from '@angular/core';
import { TEMPORARY_INJECTOR } from './injector';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
@Injectable({
providedIn: 'root'
})
export class DossierTemplatesService extends EntitiesService<DossierTemplate, IDossierTemplate> {
constructor(protected readonly _injector: Injector) {
super(TEMPORARY_INJECTOR(_injector), 'dossier-template');
}
fetch() {
this.get().pipe(map(entities => entities.map(dossierTemplate => new DossierTemplate(dossierTemplate))));
}
/**
* Gets all dossier templates.
*/
get(): Observable<IDossierTemplate[]>;
/**
* Gets one dossier template by id.
*/
get(dossierTemplateId: string): Observable<IDossierTemplate>;
get(dossierTemplateId?: string) {
if (dossierTemplateId) {
return super._getOne([dossierTemplateId]);
}
return super.getAll();
}
}

View File

@ -0,0 +1,92 @@
import { EntitiesService, List, RequiredParam, Validate } from '@iqser/common-ui';
import { FileAttributes, FileAttributesConfig, IFileAttributeConfig } from '@redaction/red-ui-http';
import { Injectable, Injector } from '@angular/core';
import { TEMPORARY_INJECTOR } from './injector';
import { BehaviorSubject, Observable, of } from 'rxjs';
import { catchError, map, tap } from 'rxjs/operators';
import { FileAttributeConfig } from '@models/file/file-attribute-config';
type FileAttributesConfigMap = Readonly<Record<string, FileAttributesConfig>>;
@Injectable({
providedIn: 'root'
})
export class FileAttributesService extends EntitiesService<FileAttributeConfig, IFileAttributeConfig> {
private readonly _fileAttributesConfig$ = new BehaviorSubject<FileAttributesConfigMap>({});
constructor(protected readonly _injector: Injector) {
super(TEMPORARY_INJECTOR(_injector), 'fileAttributes');
}
get fileAttributesConfig(): FileAttributesConfigMap {
return this._fileAttributesConfig$.value;
}
fetch(): Observable<FileAttributeConfig[]> {
return this.getAll().pipe(
map(entities => entities.map(entity => new FileAttributeConfig(entity))),
tap(entities => this.setEntities(entities))
);
}
/**
* Get the file attributes that can be used at importing csv.
*/
@Validate()
getFileAttributesConfig(@RequiredParam() dossierTemplateId: string, fetch = true): Observable<FileAttributesConfig> {
if (!fetch) {
return this._fileAttributesConfig$.pipe(map(entities => entities[dossierTemplateId]));
}
const request$ = this._getOne<FileAttributesConfig>(['config', dossierTemplateId]);
return request$.pipe(
tap(entities =>
this._fileAttributesConfig$.next({
...this._fileAttributesConfig$.value,
[dossierTemplateId]: entities
})
),
catchError(() => of({}))
);
}
getFileAttributeConfig(dossierTemplateId: string): FileAttributesConfig | undefined {
return this._fileAttributesConfig$.value[dossierTemplateId];
}
/**
* Add or update a file attribute that can be used at importing csv.
*/
@Validate()
setFileAttributesConfig(@RequiredParam() body: IFileAttributeConfig, @RequiredParam() dossierTemplateId: string) {
const url = `${this._defaultModelPath}/config/fileAttribute/${dossierTemplateId}`;
return this._post<unknown>(body, url);
}
/**
* Set file attributes base configuration and a list of file attributes,
*/
@Validate()
setFileAttributeConfig(@RequiredParam() body: FileAttributesConfig, @RequiredParam() dossierTemplateId: string) {
const url = `${this._defaultModelPath}/config/baseConfig/${dossierTemplateId}`;
return this._put<unknown>(body, url);
}
/**
* Set file attributes to an existing file
*/
@Validate()
setFileAttributes(@RequiredParam() body: FileAttributes, @RequiredParam() dossierId: string, @RequiredParam() fileId: string) {
const url = `${this._defaultModelPath}/set/${dossierId}/${fileId}`;
return this._post<unknown>(body, url);
}
/**
* Delete a specific file attribute.
*/
@Validate()
deleteFileAttributes(@RequiredParam() body: List, @RequiredParam() dossierTemplateId: string) {
const url = `${this._defaultModelPath}/config/fileAttribute/${dossierTemplateId}/delete`;
return this.delete(body, url);
}
}

View File

@ -4,15 +4,25 @@ import { IFile } from '@redaction/red-ui-http';
import { File } from '@models/file/file';
import { TEMPORARY_INJECTOR } from './injector';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
import { UserService } from '@services/user.service';
@Injectable({
providedIn: 'root'
})
export class FilesService extends EntitiesService<File, IFile> {
constructor(protected readonly _injector: Injector) {
constructor(protected readonly _injector: Injector, private readonly _userService: UserService) {
super(TEMPORARY_INJECTOR(_injector), 'status');
}
getExistingFilesFor(dossierId: string): List<File> {
return this.all.filter(file => file.dossierId === dossierId);
}
fetch() {
this.get().pipe(map(files => files.map(file => new File(file, this._userService.getNameForId(file.currentReviewer)))));
}
/**
* Gets the status for all files.
*/

View File

@ -12,8 +12,8 @@ import { Toaster } from '@iqser/common-ui';
import { TranslateService } from '@ngx-translate/core';
import { Event, NavigationEnd, ResolveStart, Router } from '@angular/router';
import { UserService } from '@services/user.service';
import { forkJoin, Observable, of, Subject } from 'rxjs';
import { catchError, map, tap } from 'rxjs/operators';
import { forkJoin, Observable, Subject } from 'rxjs';
import { map, tap } from 'rxjs/operators';
import { FALLBACK_COLOR, hexToRgb } from '@utils/functions';
import { File } from '@models/file/file';
import { Dossier } from './model/dossier';
@ -24,6 +24,8 @@ import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { UserPreferenceService } from '@services/user-preference.service';
import { FilesService } from '../modules/dossier/services/files.service';
import { DictionaryService } from '@shared/services/dictionary.service';
import { DossierTemplatesService } from '../modules/dossier/services/dossier-templates.service';
import { FileAttributesService } from '../modules/dossier/services/file-attributes.service';
export interface AppState {
dossiers: Dossier[];
@ -56,8 +58,8 @@ export class AppStateService {
private readonly _reanalysisControllerService: ReanalysisControllerService,
private readonly _translateService: TranslateService,
private readonly _dictionaryService: DictionaryService,
private readonly _dossierTemplateControllerService: DossierTemplateControllerService,
private readonly _fileAttributesService: FileAttributesControllerService,
private readonly _dossierTemplatesService: DossierTemplatesService,
private readonly _fileAttributesService: FileAttributesService,
private readonly _userPreferenceService: UserPreferenceService
) {
this._appState = {
@ -172,10 +174,6 @@ export class AppStateService {
}
}
getFileAttributeConfig(dossierTemplateId: string): FileAttributesConfig {
return this.dossierTemplates.find(d => d.dossierTemplateId === dossierTemplateId)?.fileAttributesConfig;
}
getDictionaryColor(type?: string, dossierTemplateId = this.activeDossier?.dossierTemplateId) {
if (!dossierTemplateId) {
dossierTemplateId = this.dossierTemplates[0]?.dossierTemplateId;
@ -245,7 +243,7 @@ export class AppStateService {
const activeFile = new File(
iFile,
this._userService.getNameForId(iFile.currentReviewer),
this.getFileAttributeConfig(iFile.dossierTemplateId)
this._fileAttributesService.getFileAttributeConfig(iFile.dossierTemplateId)
);
this.activeDossier.files = this.activeDossier?.files.map(file => (file.fileId === activeFile.fileId ? activeFile : file));
@ -372,27 +370,21 @@ export class AppStateService {
}
async loadAllDossierTemplates() {
const dossierTemplates = await this._dossierTemplateControllerService.getAllDossierTemplates().toPromise();
this._appState.dossierTemplates = dossierTemplates.map(dossierTemplate => new DossierTemplate(dossierTemplate, null));
const dossierTemplates = await this._dossierTemplatesService.get().toPromise();
this._appState.dossierTemplates = dossierTemplates.map(dossierTemplate => new DossierTemplate(dossierTemplate));
for (const dossierTemplate of this._appState.dossierTemplates) {
dossierTemplate.fileAttributesConfig = await this._fileAttributesService
.getFileAttributesConfiguration(dossierTemplate.dossierTemplateId)
.pipe(catchError(() => of({})))
.toPromise();
await this._fileAttributesService.getFileAttributesConfig(dossierTemplate.dossierTemplateId).toPromise();
}
}
async refreshDossierTemplate(dossierTemplateId: string) {
const dossierTemplate = await this._dossierTemplateControllerService.getDossierTemplate(dossierTemplateId).toPromise();
const dossierTemplate = await this._dossierTemplatesService.get(dossierTemplateId).toPromise();
const fileAttributesConfigs = await this._fileAttributesService
.getFileAttributesConfiguration(dossierTemplateId)
.pipe(catchError(() => of({})))
.toPromise();
await this._fileAttributesService.getFileAttributesConfig(dossierTemplateId).toPromise();
Object.assign(
this._appState.dossierTemplates.find(d => d.dossierTemplateId === dossierTemplateId),
new DossierTemplate(dossierTemplate, fileAttributesConfigs)
new DossierTemplate(dossierTemplate)
);
await this.refreshDossierTemplateDictionaryData(dossierTemplateId);
@ -698,7 +690,7 @@ export class AppStateService {
const file = new File(
iFile,
this._userService.getNameForId(iFile.currentReviewer),
this.getFileAttributeConfig(iFile.dossierTemplateId)
this._fileAttributesService.getFileAttributeConfig(iFile.dossierTemplateId)
);
file.lastOpened = file.fileId === this._userPreferenceService.getLastOpenedFileForDossier(dossier.id);
if (JSON.stringify(oldFile) !== JSON.stringify(file)) {
@ -716,7 +708,7 @@ export class AppStateService {
const file = new File(
iFile,
this._userService.getNameForId(iFile.currentReviewer),
this.getFileAttributeConfig(iFile.dossierTemplateId)
this._fileAttributesService.getFileAttributeConfig(iFile.dossierTemplateId)
);
fileChangedEvent.push(file);
}
@ -724,7 +716,11 @@ export class AppStateService {
dossier.files = iFiles.map(
iFile =>
new File(iFile, this._userService.getNameForId(iFile.currentReviewer), this.getFileAttributeConfig(iFile.dossierTemplateId))
new File(
iFile,
this._userService.getNameForId(iFile.currentReviewer),
this._fileAttributesService.getFileAttributeConfig(iFile.dossierTemplateId)
)
);
this._computeStats();

View File

@ -7,7 +7,6 @@ import { DigitalSignatureControllerService } from './api/digitalSignatureControl
import { DossierAttributesControllerService } from './api/dossierAttributesController.service';
import { DossierTemplateControllerService } from './api/dossierTemplateController.service';
import { DownloadControllerService } from './api/downloadController.service';
import { FileAttributesControllerService } from './api/fileAttributesController.service';
import { FileManagementControllerService } from './api/fileManagementController.service';
import { GeneralSettingsControllerService } from './api/generalSettingsController.service';
import { InfoControllerService } from './api/infoController.service';
@ -39,7 +38,6 @@ import { StatusReportControllerService } from './api/statusReportController.serv
DossierAttributesControllerService,
DossierTemplateControllerService,
DownloadControllerService,
FileAttributesControllerService,
FileManagementControllerService,
GeneralSettingsControllerService,
InfoControllerService,

View File

@ -1,33 +1,4 @@
export * from './auditController.service';
import { AuditControllerService } from './auditController.service';
import { DictionaryControllerService } from './dictionaryController.service';
import { DigitalSignatureControllerService } from './digitalSignatureController.service';
import { DossierAttributesControllerService } from './dossierAttributesController.service';
import { DossierControllerService } from './dossierController.service';
import { DossierTemplateControllerService } from './dossierTemplateController.service';
import { DownloadControllerService } from './downloadController.service';
import { FileAttributesControllerService } from './fileAttributesController.service';
import { FileManagementControllerService } from './fileManagementController.service';
import { GeneralSettingsControllerService } from './generalSettingsController.service';
import { InfoControllerService } from './infoController.service';
import { LegalBasisMappingControllerService } from './legalBasisMappingController.service';
import { LicenseReportControllerService } from './licenseReportController.service';
import { ManualRedactionControllerService } from './manualRedactionController.service';
import { NotificationControllerService } from './notificationController.service';
import { ReanalysisControllerService } from './reanalysisController.service';
import { RedactionLogControllerService } from './redactionLogController.service';
import { ReportTemplateControllerService } from './reportTemplateController.service';
import { RulesControllerService } from './rulesController.service';
import { SearchControllerService } from './searchController.service';
import { SmtpConfigurationControllerService } from './smtpConfigurationController.service';
import { StatusControllerService } from './statusController.service';
import { StatusReportControllerService } from './statusReportController.service';
import { UploadControllerService } from './uploadController.service';
import { UserControllerService } from './userController.service';
import { UserPreferenceControllerService } from './userPreferenceController.service';
import { VersionsControllerService } from './versionsController.service';
import { ViewedPagesControllerService } from './viewedPagesController.service';
import { WatermarkControllerService } from './watermarkController.service';
export * from './dictionaryController.service';
@ -85,34 +56,22 @@ export * from './viewedPagesController.service';
export * from './watermarkController.service';
export const APIS = [
AuditControllerService,
DictionaryControllerService,
DigitalSignatureControllerService,
DossierAttributesControllerService,
DossierControllerService,
DossierTemplateControllerService,
DownloadControllerService,
FileAttributesControllerService,
FileManagementControllerService,
GeneralSettingsControllerService,
InfoControllerService,
LegalBasisMappingControllerService,
LicenseReportControllerService,
ManualRedactionControllerService,
NotificationControllerService,
ReanalysisControllerService,
RedactionLogControllerService,
ReportTemplateControllerService,
RulesControllerService,
SearchControllerService,
SmtpConfigurationControllerService,
StatusControllerService,
StatusReportControllerService,
UploadControllerService,
UserControllerService,
UserPreferenceControllerService,
VersionsControllerService,
ViewedPagesControllerService,
WatermarkControllerService
];
export * from './downloadController.service';
export * from './digitalSignatureController.service';
export * from './fileAttributesController.service';
export * from './smtpConfigurationController.service';
export * from './reportTemplateController.service';
export * from './uploadController.service';
export * from './generalSettingsController.service';
export * from './dossierAttributesController.service';
export * from './searchController.service';
export * from './notificationController.service';