UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

124 lines 16 kB
import { Injectable } from '@angular/core'; import { InventoryBinaryService, OperationService, OperationStatus } from '@c8y/client'; import { AlertService, gettext, ModalService } from '@c8y/ngx-components'; import { assign } from 'lodash-es'; import { switchMap } from 'rxjs/operators'; import * as i0 from "@angular/core"; import * as i1 from "@c8y/client"; import * as i2 from "@c8y/ngx-components"; export class DiagnosticsService { constructor(operationService, inventoryBinary, modalService, alertService) { this.operationService = operationService; this.inventoryBinary = inventoryBinary; this.modalService = modalService; this.alertService = alertService; this.fragment = 'c8y_DiagnosticReport'; } isSupportedDevice(device) { const supportedOperations = (device && device.c8y_SupportedOperations) || []; return supportedOperations.includes(this.fragment); } getOperations$(device$) { return device$.pipe(switchMap(device => this.operationService.list({ deviceId: device.id, fragmentType: this.fragment, dateFrom: new Date(0).toISOString(), dateTo: new Date(Date.now()).toISOString(), revert: true, pageSize: 10, withTotalPages: true }))); } async createOperation(deviceId) { const operation = { deviceId, description: gettext('Diagnostic file request'), [this.fragment]: {} }; try { await this.operationService.create(operation); this.alertService.success(gettext('Diagnostic file request sent.')); } catch (error) { this.alertService.addServerFailure(error); } } async deleteOperation(operation) { try { const result = await this.modalService.confirm(gettext('Delete diagnostic file'), gettext('You are about to delete this diagnostic file. Do you want to proceed?'), 'danger', { ok: gettext('Delete'), cancel: gettext('Cancel') }); if (result) { this.deleteDiagnosticsBinary(operation); } } catch (error) { // Do nothing } } async cancelOperation(operation) { try { const operationAfterUpdate = (await this.operationService.update({ id: operation.id, status: OperationStatus.FAILED, failureReason: gettext('Operation cancelled by user.') })).data; assign(operation, operationAfterUpdate); this.alertService.success(gettext('Diagnostic file request cancelled.')); } catch (ex) { this.alertService.addServerFailure(ex); } } getOperation(op) { if (!op) { return null; } return op && op[this.fragment]; } async deleteDiagnosticsBinary(op) { const operation = this.getOperation(op); if (operation && operation.file) { const { file } = operation; try { const binaryId = this.inventoryBinary.getIdFromUrl(file); const result = await this.inventoryBinary.delete(binaryId); if (result) { this.deleteDiagnosticsFragment(op); } } catch (err) { if (err.res.status === 404) { // In case the file is already deleted via other means we want to delete the fragment this.deleteDiagnosticsFragment(op); } else { const msg = gettext('Could not delete the diagnostic file.'); this.alertService.danger(msg); } } } } async deleteDiagnosticsFragment(op) { const deleteOp = { id: op.id, status: op.status, [this.fragment]: null }; try { const operationAfterUpdate = (await this.operationService.update(deleteOp)).data; assign(op, operationAfterUpdate); this.alertService.success(gettext('Diagnostic file deleted.')); } catch (error) { this.alertService.addServerFailure(error); } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DiagnosticsService, deps: [{ token: i1.OperationService }, { token: i1.InventoryBinaryService }, { token: i2.ModalService }, { token: i2.AlertService }], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DiagnosticsService }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DiagnosticsService, decorators: [{ type: Injectable }], ctorParameters: () => [{ type: i1.OperationService }, { type: i1.InventoryBinaryService }, { type: i2.ModalService }, { type: i2.AlertService }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhZ25vc3RpY3Muc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2RpYWdub3N0aWNzL2RpYWdub3N0aWNzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBR0wsc0JBQXNCLEVBRXRCLGdCQUFnQixFQUNoQixlQUFlLEVBQ2hCLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDbkMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7O0FBRzNDLE1BQU0sT0FBTyxrQkFBa0I7SUFFN0IsWUFDVSxnQkFBa0MsRUFDbEMsZUFBdUMsRUFDdkMsWUFBMEIsRUFDMUIsWUFBMEI7UUFIMUIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQyxvQkFBZSxHQUFmLGVBQWUsQ0FBd0I7UUFDdkMsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFMM0IsYUFBUSxHQUFHLHNCQUFzQixDQUFDO0lBTXhDLENBQUM7SUFFSixpQkFBaUIsQ0FBQyxNQUFNO1FBQ3RCLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLHVCQUF1QixDQUFDLElBQUksRUFBRSxDQUFDO1FBQzdFLE9BQU8sbUJBQW1CLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRUQsY0FBYyxDQUFDLE9BQW1DO1FBQ2hELE9BQU8sT0FBTyxDQUFDLElBQUksQ0FDakIsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQ2pCLElBQUksQ0FBQyxnQkFBZ0IsQ0FB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QyxJQUFJLENBQUM7WUFDakYsTUFBTSxDQUFDLEVBQUUsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO1lBQ2pDLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLENBQUM7UUFDakUsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVDLENBQUM7SUFDSCxDQUFDOytHQTFIVSxrQkFBa0I7bUhBQWxCLGtCQUFrQjs7NEZBQWxCLGtCQUFrQjtrQkFEOUIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIElNYW5hZ2VkT2JqZWN0LFxuICBJUmVzdWx0TGlzdCxcbiAgSW52ZW50b3J5QmluYXJ5U2VydmljZSxcbiAgSU9wZXJhdGlvbixcbiAgT3BlcmF0aW9uU2VydmljZSxcbiAgT3BlcmF0aW9uU3RhdHVzXG59IGZyb20gJ0BjOHkvY2xpZW50JztcbmltcG9ydCB7IEFsZXJ0U2VydmljZSwgZ2V0dGV4dCwgTW9kYWxTZXJ2aWNlIH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cyc7XG5pbXBvcnQgeyBhc3NpZ24gfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRGlhZ25vc3RpY3NTZXJ2aWNlIHtcbiAgcmVhZG9ubHkgZnJhZ21lbnQgPSAnYzh5X0RpYWdub3N0aWNSZXBvcnQnO1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIG9wZXJhdGlvblNlcnZpY2U6IE9wZXJhdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBpbnZlbnRvcnlCaW5hcnk6IEludmVudG9yeUJpbmFyeVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IE1vZGFsU2VydmljZSxcbiAgICBwcml2YXRlIGFsZXJ0U2VydmljZTogQWxlcnRTZXJ2aWNlXG4gICkge31cblxuICBpc1N1cHBvcnRlZERldmljZShkZXZpY2UpOiBib29sZWFuIHtcbiAgICBjb25zdCBzdXBwb3J0ZWRPcGVyYXRpb25zID0gKGRldmljZSAmJiBkZXZpY2UuYzh5X1N1cHBvcnRlZE9wZXJhdGlvbnMpIHx8IFtdO1xuICAgIHJldHVybiBzdXBwb3J0ZWRPcGVyYXRpb25zLmluY2x1ZGVzKHRoaXMuZnJhZ21lbnQpO1xuICB9XG5cbiAgZ2V0T3BlcmF0aW9ucyQoZGV2aWNlJDogT2JzZXJ2YWJsZTxJTWFuYWdlZE9iamVjdD4pOiBPYnNlcnZhYmxlPElSZXN1bHRMaXN0PElPcGVyYXRpb24+PiB7XG4gICAgcmV0dXJuIGRldmljZSQucGlwZShcbiAgICAgIHN3aXRjaE1hcChkZXZpY2UgPT5cbiAgICAgICAgdGhpcy5vcGVyYXRpb25TZXJ2aWNlLmxpc3Qoe1xuICAgICAgICAgIGRldmljZUlkOiBkZXZpY2UuaWQsXG4gICAgICAgICAgZnJhZ21lbnRUeXBlOiB0aGlzLmZyYWdtZW50LFxuICAgICAgICAgIGRhdGVGcm9tOiBuZXcgRGF0ZSgwKS50b0lTT1N0cmluZygpLFxuICAgICAgICAgIGRhdGVUbzogbmV3IERhdGUoRGF0ZS5ub3coKSkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICByZXZlcnQ6IHRydWUsXG4gICAgICAgICAgcGFnZVNpemU6IDEwLFxuICAgICAgICAgIHdpdGhUb3RhbFBhZ2VzOiB0cnVlXG4gICAgICAgIH0pXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZU9wZXJhdGlvbihkZXZpY2VJZDogc3RyaW5nKSB7XG4gICAgY29uc3Qgb3BlcmF0aW9uID0ge1xuICAgICAgZGV2aWNlSWQsXG4gICAgICBkZXNjcmlwdGlvbjogZ2V0dGV4dCgnRGlhZ25vc3RpYyBmaWxlIHJlcXVlc3QnKSxcbiAgICAgIFt0aGlzLmZyYWdtZW50XToge31cbiAgICB9O1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLm9wZXJhdGlvblNlcnZpY2UuY3JlYXRlKG9wZXJhdGlvbik7XG4gICAgICB0aGlzLmFsZXJ0U2VydmljZS5zdWNjZXNzKGdldHRleHQoJ0RpYWdub3N0aWMgZmlsZSByZXF1ZXN0IHNlbnQuJykpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmFsZXJ0U2VydmljZS5hZGRTZXJ2ZXJGYWlsdXJlKGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBkZWxldGVPcGVyYXRpb24ob3BlcmF0aW9uOiBJT3BlcmF0aW9uKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMubW9kYWxTZXJ2aWNlLmNvbmZpcm0oXG4gICAgICAgIGdldHRleHQoJ0RlbGV0ZSBkaWFnbm9zdGljIGZpbGUnKSxcbiAgICAgICAgZ2V0dGV4dCgnWW91IGFyZSBhYm91dCB0byBkZWxldGUgdGhpcyBkaWFnbm9zdGljIGZpbGUuIERvIHlvdSB3YW50IHRvIHByb2NlZWQ/JyksXG4gICAgICAgICdkYW5nZXInLFxuICAgICAgICB7XG4gICAgICAgICAgb2s6IGdldHRleHQoJ0RlbGV0ZScpLFxuICAgICAgICAgIGNhbmNlbDogZ2V0dGV4dCgnQ2FuY2VsJylcbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICB0aGlzLmRlbGV0ZURpYWdub3N0aWNzQmluYXJ5KG9wZXJhdGlvbik7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIERvIG5vdGhpbmdcbiAgICB9XG4gIH1cblxuICBhc3luYyBjYW5jZWxPcGVyYXRpb24ob3BlcmF0aW9uOiBJT3BlcmF0aW9uKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9wZXJhdGlvbkFmdGVyVXBkYXRlID0gKFxuICAgICAgICBhd2FpdCB0aGlzLm9wZXJhdGlvblNlcnZpY2UudXBkYXRlKHtcbiAgICAgICAgICBpZDogb3BlcmF0aW9uLmlkLFxuICAgICAgICAgIHN0YXR1czogT3BlcmF0aW9uU3RhdHVzLkZBSUxFRCxcbiAgICAgICAgICBmYWlsdXJlUmVhc29uOiBnZXR0ZXh0KCdPcGVyYXRpb24gY2FuY2VsbGVkIGJ5IHVzZXIuJylcbiAgICAgICAgfSlcbiAgICAgICkuZGF0YTtcbiAgICAgIGFzc2lnbihvcGVyYXRpb24sIG9wZXJhdGlvbkFmdGVyVXBkYXRlKTtcbiAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLnN1Y2Nlc3MoZ2V0dGV4dCgnRGlhZ25vc3RpYyBmaWxlIHJlcXVlc3QgY2FuY2VsbGVkLicpKTtcbiAgICB9IGNhdGNoIChleCkge1xuICAgICAgdGhpcy5hbGVydFNlcnZpY2UuYWRkU2VydmVyRmFpbHVyZShleCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRPcGVyYXRpb24ob3A6IElPcGVyYXRpb24pIHtcbiAgICBpZiAoIW9wKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIG9wICYmIG9wW3RoaXMuZnJhZ21lbnRdO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBkZWxldGVEaWFnbm9zdGljc0JpbmFyeShvcDogSU9wZXJhdGlvbikge1xuICAgIGNvbnN0IG9wZXJhdGlvbiA9IHRoaXMuZ2V0T3BlcmF0aW9uKG9wKTtcbiAgICBpZiAob3BlcmF0aW9uICYmIG9wZXJhdGlvbi5maWxlKSB7XG4gICAgICBjb25zdCB7IGZpbGUgfSA9IG9wZXJhdGlvbjtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGJpbmFyeUlkID0gdGhpcy5pbnZlbnRvcnlCaW5hcnkuZ2V0SWRGcm9tVXJsKGZpbGUpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmludmVudG9yeUJpbmFyeS5kZWxldGUoYmluYXJ5SWQpO1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgdGhpcy5kZWxldGVEaWFnbm9zdGljc0ZyYWdtZW50KG9wKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmIChlcnIucmVzLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgLy8gSW4gY2FzZSB0aGUgZmlsZSBpcyBhbHJlYWR5IGRlbGV0ZWQgdmlhIG90aGVyIG1lYW5zIHdlIHdhbnQgdG8gZGVsZXRlIHRoZSBmcmFnbWVudFxuICAgICAgICAgIHRoaXMuZGVsZXRlRGlhZ25vc3RpY3NGcmFnbWVudChvcCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgbXNnID0gZ2V0dGV4dCgnQ291bGQgbm90IGRlbGV0ZSB0aGUgZGlhZ25vc3RpYyBmaWxlLicpO1xuICAgICAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmRhbmdlcihtc2cpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBkZWxldGVEaWFnbm9zdGljc0ZyYWdtZW50KG9wOiBJT3BlcmF0aW9uKSB7XG4gICAgY29uc3QgZGVsZXRlT3AgPSB7XG4gICAgICBpZDogb3AuaWQsXG4gICAgICBzdGF0dXM6IG9wLnN0YXR1cyxcbiAgICAgIFt0aGlzLmZyYWdtZW50XTogbnVsbFxuICAgIH07XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9wZXJhdGlvbkFmdGVyVXBkYXRlID0gKGF3YWl0IHRoaXMub3BlcmF0aW9uU2VydmljZS51cGRhdGUoZGVsZXRlT3ApKS5kYXRhO1xuICAgICAgYXNzaWduKG9wLCBvcGVyYXRpb25BZnRlclVwZGF0ZSk7XG4gICAgICB0aGlzLmFsZXJ0U2VydmljZS5zdWNjZXNzKGdldHRleHQoJ0RpYWdub3N0aWMgZmlsZSBkZWxldGVkLicpKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5hbGVydFNlcnZpY2UuYWRkU2VydmVyRmFpbHVyZShlcnJvcik7XG4gICAgfVxuICB9XG59XG4iXX0=