@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
124 lines • 16 kB
JavaScript
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=