Skip to content
Snippets Groups Projects
Select Git revision
  • 625d5fdd4ea91f4e16d83aa1f7dc4a6f99a275a6
  • main default protected
  • ozg-8323-umzug-dependency-track
  • OZG-8252-gitlab-pipelines
  • release
  • OZG-7856_schadcode_scanner
  • ci-pipeline
  • OZG-7526-signatur-nicht-uebernommen
  • OZG-6223-zip-download-bug
  • OZG-7367-tooltip-extension
  • OZG-7023-OZG-6956-E2E-externe-Stellen
  • OZG-6238-npm-durch-pnpm-ersetzen
  • release-admin
  • release-info
  • OZG-6700-admin-feature-toggle
  • E2E-Updates
  • OZG-7047-tooltips
  • OZG-6957-e2e-fachstellen-oe-daten
  • OZG-7006-ZuarbeitAnfragen
  • temp_OZG-7027
  • unit-tests-hotfix
  • 2.27.0
  • 2.26.0
  • 2.25.0
  • 2.24.2
  • 2.24.1
  • 2.24.0
  • 2.23.0
  • 2.22.0
  • 2.21.0
  • 2.20.0
  • 2.21.0-SNAPSHOT
  • 2.19.0
  • 2.18.0
  • 2.17.1
  • 1.3.0
  • release-admin-1.3.0
  • release-info-1.3.0
  • 2.17.0
  • 2.16.0
  • 2.15.0
41 results

kommentar.service.ts

