269 lines
7.6 KiB
TypeScript
Raw Normal View History

2022-05-20 17:50:35 +03:00
///
2025-02-25 09:39:16 +02:00
/// Copyright © 2016-2025 The Thingsboard Authors
2022-05-20 17:50:35 +03:00
///
/// Licensed under the Apache License, Version 2.0 (the "License");
/// you may not use this file except in compliance with the License.
/// You may obtain a copy of the License at
///
/// http://www.apache.org/licenses/LICENSE-2.0
///
/// Unless required by applicable law or agreed to in writing, software
/// distributed under the License is distributed on an "AS IS" BASIS,
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
/// See the License for the specific language governing permissions and
/// limitations under the License.
///
import { EntityId } from '@shared/models/id/entity-id';
import { AliasEntityType, EntityType } from '@shared/models/entity-type.models';
import { ExportableEntity } from '@shared/models/base-data';
import { EntityRelation } from '@shared/models/relation.models';
import { Device, DeviceCredentials } from '@shared/models/device.models';
import { RuleChain, RuleChainMetaData } from '@shared/models/rule-chain.models';
2022-05-20 17:50:35 +03:00
export const exportableEntityTypes: Array<EntityType> = [
EntityType.ASSET,
EntityType.DEVICE,
EntityType.ENTITY_VIEW,
EntityType.DASHBOARD,
EntityType.CUSTOMER,
EntityType.DEVICE_PROFILE,
2022-09-26 18:10:12 +03:00
EntityType.ASSET_PROFILE,
EntityType.RULE_CHAIN,
EntityType.WIDGET_TYPE,
2023-05-12 14:56:16 +03:00
EntityType.WIDGETS_BUNDLE,
2023-11-16 15:13:36 +02:00
EntityType.TB_RESOURCE,
2025-06-23 12:28:46 +03:00
EntityType.OTA_PACKAGE,
2023-05-12 14:56:16 +03:00
EntityType.NOTIFICATION_TEMPLATE,
EntityType.NOTIFICATION_TARGET,
2025-07-08 17:46:18 +03:00
EntityType.NOTIFICATION_RULE,
2025-07-09 18:07:02 +03:00
EntityType.AI_MODEL,
];
2025-06-23 12:28:46 +03:00
export const entityTypesWithoutRelatedData = new Set<EntityType | AliasEntityType>([
2023-05-12 14:56:16 +03:00
EntityType.NOTIFICATION_TEMPLATE,
EntityType.NOTIFICATION_TARGET,
2023-11-16 15:13:36 +02:00
EntityType.NOTIFICATION_RULE,
2025-07-08 17:46:18 +03:00
EntityType.TB_RESOURCE,
2025-06-23 12:28:46 +03:00
EntityType.OTA_PACKAGE,
2025-07-09 18:07:02 +03:00
EntityType.AI_MODEL,
2023-05-19 16:07:08 +03:00
]);
2023-05-12 14:56:16 +03:00
2022-05-20 17:50:35 +03:00
export interface VersionCreateConfig {
saveRelations: boolean;
saveAttributes: boolean;
2022-06-02 12:32:10 +03:00
saveCredentials: boolean;
saveCalculatedFields: boolean;
2022-05-20 17:50:35 +03:00
}
export enum VersionCreateRequestType {
SINGLE_ENTITY = 'SINGLE_ENTITY',
COMPLEX = 'COMPLEX'
}
export interface VersionCreateRequest {
versionName: string;
branch: string;
type: VersionCreateRequestType;
}
export interface SingleEntityVersionCreateRequest extends VersionCreateRequest {
entityId: EntityId;
config: VersionCreateConfig;
type: VersionCreateRequestType.SINGLE_ENTITY;
}
export enum SyncStrategy {
MERGE = 'MERGE',
OVERWRITE = 'OVERWRITE'
}
export const syncStrategyTranslationMap = new Map<SyncStrategy, string>(
[
[SyncStrategy.MERGE, 'version-control.sync-strategy-merge'],
[SyncStrategy.OVERWRITE, 'version-control.sync-strategy-overwrite']
]
);
2022-06-01 16:35:20 +03:00
export const syncStrategyHintMap = new Map<SyncStrategy, string>(
[
[SyncStrategy.MERGE, 'version-control.sync-strategy-merge-hint'],
[SyncStrategy.OVERWRITE, 'version-control.sync-strategy-overwrite-hint']
]
);
export interface EntityTypeVersionCreateConfig extends VersionCreateConfig {
syncStrategy: SyncStrategy;
entityIds: string[];
allEntities: boolean;
}
export interface ComplexVersionCreateRequest extends VersionCreateRequest {
syncStrategy: SyncStrategy;
entityTypes: {[entityType: string]: EntityTypeVersionCreateConfig};
type: VersionCreateRequestType.COMPLEX;
}
export function createDefaultEntityTypesVersionCreate(): {[entityType: string]: EntityTypeVersionCreateConfig} {
const res: {[entityType: string]: EntityTypeVersionCreateConfig} = {};
for (const entityType of exportableEntityTypes) {
res[entityType] = {
syncStrategy: null,
saveAttributes: !entityTypesWithoutRelatedData.has(entityType),
saveRelations: !entityTypesWithoutRelatedData.has(entityType),
saveCalculatedFields: typesWithCalculatedFields.has(entityType),
2022-06-02 12:32:10 +03:00
saveCredentials: true,
allEntities: true,
entityIds: []
};
}
return res;
}
2022-05-31 11:33:49 +03:00
export interface VersionLoadConfig {
loadRelations: boolean;
loadAttributes: boolean;
2022-06-02 12:32:10 +03:00
loadCredentials: boolean;
loadCalculatedFields: boolean;
2022-05-31 11:33:49 +03:00
}
export enum VersionLoadRequestType {
SINGLE_ENTITY = 'SINGLE_ENTITY',
ENTITY_TYPE = 'ENTITY_TYPE'
}
2022-05-26 13:50:50 +03:00
export interface VersionLoadRequest {
versionId: string;
type: VersionLoadRequestType;
}
export interface SingleEntityVersionLoadRequest extends VersionLoadRequest {
externalEntityId: EntityId;
config: VersionLoadConfig;
type: VersionLoadRequestType.SINGLE_ENTITY;
}
2022-05-31 11:33:49 +03:00
export interface EntityTypeVersionLoadConfig extends VersionLoadConfig {
removeOtherEntities: boolean;
findExistingEntityByName: boolean;
2022-05-31 11:33:49 +03:00
}
export interface EntityTypeVersionLoadRequest extends VersionLoadRequest {
entityTypes: {[entityType: string]: EntityTypeVersionLoadConfig};
type: VersionLoadRequestType.ENTITY_TYPE;
2024-03-15 18:27:47 +02:00
rollbackOnError: boolean;
2022-05-31 11:33:49 +03:00
}
export function createDefaultEntityTypesVersionLoad(): {[entityType: string]: EntityTypeVersionLoadConfig} {
const res: {[entityType: string]: EntityTypeVersionLoadConfig} = {};
for (const entityType of exportableEntityTypes) {
res[entityType] = {
loadAttributes: !entityTypesWithoutRelatedData.has(entityType),
loadRelations: !entityTypesWithoutRelatedData.has(entityType),
2022-06-02 12:32:10 +03:00
loadCredentials: true,
loadCalculatedFields: typesWithCalculatedFields.has(entityType),
removeOtherEntities: false,
2022-06-01 16:35:20 +03:00
findExistingEntityByName: true
2022-05-31 11:33:49 +03:00
};
}
return res;
}
2022-05-20 17:50:35 +03:00
export interface BranchInfo {
name: string;
default: boolean;
}
export interface EntityVersion {
2022-05-25 12:26:23 +03:00
timestamp: number;
2022-05-20 17:50:35 +03:00
id: string;
name: string;
2022-05-31 13:09:47 +03:00
author: string;
2022-05-20 17:50:35 +03:00
}
export interface VersionCreationResult {
version: EntityVersion;
added: number;
modified: number;
removed: number;
error: string;
done: boolean;
2022-05-20 17:50:35 +03:00
}
2022-05-26 13:50:50 +03:00
2022-06-02 12:32:10 +03:00
export interface EntityTypeLoadResult {
2022-05-26 13:50:50 +03:00
entityType: EntityType;
created: number;
updated: number;
deleted: number;
}
2022-06-02 12:32:10 +03:00
export enum EntityLoadErrorType {
DEVICE_CREDENTIALS_CONFLICT = 'DEVICE_CREDENTIALS_CONFLICT',
MISSING_REFERENCED_ENTITY = 'MISSING_REFERENCED_ENTITY',
RUNTIME = 'RUNTIME'
2022-06-02 12:32:10 +03:00
}
export const entityLoadErrorTranslationMap = new Map<EntityLoadErrorType, string>(
[
[EntityLoadErrorType.DEVICE_CREDENTIALS_CONFLICT, 'version-control.device-credentials-conflict'],
[EntityLoadErrorType.MISSING_REFERENCED_ENTITY, 'version-control.missing-referenced-entity'],
[EntityLoadErrorType.RUNTIME, 'version-control.runtime-failed']
2022-06-02 12:32:10 +03:00
]
);
export interface EntityLoadError {
type: EntityLoadErrorType;
source: EntityId;
target: EntityId;
message?: string;
2022-06-02 12:32:10 +03:00
}
export interface VersionLoadResult {
result: Array<EntityTypeLoadResult>;
error: EntityLoadError;
done: boolean;
2022-06-02 12:32:10 +03:00
}
2022-06-08 12:52:56 +03:00
export interface AttributeExportData {
key: string;
lastUpdateTs: number;
booleanValue: boolean;
strValue: string;
longValue: number;
doubleValue: number;
jsonValue: string;
}
export interface EntityExportData<E extends ExportableEntity<EntityId>> {
entity: E;
entityType: EntityType;
relations: Array<EntityRelation>;
2022-06-08 12:52:56 +03:00
attributes: {[key: string]: Array<AttributeExportData>};
}
export interface DeviceExportData extends EntityExportData<Device> {
credentials: DeviceCredentials;
}
export interface RuleChainExportData extends EntityExportData<RuleChain> {
metaData: RuleChainMetaData;
}
export interface EntityDataDiff {
currentVersion: EntityExportData<any>;
otherVersion: EntityExportData<any>;
}
export function entityExportDataToJsonString(data: EntityExportData<any>): string {
return JSON.stringify(data, null, 4);
}
export interface EntityDataInfo {
hasRelations: boolean;
hasAttributes: boolean;
2022-06-02 12:32:10 +03:00
hasCredentials: boolean;
hasCalculatedFields: boolean;
}
export const typesWithCalculatedFields = new Set<EntityType | AliasEntityType>([EntityType.DEVICE, EntityType.ASSET, EntityType.ASSET_PROFILE, EntityType.DEVICE_PROFILE]);