diff --git a/apps/red-ui/src/app/app.module.ts b/apps/red-ui/src/app/app.module.ts index cb4138914..67dfac44c 100644 --- a/apps/red-ui/src/app/app.module.ts +++ b/apps/red-ui/src/app/app.module.ts @@ -5,7 +5,6 @@ import { ActivatedRoute, Router } from '@angular/router'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { HTTP_INTERCEPTORS, HttpClient, HttpClientModule } from '@angular/common/http'; import { BaseScreenComponent } from '@components/base-screen/base-screen.component'; -import { ApiModule, GeneralSettingsControllerService } from '@redaction/red-ui-http'; import { ApiPathInterceptor } from '@utils/api-path-interceptor'; import { MissingTranslationHandler, TranslateCompiler, TranslateLoader, TranslateModule } from '@ngx-translate/core'; import { languageInitializer } from '@i18n/language.initializer'; @@ -36,6 +35,7 @@ import { DatePipe } from '@shared/pipes/date.pipe'; import * as links from '../assets/help-mode/links.json'; import { HELP_DOCS, IqserHelpModeModule, MAX_RETRIES_ON_SERVER_ERROR, ServerErrorInterceptor, ToastComponent } from '@iqser/common-ui'; import { KeycloakService } from 'keycloak-angular'; +import { GeneralSettingsService } from '@services/general-settings.service'; export function httpLoaderFactory(httpClient: HttpClient): PruningTranslationLoader { return new PruningTranslationLoader(httpClient, '/assets/i18n/', '.json'); @@ -64,7 +64,6 @@ const components = [AppComponent, AuthErrorComponent, NotificationsComponent, Sp FileUploadDownloadModule, HttpClientModule, AuthModule, - ApiModule, AppRoutingModule, MonacoEditorModule, IqserHelpModeModule, @@ -121,7 +120,7 @@ const components = [AppComponent, AuthErrorComponent, NotificationsComponent, Sp provide: APP_INITIALIZER, multi: true, useFactory: configurationInitializer, - deps: [KeycloakService, Title, ConfigService, GeneralSettingsControllerService], + deps: [KeycloakService, Title, ConfigService, GeneralSettingsService], }, { provide: MONACO_PATH, diff --git a/apps/red-ui/src/app/components/notifications/notifications.component.ts b/apps/red-ui/src/app/components/notifications/notifications.component.ts index f50474a7e..609beaf5f 100644 --- a/apps/red-ui/src/app/components/notifications/notifications.component.ts +++ b/apps/red-ui/src/app/components/notifications/notifications.component.ts @@ -1,7 +1,7 @@ import { Component } from '@angular/core'; import * as moment from 'moment'; import { TranslateService } from '@ngx-translate/core'; -import { Notification, NotificationControllerService, NotificationResponse } from '@redaction/red-ui-http'; +import { Notification, NotificationResponse } from '@redaction/red-ui-http'; import { DatePipe } from '@shared/pipes/date.pipe'; import { AppStateService } from '@state/app-state.service'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; @@ -9,6 +9,7 @@ import { UserService } from '@services/user.service'; import { NotificationType, NotificationTypeEnum } from '@models/notification-types'; import { notificationsTranslations } from '../../translations/notifications-translations'; import { DossiersService } from '@services/entity-services/dossiers.service'; +import { NotificationsService } from '@services/notifications.service'; @Component({ selector: 'redaction-notifications', @@ -23,12 +24,12 @@ export class NotificationsComponent { constructor( private readonly _translateService: TranslateService, private readonly _userService: UserService, - private readonly _notificationControllerService: NotificationControllerService, + private readonly _notificationsService: NotificationsService, private readonly _appStateService: AppStateService, private readonly _dossiersService: DossiersService, private readonly _datePipe: DatePipe, ) { - this._notificationControllerService.getNotifications(false).subscribe((response: NotificationResponse) => { + this._notificationsService.getNotifications(false).subscribe((response: NotificationResponse) => { this.notifications = response.notifications.filter(notification => this._isSupportedType(notification)); this._groupNotifications(this.notifications); this.hasUnreadNotifications = this.notifications?.filter(n => !n.readDate).length > 0; @@ -47,7 +48,7 @@ export class NotificationsComponent { async markRead(notification: Notification, $event, isRead: boolean = true) { $event.stopPropagation(); const ids = [`${notification.id}`]; - await this._notificationControllerService.toggleNotificationRead(ids, isRead).toPromise(); + await this._notificationsService.toggleNotificationRead(ids, isRead).toPromise(); if (isRead) { notification.readDate = moment().format('YYYY-MM-DDTHH:mm:ss Z'); } else { diff --git a/apps/red-ui/src/app/modules/admin/admin.module.ts b/apps/red-ui/src/app/modules/admin/admin.module.ts index f21670f8d..932ecd4fa 100644 --- a/apps/red-ui/src/app/modules/admin/admin.module.ts +++ b/apps/red-ui/src/app/modules/admin/admin.module.ts @@ -42,6 +42,10 @@ import { TrashScreenComponent } from './screens/trash/trash-screen.component'; import { AuditService } from './services/audit.service'; import { DigitalSignatureService } from './services/digital-signature.service'; import { BaseAdminScreenComponent } from './base-admin-screen/base-admin-screen.component'; +import { LicenseReportService } from './services/licence-report.service'; +import { RulesService } from './services/rules.service'; +import { SmtpConfigService } from './services/smtp-config.service'; +import { WatermarkService } from './services/watermark.service'; const dialogs = [ AddEditDossierTemplateDialogComponent, @@ -92,7 +96,15 @@ const components = [ @NgModule({ declarations: [...components], - providers: [AdminDialogService, AuditService, DigitalSignatureService], + providers: [ + AdminDialogService, + AuditService, + DigitalSignatureService, + LicenseReportService, + RulesService, + SmtpConfigService, + WatermarkService, + ], imports: [CommonModule, SharedModule, AdminRoutingModule, NgxChartsModule, ColorPickerModule, MonacoEditorModule], }) export class AdminModule {} diff --git a/apps/red-ui/src/app/modules/admin/screens/general-config/general-config-screen.component.ts b/apps/red-ui/src/app/modules/admin/screens/general-config/general-config-screen.component.ts index 1306a96c7..cf4f4d619 100644 --- a/apps/red-ui/src/app/modules/admin/screens/general-config/general-config-screen.component.ts +++ b/apps/red-ui/src/app/modules/admin/screens/general-config/general-config-screen.component.ts @@ -1,16 +1,13 @@ import { Component, OnDestroy, OnInit } from '@angular/core'; import { FormBuilder, FormGroup, Validators } from '@angular/forms'; import { AdminDialogService } from '../../services/admin-dialog.service'; -import { - GeneralConfigurationModel, - GeneralSettingsControllerService, - SMTPConfiguration, - SmtpConfigurationControllerService, -} from '@redaction/red-ui-http'; +import { GeneralConfigurationModel, SMTPConfiguration } from '@redaction/red-ui-http'; import { ConfigService } from '@services/config.service'; import { AutoUnsubscribe, IconButtonTypes, LoadingService, Toaster } from '@iqser/common-ui'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { UserService } from '@services/user.service'; +import { GeneralSettingsService } from '@services/general-settings.service'; +import { SmtpConfigService } from '../../services/smtp-config.service'; @Component({ selector: 'redaction-general-config-screen', @@ -34,8 +31,8 @@ export class GeneralConfigScreenComponent extends AutoUnsubscribe implements OnI private readonly _loadingService: LoadingService, private readonly _dialogService: AdminDialogService, private readonly _configService: ConfigService, - private readonly _smtpConfigService: SmtpConfigurationControllerService, - private readonly _generalSettingsControllerService: GeneralSettingsControllerService, + private readonly _smtpConfigService: SmtpConfigService, + private readonly _generalSettingsService: GeneralSettingsService, ) { super(); @@ -110,8 +107,8 @@ export class GeneralConfigScreenComponent extends AutoUnsubscribe implements OnI const configFormValues = this.configForm.getRawValue(); - await this._generalSettingsControllerService.updateGeneralConfigurations(configFormValues).toPromise(); - this._initialGeneralConfiguration = await this._generalSettingsControllerService.getGeneralConfigurations().toPromise(); + await this._generalSettingsService.updateGeneralConfigurations(configFormValues).toPromise(); + this._initialGeneralConfiguration = await this._generalSettingsService.getGeneralConfigurations().toPromise(); this._configService.updateDisplayName(this._initialGeneralConfiguration.displayName); this._loadingService.stop(); } @@ -141,7 +138,7 @@ export class GeneralConfigScreenComponent extends AutoUnsubscribe implements OnI private async _loadData() { this._loadingService.start(); try { - this._initialGeneralConfiguration = await this._generalSettingsControllerService.getGeneralConfigurations().toPromise(); + this._initialGeneralConfiguration = await this._generalSettingsService.getGeneralConfigurations().toPromise(); this.configForm.patchValue(this._initialGeneralConfiguration, { emitEvent: false }); } catch (e) {} diff --git a/apps/red-ui/src/app/modules/admin/screens/license-information/license-information-screen.component.ts b/apps/red-ui/src/app/modules/admin/screens/license-information/license-information-screen.component.ts index 06ab7877a..7e8c5843c 100644 --- a/apps/red-ui/src/app/modules/admin/screens/license-information/license-information-screen.component.ts +++ b/apps/red-ui/src/app/modules/admin/screens/license-information/license-information-screen.component.ts @@ -1,5 +1,5 @@ import { Component, OnInit } from '@angular/core'; -import { LicenseReport, LicenseReportControllerService } from '@redaction/red-ui-http'; +import { LicenseReport } from '@redaction/red-ui-http'; import { ConfigService } from '@services/config.service'; import * as moment from 'moment'; import { TranslateService } from '@ngx-translate/core'; @@ -7,6 +7,7 @@ import { ButtonConfig, IconButtonTypes, LoadingService } from '@iqser/common-ui' import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { UserService } from '@services/user.service'; import { RouterHistoryService } from '@services/router-history.service'; +import { LicenseReportService } from '../../services/licence-report.service'; @Component({ selector: 'redaction-license-information-screen', @@ -47,7 +48,7 @@ export class LicenseInformationScreenComponent implements OnInit { private readonly _loadingService: LoadingService, readonly routerHistoryService: RouterHistoryService, private readonly _translateService: TranslateService, - private readonly _licenseReportController: LicenseReportControllerService, + private readonly _licenseReportService: LicenseReportService, ) { _loadingService.start(); } @@ -68,15 +69,15 @@ export class LicenseInformationScreenComponent implements OnInit { endDate: endDate.toDate(), }; const promises = [ - this._licenseReportController.licenseReport(currentConfig).toPromise(), - this._licenseReportController.licenseReport({}).toPromise(), + this._licenseReportService.licenseReport(currentConfig).toPromise(), + this._licenseReportService.licenseReport({}).toPromise(), ]; if (endDate.isBefore(moment())) { const unlicensedConfig = { startDate: endDate.toDate(), }; - promises.push(this._licenseReportController.licenseReport(unlicensedConfig).toPromise()); + promises.push(this._licenseReportService.licenseReport(unlicensedConfig).toPromise()); } Promise.all(promises).then(reports => { @@ -131,7 +132,7 @@ export class LicenseInformationScreenComponent implements OnInit { } promises.push( - this._licenseReportController + this._licenseReportService .licenseReport({ startDate: moment(`01-${m + 1}-${y}`, 'DD-MM-YYYY').toDate(), endDate: moment(`01-${nm + 1}-${ny}`, 'DD-MM-YYYY').toDate(), diff --git a/apps/red-ui/src/app/modules/admin/screens/reports/reports-screen.component.ts b/apps/red-ui/src/app/modules/admin/screens/reports/reports-screen.component.ts index 44a281508..e691adcf4 100644 --- a/apps/red-ui/src/app/modules/admin/screens/reports/reports-screen.component.ts +++ b/apps/red-ui/src/app/modules/admin/screens/reports/reports-screen.component.ts @@ -1,7 +1,7 @@ import { Component, ElementRef, OnInit, ViewChild } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { AppStateService } from '@state/app-state.service'; -import { PlaceholdersResponse, ReportTemplate, ReportTemplateControllerService } from '@redaction/red-ui-http'; +import { PlaceholdersResponse, ReportTemplate } from '@redaction/red-ui-http'; import { download } from '@utils/file-download-utils'; import { ConfirmationDialogInput, LoadingService, Toaster } from '@iqser/common-ui'; import { PermissionsService } from '@services/permissions.service'; @@ -13,6 +13,7 @@ import { removeBraces } from '@utils/functions'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { AdminDialogService } from '../../services/admin-dialog.service'; import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service'; +import { ReportTemplateService } from '@services/report-template.service'; interface Placeholder { placeholder: string; @@ -38,7 +39,7 @@ export class ReportsScreenComponent implements OnInit { private readonly _activatedRoute: ActivatedRoute, private readonly _appStateService: AppStateService, private readonly _dossierTemplatesService: DossierTemplatesService, - private readonly _reportTemplateService: ReportTemplateControllerService, + private readonly _reportTemplateService: ReportTemplateService, private readonly _dialogService: AdminDialogService, private readonly _toaster: Toaster, private readonly _loadingService: LoadingService, @@ -120,7 +121,7 @@ export class ReportsScreenComponent implements OnInit { } private async _deleteTemplate(template: ReportTemplate) { - await this._reportTemplateService.deleteTemplate(template.dossierTemplateId, template.templateId).toPromise(); + await this._reportTemplateService.delete(template.dossierTemplateId, template.templateId).toPromise(); await this._loadReportTemplates(); } diff --git a/apps/red-ui/src/app/modules/admin/screens/rules/rules-screen.component.scss b/apps/red-ui/src/app/modules/admin/screens/rules/rules-screen.component.scss index 64b93fd95..2a5860784 100644 --- a/apps/red-ui/src/app/modules/admin/screens/rules/rules-screen.component.scss +++ b/apps/red-ui/src/app/modules/admin/screens/rules/rules-screen.component.scss @@ -1,6 +1,7 @@ .editor-container { width: 100%; - padding: 15px; + padding-top: 15px; + padding-left: 15px; } ngx-monaco-editor { diff --git a/apps/red-ui/src/app/modules/admin/screens/rules/rules-screen.component.ts b/apps/red-ui/src/app/modules/admin/screens/rules/rules-screen.component.ts index 5f3908265..b19485bbe 100644 --- a/apps/red-ui/src/app/modules/admin/screens/rules/rules-screen.component.ts +++ b/apps/red-ui/src/app/modules/admin/screens/rules/rules-screen.component.ts @@ -1,6 +1,5 @@ -import { Component, ElementRef, OnInit, ViewChild } from '@angular/core'; +import { ChangeDetectionStrategy, Component, ElementRef, OnInit, ViewChild } from '@angular/core'; import { PermissionsService } from '@services/permissions.service'; -import { RulesControllerService } from '@redaction/red-ui-http'; import { Debounce, IconButtonTypes, LoadingService, Toaster } from '@iqser/common-ui'; import { TranslateService } from '@ngx-translate/core'; import { saveAs } from 'file-saver'; @@ -9,6 +8,7 @@ import { ActivatedRoute } from '@angular/router'; import { AppStateService } from '@state/app-state.service'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service'; +import { RulesService } from '../../services/rules.service'; import ICodeEditor = monaco.editor.ICodeEditor; import IModelDeltaDecoration = monaco.editor.IModelDeltaDecoration; import IStandaloneEditorConstructionOptions = monaco.editor.IStandaloneEditorConstructionOptions; @@ -17,6 +17,7 @@ import IStandaloneEditorConstructionOptions = monaco.editor.IStandaloneEditorCon selector: 'redaction-rules-screen', templateUrl: './rules-screen.component.html', styleUrls: ['./rules-screen.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, }) export class RulesScreenComponent extends ComponentHasChanges implements OnInit { readonly iconButtonTypes = IconButtonTypes; @@ -38,7 +39,7 @@ export class RulesScreenComponent extends ComponentHasChanges implements OnInit constructor( readonly permissionsService: PermissionsService, - private readonly _rulesControllerService: RulesControllerService, + private readonly _rulesService: RulesService, private readonly _appStateService: AppStateService, private readonly _dossierTemplatesService: DossierTemplatesService, private readonly _toaster: Toaster, @@ -88,7 +89,7 @@ export class RulesScreenComponent extends ComponentHasChanges implements OnInit async save(): Promise { this._loadingService.start(); - await this._rulesControllerService + await this._rulesService .uploadRules({ rules: this._codeEditor.getModel().getValue(), dossierTemplateId: this._dossierTemplatesService.activeDossierTemplateId, @@ -148,8 +149,8 @@ export class RulesScreenComponent extends ComponentHasChanges implements OnInit private async _initialize() { this._loadingService.start(); - await this._rulesControllerService - .downloadRules(this._dossierTemplatesService.activeDossierTemplateId) + await this._rulesService + .download(this._dossierTemplatesService.activeDossierTemplateId) .toPromise() .then( rules => { diff --git a/apps/red-ui/src/app/modules/admin/screens/watermark/watermark-screen.component.ts b/apps/red-ui/src/app/modules/admin/screens/watermark/watermark-screen.component.ts index 33d90a62e..796c72289 100644 --- a/apps/red-ui/src/app/modules/admin/screens/watermark/watermark-screen.component.ts +++ b/apps/red-ui/src/app/modules/admin/screens/watermark/watermark-screen.component.ts @@ -5,12 +5,13 @@ import { environment } from '@environments/environment'; import { HttpClient } from '@angular/common/http'; import { FormBuilder, FormGroup, Validators } from '@angular/forms'; import { Debounce, IconButtonTypes, LoadingService, Toaster } from '@iqser/common-ui'; -import { WatermarkControllerService, WatermarkModel } from '@redaction/red-ui-http'; +import { WatermarkModel } from '@redaction/red-ui-http'; import { ActivatedRoute } from '@angular/router'; import { BASE_HREF } from '../../../../tokens'; import { stampPDFPage } from '@utils/page-stamper'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service'; +import { WatermarkService } from '../../services/watermark.service'; export const DEFAULT_WATERMARK: WatermarkModel = { text: null, @@ -37,7 +38,7 @@ export class WatermarkScreenComponent implements OnInit { constructor( readonly permissionsService: PermissionsService, @Inject(BASE_HREF) private readonly _baseHref: string, - private readonly _watermarkControllerService: WatermarkControllerService, + private readonly _watermarkService: WatermarkService, private readonly _toaster: Toaster, private readonly _http: HttpClient, private readonly _changeDetectorRef: ChangeDetectorRef, @@ -79,8 +80,8 @@ export class WatermarkScreenComponent implements OnInit { const dossierTemplateId = this._dossierTemplatesService.activeDossierTemplateId; const observable = watermark.text - ? this._watermarkControllerService.saveWatermark(watermark, dossierTemplateId) - : this._watermarkControllerService.deleteWatermark(dossierTemplateId); + ? this._watermarkService.saveWatermark(watermark, dossierTemplateId) + : this._watermarkService.deleteWatermark(dossierTemplateId); observable.toPromise().then( () => { @@ -108,7 +109,7 @@ export class WatermarkScreenComponent implements OnInit { } private _loadWatermark() { - this._watermarkControllerService.getWatermark(this._dossierTemplatesService.activeDossierTemplateId).subscribe( + this._watermarkService.getWatermark(this._dossierTemplatesService.activeDossierTemplateId).subscribe( watermark => { this._watermark = watermark; this.configForm.setValue({ ...this._watermark }); diff --git a/apps/red-ui/src/app/modules/admin/services/licence-report.service.ts b/apps/red-ui/src/app/modules/admin/services/licence-report.service.ts new file mode 100644 index 000000000..5ee5bd9eb --- /dev/null +++ b/apps/red-ui/src/app/modules/admin/services/licence-report.service.ts @@ -0,0 +1,24 @@ +import { Injectable, Injector } from '@angular/core'; +import { GenericService, QueryParam, RequiredParam, Validate } from '@iqser/common-ui'; +import { LicenseReport, LicenseReportRequest } from '@redaction/red-ui-http'; + +@Injectable() +export class LicenseReportService extends GenericService { + constructor(protected readonly _injector: Injector) { + super(_injector, 'report'); + } + + @Validate() + licenseReport(@RequiredParam() body: LicenseReportRequest, limit?: number, offset?: number) { + const queryParams: QueryParam[] = []; + if (limit) { + queryParams.push({ key: 'limit', value: limit }); + } + + if (offset) { + queryParams.push({ key: 'offset', value: offset }); + } + + return this._post(body, `${this._defaultModelPath}/license`, queryParams); + } +} diff --git a/apps/red-ui/src/app/modules/admin/services/rules.service.ts b/apps/red-ui/src/app/modules/admin/services/rules.service.ts new file mode 100644 index 000000000..fb53d0d25 --- /dev/null +++ b/apps/red-ui/src/app/modules/admin/services/rules.service.ts @@ -0,0 +1,20 @@ +import { Injectable, Injector } from '@angular/core'; +import { GenericService, RequiredParam, Validate } from '@iqser/common-ui'; +import { Rules } from '@redaction/red-ui-http'; + +@Injectable() +export class RulesService extends GenericService { + constructor(protected readonly _injector: Injector) { + super(_injector, 'rules'); + } + + @Validate() + download(@RequiredParam() dossierTemplateId: string) { + return this._getOne([dossierTemplateId]); + } + + @Validate() + uploadRules(@RequiredParam() body: Rules) { + return this._post(body); + } +} diff --git a/apps/red-ui/src/app/modules/admin/services/smtp-config.service.ts b/apps/red-ui/src/app/modules/admin/services/smtp-config.service.ts new file mode 100644 index 000000000..8d7391026 --- /dev/null +++ b/apps/red-ui/src/app/modules/admin/services/smtp-config.service.ts @@ -0,0 +1,24 @@ +import { Injectable, Injector } from '@angular/core'; +import { GenericService, RequiredParam, Validate } from '@iqser/common-ui'; +import { SMTPConfiguration } from '@redaction/red-ui-http'; + +@Injectable() +export class SmtpConfigService extends GenericService { + constructor(protected readonly _injector: Injector) { + super(_injector, 'configuration'); + } + + @Validate() + updateSMTPConfiguration(@RequiredParam() body: SMTPConfiguration) { + return this._post(body, `${this._defaultModelPath}/smtp`); + } + + @Validate() + testSMTPConfiguration(@RequiredParam() body: SMTPConfiguration) { + return this._post(body, `${this._defaultModelPath}/smtp/test`); + } + + getCurrentSMTPConfiguration() { + return this._getOne(['smtp']); + } +} diff --git a/apps/red-ui/src/app/modules/admin/services/watermark.service.ts b/apps/red-ui/src/app/modules/admin/services/watermark.service.ts new file mode 100644 index 000000000..560835922 --- /dev/null +++ b/apps/red-ui/src/app/modules/admin/services/watermark.service.ts @@ -0,0 +1,25 @@ +import { Injectable, Injector } from '@angular/core'; +import { GenericService, RequiredParam, Validate } from '@iqser/common-ui'; +import { WatermarkModel } from '@redaction/red-ui-http'; + +@Injectable() +export class WatermarkService extends GenericService { + constructor(protected readonly _injector: Injector) { + super(_injector, 'watermark'); + } + + @Validate() + saveWatermark(@RequiredParam() body: WatermarkModel, @RequiredParam() dossierTemplateId: string) { + return this._post(body, `${this._defaultModelPath}/${dossierTemplateId}`); + } + + @Validate() + deleteWatermark(@RequiredParam() dossierTemplateId: string) { + return super.delete({}, `${this._defaultModelPath}/${dossierTemplateId}`); + } + + @Validate() + getWatermark(@RequiredParam() dossierTemplateId: string) { + return this._getOne([dossierTemplateId]); + } +} diff --git a/apps/red-ui/src/app/modules/dossier/components/page-exclusion/page-exclusion.component.ts b/apps/red-ui/src/app/modules/dossier/components/page-exclusion/page-exclusion.component.ts index 6af347ea6..5060d4919 100644 --- a/apps/red-ui/src/app/modules/dossier/components/page-exclusion/page-exclusion.component.ts +++ b/apps/red-ui/src/app/modules/dossier/components/page-exclusion/page-exclusion.component.ts @@ -1,9 +1,10 @@ import { Component, EventEmitter, Input, OnChanges, Output, ViewChild } from '@angular/core'; import { PermissionsService } from '@services/permissions.service'; -import { PageRange, ReanalysisControllerService } from '@redaction/red-ui-http'; +import { PageRange } from '@redaction/red-ui-http'; import { InputWithActionComponent, LoadingService, Toaster } from '@iqser/common-ui'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { File } from '@models/file/file'; +import { ReanalysisService } from '@services/reanalysis.service'; @Component({ selector: 'redaction-page-exclusion', @@ -19,7 +20,7 @@ export class PageExclusionComponent implements OnChanges { constructor( readonly permissionsService: PermissionsService, - private readonly _reanalysisControllerService: ReanalysisControllerService, + private readonly _reanalysisService: ReanalysisService, private readonly _toaster: Toaster, private readonly _loadingService: LoadingService, ) {} @@ -56,7 +57,7 @@ export class PageExclusionComponent implements OnChanges { endPage, }; }); - await this._reanalysisControllerService + await this._reanalysisService .excludePages( { pageRanges: pageRanges, @@ -75,7 +76,7 @@ export class PageExclusionComponent implements OnChanges { async includePagesRange(range: PageRange): Promise { this._loadingService.start(); - await this._reanalysisControllerService + await this._reanalysisService .includePages( { pageRanges: [range], diff --git a/apps/red-ui/src/app/modules/dossier/components/page-indicator/page-indicator.component.ts b/apps/red-ui/src/app/modules/dossier/components/page-indicator/page-indicator.component.ts index d8e247d77..6f97eeabb 100644 --- a/apps/red-ui/src/app/modules/dossier/components/page-indicator/page-indicator.component.ts +++ b/apps/red-ui/src/app/modules/dossier/components/page-indicator/page-indicator.component.ts @@ -1,10 +1,11 @@ import { Component, EventEmitter, Input, OnChanges, OnDestroy, OnInit, Output, SimpleChanges } from '@angular/core'; -import { ViewedPages, ViewedPagesControllerService } from '@redaction/red-ui-http'; +import { ViewedPages } from '@redaction/red-ui-http'; import { AppStateService } from '@state/app-state.service'; import { PermissionsService } from '@services/permissions.service'; import { ConfigService } from '@services/config.service'; import { Subscription } from 'rxjs'; import { DossiersService } from '@services/entity-services/dossiers.service'; +import { ViewedPagesService } from '../../shared/services/viewed-pages.service'; @Component({ selector: 'redaction-page-indicator', @@ -24,7 +25,7 @@ export class PageIndicatorComponent implements OnChanges, OnInit, OnDestroy { private _subscription: Subscription; constructor( - private readonly _viewedPagesControllerService: ViewedPagesControllerService, + private readonly _viewedPagesService: ViewedPagesService, private readonly _appStateService: AppStateService, private readonly _dossiersService: DossiersService, private readonly _configService: ConfigService, @@ -105,7 +106,7 @@ export class PageIndicatorComponent implements OnChanges, OnInit, OnDestroy { // } private _markPageRead() { - this._viewedPagesControllerService + this._viewedPagesService .addPage({ page: this.number }, this._dossiersService.activeDossierId, this._appStateService.activeFileId) .subscribe(() => { if (this.activePage) { @@ -117,7 +118,7 @@ export class PageIndicatorComponent implements OnChanges, OnInit, OnDestroy { } private _markPageUnread() { - this._viewedPagesControllerService + this._viewedPagesService .removePage(this._dossiersService.activeDossierId, this._appStateService.activeFileId, this.number) .subscribe(() => { this.viewedPages?.pages?.splice( diff --git a/apps/red-ui/src/app/modules/dossier/dialogs/add-dossier-dialog/add-dossier-dialog.component.ts b/apps/red-ui/src/app/modules/dossier/dialogs/add-dossier-dialog/add-dossier-dialog.component.ts index 1bebf9ab2..e2d1ff8f1 100644 --- a/apps/red-ui/src/app/modules/dossier/dialogs/add-dossier-dialog/add-dossier-dialog.component.ts +++ b/apps/red-ui/src/app/modules/dossier/dialogs/add-dossier-dialog/add-dossier-dialog.component.ts @@ -1,18 +1,13 @@ import { Component } from '@angular/core'; import { MatDialogRef } from '@angular/material/dialog'; -import { - DossierRequest, - DownloadFileType, - IDossierTemplate, - ReportTemplate, - ReportTemplateControllerService, -} from '@redaction/red-ui-http'; +import { DossierRequest, DownloadFileType, IDossierTemplate, ReportTemplate } from '@redaction/red-ui-http'; import { FormBuilder, FormGroup, Validators } from '@angular/forms'; import * as moment from 'moment'; import { downloadTypesTranslations } from '../../../../translations/download-types-translations'; import { IconButtonTypes } from '@iqser/common-ui'; import { DossiersService } from '@services/entity-services/dossiers.service'; import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service'; +import { ReportTemplateService } from '@services/report-template.service'; @Component({ templateUrl: './add-dossier-dialog.component.html', @@ -34,7 +29,7 @@ export class AddDossierDialogComponent { private readonly _dossiersService: DossiersService, private readonly _dossierTemplatesService: DossierTemplatesService, private readonly _formBuilder: FormBuilder, - private readonly _reportTemplateController: ReportTemplateControllerService, + private readonly _reportTemplateController: ReportTemplateService, readonly dialogRef: MatDialogRef, ) { this._filterInvalidDossierTemplates(); diff --git a/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/deleted-documents/edit-dossier-deleted-documents.component.ts b/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/deleted-documents/edit-dossier-deleted-documents.component.ts index d9d3b8d88..f220b38a9 100644 --- a/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/deleted-documents/edit-dossier-deleted-documents.component.ts +++ b/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/deleted-documents/edit-dossier-deleted-documents.component.ts @@ -12,7 +12,7 @@ import { TableColumnConfig, TitleColors, } from '@iqser/common-ui'; -import { FileManagementControllerService, IFile } from '@redaction/red-ui-http'; +import { IFile } from '@redaction/red-ui-http'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import * as moment from 'moment'; import { ConfigService } from '@services/config.service'; @@ -22,6 +22,7 @@ import { distinctUntilChanged, map } from 'rxjs/operators'; import { DossiersDialogService } from '../../../services/dossiers-dialog.service'; import { AppStateService } from '@state/app-state.service'; import { FilesService } from '@services/entity-services/files.service'; +import { FileManagementService } from '../../../shared/services/file-management.service'; interface FileListItem extends IFile, IListable { readonly canRestore: boolean; @@ -55,7 +56,7 @@ export class EditDossierDeletedDocumentsComponent extends ListingComponent { const fileIds = files.map(f => f.fileId); - await this._fileManagementController.restoreFiles(fileIds, this.dossier.id).toPromise(); + await this._fileManagementService.restore(fileIds, this.dossier.id).toPromise(); this._removeFromList(fileIds); await this._appStateService.reloadActiveDossierFiles(); this.updateDossier.emit(); @@ -121,7 +122,7 @@ export class EditDossierDeletedDocumentsComponent extends ListingComponent f.fileId); - await this._fileManagementController.hardDeleteFile(this.dossier.id, fileIds).toPromise(); + await this._fileManagementService.hardDelete(this.dossier.id, fileIds).toPromise(); this._removeFromList(fileIds); this.updateDossier.emit(); } 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 9b18601e5..341aed718 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,11 @@ import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; -import { DownloadFileType, ReportTemplate, ReportTemplateControllerService } from '@redaction/red-ui-http'; +import { DownloadFileType, ReportTemplate } from '@redaction/red-ui-http'; import { FormBuilder, FormGroup } from '@angular/forms'; import { Dossier } from '@state/model/dossier'; import { EditDossierSectionInterface } from '../edit-dossier-section.interface'; import { downloadTypesTranslations } from '../../../../../translations/download-types-translations'; import { DossiersService } from '@services/entity-services/dossiers.service'; +import { ReportTemplateService } from '@services/report-template.service'; @Component({ selector: 'redaction-edit-dossier-download-package', @@ -24,7 +25,7 @@ export class EditDossierDownloadPackageComponent implements OnInit, EditDossierS constructor( private readonly _dossiersService: DossiersService, - private readonly _reportTemplateController: ReportTemplateControllerService, + private readonly _reportTemplateController: ReportTemplateService, private readonly _formBuilder: FormBuilder, ) {} diff --git a/apps/red-ui/src/app/modules/dossier/dossiers.module.ts b/apps/red-ui/src/app/modules/dossier/dossiers.module.ts index b6fd63572..4a1007320 100644 --- a/apps/red-ui/src/app/modules/dossier/dossiers.module.ts +++ b/apps/red-ui/src/app/modules/dossier/dossiers.module.ts @@ -39,6 +39,7 @@ import { AnnotationsListComponent } from './components/file-workload/components/ import { AnnotationSourceComponent } from './components/file-workload/components/annotation-source/annotation-source.component'; import { OverlayModule } from '@angular/cdk/overlay'; import { SharedDossiersModule } from './shared/shared-dossiers.module'; +import { PlatformSearchService } from './shared/services/platform-search.service'; const screens = [FilePreviewScreenComponent, SearchScreenComponent]; @@ -84,6 +85,7 @@ const services = [ PdfViewerDataService, AnnotationDrawService, AnnotationProcessingService, + PlatformSearchService, ]; @NgModule({ diff --git a/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/components/bulk-actions/dossier-overview-bulk-actions.component.ts b/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/components/bulk-actions/dossier-overview-bulk-actions.component.ts index 101d03029..6e79c4ba3 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/components/bulk-actions/dossier-overview-bulk-actions.component.ts +++ b/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/components/bulk-actions/dossier-overview-bulk-actions.component.ts @@ -1,6 +1,5 @@ import { Component, EventEmitter, Input, Output } from '@angular/core'; import { AppStateService } from '@state/app-state.service'; -import { FileManagementControllerService, ReanalysisControllerService } from '@redaction/red-ui-http'; import { PermissionsService } from '@services/permissions.service'; import { File } from '@models/file/file'; import { FileActionService } from '../../../../shared/services/file-action.service'; @@ -10,8 +9,10 @@ import { CircleButtonTypes, ConfirmationDialogInput, ListingService, LoadingServ import { TranslateService } from '@ngx-translate/core'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { Dossier } from '@state/model/dossier'; -import { LongPressEvent } from '../../../../../shared/directives/long-press.directive'; -import { UserPreferenceService } from '../../../../../../services/user-preference.service'; +import { LongPressEvent } from '@shared/directives/long-press.directive'; +import { UserPreferenceService } from '@services/user-preference.service'; +import { FileManagementService } from '../../../../shared/services/file-management.service'; +import { ReanalysisService } from '@services/reanalysis.service'; @Component({ selector: 'redaction-dossier-overview-bulk-actions', @@ -29,8 +30,8 @@ export class DossierOverviewBulkActionsComponent { constructor( private readonly _appStateService: AppStateService, private readonly _dialogService: DossiersDialogService, - private readonly _fileManagementControllerService: FileManagementControllerService, - private readonly _reanalysisControllerService: ReanalysisControllerService, + private readonly _fileManagementService: FileManagementService, + private readonly _reanalysisService: ReanalysisService, private readonly _permissionsService: PermissionsService, private readonly _fileActionService: FileActionService, private readonly _loadingService: LoadingService, @@ -134,8 +135,8 @@ export class DossierOverviewBulkActionsComponent { }), async () => { this._loadingService.start(); - await this._fileManagementControllerService - .deleteFiles( + await this._fileManagementService + .delete( this.selectedFiles.map(item => item.fileId), this.dossier.dossierId, ) @@ -158,7 +159,7 @@ export class DossierOverviewBulkActionsComponent { reanalyse() { const fileIds = this.selectedFiles.filter(file => file.analysisRequired).map(file => file.fileId); - this._performBulkAction(this._reanalysisControllerService.reanalyzeFilesForDossier(fileIds, this.dossier.id)); + this._performBulkAction(this._reanalysisService.reanalyzeFilesForDossier(fileIds, this.dossier.id)); } ocr() { diff --git a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/file-preview-screen.component.ts b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/file-preview-screen.component.ts index c4b0a10e0..334ab7739 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/file-preview-screen.component.ts +++ b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/file-preview-screen.component.ts @@ -28,7 +28,7 @@ import { PermissionsService } from '@services/permissions.service'; import { timer } from 'rxjs'; import { UserPreferenceService } from '@services/user-preference.service'; import { UserService } from '@services/user.service'; -import { FileManagementControllerService, FileStatus, List } from '@redaction/red-ui-http'; +import { FileStatus, List } from '@redaction/red-ui-http'; import { PdfViewerDataService } from '../../services/pdf-viewer-data.service'; import { download } from '@utils/file-download-utils'; import { ViewMode } from '@models/file/view-mode'; @@ -44,6 +44,7 @@ import { User } from '@models/user'; import { FilesService } from '@services/entity-services/files.service'; import { DossiersService } from '@services/entity-services/dossiers.service'; import { Dossier } from '@state/model/dossier'; +import { FileManagementService } from '../../shared/services/file-management.service'; import Annotation = Core.Annotations.Annotation; const ALL_HOTKEY_ARRAY = ['Escape', 'F', 'f']; @@ -99,7 +100,7 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni private readonly _fileDownloadService: PdfViewerDataService, private readonly _filesService: FilesService, private readonly _ngZone: NgZone, - private readonly _fileManagementControllerService: FileManagementControllerService, + private readonly _fileManagementService: FileManagementService, private readonly _loadingService: LoadingService, private readonly _filterService: FilterService, private readonly _translateService: TranslateService, @@ -515,8 +516,8 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni } downloadOriginalFile() { - this.addSubscription = this._fileManagementControllerService - .downloadOriginalFile(this.fileData.file.dossierId, this.fileId, true, this.fileData.file.cacheIdentifier, 'response') + this.addSubscription = this._fileManagementService + .downloadOriginalFile(this.fileData.file.dossierId, this.fileId, 'response', true, this.fileData.file.cacheIdentifier) .subscribe(data => { download(data, this.fileData.file.filename); }); diff --git a/apps/red-ui/src/app/modules/dossier/screens/search-screen/search-screen.component.ts b/apps/red-ui/src/app/modules/dossier/screens/search-screen/search-screen.component.ts index a941e78b5..bf133e511 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/search-screen/search-screen.component.ts +++ b/apps/red-ui/src/app/modules/dossier/screens/search-screen/search-screen.component.ts @@ -9,7 +9,7 @@ import { SearchPositions, TableColumnConfig, } from '@iqser/common-ui'; -import { List, MatchedDocument, SearchControllerService, SearchResult } from '@redaction/red-ui-http'; +import { List, MatchedDocument, SearchResult } from '@redaction/red-ui-http'; import { BehaviorSubject, Observable } from 'rxjs'; import { debounceTime, map, skip, switchMap, tap } from 'rxjs/operators'; import { ActivatedRoute, Router } from '@angular/router'; @@ -18,6 +18,7 @@ import { fileStatusTranslations } from '../../translations/file-status-translati import { TranslateService } from '@ngx-translate/core'; import { RouterHistoryService } from '@services/router-history.service'; import { DossiersService } from '@services/entity-services/dossiers.service'; +import { PlatformSearchService } from '../../shared/services/platform-search.service'; interface ListItem extends IListable { readonly dossierId: string; @@ -69,7 +70,7 @@ export class SearchScreenComponent extends ListingComponent implements private readonly _dossiersService: DossiersService, readonly routerHistoryService: RouterHistoryService, private readonly _translateService: TranslateService, - private readonly _searchControllerService: SearchControllerService, + private readonly _platformSearchService: PlatformSearchService, ) { super(_injector); this.searchService.skip = true; @@ -108,7 +109,7 @@ export class SearchScreenComponent extends ListingComponent implements } private _search(searchInput: SearchInput): Observable { - return this._searchControllerService.search({ + return this._platformSearchService.search({ dossierIds: [...searchInput.dossierIds], queryString: searchInput.query ?? '', page: 1, diff --git a/apps/red-ui/src/app/modules/dossier/services/annotation-actions.service.ts b/apps/red-ui/src/app/modules/dossier/services/annotation-actions.service.ts index 52978a165..291f42c10 100644 --- a/apps/red-ui/src/app/modules/dossier/services/annotation-actions.service.ts +++ b/apps/red-ui/src/app/modules/dossier/services/annotation-actions.service.ts @@ -29,7 +29,7 @@ export class AnnotationActionsService { $event?.stopPropagation(); annotations.forEach(annotation => { this._processObsAndEmit( - this._manualAnnotationService.approveRequest(annotation.id, annotation.isModifyDictionary), + this._manualAnnotationService.approve(annotation.id, annotation.isModifyDictionary), annotation, annotationsChanged, ); @@ -47,7 +47,7 @@ export class AnnotationActionsService { this._dialogService.openDialog('forceRedaction', $event, null, (request: ForceRedactionRequest) => { annotations.forEach(annotation => { this._processObsAndEmit( - this._manualAnnotationService.forceRedaction({ + this._manualAnnotationService.force({ ...request, annotationId: annotation.id, }), @@ -98,7 +98,7 @@ export class AnnotationActionsService { this._dialogService.openDialog('recategorizeImage', $event, annotations, (data: { type: string; comment: string }) => { annotations.forEach(annotation => { this._processObsAndEmit( - this._manualAnnotationService.recategorizeImage(annotation.annotationId, data.type, data.comment), + this._manualAnnotationService.recategorizeImg(annotation.annotationId, data.type, data.comment), annotation, annotationsChanged, ); diff --git a/apps/red-ui/src/app/modules/dossier/services/annotation-draw.service.ts b/apps/red-ui/src/app/modules/dossier/services/annotation-draw.service.ts index 81e255a68..b21a14aa0 100644 --- a/apps/red-ui/src/app/modules/dossier/services/annotation-draw.service.ts +++ b/apps/red-ui/src/app/modules/dossier/services/annotation-draw.service.ts @@ -1,11 +1,12 @@ import { Injectable } from '@angular/core'; import { Core, WebViewerInstance } from '@pdftron/webviewer'; -import { Rectangle, RedactionLogControllerService, SectionGrid, SectionRectangle } from '@redaction/red-ui-http'; +import { Rectangle, SectionGrid, SectionRectangle } from '@redaction/red-ui-http'; import { hexToRgb } from '@utils/functions'; import { AppStateService } from '@state/app-state.service'; import { AnnotationWrapper } from '@models/file/annotation.wrapper'; import { UserPreferenceService } from '@services/user-preference.service'; import { DossiersService } from '@services/entity-services/dossiers.service'; +import { RedactionLogService } from './redaction-log.service'; import Annotation = Core.Annotations.Annotation; @Injectable() @@ -13,7 +14,7 @@ export class AnnotationDrawService { constructor( private readonly _appStateService: AppStateService, private readonly _dossiersService: DossiersService, - private readonly _redactionLogControllerService: RedactionLogControllerService, + private readonly _redactionLogService: RedactionLogService, private readonly _userPreferenceService: UserPreferenceService, ) {} @@ -29,7 +30,7 @@ export class AnnotationDrawService { annotationManager.drawAnnotationsFromList(annotations); if (this._userPreferenceService.areDevFeaturesEnabled) { - this._redactionLogControllerService + this._redactionLogService .getSectionGrid(this._dossiersService.activeDossierId, this._appStateService.activeFileId) .subscribe(sectionGrid => { this._drawSections(activeViewer, sectionGrid); diff --git a/apps/red-ui/src/app/modules/dossier/services/manual-annotation.service.ts b/apps/red-ui/src/app/modules/dossier/services/manual-annotation.service.ts index e5d4f5299..a3ac0dac7 100644 --- a/apps/red-ui/src/app/modules/dossier/services/manual-annotation.service.ts +++ b/apps/red-ui/src/app/modules/dossier/services/manual-annotation.service.ts @@ -1,8 +1,17 @@ -import { Injectable } from '@angular/core'; +import { Injectable, Injector } from '@angular/core'; import { AppStateService } from '@state/app-state.service'; -import { AddRedactionRequest, ForceRedactionRequest, ManualRedactionControllerService } from '@redaction/red-ui-http'; +import { + AddRedactionRequest, + ApproveRequest, + CommentResponse, + ForceRedactionRequest, + ImageRecategorizationRequest, + LegalBasisChangeRequest, + ManualAddResponse, + RemoveRedactionRequest, +} from '@redaction/red-ui-http'; import { AnnotationWrapper } from '@models/file/annotation.wrapper'; -import { ErrorMessageService, Toaster } from '@iqser/common-ui'; +import { ErrorMessageService, GenericService, RequiredParam, Toaster, Validate } from '@iqser/common-ui'; import { TranslateService } from '@ngx-translate/core'; import { tap } from 'rxjs/operators'; import { UserService } from '@services/user.service'; @@ -13,7 +22,7 @@ import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { DossiersService } from '@services/entity-services/dossiers.service'; @Injectable() -export class ManualAnnotationService { +export class ManualAnnotationService extends GenericService { CONFIG: { [key in AnnotationActionMode]: string; }; @@ -24,10 +33,11 @@ export class ManualAnnotationService { private readonly _userService: UserService, private readonly _translateService: TranslateService, private readonly _toaster: Toaster, - private readonly _manualRedactionControllerService: ManualRedactionControllerService, private readonly _permissionsService: PermissionsService, private readonly _errorMessageService: ErrorMessageService, + protected readonly _injector: Injector, ) { + super(_injector, 'manualRedaction'); this.CONFIG = { add: 'addRedaction', 'recategorize-image': 'recategorizeImage', @@ -47,17 +57,8 @@ export class ManualAnnotationService { _makeRequest(mode: AnnotationActionMode, body: any, secondParam: any = null, modifyDictionary = false) { const obs = !secondParam - ? this._manualRedactionControllerService[this.CONFIG[mode]]( - body, - this._dossiersService.activeDossierId, - this._appStateService.activeFileId, - ) - : this._manualRedactionControllerService[this.CONFIG[mode]]( - body, - secondParam, - this._dossiersService.activeDossierId, - this._appStateService.activeFileId, - ); + ? this[this.CONFIG[mode]](body, this._dossiersService.activeDossierId, this._appStateService.activeFileId) + : this[this.CONFIG[mode]](body, secondParam, this._dossiersService.activeDossierId, this._appStateService.activeFileId); return obs.pipe( tap( @@ -72,25 +73,26 @@ export class ManualAnnotationService { ); } - // Comments - // this wraps /manualRedaction/comment/add - addComment(comment: string, annotationId: string) { - return this._manualRedactionControllerService.addComment( - { text: comment }, - annotationId, - this._dossiersService.activeDossierId, - this._appStateService.activeFileId, - ); + @Validate() + addComment( + @RequiredParam() comment: string, + @RequiredParam() annotationId: string, + dossierId = this._dossiersService.activeDossierId, + fileId = this._appStateService.activeFileId, + ) { + const url = `${this._defaultModelPath}/comment/add/${dossierId}/${fileId}/${annotationId}`; + return this._post({ text: comment }, url); } - // this wraps /manualRedaction/comment/undo - deleteComment(commentId: string, annotationId: string) { - return this._manualRedactionControllerService.undoComment( - annotationId, - commentId, - this._dossiersService.activeDossierId, - this._appStateService.activeFileId, - ); + @Validate() + deleteComment( + @RequiredParam() commentId: string, + @RequiredParam() annotationId: string, + dossierId = this._dossiersService.activeDossierId, + fileId = this._appStateService.activeFileId, + ) { + const url = `${this._defaultModelPath}/comment/undo/${dossierId}/${fileId}/${annotationId}/${commentId}`; + return super.delete({}, url); } addRecommendation(annotation: AnnotationWrapper) { @@ -116,7 +118,7 @@ export class ManualAnnotationService { // this wraps // /manualRedaction/redaction/recategorize // /manualRedaction/request/recategorize - recategorizeImage(annotationId: string, type: string, comment: string) { + recategorizeImg(annotationId: string, type: string, comment: string) { const mode: AnnotationActionMode = this._permissionsService.isApprover() ? 'recategorize-image' : 'request-image-recategorization'; return this._makeRequest(mode, { annotationId, type, comment }); } @@ -132,14 +134,14 @@ export class ManualAnnotationService { // this wraps // /manualRedaction/redaction/force // /manualRedaction/request/force - forceRedaction(request: ForceRedactionRequest) { + force(request: ForceRedactionRequest) { const mode: AnnotationActionMode = this._permissionsService.isApprover() ? 'force-redaction' : 'request-force-redaction'; return this._makeRequest(mode, request); } // this wraps // /manualRedaction/approve - approveRequest(annotationId: string, addToDictionary: boolean = false) { + approve(annotationId: string, addToDictionary: boolean = false) { // for only here - approve the request return this._makeRequest('approve', { addOrRemoveFromDictionary: addToDictionary }, annotationId, addToDictionary); } @@ -213,6 +215,109 @@ export class ManualAnnotationService { } } + @Validate() + addRedaction(@RequiredParam() body: AddRedactionRequest, @RequiredParam() dossierId: string, @RequiredParam() fileId: string) { + const url = `${this._defaultModelPath}/redaction/add/${dossierId}/${fileId}`; + return this._post(body, url); + } + + @Validate() + recategorizeImage( + @RequiredParam() body: ImageRecategorizationRequest, + @RequiredParam() dossierId: string, + @RequiredParam() fileId: string, + ) { + const url = `${this._defaultModelPath}/redaction/recategorize/${dossierId}/${fileId}`; + return this._post(body, url); + } + + @Validate() + requestImageRecategorization( + @RequiredParam() body: ImageRecategorizationRequest, + @RequiredParam() dossierId: string, + @RequiredParam() fileId: string, + ) { + const url = `${this._defaultModelPath}/request/recategorize/${dossierId}/${fileId}`; + return this._post(body, url); + } + + @Validate() + legalBasisChange(@RequiredParam() body: LegalBasisChangeRequest, @RequiredParam() dossierId: string, @RequiredParam() fileId: string) { + const url = `${this._defaultModelPath}/redaction/legalBasisChange/${dossierId}/${fileId}`; + return this._post(body, url); + } + + @Validate() + requestLegalBasisChange( + @RequiredParam() body: LegalBasisChangeRequest, + @RequiredParam() dossierId: string, + @RequiredParam() fileId: string, + ) { + const url = `${this._defaultModelPath}/request/legalBasis/${dossierId}/${fileId}`; + return this._post(body, url); + } + + @Validate() + requestRemoveRedaction( + @RequiredParam() body: RemoveRedactionRequest, + @RequiredParam() dossierId: string, + @RequiredParam() fileId: string, + ) { + const url = `${this._defaultModelPath}/request/remove/${dossierId}/${fileId}`; + return this._post(body, url); + } + + @Validate() + approveRequest( + @RequiredParam() body: ApproveRequest, + @RequiredParam() annotationId: string, + @RequiredParam() dossierId: string, + @RequiredParam() fileId: string, + ) { + const url = `${this._defaultModelPath}/approve/${dossierId}/${fileId}`; + return this._post(body, url); + } + + @Validate() + declineRequest(@RequiredParam() annotationId: string, @RequiredParam() dossierId: string, @RequiredParam() fileId: string) { + const url = `${this._defaultModelPath}/decline/${dossierId}/${fileId}/${annotationId}`; + return this._post({}, url); + } + + @Validate() + undo(@RequiredParam() annotationId: string, @RequiredParam() dossierId: string, @RequiredParam() fileId: string) { + const url = `${this._defaultModelPath}/undo/${dossierId}/${fileId}/${annotationId}`; + return super.delete({}, url); + } + + @Validate() + removeRedaction(@RequiredParam() body: RemoveRedactionRequest, @RequiredParam() dossierId: string, @RequiredParam() fileId: string) { + const url = `${this._defaultModelPath}/redaction/remove/${dossierId}/${fileId}`; + return this._post(body, url); + } + + @Validate() + requestAddRedaction(@RequiredParam() body: AddRedactionRequest, @RequiredParam() dossierId: string, @RequiredParam() fileId: string) { + const url = `${this._defaultModelPath}/request/add/${dossierId}/${fileId}`; + return this._post(body, url); + } + + @Validate() + forceRedaction(@RequiredParam() body: ForceRedactionRequest, @RequiredParam() dossierId: string, @RequiredParam() fileId: string) { + const url = `${this._defaultModelPath}/redaction/force/${dossierId}/${fileId}`; + return this._post(body, url); + } + + @Validate() + requestForceRedaction( + @RequiredParam() body: ForceRedactionRequest, + @RequiredParam() dossierId: string, + @RequiredParam() fileId: string, + ) { + const url = `${this._defaultModelPath}/request/force/${dossierId}/${fileId}`; + return this._post(body, url); + } + private _getMessage(mode: AnnotationActionMode, modifyDictionary?: boolean, error: boolean = false) { const type = modifyDictionary ? 'dictionary' : 'manual-redaction'; const resultType = error ? 'error' : 'success'; diff --git a/apps/red-ui/src/app/modules/dossier/services/pdf-viewer-data.service.ts b/apps/red-ui/src/app/modules/dossier/services/pdf-viewer-data.service.ts index c49be6c66..7578d2573 100644 --- a/apps/red-ui/src/app/modules/dossier/services/pdf-viewer-data.service.ts +++ b/apps/red-ui/src/app/modules/dossier/services/pdf-viewer-data.service.ts @@ -1,17 +1,14 @@ import { Injectable } from '@angular/core'; import { forkJoin, Observable, of } from 'rxjs'; import { catchError, map, tap } from 'rxjs/operators'; -import { - FileManagementControllerService, - ManualRedactionControllerService, - RedactionLogControllerService, - ViewedPagesControllerService, -} from '@redaction/red-ui-http'; import { FileDataModel } from '@models/file/file-data.model'; import { AppStateService } from '@state/app-state.service'; import { PermissionsService } from '@services/permissions.service'; import { File } from '@models/file/file'; import { DossiersService } from '@services/entity-services/dossiers.service'; +import { FileManagementService } from '../shared/services/file-management.service'; +import { RedactionLogService } from './redaction-log.service'; +import { ViewedPagesService } from '../shared/services/viewed-pages.service'; @Injectable() export class PdfViewerDataService { @@ -19,21 +16,18 @@ export class PdfViewerDataService { private readonly _appStateService: AppStateService, private readonly _dossiersService: DossiersService, private readonly _permissionsService: PermissionsService, - private readonly _man: ManualRedactionControllerService, - private readonly _fileManagementControllerService: FileManagementControllerService, - private readonly _redactionLogControllerService: RedactionLogControllerService, - private readonly _viewedPagesControllerService: ViewedPagesControllerService, + private readonly _fileManagementService: FileManagementService, + private readonly _redactionLogService: RedactionLogService, + private readonly _viewedPagesService: ViewedPagesService, ) {} loadActiveFileRedactionLog() { - return this._redactionLogControllerService - .getRedactionLog(this._dossiersService.activeDossierId, this._appStateService.activeFileId) - .pipe( - tap( - redactionLog => redactionLog.redactionLogEntry.sort((a, b) => a.positions[0].page - b.positions[0].page), - catchError(() => of({})), - ), - ); + return this._redactionLogService.getRedactionLog(this._dossiersService.activeDossierId, this._appStateService.activeFileId).pipe( + tap( + redactionLog => redactionLog.redactionLogEntry.sort((a, b) => a.positions[0].page - b.positions[0].page), + catchError(() => of({})), + ), + ); } loadActiveFileData(): Observable { @@ -48,7 +42,7 @@ export class PdfViewerDataService { getViewedPagesForActiveFile() { if (this._permissionsService.canMarkPagesAsViewed()) { - return this._viewedPagesControllerService + return this._viewedPagesService .getViewedPages(this._dossiersService.activeDossierId, this._appStateService.activeFileId) .pipe(catchError(() => of({ pages: [] }))); } @@ -56,6 +50,6 @@ export class PdfViewerDataService { } downloadOriginalFile(file: File): Observable { - return this._fileManagementControllerService.downloadOriginalFile(file.dossierId, file.fileId, true, file.cacheIdentifier, 'body'); + return this._fileManagementService.downloadOriginalFile(file.dossierId, file.fileId, 'body', true, file.cacheIdentifier); } } diff --git a/apps/red-ui/src/app/modules/dossier/services/redaction-log.service.ts b/apps/red-ui/src/app/modules/dossier/services/redaction-log.service.ts new file mode 100644 index 000000000..b90b0c456 --- /dev/null +++ b/apps/red-ui/src/app/modules/dossier/services/redaction-log.service.ts @@ -0,0 +1,27 @@ +import { Injectable, Injector } from '@angular/core'; +import { GenericService, QueryParam, RequiredParam, Validate } from '@iqser/common-ui'; +import { RedactionLog, SectionGrid } from '@redaction/red-ui-http'; + +@Injectable({ + providedIn: 'root', +}) +export class RedactionLogService extends GenericService { + constructor(protected readonly _injector: Injector) { + super(_injector, ''); + } + + @Validate() + getRedactionLog(@RequiredParam() dossierId: string, @RequiredParam() fileId: string, withManualRedactions?: boolean) { + const queryParams: QueryParam[] = []; + if (withManualRedactions) { + queryParams.push({ key: 'withManualRedactions', value: withManualRedactions }); + } + + return this._getOne([dossierId, fileId], 'redactionLog', queryParams); + } + + @Validate() + getSectionGrid(@RequiredParam() dossierId: string, @RequiredParam() fileId: string) { + return this._getOne([dossierId, fileId], 'sectionGrid'); + } +} 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 d0e1c506a..294e55f14 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 @@ -13,7 +13,7 @@ import { StatusBarConfig, Toaster, } from '@iqser/common-ui'; -import { FileManagementControllerService, FileStatus } from '@redaction/red-ui-http'; +import { FileStatus } from '@redaction/red-ui-http'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { UserService } from '@services/user.service'; import { filter } from 'rxjs/operators'; @@ -21,6 +21,7 @@ import { UserPreferenceService } from '@services/user-preference.service'; import { LongPressEvent } from '@shared/directives/long-press.directive'; import { FileActionService } from '../../services/file-action.service'; import { DossiersService } from '@services/entity-services/dossiers.service'; +import { FileManagementService } from '../../services/file-management.service'; @Component({ selector: 'redaction-file-actions', @@ -66,7 +67,7 @@ export class FileActionsComponent extends AutoUnsubscribe implements OnInit, OnD private readonly _dialogService: DossiersDialogService, private readonly _fileActionService: FileActionService, private readonly _loadingService: LoadingService, - private readonly _fileManagementControllerService: FileManagementControllerService, + private readonly _fileManagementService: FileManagementService, private readonly _userService: UserService, private readonly _toaster: Toaster, private readonly _userPreferenceService: UserPreferenceService, @@ -135,8 +136,8 @@ export class FileActionsComponent extends AutoUnsubscribe implements OnInit, OnD }), async () => { this._loadingService.start(); - await this._fileManagementControllerService - .deleteFiles([this.file.fileId], this.file.dossierId) + await this._fileManagementService + .delete([this.file.fileId], this.file.dossierId) .toPromise() .catch(error => { this._toaster.error(_('error.http.generic'), { params: error }); diff --git a/apps/red-ui/src/app/modules/dossier/shared/services/file-action.service.ts b/apps/red-ui/src/app/modules/dossier/shared/services/file-action.service.ts index cbcbfb73f..21ab6dcd3 100644 --- a/apps/red-ui/src/app/modules/dossier/shared/services/file-action.service.ts +++ b/apps/red-ui/src/app/modules/dossier/shared/services/file-action.service.ts @@ -1,7 +1,6 @@ import { Injectable } from '@angular/core'; import { AppStateService } from '@state/app-state.service'; import { UserService } from '@services/user.service'; -import { ReanalysisControllerService } from '@redaction/red-ui-http'; import { File } from '@models/file/file'; import { PermissionsService } from '@services/permissions.service'; import { DossiersDialogService } from '../../services/dossiers-dialog.service'; @@ -9,6 +8,7 @@ import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { FilesService } from '@services/entity-services/files.service'; import { ConfirmationDialogInput } from '@iqser/common-ui'; import { DossiersService } from '@services/entity-services/dossiers.service'; +import { ReanalysisService } from '@services/reanalysis.service'; @Injectable() export class FileActionService { @@ -17,17 +17,17 @@ export class FileActionService { private readonly _permissionsService: PermissionsService, private readonly _userService: UserService, private readonly _fileService: FilesService, - private readonly _reanalysisControllerService: ReanalysisControllerService, + private readonly _reanalysisService: ReanalysisService, private readonly _appStateService: AppStateService, private readonly _dossiersService: DossiersService, ) {} reanalyseFile(file = this._appStateService.activeFile) { - return this._reanalysisControllerService.reanalyzeFile(this._dossiersService.activeDossier.id, file.fileId, true); + return this._reanalysisService.reanalyzeFilesForDossier([file.fileId], this._dossiersService.activeDossier.id, true); } toggleAnalysis(file = this._appStateService.activeFile) { - return this._reanalysisControllerService.toggleAnalysis(file.dossierId, file.fileId, !file.excluded); + return this._reanalysisService.toggleAnalysis(file.dossierId, file.fileId, !file.excluded); } async assignToMe(files?: File[], callback?: Function) { @@ -78,7 +78,7 @@ export class FileActionService { } ocrFiles(files: File[]) { - return this._reanalysisControllerService.ocrFiles( + return this._reanalysisService.ocrFiles( files.map(f => f.fileId), this._dossiersService.activeDossierId, ); diff --git a/apps/red-ui/src/app/modules/dossier/shared/services/file-management.service.ts b/apps/red-ui/src/app/modules/dossier/shared/services/file-management.service.ts new file mode 100644 index 000000000..7197f8d35 --- /dev/null +++ b/apps/red-ui/src/app/modules/dossier/shared/services/file-management.service.ts @@ -0,0 +1,69 @@ +import { GenericService, List, QueryParam, RequiredParam, Validate } from '@iqser/common-ui'; +import { Injectable, Injector } from '@angular/core'; +import { HeadersConfiguration } from '../../../../../../../../libs/common-ui/src/lib/utils/headers-configuration'; +import { HttpHeaders, HttpResponse } from '@angular/common/http'; +import { Observable } from 'rxjs'; + +@Injectable({ + providedIn: 'root', +}) +export class FileManagementService extends GenericService { + constructor(protected readonly _injector: Injector) { + super(_injector, ''); + } + + @Validate() + delete(@RequiredParam() body: List, @RequiredParam() dossierId: string) { + return super._post(body, `delete/${dossierId}`); + } + + @Validate() + hardDelete(@RequiredParam() dossierId: string, @RequiredParam() fileIds: List) { + const queryParams = fileIds.map(id => ({ key: 'fileIds', value: id })); + return super.delete({}, `delete/hard-delete/${dossierId}`, queryParams); + } + + @Validate() + restore(@RequiredParam() body: List, @RequiredParam() dossierId: string) { + return this._post(body, `delete/restore/${dossierId}`); + } + + downloadOriginalFile(dossierId: string, fileId: string, observe?: 'body', inline?: boolean, indicator?: string): Observable; + downloadOriginalFile( + dossierId: string, + fileId: string, + observe?: 'response', + inline?: boolean, + indicator?: string, + ): Observable>; + @Validate() + downloadOriginalFile( + @RequiredParam() dossierId: string, + @RequiredParam() fileId: string, + observe: 'body' | 'response' = 'body', + inline?: boolean, + indicator?: string, + ) { + const queryParams: QueryParam[] = []; + if (inline) { + queryParams.push({ key: 'inline', value: inline }); + } + + if (indicator) { + queryParams.push({ key: 'indicator', value: indicator }); + } + + let headers = new HttpHeaders(); + const httpHeaderAcceptSelected = HeadersConfiguration.selectHeaderAccept(['*/*']); + if (httpHeaderAcceptSelected !== undefined) { + headers = headers.set('Accept', httpHeaderAcceptSelected); + } + + return this._http.request('get', `/download/original/${encodeURIComponent(dossierId)}/${encodeURIComponent(fileId)}`, { + responseType: 'blob', + params: this._queryParams(queryParams), + headers: headers, + observe: observe, + }); + } +} diff --git a/apps/red-ui/src/app/modules/dossier/shared/services/platform-search.service.ts b/apps/red-ui/src/app/modules/dossier/shared/services/platform-search.service.ts new file mode 100644 index 000000000..ff8f8a55c --- /dev/null +++ b/apps/red-ui/src/app/modules/dossier/shared/services/platform-search.service.ts @@ -0,0 +1,14 @@ +import { Injectable, Injector } from '@angular/core'; +import { GenericService } from '@iqser/common-ui'; +import { SearchRequest, SearchResult } from '@redaction/red-ui-http'; + +@Injectable() +export class PlatformSearchService extends GenericService { + constructor(protected readonly _injector: Injector) { + super(_injector, 'search'); + } + + search(body: SearchRequest) { + return this._post(body); + } +} diff --git a/apps/red-ui/src/app/modules/dossier/shared/services/viewed-pages.service.ts b/apps/red-ui/src/app/modules/dossier/shared/services/viewed-pages.service.ts new file mode 100644 index 000000000..43a2e31fa --- /dev/null +++ b/apps/red-ui/src/app/modules/dossier/shared/services/viewed-pages.service.ts @@ -0,0 +1,27 @@ +import { Injectable, Injector } from '@angular/core'; +import { GenericService, RequiredParam, Validate } from '@iqser/common-ui'; +import { ViewedPages, ViewedPagesRequest } from '@redaction/red-ui-http'; + +@Injectable({ + providedIn: 'root', +}) +export class ViewedPagesService extends GenericService { + constructor(protected readonly _injector: Injector) { + super(_injector, 'viewedPages'); + } + + @Validate() + addPage(@RequiredParam() body: ViewedPagesRequest, @RequiredParam() dossierId: string, @RequiredParam() fileId: string) { + return this._post(body, `${this._defaultModelPath}/${dossierId}/${fileId}`); + } + + @Validate() + removePage(@RequiredParam() dossierId: string, @RequiredParam() fileId: string, @RequiredParam() page: number) { + return super.delete({}, `${this._defaultModelPath}/${dossierId}/${fileId}/${page}`); + } + + @Validate() + getViewedPages(@RequiredParam() dossierId: string, @RequiredParam() fileId: string) { + return this._getOne([dossierId, fileId]); + } +} diff --git a/apps/red-ui/src/app/modules/upload-download/services/file-upload.service.ts b/apps/red-ui/src/app/modules/upload-download/services/file-upload.service.ts index e2299262f..e6908b7f0 100644 --- a/apps/red-ui/src/app/modules/upload-download/services/file-upload.service.ts +++ b/apps/red-ui/src/app/modules/upload-download/services/file-upload.service.ts @@ -1,4 +1,4 @@ -import { ApplicationRef, Injectable } from '@angular/core'; +import { ApplicationRef, Injectable, Injector } from '@angular/core'; import { FileUploadModel } from '../model/file-upload.model'; import { AppStateService } from '@state/app-state.service'; import { HttpErrorResponse, HttpEventType } from '@angular/common/http'; @@ -6,10 +6,11 @@ import { interval, Subscription } from 'rxjs'; import { ConfigService } from '@services/config.service'; import { TranslateService } from '@ngx-translate/core'; import { UploadDownloadDialogService } from './upload-download-dialog.service'; -import { UploadControllerService } from '@redaction/red-ui-http'; +import { FileUploadResult } from '@redaction/red-ui-http'; import { isCsv } from '@utils/file-drop-utils'; -import { ErrorMessageService } from '@iqser/common-ui'; +import { ErrorMessageService, GenericService, RequiredParam, Validate } from '@iqser/common-ui'; import { DossiersService } from '@services/entity-services/dossiers.service'; +import { HeadersConfiguration } from '../../../../../../../libs/common-ui/src/lib/utils/headers-configuration'; export interface ActiveUpload { subscription: Subscription; @@ -17,7 +18,7 @@ export interface ActiveUpload { } @Injectable() -export class FileUploadService { +export class FileUploadService extends GenericService { static readonly MAX_PARALLEL_UPLOADS = 5; files: FileUploadModel[] = []; groupedFiles: { [key: string]: FileUploadModel[] } = {}; @@ -32,11 +33,11 @@ export class FileUploadService { private readonly _applicationRef: ApplicationRef, private readonly _translateService: TranslateService, private readonly _configService: ConfigService, - private readonly _uploadControllerService: UploadControllerService, private readonly _dialogService: UploadDownloadDialogService, private readonly _errorMessageService: ErrorMessageService, + protected readonly _injector: Injector, ) { - this._uploadControllerService.defaultHeaders = this._uploadControllerService.defaultHeaders.append('ngsw-bypass', 'true'); + super(_injector, 'upload'); interval(2500).subscribe(() => { this._handleUploads(); }); @@ -120,6 +121,23 @@ export class FileUploadService { } } + @Validate() + uploadFileForm(@RequiredParam() dossierId: string, file?: Blob) { + const formParams = new FormData(); + + if (file !== undefined) { + formParams.append('file', file); + } + + const headers = HeadersConfiguration.getHeaders({ contentType: false }).append('ngsw-bypass', 'true'); + + return this._http.post(`/${this._defaultModelPath}/${dossierId}`, formParams, { + headers, + observe: 'events', + reportProgress: true, + }); + } + private _addFileToGroup(file: FileUploadModel) { if (!this.groupedFiles[file.dossierId]) { this.groupedFiles[file.dossierId] = []; @@ -155,7 +173,7 @@ export class FileUploadService { private _createSubscription(uploadFile: FileUploadModel) { this.activeUploads++; - const obs = this._uploadControllerService.uploadFileForm(uploadFile.dossierId, uploadFile.file, 'events', true); + const obs = this.uploadFileForm(uploadFile.dossierId, uploadFile.file); return obs.subscribe( async event => { if (event.type === HttpEventType.UploadProgress) { diff --git a/apps/red-ui/src/app/services/general-settings.service.ts b/apps/red-ui/src/app/services/general-settings.service.ts new file mode 100644 index 000000000..d5ec9f93c --- /dev/null +++ b/apps/red-ui/src/app/services/general-settings.service.ts @@ -0,0 +1,22 @@ +import { Injectable, Injector } from '@angular/core'; +import { GenericService, RequiredParam, Validate } from '@iqser/common-ui'; +import { GeneralConfigurationModel } from '@redaction/red-ui-http'; +import { tap } from 'rxjs/operators'; + +@Injectable({ + providedIn: 'root', +}) +export class GeneralSettingsService extends GenericService { + constructor(protected readonly _injector: Injector) { + super(_injector, 'configuration'); + } + + getGeneralConfigurations() { + return this._getOne(['general']).pipe(tap(console.log)); + } + + @Validate() + updateGeneralConfigurations(@RequiredParam() body: GeneralConfigurationModel) { + return this._post(body, `${this._defaultModelPath}/general`); + } +} diff --git a/apps/red-ui/src/app/services/notifications.service.ts b/apps/red-ui/src/app/services/notifications.service.ts new file mode 100644 index 000000000..8860df5a3 --- /dev/null +++ b/apps/red-ui/src/app/services/notifications.service.ts @@ -0,0 +1,32 @@ +import { Injectable, Injector } from '@angular/core'; +import { GenericService, List, QueryParam, RequiredParam, Validate } from '@iqser/common-ui'; +import { NotificationResponse } from '@redaction/red-ui-http'; + +@Injectable({ + providedIn: 'root', +}) +export class NotificationsService extends GenericService { + constructor(protected readonly _injector: Injector) { + super(_injector, 'notification'); + } + + @Validate() + getNotifications(@RequiredParam() includeSeen: boolean) { + let queryParam: QueryParam; + if (includeSeen !== undefined && includeSeen !== null) { + queryParam = { key: 'includeSeen', value: includeSeen }; + } + + return this._getOne([], this._defaultModelPath, [queryParam]); + } + + @Validate() + toggleNotificationRead(@RequiredParam() body: List, @RequiredParam() setRead: boolean) { + let queryParam: QueryParam; + if (setRead !== undefined && setRead !== null) { + queryParam = { key: 'setRead', value: setRead }; + } + + return this._post(body, `${this._defaultModelPath}/toggle-read`, [queryParam]); + } +} diff --git a/apps/red-ui/src/app/services/reanalysis.service.ts b/apps/red-ui/src/app/services/reanalysis.service.ts new file mode 100644 index 000000000..5d75a2e3c --- /dev/null +++ b/apps/red-ui/src/app/services/reanalysis.service.ts @@ -0,0 +1,57 @@ +import { Injectable, Injector } from '@angular/core'; +import { GenericService, List, QueryParam, RequiredParam, Validate } from '@iqser/common-ui'; +import { PageExclusionRequest } from '@redaction/red-ui-http'; + +@Injectable({ + providedIn: 'root', +}) +export class ReanalysisService extends GenericService { + constructor(protected readonly _injector: Injector) { + super(_injector, ''); + } + + @Validate() + excludePages(@RequiredParam() body: PageExclusionRequest, @RequiredParam() dossierId: string, @RequiredParam() fileId: string) { + return this._post(body, `exclude-pages/${dossierId}/${fileId}`); + } + + @Validate() + includePages(@RequiredParam() body: PageExclusionRequest, @RequiredParam() dossierId: string, @RequiredParam() fileId: string) { + return this._post(body, `include-pages/${dossierId}/${fileId}`); + } + + @Validate() + reanalyzeFilesForDossier(@RequiredParam() body: List, @RequiredParam() dossierId: string, force?: boolean) { + const queryParams: QueryParam[] = []; + if (force) { + queryParams.push({ key: 'force', value: force }); + } + + return this._post(body, `reanalyze/${dossierId}/bulk`, queryParams); + } + + @Validate() + toggleAnalysis(@RequiredParam() dossierId: string, @RequiredParam() fileId: string, excluded?: boolean) { + const queryParams: QueryParam[] = []; + if (excluded) { + queryParams.push({ key: 'excluded', value: excluded }); + } + + return this._post({}, `toggle-analysis/${dossierId}/${fileId}`, queryParams); + } + + @Validate() + ocrFiles(@RequiredParam() body: List, @RequiredParam() dossierId: string) { + return this._post(body, `ocr/reanalyze/${dossierId}/bulk`); + } + + @Validate() + reanalyzeDossier(@RequiredParam() dossierId: string, force?: boolean) { + const queryParams: QueryParam[] = []; + if (force) { + queryParams.push({ key: 'force', value: force }); + } + + return this._post({}, `reanalyze/${dossierId}`, queryParams); + } +} diff --git a/apps/red-ui/src/app/services/report-template.service.ts b/apps/red-ui/src/app/services/report-template.service.ts new file mode 100644 index 000000000..573f695ff --- /dev/null +++ b/apps/red-ui/src/app/services/report-template.service.ts @@ -0,0 +1,61 @@ +import { Injectable, Injector } from '@angular/core'; +import { GenericService, RequiredParam, Validate } from '@iqser/common-ui'; +import { PlaceholdersResponse, ReportTemplate } from '@redaction/red-ui-http'; +import { Observable } from 'rxjs'; +import { HttpResponse } from '@angular/common/http'; +import { HeadersConfiguration } from '../../../../../libs/common-ui/src/lib/utils/headers-configuration'; + +@Injectable({ + providedIn: 'root', +}) +export class ReportTemplateService extends GenericService { + constructor(protected readonly _injector: Injector) { + super(_injector, 'templateUpload'); + } + + @Validate() + uploadTemplateForm(@RequiredParam() dossierTemplateId: string, multiFileReport?: boolean, file?: Blob) { + const formParams = new FormData(); + + if (multiFileReport !== undefined) { + formParams.append('multiFileReport', multiFileReport); + } + if (file !== undefined) { + formParams.append('file', file); + } + + return this._http.post(`/${this._defaultModelPath}/${dossierTemplateId}`, formParams, { + observe: 'body', + }); + } + + @Validate() + delete(@RequiredParam() dossierTemplateId: string, @RequiredParam() templateId: string) { + return super.delete({}, `${this._defaultModelPath}/${dossierTemplateId}/${templateId}`); + } + + @Validate() + getAvailableReportTemplates(@RequiredParam() dossierTemplateId: string) { + return this.getAll(`${this._defaultModelPath}/${dossierTemplateId}`); + } + + @Validate() + getAvailablePlaceholders(@RequiredParam() dossierTemplateId: string) { + return this._getOne([dossierTemplateId], 'placeholders'); + } + + downloadReportTemplate(dossierTemplateId: string, templateId: string, observe: 'response'): Observable>; + downloadReportTemplate(dossierTemplateId: string, templateId: string, observe: 'body'): Observable; + @Validate() + downloadReportTemplate( + @RequiredParam() dossierTemplateId: string, + @RequiredParam() templateId: string, + observe: 'body' | 'response' = 'body', + ) { + return this._http.request('get', `/${this._defaultModelPath}/${dossierTemplateId}/${templateId}`, { + responseType: 'blob', + observe: observe, + headers: HeadersConfiguration.getHeaders({ contentType: false }), + }); + } +} 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 6dea2d22e..bfa0c53dd 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, IFile, ReanalysisControllerService } from '@redaction/red-ui-http'; +import { Colors, IFile } from '@redaction/red-ui-http'; import { ActivationEnd, Router } from '@angular/router'; import { UserService } from '@services/user.service'; import { forkJoin, Observable, of, Subject } from 'rxjs'; @@ -15,6 +15,7 @@ import { FilesService } from '@services/entity-services/files.service'; import { DictionaryService } from '@shared/services/dictionary.service'; import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service'; import { FileAttributesService } from '@services/entity-services/file-attributes.service'; +import { ReanalysisService } from '@services/reanalysis.service'; export interface AppState { activeFileId?: string; @@ -35,7 +36,7 @@ export class AppStateService { private readonly _userService: UserService, private readonly _dossiersService: DossiersService, private readonly _filesService: FilesService, - private readonly _reanalysisControllerService: ReanalysisControllerService, + private readonly _reanalysisService: ReanalysisService, private readonly _dictionaryService: DictionaryService, private readonly _dossierTemplatesService: DossierTemplatesService, private readonly _fileAttributesService: FileAttributesService, @@ -176,7 +177,7 @@ export class AppStateService { } async reanalyzeDossier({ id } = this._dossiersService.activeDossier) { - await this._reanalysisControllerService.reanalyzeDossier(id, true).toPromise(); + await this._reanalysisService.reanalyzeDossier(id, true).toPromise(); } async activateFile(dossierId: string, fileId: string) { diff --git a/apps/red-ui/src/app/utils/configuration.initializer.ts b/apps/red-ui/src/app/utils/configuration.initializer.ts index 1cb29da59..2b9010baf 100644 --- a/apps/red-ui/src/app/utils/configuration.initializer.ts +++ b/apps/red-ui/src/app/utils/configuration.initializer.ts @@ -1,21 +1,21 @@ -import { GeneralSettingsControllerService } from '@redaction/red-ui-http'; import { catchError, filter, mergeMap, take, tap } from 'rxjs/operators'; import { ConfigService } from '@services/config.service'; import { Title } from '@angular/platform-browser'; import { of } from 'rxjs'; import { KeycloakEventType, KeycloakService } from 'keycloak-angular'; +import { GeneralSettingsService } from '@services/general-settings.service'; export function configurationInitializer( keycloakService: KeycloakService, title: Title, configService: ConfigService, - generalSettingsControllerService: GeneralSettingsControllerService, + generalSettingsService: GeneralSettingsService, ) { return () => keycloakService.keycloakEvents$ .pipe( filter(event => event.type === KeycloakEventType.OnReady), - mergeMap(() => generalSettingsControllerService.getGeneralConfigurations()), + mergeMap(() => generalSettingsService.getGeneralConfigurations()), tap(configuration => configService.updateDisplayName(configuration.displayName)), catchError(() => { title.setTitle('RedactManager'); diff --git a/libs/red-ui-http/src/lib/api.module.ts b/libs/red-ui-http/src/lib/api.module.ts deleted file mode 100644 index d3eadd865..000000000 --- a/libs/red-ui-http/src/lib/api.module.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { ModuleWithProviders, NgModule, Optional, SkipSelf } from '@angular/core'; -import { Configuration } from './configuration'; -import { HttpClient } from '@angular/common/http'; -import { FileManagementControllerService } from './api/fileManagementController.service'; -import { GeneralSettingsControllerService } from './api/generalSettingsController.service'; -import { InfoControllerService } from './api/infoController.service'; -import { LicenseReportControllerService } from './api/licenseReportController.service'; -import { ManualRedactionControllerService } from './api/manualRedactionController.service'; -import { ReanalysisControllerService } from './api/reanalysisController.service'; -import { RedactionLogControllerService } from './api/redactionLogController.service'; -import { ReportTemplateControllerService } from './api/reportTemplateController.service'; -import { RulesControllerService } from './api/rulesController.service'; -import { SmtpConfigurationControllerService } from './api/smtpConfigurationController.service'; -import { UploadControllerService } from './api/uploadController.service'; -import { VersionsControllerService } from './api/versionsController.service'; -import { ViewedPagesControllerService } from './api/viewedPagesController.service'; -import { WatermarkControllerService } from './api/watermarkController.service'; -import { SearchControllerService } from './api/searchController.service'; -import { NotificationControllerService } from './api/notificationController.service'; -import { StatusReportControllerService } from './api/statusReportController.service'; - -@NgModule({ - imports: [], - declarations: [], - exports: [], - providers: [ - FileManagementControllerService, - GeneralSettingsControllerService, - InfoControllerService, - LicenseReportControllerService, - ManualRedactionControllerService, - ReanalysisControllerService, - RedactionLogControllerService, - ReportTemplateControllerService, - RulesControllerService, - SmtpConfigurationControllerService, - UploadControllerService, - VersionsControllerService, - ViewedPagesControllerService, - WatermarkControllerService, - SearchControllerService, - NotificationControllerService, - StatusReportControllerService, - ], -}) -export class ApiModule { - constructor(@Optional() @SkipSelf() parentModule: ApiModule, @Optional() http: HttpClient) { - if (parentModule) { - throw new Error('ApiModule is already loaded. Import in your base AppModule only.'); - } - if (!http) { - throw new Error( - 'You need to import the HttpClientModule in your AppModule! \n' + - 'See also https://github.com/angular/angular/issues/20575', - ); - } - } - - public static forRoot(configurationFactory: () => Configuration): ModuleWithProviders { - return { - ngModule: ApiModule, - providers: [{ provide: Configuration, useFactory: configurationFactory }], - }; - } -} diff --git a/libs/red-ui-http/src/lib/index.ts b/libs/red-ui-http/src/lib/index.ts index 9e8b8971c..50c198439 100644 --- a/libs/red-ui-http/src/lib/index.ts +++ b/libs/red-ui-http/src/lib/index.ts @@ -2,5 +2,4 @@ export * from './api/api'; export * from './model/models'; export * from './variables'; export * from './configuration'; -export * from './api.module'; export * from './red-types';