@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
114 lines • 15.4 kB
JavaScript
import { Injectable } from '@angular/core';
import { map, take } from 'rxjs/operators';
import { groupBy } from 'lodash-es';
import { VersionService } from './version.service';
import { AppStateService } from '../common/ui-state.service';
import { ApplicationService, ApplicationType } from '@c8y/client';
import * as i0 from "@angular/core";
import * as i1 from "./version.service";
import * as i2 from "../common/ui-state.service";
import * as i3 from "@c8y/client";
export class PlatformDetailsService {
constructor(version, appState, apps) {
this.version = version;
this.appState = appState;
this.apps = apps;
}
async getPlatformDetailsObject() {
const currentUser = this.appState.currentUser.value;
const userId = currentUser?.id;
const userPermissions = this.getUserPermissions(currentUser);
const [hookedVersions, microserviceVersions] = await Promise.all([
this.getVersions(),
this.getMicroserviceVersions(userId)
]);
const versions = [...hookedVersions, ...microserviceVersions];
const groupedVersions = groupBy(versions, 'type');
const tenantId = this.appState.currentTenant.value?.name;
// useful as `domainName` might be pointing to a custom domain
// self link should still allow to identify the actual environment of the tenant
const tenantSelfLink = this.appState.currentTenant.value?.self;
const tenantDomainName = this.appState.currentTenant.value?.domainName;
const applicationKey = this.appState.currentApplication.value?.key;
const applicationId = this.appState.currentApplication.value?.id;
const time = new Date().toISOString();
const url = document.URL;
const obj = {
time,
tenantId,
tenantSelfLink,
tenantDomainName,
url,
userId,
userPermissions,
applicationId,
applicationKey,
versions: groupedVersions
};
return obj;
}
async getVersions() {
const versions = await this.version.items$
.pipe(take(1), map(versions => this.version.cleanUpVersions(versions)))
.toPromise();
return versions;
}
async getMicroserviceVersions(userId) {
try {
const { data: apps } = await this.apps.listByUser(userId, {
pageSize: 2000,
dropOverwrittenApps: true,
noPaging: true
});
return apps
.filter(app => !!app.manifest?.version && app.type === ApplicationType.MICROSERVICE)
.map(app => {
return {
label: app.name,
version: app.manifest.version,
type: app.type,
custom: {
owner: app.owner?.tenant?.id,
provider: app.manifest?.provider
}
};
});
}
catch (e) {
console.warn(e);
return [];
}
}
getUserPermissions(user) {
if (!user) {
return null;
}
const userPermissions = this.getDirectPermissionsOfUser(user);
const groupPermissions = this.getPermissionsOfAssignedGroups(user);
return { user: userPermissions, groups: groupPermissions };
}
getDirectPermissionsOfUser(user) {
const userChangedType = user;
const userRoleReferences = userChangedType.roles?.references || [];
return userRoleReferences.map(ref => ref.role.id);
}
getPermissionsOfAssignedGroups(user) {
const groups = user.groups?.references || [];
return groups.map(ref => {
const roleReferences = ref.group?.roles?.references || [];
const permissions = roleReferences.map(ref => ref.role.id);
return {
id: ref.group.id,
name: ref.group.name,
permissions
};
});
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PlatformDetailsService, deps: [{ token: i1.VersionService }, { token: i2.AppStateService }, { token: i3.ApplicationService }], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PlatformDetailsService, providedIn: 'root' }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PlatformDetailsService, decorators: [{
type: Injectable,
args: [{ providedIn: 'root' }]
}], ctorParameters: () => [{ type: i1.VersionService }, { type: i2.AppStateService }, { type: i3.ApplicationService }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhdGZvcm0tZGV0YWlscy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vY29yZS92ZXJzaW9uL3BsYXRmb3JtLWRldGFpbHMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNwQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRTdELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxlQUFlLEVBQXVCLE1BQU0sYUFBYSxDQUFDOzs7OztBQUd2RixNQUFNLE9BQU8sc0JBQXNCO0lBQ2pDLFlBQ1UsT0FBdUIsRUFDdkIsUUFBeUIsRUFDekIsSUFBd0I7UUFGeEIsWUFBTyxHQUFQLE9BQU8sQ0FBZ0I7UUFDdkIsYUFBUSxHQUFSLFFBQVEsQ0FBaUI7UUFDekIsU0FBSSxHQUFKLElBQUksQ0FBb0I7SUFDL0IsQ0FBQztJQUVKLEtBQUssQ0FBQyx3QkFBd0I7UUFDNUIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDO1FBQ3BELE1BQU0sTUFBTSxHQUFHLFdBQVcsRUFBRSxFQUFFLENBQUM7UUFDL0IsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzdELE1BQU0sQ0FBQyxjQUFjLEVBQUUsb0JBQW9CLENBQUMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUM7WUFDL0QsSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNsQixJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxD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QUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOytHQTFHVSxzQkFBc0I7bUhBQXRCLHNCQUFzQixjQURULE1BQU07OzRGQUNuQixzQkFBc0I7a0JBRGxDLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgbWFwLCB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgZ3JvdXBCeSB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBWZXJzaW9uU2VydmljZSB9IGZyb20gJy4vdmVyc2lvbi5zZXJ2aWNlJztcbmltcG9ydCB7IEFwcFN0YXRlU2VydmljZSB9IGZyb20gJy4uL2NvbW1vbi91aS1zdGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IENsZWFuZWRWZXJzaW9uIH0gZnJvbSAnLi92ZXJzaW9uLm1vZGVsJztcbmltcG9ydCB7IEFwcGxpY2F0aW9uU2VydmljZSwgQXBwbGljYXRpb25UeXBlLCBJQ3VycmVudFVzZXIsIElVc2VyIH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIFBsYXRmb3JtRGV0YWlsc1NlcnZpY2Uge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHZlcnNpb246IFZlcnNpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgYXBwU3RhdGU6IEFwcFN0YXRlU2VydmljZSxcbiAgICBwcml2YXRlIGFwcHM6IEFwcGxpY2F0aW9uU2VydmljZVxuICApIHt9XG5cbiAgYXN5bmMgZ2V0UGxhdGZvcm1EZXRhaWxzT2JqZWN0KCkge1xuICAgIGNvbnN0IGN1cnJlbnRVc2VyID0gdGhpcy5hcHBTdGF0ZS5jdXJyZW50VXNlci52YWx1ZTtcbiAgICBjb25zdCB1c2VySWQgPSBjdXJyZW50VXNlcj8uaWQ7XG4gICAgY29uc3QgdXNlclBlcm1pc3Npb25zID0gdGhpcy5nZXRVc2VyUGVybWlzc2lvbnMoY3VycmVudFVzZXIpO1xuICAgIGNvbnN0IFtob29rZWRWZXJzaW9ucywgbWljcm9zZXJ2aWNlVmVyc2lvbnNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgdGhpcy5nZXRWZXJzaW9ucygpLFxuICAgICAgdGhpcy5nZXRNaWNyb3NlcnZpY2VWZXJzaW9ucyh1c2VySWQpXG4gICAgXSk7XG4gICAgY29uc3QgdmVyc2lvbnMgPSBbLi4uaG9va2VkVmVyc2lvbnMsIC4uLm1pY3Jvc2VydmljZVZlcnNpb25zXTtcbiAgICBjb25zdCBncm91cGVkVmVyc2lvbnM6IHsgW2tleTogc3RyaW5nXTogQ2xlYW5lZFZlcnNpb25bXSB9ID0gZ3JvdXBCeSh2ZXJzaW9ucywgJ3R5cGUnKTtcbiAgICBjb25zdCB0ZW5hbnRJZCA9IHRoaXMuYXBwU3RhdGUuY3VycmVudFRlbmFudC52YWx1ZT8ubmFtZTtcbiAgICAvLyB1c2VmdWwgYXMgYGRvbWFpbk5hbWVgIG1pZ2h0IGJlIHBvaW50aW5nIHRvIGEgY3VzdG9tIGRvbWFpblxuICAgIC8vIHNlbGYgbGluayBzaG91bGQgc3RpbGwgYWxsb3cgdG8gaWRlbnRpZnkgdGhlIGFjdHVhbCBlbnZpcm9ubWVudCBvZiB0aGUgdGVuYW50XG4gICAgY29uc3QgdGVuYW50U2VsZkxpbmsgPSB0aGlzLmFwcFN0YXRlLmN1cnJlbnRUZW5hbnQudmFsdWU/LnNlbGY7XG4gICAgY29uc3QgdGVuYW50RG9tYWluTmFtZSA9IHRoaXMuYXBwU3RhdGUuY3VycmVudFRlbmFudC52YWx1ZT8uZG9tYWluTmFtZTtcbiAgICBjb25zdCBhcHBsaWNhdGlvbktleSA9IHRoaXMuYXBwU3RhdGUuY3VycmVudEFwcGxpY2F0aW9uLnZhbHVlPy5rZXk7XG4gICAgY29uc3QgYXBwbGljYXRpb25JZCA9IHRoaXMuYXBwU3RhdGUuY3VycmVudEFwcGxpY2F0aW9uLnZhbHVlPy5pZDtcbiAgICBjb25zdCB0aW1lID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgIGNvbnN0IHVybCA9IGRvY3VtZW50LlVSTDtcbiAgICBjb25zdCBvYmogPSB7XG4gICAgICB0aW1lLFxuICAgICAgdGVuYW50SWQsXG4gICAgICB0ZW5hbnRTZWxmTGluayxcbiAgICAgIHRlbmFudERvbWFpbk5hbWUsXG4gICAgICB1cmwsXG4gICAgICB1c2VySWQsXG4gICAgICB1c2VyUGVybWlzc2lvbnMsXG4gICAgICBhcHBsaWNhdGlvbklkLFxuICAgICAgYXBwbGljYXRpb25LZXksXG4gICAgICB2ZXJzaW9uczogZ3JvdXBlZFZlcnNpb25zXG4gICAgfTtcbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGdldFZlcnNpb25zKCk6IFByb21pc2U8Q2xlYW5lZFZlcnNpb25bXT4ge1xuICAgIGNvbnN0IHZlcnNpb25zID0gYXdhaXQgdGhpcy52ZXJzaW9uLml0ZW1zJFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2UoMSksXG4gICAgICAgIG1hcCh2ZXJzaW9ucyA9PiB0aGlzLnZlcnNpb24uY2xlYW5VcFZlcnNpb25zKHZlcnNpb25zKSlcbiAgICAgIClcbiAgICAgIC50b1Byb21pc2UoKTtcbiAgICByZXR1cm4gdmVyc2lvbnM7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgZ2V0TWljcm9zZXJ2aWNlVmVyc2lvbnModXNlcklkOiBzdHJpbmcpOiBQcm9taXNlPENsZWFuZWRWZXJzaW9uW10+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBkYXRhOiBhcHBzIH0gPSBhd2FpdCB0aGlzLmFwcHMubGlzdEJ5VXNlcih1c2VySWQsIHtcbiAgICAgICAgcGFnZVNpemU6IDIwMDAsXG4gICAgICAgIGRyb3BPdmVyd3JpdHRlbkFwcHM6IHRydWUsXG4gICAgICAgIG5vUGFnaW5nOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBhcHBzXG4gICAgICAgIC5maWx0ZXIoYXBwID0+ICEhYXBwLm1hbmlmZXN0Py52ZXJzaW9uICYmIGFwcC50eXBlID09PSBBcHBsaWNhdGlvblR5cGUuTUlDUk9TRVJWSUNFKVxuICAgICAgICAubWFwKGFwcCA9PiB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGxhYmVsOiBhcHAubmFtZSxcbiAgICAgICAgICAgIHZlcnNpb246IGFwcC5tYW5pZmVzdC52ZXJzaW9uLFxuICAgICAgICAgICAgdHlwZTogYXBwLnR5cGUsXG4gICAgICAgICAgICBjdXN0b206IHtcbiAgICAgICAgICAgICAgb3duZXI6IGFwcC5vd25lcj8udGVuYW50Py5pZCxcbiAgICAgICAgICAgICAgcHJvdmlkZXI6IGFwcC5tYW5pZmVzdD8ucHJvdmlkZXJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLndhcm4oZSk7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldFVzZXJQZXJtaXNzaW9ucyh1c2VyOiBJQ3VycmVudFVzZXIgfCBudWxsKSB7XG4gICAgaWYgKCF1c2VyKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgdXNlclBlcm1pc3Npb25zID0gdGhpcy5nZXREaXJlY3RQZXJtaXNzaW9uc09mVXNlcih1c2VyKTtcbiAgICBjb25zdCBncm91cFBlcm1pc3Npb25zID0gdGhpcy5nZXRQZXJtaXNzaW9uc09mQXNzaWduZWRHcm91cHModXNlcik7XG4gICAgcmV0dXJuIHsgdXNlcjogdXNlclBlcm1pc3Npb25zLCBncm91cHM6IGdyb3VwUGVybWlzc2lvbnMgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXREaXJlY3RQZXJtaXNzaW9uc09mVXNlcih1c2VyOiBJQ3VycmVudFVzZXIpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgdXNlckNoYW5nZWRUeXBlID0gdXNlciBhcyBJVXNlcjtcbiAgICBjb25zdCB1c2VyUm9sZVJlZmVyZW5jZXMgPSB1c2VyQ2hhbmdlZFR5cGUucm9sZXM/LnJlZmVyZW5jZXMgfHwgW107XG4gICAgcmV0dXJuIHVzZXJSb2xlUmVmZXJlbmNlcy5tYXAocmVmID0+IHJlZi5yb2xlLmlkKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRQZXJtaXNzaW9uc09mQXNzaWduZWRHcm91cHMoXG4gICAgdXNlcjogSUN1cnJlbnRVc2VyXG4gICk6IHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nOyBwZXJtaXNzaW9uczogc3RyaW5nW10gfVtdIHtcbiAgICBjb25zdCBncm91cHM6IEFycmF5PGFueT4gPSAodXNlciBhcyBhbnkpLmdyb3Vwcz8ucmVmZXJlbmNlcyB8fCBbXTtcblxuICAgIHJldHVybiBncm91cHMubWFwKHJlZiA9PiB7XG4gICAgICBjb25zdCByb2xlUmVmZXJlbmNlczogQXJyYXk8YW55PiA9IHJlZi5ncm91cD8ucm9sZXM/LnJlZmVyZW5jZXMgfHwgW107XG4gICAgICBjb25zdCBwZXJtaXNzaW9ucyA9IHJvbGVSZWZlcmVuY2VzLm1hcChyZWYgPT4gcmVmLnJvbGUuaWQpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaWQ6IHJlZi5ncm91cC5pZCxcbiAgICAgICAgbmFtZTogcmVmLmdyb3VwLm5hbWUsXG4gICAgICAgIHBlcm1pc3Npb25zXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG59XG4iXX0=