Blame
  • user avatar
    OZGCloud authored
    625d5fdd
    History
    kommentar.service.ts 5.95 KiB
    /*
     * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den
     * Ministerpräsidenten des Landes Schleswig-Holstein
     * Staatskanzlei
     * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
     *
     * Lizenziert unter der EUPL, Version 1.2 oder - sobald
     * diese von der Europäischen Kommission genehmigt wurden -
     * Folgeversionen der EUPL ("Lizenz");
     * Sie dürfen dieses Werk ausschließlich gemäß
     * dieser Lizenz nutzen.
     * Eine Kopie der Lizenz finden Sie hier:
     *
     * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
     *
     * Sofern nicht durch anwendbare Rechtsvorschriften
     * gefordert oder in schriftlicher Form vereinbart, wird
     * die unter der Lizenz verbreitete Software "so wie sie
     * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
     * ausdrücklich oder stillschweigend - verbreitet.
     * Die sprachspezifischen Genehmigungen und Beschränkungen
     * unter der Lizenz sind dem Lizenztext zu entnehmen.
     */
    import { Injectable } from '@angular/core';
    import { Params } from '@angular/router';
    import { BinaryFileListResource, BinaryFileService } from '@goofy-client/binary-file-shared';
    import { CommandOrder, CommandResource, CommandService, CreateCommand, isDone } from '@goofy-client/command-shared';
    import { createEmptyStateResource, createStateResource, doIfLoadingRequired, NavigationService, StateResource } from '@goofy-client/tech-shared';
    import { VorgangResource, VorgangService } from '@goofy-client/vorgang-shared';
    import { hasLink, Resource } from '@ngxp/rest';
    import { isNil } from 'lodash';
    import { BehaviorSubject, Observable, of, Subscription } from 'rxjs';
    import { startWith, tap } from 'rxjs/operators';
    import { KommentarLinkRel, KommentarListLinkRel } from './kommentar.linkrel';
    import { CreateKommentarCommand, Kommentar, KommentarListResource, KommentarResource } from './kommentar.model';
    import { KommentarRepository } from './kommentar.repository';
    
    @Injectable({ providedIn: 'root' })
    export class KommentarService {
    
    	readonly kommentarList$: BehaviorSubject<StateResource<KommentarListResource>> = new BehaviorSubject(createEmptyStateResource<KommentarListResource>());
    	readonly formularVisibility$: BehaviorSubject<boolean> = new BehaviorSubject(false);
    
    	private navigationSub: Subscription;
    
    	constructor(
    		private repository: KommentarRepository,
    		private commandService: CommandService,
    		private navigationService: NavigationService,
    		private vorgangService: VorgangService,
    		private binaryFileService: BinaryFileService,
    	) {
    		this.listenToNavigation();
    	}
    
    	private listenToNavigation(): void {
    		this.unsubscribe();
    		this.navigationSub = this.navigationService.urlChanged().subscribe((params: Params) => this.onNavigation(params));
    	}
    
    	private unsubscribe(): void {
    		if (!isNil(this.navigationSub)) this.navigationSub.unsubscribe();
    	}
    
    	onNavigation(params: Params): void {
    		if (NavigationService.isVorgangListPage(params)) {
    			this.setKommentarListOnReload();
    		}
    		if (NavigationService.isVorgangDetailPage(params, VorgangService.VORGANG_WITH_EINGANG_URL)) {
    			this.setKommentarListOnReload();
    		}
    	}
    
    	private setKommentarListOnReload(): void {
    		this.kommentarList$.next({ ...this.kommentarList$.value, reload: true });
    	}
    
    	public getKommentareByVorgang(vorgang: VorgangResource): Observable<StateResource<KommentarListResource>> {
    		doIfLoadingRequired(this.kommentarList$.value, () => this.loadKommentare(vorgang));
    		return this.kommentarList$.asObservable();
    	}
    
    	private loadKommentare(vorgang: VorgangResource): void {
    		this.setListLoadingTrue();
    
    		const sub: Subscription = this.repository.findKommentare(vorgang).subscribe((kommentarList: KommentarListResource) => {
    			this.setKommentarList(kommentarList);
    			sub.unsubscribe();
    		});
    	}
    
    	setListLoadingTrue(): void {
    		this.kommentarList$.next({ ...this.kommentarList$.value, loading: true });
    	}
    
    	setKommentarListReload() {
    		this.kommentarList$.next({ ...this.kommentarList$.value, reload: true });
    	}
    
    	setKommentarList(kommentarList: KommentarListResource): void {
    		this.kommentarList$.next(createStateResource(kommentarList));
    	}
    
    	public isFormularVisible(): Observable<boolean> {
    		return this.formularVisibility$.asObservable();
    	}
    
    	public showFormular(): void {
    		this.formularVisibility$.next(true);
    	}
    
    	public hideFormular(): void {
    		this.formularVisibility$.next(false);
    	}
    
    	public createKommentar(kommentar: Kommentar): Observable<StateResource<CommandResource>> {
    		return this.createKommentarCommand(this.kommentarList$.value.resource, KommentarListLinkRel.CREATE_KOMMENTAR, this.createCreateKommentarCommand(kommentar));
    	}
    
    	createCreateKommentarCommand(kommentar: Kommentar): CreateKommentarCommand {
    		return { order: CommandOrder.CREATE_KOMMENTAR, kommentar, body: null };
    	}
    
    	public editKommentar(kommentar: KommentarResource, toPatch: Kommentar): Observable<StateResource<CommandResource>> {
    		return this.createKommentarCommand(kommentar, KommentarLinkRel.EDIT, this.createEditKommentarCommand(toPatch));
    	}
    
    	createEditKommentarCommand(kommentar: Kommentar): CreateKommentarCommand {
    		return { order: CommandOrder.EDIT_KOMMENTAR, kommentar, body: null };
    	}
    
    	createKommentarCommand(resource: Resource, linkRel: string, command: CreateCommand): Observable<StateResource<CommandResource>> {
    		return this.commandService.createCommand(resource, linkRel, command).pipe(
    			tap((createdCommand: StateResource<CommandResource>) => this.afterCreateOrEditKommentar(createdCommand)),
    			startWith(createEmptyStateResource<CommandResource>(true)));
    	}
    
    	afterCreateOrEditKommentar(command: StateResource<CommandResource>): void {
    		if (isDone(command.resource)) {
    			this.hideFormular();
    			this.setKommentarListReload();
    			this.vorgangService.reloadCurrentVorgang();
    		}
    	}
    
    	getAttachments(kommentar: KommentarResource): Observable<StateResource<BinaryFileListResource>> {
    		if (hasLink(kommentar, KommentarLinkRel.ATTACHMENTS)) {
    			return this.binaryFileService.getFiles(kommentar, KommentarLinkRel.ATTACHMENTS);
    		}
    		return of(createEmptyStateResource<BinaryFileListResource>());
    	}
    }