bruce-models 4.6.1 → 4.6.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"bruce-models.umd.js","sources":["../src/api/api.ts","../src/common/cache.ts","../src/api/abstract-api.ts","../src/server/message-broker.ts","../src/api/guardian-api.ts","../src/api/bruce-api.ts","../src/api/global-api.ts","../src/api/api-getters.ts","../src/environment.ts","../src/ann-document/ann-document.ts","../src/custom-form/custom-form.ts","../src/common/color-css-defaults.ts","../src/common/color.ts","../src/common/geometry.ts","../src/util/object-utils.ts","../src/entity/entity-attribute.ts","../src/entity/entity-type.ts","../src/util/path-utils.ts","../src/project/zoom-control.ts","../src/entity/entity-historic-data.ts","../src/entity/entity.ts","../src/common/bruce-variable.ts","../src/calculator/calculator.ts","../src/common/bounds.ts","../src/common/bruce-event.ts","../src/common/camera.ts","../src/common/cartes.ts","../src/common/carto.ts","../src/common/delay-queue.ts","../src/common/utc.ts","../src/common/lru-cache.ts","../src/entity/entity-attachment-type.ts","../src/entity/entity-attachment.ts","../src/entity/entity-comment.ts","../src/entity/entity-link.ts","../src/entity/entity-lod.ts","../src/entity/entity-lod-category.ts","../src/entity/entity-relation-type.ts","../src/entity/entity-relation.ts","../src/entity/entity-source.ts","../src/entity/entity-tag.ts","../src/util/math-utils.ts","../src/entity/entity-coords.ts","../src/entity/entity-type-visual-settings.ts","../src/entity/entity-table-view.ts","../src/style/style.ts","../src/entity-type-model/comment.ts","../src/internal/uploader.ts","../src/client-file/client-file.ts","../src/program-key/program-key.ts","../src/tileset/tileset.ts","../src/project/menu-item.ts","../src/project/project-view-bookmark.ts","../src/project/project-view.ts","../src/project/project-view-legacy-tile.ts","../src/project/project-view-tile.ts","../src/project/project-view-legacy.ts","../src/project/project-view-legacy-bookmark.ts","../src/server/pending-action.ts","../src/account/account.ts","../src/server/hosting-location.ts","../src/user/permission.ts","../src/user/session.ts","../src/user/user-group.ts","../src/user/user.ts","../src/account/account-invite.ts","../src/account/account-features.ts","../src/account/account-limits.ts","../src/util/encrypt-utils.ts","../src/util/url-utils.ts","../src/data-lab/data-lab.ts","../src/import/import-cad.ts","../src/import/import-csv.ts","../src/import/import-json.ts","../src/import/import-kml.ts","../src/import/imported-file.ts","../src/markup/markup.ts","../src/plugin/plugin.ts","../src/data-source/data-source.ts","../src/bruce-models.ts"],"sourcesContent":["import { IDictionary } from \"../common/dictionary\";\n\n/**\n * Contains generic descriptions used for Nextspace requests.\n */\nexport namespace Api {\n /**\n * Cache keys utilized by methods within this library.\n * These help construct keys to store and retrieve data from the local cache.\n */\n export enum ECacheKey {\n Id = \":\",\n ListId = \"::\",\n Entity = \"entity\",\n EntityType = \"entitytype\",\n ProjectView = \"projectview\",\n ProjectViewBookmark = \"pvbookmark\",\n Tileset = \"tileset\",\n ClientFile = \"clientfile\",\n ClientFileCountsPurpose = \"clientfilecountspurpose\",\n ClientFileCountsExtension = \"clientfilecountsextensions\",\n ClientFileCountsMIMEType = \"clientfilecountsmimetypes\",\n ClientFileCountsUser = \"clientfilecountsusers\",\n Session = \"session\",\n PendingAction = \"pendingaction\",\n EntitySource = \"entitysource\",\n DataSource = \"datasource\",\n ProgramKey = \"programkey\",\n EntityCoords = \"entitycoords\",\n Tag = \"tag\",\n Attachment = \"attachment\",\n Comment = \"comment\",\n Link = \"link\",\n AnnDocument = \"anndocument\",\n AttachmentType = \"attachmenttype\",\n Relation = \"relation\",\n RelationType = \"relationtype\",\n Lod = \"lod\",\n LodCategory = \"lodcategory\",\n Style = \"style\",\n PublishTileset = \"publishtileset\",\n TilesetAccess = \"tilesetaccess\",\n User = \"user\",\n UserSettings = \"usersettings\",\n UserEmail = \"useremail\",\n AccessToken = \"accesstoken\",\n UserGroup = \"usergroup\",\n Account = \"account\",\n AccountFeatures = \"accountfeatures\",\n DatabaseRegion = \"databaseregion\",\n CustomForm = \"customform\",\n ImportedFile = \"importedfile\",\n Plugin = \"plugin\",\n PluginIndexFile = \"pluginindexfile\",\n EntityHistoricData = \"entityhistoricdata\",\n EntityHistoricDataRec = \"entityhistoricdatarec\",\n EntityHistoricDataStats = \"entityhistoricdatastats\",\n AccountLimits = \"accountlimits\"\n }\n\n // 1 minute.\n export const DEFAULT_CACHE_DURATION = 60 * 1000;\n // The template client account is a container for default settings to reference.\n export const TEMPLATE_ACCOUNT_ID = \"template\";\n export const SUPER_ACCOUNT_ID = \"hypeportal\";\n // Default session token header.\n export const ACCESS_TOKEN_HEADER = \"X-Access-Token\";\n\n /**\n * Possible environments we host Bruce apps on.\n * When these are matched, they should be case-insensitive.\n */\n export enum EEnv {\n // DEV environment that is separate to production data.\n DEV = \"DEV\",\n // Currently out of use.\n // DEV environment that is separate to production data.\n STG = \"STG\",\n // Production data with a beta API.\n UAT = \"UAT\",\n // Production data with a stable API.\n PROD = \"PROD\"\n }\n export type Env = EEnv | string;\n // False = cache is enabled by default for req-params.\n export let DEFAULT_NO_CACHE = false;\n\n /**\n * Prepares a string to be included in a url.\n * @param str\n * @returns\n */\n export function Encode(str: string): string {\n return encodeURIComponent(str.replace(/\\+/g, \"%2B\").replace(/\\./g, \"%2E\"));\n }\n\n /**\n * Standard list response from Nextspace APIs.\n * Newer APIs will typically use a different format. Eg: \"entities\" for an entity list.\n */\n export interface IList<T> {\n Items: T[];\n TotalCount?: number;\n }\n\n export enum ESortOrder {\n None = 0,\n Asc = 1,\n Desc = -1\n }\n\n export enum ESortOrderStr {\n Asc = \"ASC\",\n Desc = \"DESC\"\n }\n\n /**\n * Known response encodings from Nextspace APIs.\n */\n export enum EEncoding {\n // Default.\n UTF8 = \"UTF-8\",\n // Deprecated. Shouldn't be found anywhere anymore.\n UTF16 = \"UTF-16BE\"\n }\n\n /**\n * Describes request params for any HTTP request performed through this library.\n */\n export interface IReqParams {\n // Default is Api.DEFAULT_CACHE_STATE.\n // If true then local cache check will be skipped.\n noCache?: boolean;\n // Request headers.\n headers?: IDictionary<string>;\n }\n\n /**\n * Prepares default settings for a request to Bruce Api.\n * (Currently none).\n * @param base\n * @returns\n */\n export function PrepReqParams(base?: Api.IReqParams | IUploadReqParams): IReqParams | IUploadReqParams {\n base = {\n ...base\n };\n return base;\n }\n\n /**\n * Describes upload request params.\n */\n export interface IUploadReqParams extends IReqParams {\n // (Optional) Upload progress callback.\n onProgress?: (e: ProgressEvent) => void;\n // The form data to upload.\n formData?: IDictionary<string> | FormData;\n }\n}","type Key = string | number;\n\n// 1 minute.\nconst DEFAULT_DURATION = 60 * 1000;\n\ninterface IRecord {\n // The id of the item.\n id: string;\n // The data of the item.\n data: any;\n // The time when the item was added to the cache.\n expires: number;\n}\n\nexport class CacheControl<T> {\n private memory: Map<Key, IRecord> = new Map<Key, IRecord>();\n public Disabled: boolean = false;\n\n constructor(id: string) {\n if (!id) {\n id = \"default\";\n }\n }\n\n /**\n * Sets item to cache.\n * @param id\n * @param data\n * @param duration\n */\n public Set(params: {\n id: string,\n data: any,\n // Optional, default is 1 minute.\n // Value is in milliseconds and if it's set to 0 or lower then it'll be set to 1 minute.\n duration?: number\n }): void {\n if (this.Disabled) {\n return;\n }\n let { id, data, duration } = params;\n if (!duration || duration < 0) {\n duration = DEFAULT_DURATION;\n }\n id = String(id);\n\n const expires = Date.now() + duration;\n const record: IRecord = {\n id,\n data,\n expires\n };\n this.memory.set(id, record);\n }\n\n /**\n * Returns the item with the given id.\n * @param id\n * @returns\n */\n public Get(id: Key): {\n data: T,\n found: boolean\n } {\n if (this.Disabled) {\n return null;\n }\n id = String(id);\n\n let record = this.memory.get(id);\n if (!record) {\n return {\n data: null,\n found: false\n };\n }\n if (record.expires < Date.now()) {\n this.memory.delete(id);\n return {\n data: null,\n found: false\n };\n }\n return {\n data: record.data,\n found: true\n };\n }\n\n /**\n * Removes all items from the cache.\n */\n public Clear(): void {\n this.memory.clear();\n }\n\n /**\n * Removes the item with the given id.\n * @param id\n */\n public Remove(id: Key): void {\n id = String(id);\n this.memory.delete(id);\n }\n\n /**\n * Removes all items that match the callback.\n * If callback returns true then the item is removed.\n * @param callback\n */\n public RemoveBy(callback: (key: Key) => boolean): void {\n const memoryKeys = Array.from(this.memory.keys());\n for (const key of memoryKeys) {\n if (callback(key)) {\n this.memory.delete(key);\n }\n }\n }\n\n /**\n * Removes all items that start with the given text.\n * @param text\n */\n public RemoveByStartsWith(text: Key): void {\n this.RemoveBy(key => String(key).startsWith(String(text)));\n }\n\n /**\n * Removes all items that contain the given text.\n * @param text\n */\n public RemoveByContains(text: Key): void {\n this.RemoveBy(key => String(key).includes(String(text)));\n }\n\n /**\n * Removes items based on a callback's response.\n * @param callback \n */\n public RemoveByCallback(callback: (key: Key) => boolean): void {\n this.RemoveBy(callback);\n }\n}","import { CacheControl } from \"../common/cache\";\nimport { Api } from \"./api\";\n\nasync function parseResult(data: Response): Promise<string | Blob | any> {\n if (data.status >= 400 || data.status < 200) {\n const error = await data.json();\n throw(error);\n }\n\n let type = data.headers.get(\"Content-Type\")?.trim().toLowerCase();\n let encoding = type?.split(\";\").find((x) => x.startsWith(\"charset=\"))?.split(\"=\")[1].toLowerCase();\n if (encoding === \"utf-16\") {\n encoding = Api.EEncoding.UTF16;\n }\n // We can parse this the same way as UTF-8.\n else if (encoding === \"iso-8859-1\") {\n encoding = \"utf-8\";\n }\n\n if (type == \"application/octet-stream\" || type == \"model/gltf-binary\") {\n if (encoding !== \"utf-8\") {\n console.warn(\"Binary data is being returned with an unexpected encoding:\", encoding);\n }\n return data.blob();\n }\n\n let text = await (encoding && encoding !== \"utf-8\" \n ? new TextDecoder(encoding).decode(await data.arrayBuffer()) \n : data.text());\n\n if (!text?.trim()) {\n return null;\n }\n\n if (!type) {\n type = \"\";\n }\n if (type.includes(\"text/csv\")) {\n return text;\n }\n if (text && typeof text == \"string\") {\n text = text.trim();\n }\n if (text) {\n if (\n (text.startsWith(\"{\") && text.endsWith(\"}\")) ||\n (text.startsWith(\"[\") && text.endsWith(\"]\"))\n ) {\n return JSON.parse(text);\n }\n }\n return text;\n}\n\n/**\n * This is a base class for communication with an arbitrary Nextspace API.\n */\nexport class AbstractApi {\n // HTTP header to use for session ID.\n private ssidHeader: string;\n // Session ID.\n private ssid: string = \"\";\n // Base URL for API.\n protected baseUrl: string = \"\";\n // Cache control utility.\n public Cache: CacheControl<any>;\n\n constructor(params: {\n ssidHeader?: string,\n cacheId?: string\n }) {\n this.ssidHeader = params?.ssidHeader;\n this.Cache = new CacheControl<any>(params?.cacheId);\n }\n\n /**\n * Returns the base URL for the API.\n * @returns \n */\n public GetBaseUrl(): string {\n return this.baseUrl;\n }\n\n /**\n * Sets the base URL for the API.\n * @param url \n */\n public SetBaseUrl(url: string): void {\n this.baseUrl = url;\n if (!this.baseUrl.endsWith(\"/\")) {\n this.baseUrl += \"/\";\n }\n }\n\n /**\n * Returns a cache item matching the provided key.\n * If the reqParams specify that caching is disabled, null is returned.\n * @param key \n * @param reqParams \n * @returns \n */\n public GetCacheItem(key: string, reqParams?: Api.IReqParams) {\n let noCache = reqParams?.noCache;\n if (noCache == null) {\n noCache = Api.DEFAULT_NO_CACHE;\n }\n if (noCache) {\n return null;\n }\n return this.Cache.Get(key);\n }\n\n /**\n * Sets a cache item matching the provided key.\n * If the reqParams specify that caching is disabled, then no action is taken.\n * @param params \n * @returns \n */\n public SetCacheItem(params: {\n key: string,\n value: any,\n duration?: number,\n req?: Api.IReqParams\n }) {\n let {key, value, duration, req} = params;\n let noCache = req?.noCache;\n if (noCache == null) {\n noCache = Api.DEFAULT_NO_CACHE;\n }\n if (noCache) {\n return;\n }\n if (isNaN(duration)) {\n duration = Api.DEFAULT_CACHE_DURATION;\n }\n this.Cache.Set({\n id: key,\n data: value,\n duration\n });\n }\n\n /**\n * Returns the session ID.\n * @returns \n */\n public GetSessionId(): string {\n return this.ssid;\n }\n\n /**\n * Sets the session ID.\n * @param value \n */\n public SetSessionId(value: string): void {\n this.ssid = value;\n }\n\n /**\n * Returns the session header.\n * @returns \n */\n public GetSessionHeader(): string {\n return this.ssidHeader;\n }\n\n /**\n * Sets the session header.\n * @param value \n */\n public SetSessionHeader(value: string): void {\n this.ssidHeader = value;\n }\n\n /**\n * Performs a GET request.\n * This will NOT prepend the base URL to the provided URL.\n * @param url \n * @param params \n * @returns \n */\n public async get(url: string, params?: Api.IReqParams): Promise<any> {\n if (!params) {\n params = {};\n }\n params.headers = params.headers || {};\n params.headers = {\n \"Content-Type\": \"application/json;\",\n ...params.headers\n };\n if (this.ssidHeader && this.ssid) {\n params.headers[this.ssidHeader] = this.ssid;\n }\n const res = await fetch(url, {\n headers: params.headers\n });\n return parseResult(res);\n }\n\n /**\n * Performs a DELETE request.\n * This will NOT prepend the base URL to the provided URL.\n * @param url \n * @param params \n * @returns \n */\n public async delete(url: string, params?: Api.IReqParams): Promise<any> {\n if (!params) {\n params = {};\n }\n params.headers = params.headers || {};\n params.headers = {\n \"Content-Type\": \"application/json;\",\n ...params.headers\n };\n if (this.ssidHeader && this.ssid) {\n params.headers[this.ssidHeader] = this.ssid;\n }\n const res = await fetch(url, {\n headers: params.headers,\n method: \"DELETE\"\n });\n return parseResult(res);\n }\n\n /**\n * Performs a POST request.\n * This will NOT prepend the base URL to the provided URL.\n * @param url \n * @param data \n * @param params \n * @returns \n */\n public async post(url: string, data: any, params?: Api.IReqParams): Promise<any> {\n if (!params) {\n params = {};\n }\n params.headers = params.headers || {};\n params.headers = {\n \"Content-Type\": \"application/json;\",\n ...params.headers\n };\n if (this.ssidHeader && this.ssid) {\n params.headers[this.ssidHeader] = this.ssid;\n }\n if (!data) {\n data = {};\n }\n if (typeof data != \"string\") {\n data = JSON.stringify(data);\n }\n const res = await fetch(url, {\n headers: params.headers,\n method: \"POST\",\n body: data\n });\n return parseResult(res);\n }\n\n /**\n * Performs a PUT request.\n * This will NOT prepend the base URL to the provided URL.\n * @param url \n * @param data \n * @param params \n * @returns \n */\n public async put(url: string, data: any, params?: Api.IReqParams): Promise<any> {\n if (!params) {\n params = {};\n }\n params.headers = params.headers || {};\n params.headers = {\n \"Content-Type\": \"application/json;\",\n ...params.headers\n };\n if (this.ssidHeader && this.ssid) {\n params.headers[this.ssidHeader] = this.ssid;\n }\n if (!data) {\n data = {};\n }\n if (typeof data != \"string\") {\n data = JSON.stringify(data);\n }\n const res = await fetch(url, {\n headers: params.headers,\n method: \"PUT\",\n body: data\n });\n return parseResult(res);\n }\n\n /**\n * Performs a file upload (POST) request.\n * This will NOT prepend the base URL to the provided URL.\n * @param url \n * @param blob \n * @param params \n * @returns \n */\n public async upload(url: string, blob: Blob, params?: Api.IUploadReqParams): Promise<any> {\n return new Promise((res, rej) => {\n try {\n let xhr = new XMLHttpRequest();\n const headers = <any>params?.headers;\n if (headers) {\n const headerKeys = Object.keys(headers);\n for (let i = 0; i < headerKeys.length; i++) {\n const key = headerKeys[i];\n const value = headers[key];\n xhr.setRequestHeader(key, value);\n }\n }\n if (params?.onProgress) {\n if (xhr.upload) {\n xhr.upload.onprogress = params?.onProgress;\n }\n else {\n xhr.addEventListener(\"progress\", params?.onProgress);\n }\n }\n xhr.onreadystatechange = (e) => {\n if (xhr.readyState == 4) {\n if (xhr.status >= 400 || xhr.status < 200) {\n rej(e);\n }\n else {\n try {\n res(JSON.parse(xhr.responseText));\n }\n catch (e) {\n console.error(e, xhr.responseText);\n res(xhr.responseText);\n }\n }\n }\n };\n xhr.open(\"POST\", url, true);\n if (this.ssidHeader && this.ssid) {\n xhr.setRequestHeader(this.ssidHeader, this.ssid);\n }\n let formData: any;\n if (params?.formData instanceof FormData) {\n formData = params?.formData;\n }\n else {\n formData = new FormData();\n if (params?.formData) {\n for (const key in params.formData) {\n formData.append(key, params.formData[key]);\n }\n }\n }\n formData.append(\"file\", blob);\n xhr.send(formData);\n }\n catch (e) {\n rej(e);\n }\n });\n }\n}","import { Api } from \"../api/api\";\n\n/**\n * TODO: rewrite.\n */\nexport namespace MessageBroker {\n export enum EAction {\n // Subscribes a client to topic messages on a server side.\n SUBSCRIBE = \"subscribe\",\n // Subscribes a client to a topic without notifying other clients.\n SUBSCRIBE_SHADOW = \"subscribeShadow\",\n // Unsubscribes clients from topic messages on a server side\n UNSUBSCRIBE = \"unsubscribe\",\n // Sends a message to all topic subscribers.\n BROADCAST = \"broadcast\",\n // Requests topic subscribers without subscribing.\n GET_TOPIC_SUBSCRIBERS = \"getTopicSubscribers\"\n }\n\n export type SubscribeType = EAction.SUBSCRIBE | EAction.SUBSCRIBE_SHADOW;\n\n export interface IMessageBase {\n topic: string;\n event?: string;\n data?: any;\n }\n\n export interface IMessage extends IMessageBase {\n // Timestamp of message.\n time?: number;\n // User id of message sender.\n user?: string;\n action: EAction;\n }\n\n export interface IBroker {\n /**\n * Add a subscriber to a topic.\n * @param topic \n * @param callback \n * @param action \n */\n Subscribe: (topic: string, callback: (msg: IMessage) => void, type?: SubscribeType) => void,\n /**\n * Remove a subscriber from a topic.\n * @param topic \n * @param callback \n */\n Unsubscribe: (topic: string, callback: (msg: IMessage) => void) => void,\n /**\n * Send message to server.\n * @param base \n * @returns \n */\n SendMessage: (base: IMessageBase | IMessage) => void;\n SetUserId: (userId: string) => void;\n IsConnected: boolean;\n }\n\n /**\n * Communicates with a server message broker.\n */\n export class WebSocketBroker implements IBroker {\n private subscriptions = new Map<string, ((msg: IMessage) => void)[]>();\n private ws: WebSocket;\n private reconnects: number = 0;\n private maxReconnects: number = 5;\n private userId: string;\n private uri: string;\n private env: Api.Env;\n\n public constructor(uri: string, env?: Api.Env) {\n this.uri = uri;\n this.env = env ? env : Api.EEnv.PROD;\n this.connect();\n }\n\n public get IsConnected(): boolean {\n return this.ws.readyState === WebSocket.OPEN;\n }\n\n public SetUserId(userId: string): void {\n this.userId = this.userId ? this.userId : userId;\n }\n\n private connect() {\n try {\n if (!WebSocket) {\n throw new Error(\"WebSocket is not supported by this browser\");\n }\n this.ws = new WebSocket(this.formatApiUri(this.uri));\n this.ws.onopen = this.onOpen.bind(this);\n this.ws.onmessage = this.onMessage.bind(this);\n this.ws.onerror = this.onError.bind(this);\n this.ws.onclose = this.onClose.bind(this);\n } \n catch (e) {\n console.error(e);\n }\n }\n\n private formatApiUri(uri: string): string {\n const ws = !(window as any).document || (window as any).document.location.protocol === \"https:\" ? \"wss\" : \"ws\";\n return uri.replace(/^(https|http)/, ws) + \"websocket\";\n }\n\n private onOpen(ev: any): void {\n if (this.env === Api.EEnv.DEV) {\n console.log(\"MessageBroker connection opened: \", ev);\n }\n }\n\n private onClose(ev: any): void {\n if (this.env === Api.EEnv.DEV) {\n console.log(\"MessageBroker connection closed, trying to reconnect: \", ev);\n }\n if (this.reconnects < this.maxReconnects) {\n this.reconnects += 1;\n setTimeout(() => this.connect(), 5000 * this.reconnects);\n }\n }\n\n private onMessage(ev: any): void {\n const data: IMessage = JSON.parse(ev.data);\n this.subscriptions.get(data.topic)?.forEach(cb => cb(data));\n }\n\n private onError(ev: any): void {\n console.error(\"MessageBroker connection error: \", ev);\n }\n\n private addSubscriber(topic: string, callback: (msg: IMessage) => void): void {\n const subscribers = this.subscriptions.get(topic) || [];\n if (subscribers.includes(callback)) {\n return;\n }\n subscribers.push(callback);\n this.subscriptions.set(topic, subscribers);\n }\n\n /**\n * Send message to server.\n * @param base \n * @returns \n */\n public SendMessage(base: IMessageBase | IMessage): void {\n if (this.ws.readyState !== WebSocket.OPEN) {\n return;\n }\n try {\n const msg = base as IMessage;\n if (!msg.event) {\n msg.event = EAction.BROADCAST;\n }\n let message = base.data ? base.data : {};\n if (typeof message == \"object\") {\n message = JSON.stringify(message);\n }\n msg.data = message;\n\n const outgoingMessage: IMessage = { ...msg, user: this.userId, time: Date.now() };\n this.ws.send(JSON.stringify(outgoingMessage));\n } \n catch (e) {\n console.warn(e);\n }\n }\n\n /**\n * Add a subscriber to a topic.\n * @param topic \n * @param callback \n * @param action \n */\n public Subscribe(topic: string, callback: (msg: IMessage) => void, action?: SubscribeType): void {\n if (!action) {\n action = EAction.SUBSCRIBE;\n }\n this.addSubscriber(topic, callback);\n this.SendMessage({ topic, action });\n }\n\n /**\n * Remove a subscriber from a topic.\n * @param topic \n * @param callback \n */\n public Unsubscribe(topic: string, callback: (msg: IMessage) => void): void {\n const subscribers = this.subscriptions.get(topic) || [];\n this.subscriptions.set(topic, subscribers.filter(fn => fn != callback));\n this.SendMessage({ topic, action: EAction.UNSUBSCRIBE });\n }\n\n public RequestTopicUsers(topic: string, callback: (msg: IMessage) => void): void {\n this.addSubscriber(topic, callback);\n this.SendMessage({ topic, event: EAction.GET_TOPIC_SUBSCRIBERS });\n }\n }\n}","import { AbstractApi } from \"./abstract-api\";\nimport { Api as A } from \"./api\";\n\n/**\n * This is the request handler for Cam/Idm Api,\n * This API is in charge of user session management.\n */\nexport namespace GuardianApi {\n export class Api extends AbstractApi {\n // The environment this api is running on.\n private env: A.Env;\n\n constructor(params: {\n // Optional environment to use. If unspecified, the default environment will be used.\n // Default is A.EEnv.PROD.\n env?: A.Env\n }) {\n super({\n ssidHeader: \"x-sessionid\",\n cacheId: `GUARDIAN_API_${params?.env}_`\n });\n this.env = params?.env ? params.env : A.EEnv.PROD;\n this.setBaseUrl();\n }\n\n /**\n * Sets the base url for this api.\n */\n private setBaseUrl(): void {\n let url = \"https://guardian.nextspace\";\n const env = this.env.toUpperCase();\n switch (env) {\n case A.EEnv.DEV:\n url += \"-dev.net/\";\n break;\n case A.EEnv.STG:\n url += \"-stg.net/\";\n break;\n case A.EEnv.UAT:\n url += \"-uat.net/\";\n break;\n case A.EEnv.PROD:\n url += \".host/\";\n break;\n default:\n throw(\"Specified Environment is not valid. SuppliedEnv=\" + env);\n }\n this.baseUrl = url;\n }\n\n /**\n * Gets the base url for this api.\n * @returns \n */\n public GetBaseUrl(): string {\n return this.baseUrl;\n }\n\n /**\n * Sets the base url for this api.\n * @param url \n */\n public SetBaseUrl(url: string): void {\n this.baseUrl = url;\n if (!this.baseUrl.endsWith(\"/\")) {\n this.baseUrl += \"/\";\n }\n }\n\n /**\n * Performs an HTTP GET request.\n * This will prepend the base url to the url.\n * @param url \n * @param params \n * @returns \n */\n public async GET(url: string, params?: A.IReqParams): Promise<any> {\n return this.get(this.baseUrl + url, params);\n }\n\n /**\n * Performs an HTTP DELETE request.\n * This will prepend the base url to the url.\n * @param url \n * @param params \n * @returns \n */\n public async DELETE(url: string, params?: A.IReqParams): Promise<any> {\n return this.delete(this.baseUrl + url, params);\n }\n\n /**\n * Performs an HTTP POST request.\n * This will prepend the base url to the url.\n * @param url \n * @param data \n * @param params \n * @returns \n */\n public async POST(url: string, data: any, params?: A.IReqParams): Promise<any> {\n return this.post(this.baseUrl + url, data, params);\n }\n\n /**\n * Performs a file upload request (HTTP POST).\n * This will prepend the base url to the url.\n * @param url \n * @param blob \n * @param params \n * @returns \n */\n public async UPLOAD(url: string, blob: Blob, params?: A.IUploadReqParams): Promise<any> {\n return this.upload(this.baseUrl + url, blob, params);\n }\n }\n}","import { AbstractApi } from \"./abstract-api\";\nimport { Api as A } from \"./api\";\nimport { MessageBroker } from \"../server/message-broker\";\nimport { GuardianApi } from \"./guardian-api\";\nimport { Account, IDictionary } from \"../bruce-models\";\n\n/**\n * The primary API for communication with Nextspace.\n * This API is used to manage your data.\n */\nexport namespace BruceApi {\n /**\n * This is the interface for the Bruce Api getter.\n * A getter helps manage requests to multiple client accounts.\n */\n export interface IGetter {\n accountId: string;\n // Default settings the getter's app is running on.\n env?: A.EEnv;\n // Should return using app defaults if no params are specified.\n getApi: (accountId?: string, env?: A.EEnv) => BruceApi.Api;\n }\n\n /**\n * This is the request handler for Bruce Api,\n * it should be passed to any method that wants to communicate with this particular api.\n */\n export class Api extends AbstractApi {\n // The account id this api is connected to.\n private accountId: string;\n public get AccountId(): string {\n return this.accountId;\n }\n // The environment this api is connected to.\n private env: A.Env;\n // Load cancelled indicates the user set a custom base url.\n // This will stop the regional url from being set if it's still loading.\n private loadCancelled: boolean = false;\n // The websocket message broker instance.\n // If null then the message broker is not loaded.\n private messageBroker: MessageBroker.IBroker;\n public get MessageBroker(): MessageBroker.IBroker {\n return this.messageBroker;\n }\n // Indicates if loading the regional configuration was already called.\n private configLoadAttempted: boolean = false;\n public get ConfigLoadAttempted(): boolean {\n return this.configLoadAttempted;\n }\n // The regional base url for the account.\n // When using the CDN base url you MUST include a query param for accountId.\n // Eg: \"https://d3pb232f6pp9if.cloudfront.net/entity/myEntityId?accountId=myAccountId\"\n private cdnBaseUrl: string;\n\n // Used for entity GET list-by-filter requests.\n // When set and viaCdn = true when performing an entity request, this will be used in place for base-url.\n // Eg: \"https://d3pb232f6pp9if.cloudfront.net/entitiesListForCDN/alex\"\n // @deprecated, use cdnBaseUrl.\n public EntityCdnUrl: string;\n // Works only for static/dynamic tilesets.\n // When set and viaCdn = true when getting a legacy tileset file, this will be used in place for base-url.\n // Eg: \"https://d15gsaz0jz5ika.cloudfront.net/alex/<TILESETID>/file/<FILEPATH>\"\n // @deprecated, use cdnBaseUrl.\n public LegacyTilesetCdnUrl: string;\n // Works for all tilesets including older ones.\n // Eg: \"https://blah.cloudfront.net/tilesets/<TILESETID>/files/<FILEPATH>?accountId=<ACCOUNT>\"\n // @deprecated, use cdnBaseUrl.\n public TilesetCdnUrl: string;\n\n // The API's version.\n // Will be available when the Loading promise resolves.\n private version: string | \"UNKNOWN\";\n public get Version(): string | \"UNKNOWN\" {\n return this.version;\n }\n\n // Indicates if the init process has finished loading.\n // While this is not resolved requests will be in a pending state.\n private loadProm: Promise<void>;\n public get Loading(): Promise<void> {\n return this.loadProm;\n }\n\n constructor(params: {\n // Required client account to connect to.\n accountId: string,\n // Default is PROD.\n env?: A.Env,\n // @Deprecated, use loadConfig instead.\n loadRegionalBaseUrl?: boolean\n // True to load settings for regional base url and CDN.\n /// Default = false.\n loadConfig?: boolean\n // True to load message broker.\n // Default = true.\n loadWebSocket?: boolean,\n // Guardian instance used for regional url loading.\n // If not provided then a new instance of the API is made.\n guardian?: GuardianApi.Api,\n // Indicator to load nothing. Simply sets a dummy loading promise.\n // Used for testing purposes.\n dummy?: boolean\n }) {\n super({\n ssidHeader: \"x-sessionid\",\n cacheId: `BRUCE_API_${params?.env}_${params?.accountId}_`\n });\n let {accountId, env, guardian, loadRegionalBaseUrl, loadConfig, loadWebSocket, dummy} = params;\n this.accountId = accountId;\n this.env = env ?? A.EEnv.PROD;\n\n if (!dummy) {\n // Backwards compatibility.\n if (loadRegionalBaseUrl) {\n loadConfig = true;\n }\n \n if (loadConfig) {\n // Mark it as attempted right away because we don't want any external calls while it gets to that async point.\n this.configLoadAttempted = true;\n }\n\n this.loadProm = this.init(guardian, loadConfig, loadWebSocket);\n }\n }\n\n /**\n * Loads regional base url and sets up message broker.\n * @param guardian Required for loading regional base url.\n * @param loadConfig\n * @returns\n */\n private async init(\n guardian?: GuardianApi.Api,\n loadConfig?: boolean,\n loadWebSocket?: boolean\n ): Promise<void> {\n if (!this.accountId) {\n throw(\"accountId is required.\");\n }\n\n // Set using a stable default.\n const domain = this.getDomain();\n this.baseUrl = `https://${this.accountId}.api.${domain}/`;\n\n // Attempt to load regional configuration.\n if (loadConfig) {\n await this.LoadConfig({\n guardian: guardian,\n // We marked it as attempted to load outside this method to fight any external calls.\n // So we'll force load it now.\n forceLoad: true\n });\n }\n \n // Get the version.\n if (this.baseUrl) {\n const full = this.ConstructUrl({ \n url: \"version\" \n });\n const data = await this.get(full);\n if (data?.[\"Bruce-API\"]) {\n this.version = data[\"Bruce-API\"];\n }\n else {\n this.version = \"UNKNOWN\";\n }\n }\n\n // Start web socket connection.\n if (loadWebSocket == true) {\n try {\n const full = this.ConstructUrl();\n this.messageBroker = new MessageBroker.WebSocketBroker(full, this.env);\n }\n catch (e) {\n console.warn(\"BruceApi: Failed to create message broker.\", e);\n }\n }\n }\n\n private getDomain(): string {\n const env = this.env.toUpperCase();\n let domain = \"nextspace.host\";\n switch (env) {\n case A.EEnv.DEV:\n domain = \"nextspace-dev.net\";\n break;\n case A.EEnv.STG:\n domain = \"nextspace-stg.net\";\n break;\n case A.EEnv.UAT:\n domain = \"nextspace-uat.net\";\n break;\n case A.EEnv.PROD:\n domain = \"nextspace.host\";\n break;\n default:\n console.error(\"Specified Environment is not valid. SuppliedEnv=\" + env);\n }\n return domain;\n }\n\n /**\n * Loads the regional configuration for the account.\n * If the config is already loaded then this will do nothing.\n */\n public async LoadConfig(params?: {\n guardian?: GuardianApi.Api,\n // Bypass the check to see if the config was already loaded.\n forceLoad?: boolean\n }): Promise<void> {\n let {guardian, forceLoad} = (params ?? {});\n if (this.configLoadAttempted && forceLoad != true) {\n return;\n }\n this.configLoadAttempted = true;\n try {\n if (!guardian) {\n guardian = new GuardianApi.Api({\n env: this.env\n });\n }\n\n const {account} = await Account.GetBySubdomain({\n subdomain: this.accountId,\n api: guardian\n });\n\n if (!this.loadCancelled) {\n // Set the calculated base url.\n // If this is not available then this is considered a critical failure.\n // However I am not crashing here because I want to monitor this in production.\n if (account.URL) {\n const urls = account.URL;\n if (urls?.Base) {\n this.baseUrl = urls.Base;\n }\n if (urls?.CDNEntities) {\n this.EntityCdnUrl = urls.CDNEntities;\n }\n if (urls?.CDNTileset) {\n this.TilesetCdnUrl = urls.CDNTileset;\n }\n if (urls?.CDNLegacyTileset) {\n this.LegacyTilesetCdnUrl = urls.CDNLegacyTileset;\n }\n if (urls?.CDNBase) {\n this.cdnBaseUrl = urls.CDNBase;\n }\n }\n else {\n console.error(\"BruceApi: Failed to load regional configuration for account.\", this.accountId);\n }\n }\n }\n catch (e) {\n console.error(e);\n }\n }\n\n /**\n * Creates a message broker instance and returns it.\n * If an instance is already created, it will return that one.\n * @warning This will await the loading promise to avoid using data that isn't ready.\n */\n public async ConnectWebsocket(): Promise<MessageBroker.IBroker> {\n await this.loadProm;\n if (this.messageBroker) {\n return this.messageBroker;\n }\n const full = this.ConstructUrl();\n this.messageBroker = new MessageBroker.WebSocketBroker(full, this.env);\n return this.messageBroker;\n }\n\n /**\n * Warning: This method does not wait for init to finish loading.\n * This means the url could be changed once fully initialized.\n * The url will be valid either way, but the loaded one may be faster as it is region specific.\n * Await the \"Loading\" promise if you care about this.\n * @warning use ConstructUrl instead as the baseUrl may have a query param for the account.\n * @returns\n */\n public GetBaseUrl(): string {\n return this.baseUrl;\n }\n\n /**\n * Warning: Wait the \"Loading\" promise before using this url.\n * @warning use ConstructUrl instead as the baseUrl may have a query param for the account.\n * @returns \n */\n public GetCdnBaseUrl(): string {\n return this.cdnBaseUrl;\n }\n\n /**\n * Returns a url with the provided url appended to the loaded base url.\n * If the base url is not loaded yet, this will return null.\n * @param params \n */\n public ConstructUrl(params?: {\n // URL to append to the base url.\n url?: string,\n // URL params to append to the url.\n urlParams?: URLSearchParams | IDictionary<string>,\n // If true this will check if a CDN url is available and use that instead.\n // If one is not available then the typical base url is used.\n cdn?: boolean\n }) {\n if (params?.cdn && this.cdnBaseUrl) {\n return this.ConstructCdnUrl(params.url, params.urlParams);\n }\n\n const tmp = new URL(this.baseUrl);\n \n if (params?.urlParams) {\n if (params.urlParams instanceof URLSearchParams) {\n params.urlParams.forEach((value, key) => {\n tmp.searchParams.append(key, value);\n });\n }\n else {\n for (const key in params.urlParams) {\n tmp.searchParams.append(key, params.urlParams[key]);\n }\n }\n }\n\n // Ensure the url ends with a slash.\n if (!tmp.pathname.endsWith(\"/\")) {\n tmp.pathname += \"/\";\n }\n\n let split: string[];\n if (params?.url) {\n // Ensure we're only adding the path.\n // The baseUrl could have included query params so have this extra logic.\n split = params.url.split(\"?\");\n\n // Ensure the url does not start with a slash.\n // This is because the base url already has a slash at the end.\n let path = split[0];\n if (path.startsWith(\"/\")) {\n path = path.substring(1);\n }\n tmp.pathname += path;\n }\n\n let full = tmp.toString();\n\n // Append the query string if any exist.\n if (split && split.length > 1) {\n const query = split[1].split(\"&\");\n for (let q of query) {\n if (full.includes(\"?\")) {\n full += \"&\";\n }\n else {\n full += \"?\";\n }\n full += q;\n }\n }\n\n return full;\n }\n\n /**\n * Returns a url routed through the API's CDN.\n * If the CDN is not enabled for the account, this will return null.\n * @param url suffix to append to the base url.\n * @param urlParams \n * @returns \n */\n public ConstructCdnUrl(url: string, urlParams?: URLSearchParams | IDictionary<string>): string {\n if (!this.cdnBaseUrl) {\n return null;\n }\n \n const tmp = new URL(this.cdnBaseUrl);\n if (urlParams) {\n if (urlParams instanceof URLSearchParams) {\n urlParams.forEach((value, key) => {\n tmp.searchParams.append(key, value);\n });\n }\n else {\n for (const key in urlParams) {\n tmp.searchParams.append(key, urlParams[key]);\n }\n }\n }\n\n // Ensure the url ends with a slash.\n if (!tmp.pathname.endsWith(\"/\")) {\n tmp.pathname += \"/\";\n }\n \n if (url) {\n // Ensure we're only adding the path.\n // The baseUrl could have included query params so have this extra logic.\n let split = url.split(\"?\");\n\n // Ensure the url does not start with a slash.\n // This is because the base url already has a slash at the end.\n let path = split[0];\n if (path.startsWith(\"/\")) {\n path = url.substring(1);\n }\n tmp.pathname += path;\n\n // Append the query string if any exist.\n if (split.length > 1) {\n const query = split[1].split(\"&\");\n for (let q of query) {\n const parts = q.split(\"=\");\n tmp.searchParams.append(parts[0], parts[1]);\n }\n }\n }\n\n return tmp.toString();\n }\n\n /**\n * Warning: This will cancel the init process.\n * The init process loads a region specific endpoint.\n * Setting a base url will stop that process from completing.\n * @param url\n */\n public SetBaseUrl(url: string): void {\n this.baseUrl = url;\n // If we're setting a valid URL then we'll ensure it ends with a slash.\n if (this.baseUrl && (this.baseUrl.startsWith(\"http://\") || this.baseUrl.startsWith(\"https://\"))) {\n // Parsing into URL object to avoid adding a \"/\" after query params.\n const full = new URL(this.baseUrl);\n if (!full.pathname.endsWith(\"/\")) {\n full.pathname += \"/\";\n }\n this.baseUrl = full.toString();\n }\n this.loadCancelled = true;\n }\n\n /**\n * Performs an HTTP GET request.\n * This will prepend the base url to the url.\n * @param url \n * @param params \n * @returns \n */\n public async GET(url: string, params?: A.IReqParams): Promise<any> {\n return new Promise((res, rej) => {\n this.loadProm.then(() => {\n const full = this.ConstructUrl({ \n url: url \n });\n this.get(full, params).then(res).catch(rej);\n }).catch(rej);\n });\n }\n\n /**\n * Performs an HTTP DELETE request.\n * This will prepend the base url to the url.\n * @param url \n * @param params \n * @returns \n */\n public async DELETE(url: string, params?: A.IReqParams): Promise<any> {\n return new Promise((res, rej) => {\n this.loadProm.then(() => {\n const full = this.ConstructUrl({\n url: url\n });\n this.delete(full, params).then(res).catch(rej);\n }).catch(rej);\n });\n }\n\n /**\n * Performs an HTTP POST request.\n * This will prepend the base url to the url.\n * @param url \n * @param data \n * @param params \n * @returns \n */\n public async POST(url: string, data: any, params?: A.IReqParams): Promise<any> {\n return new Promise((res, rej) => {\n this.loadProm.then(() => {\n const full = this.ConstructUrl({\n url: url\n });\n this.post(full, data, params).then(res).catch(rej);\n }).catch(rej);\n });\n }\n\n /**\n * Performs an HTTP PUT request.\n * This will prepend the base url to the url.\n * @param url \n * @param data \n * @param params \n * @returns \n */\n public async PUT(url: string, data: any, params?: A.IReqParams): Promise<any> {\n return new Promise((res, rej) => {\n this.loadProm.then(() => {\n const full = this.ConstructUrl({\n url: url\n });\n this.put(full, data, params).then(res).catch(rej);\n }).catch(rej);\n });\n }\n\n /**\n * Performs a file upload request (HTTP POST).\n * This will prepend the base url to the url.\n * @param url \n * @param blob \n * @param params \n * @returns \n */\n public async UPLOAD(url: string, blob: Blob, params?: A.IUploadReqParams): Promise<any> {\n return new Promise((res, rej) => {\n this.loadProm.then(() => {\n const full = this.ConstructUrl({\n url: url\n });\n this.upload(full, blob, params).then(res).catch(rej);\n }).catch(rej);\n });\n }\n }\n}","import { AbstractApi } from \"./abstract-api\";\nimport { Api as A } from \"./api\";\n\n/**\n * This is the request handler for Global Api,\n * The global api is used to store information that is higher level than client accounts.\n * For example it will store usage records, client account group settings, data sharing settings, etc.\n */\nexport namespace GlobalApi {\n export class Api extends AbstractApi {\n // The environment this api is running on.\n private env: A.Env;\n\n constructor(params: {\n // Optional environment to use. If unspecified, the default environment will be used.\n // Default is A.EEnv.PROD.\n env?: A.Env\n }) {\n super({\n ssidHeader: \"x-sessionid\",\n cacheId: `GLOBAL_API_${params?.env}_`\n });\n this.env = params?.env ? params.env : A.EEnv.PROD;\n this.setBaseUrl();\n }\n\n /**\n * Sets the base url for this api.\n */\n private setBaseUrl(): void {\n let url: string;\n const env = this.env.toUpperCase();\n switch (env) {\n case A.EEnv.DEV:\n url = \"https://bruceglobal.nextspace-dev.net/\";\n break;\n case A.EEnv.STG:\n url = \"https://bruceglobal.nextspace-stg.net/\";\n break;\n case A.EEnv.UAT:\n url = \"https://bruceglobal.api.nextspace-uat.net/\";\n break;\n case A.EEnv.PROD:\n url = \"https://bruceglobal.api.nextspace.host/\";\n break;\n default:\n throw(\"Specified Environment is not valid. SuppliedEnv=\" + env);\n }\n this.baseUrl = url;\n }\n\n /**\n * Gets the base url for this api.\n * @returns \n */\n public GetBaseUrl(): string {\n return this.baseUrl;\n }\n\n /**\n * Sets the base url for this api.\n * @param url \n */\n public SetBaseUrl(url: string): void {\n this.baseUrl = url;\n if (!this.baseUrl.endsWith(\"/\")) {\n this.baseUrl += \"/\";\n }\n }\n\n /**\n * Performs an HTTP GET request.\n * This will prepend the base url to the url.\n * @param url \n * @param params \n * @returns \n */\n public async GET(url: string, params?: A.IReqParams): Promise<any> {\n return this.get(this.baseUrl + url, params);\n }\n\n /**\n * Performs an HTTP DELETE request.\n * This will prepend the base url to the url.\n * @param url \n * @param params \n * @returns \n */\n public async DELETE(url: string, params?: A.IReqParams): Promise<any> {\n return this.delete(this.baseUrl + url, params);\n }\n\n /**\n * Performs an HTTP POST request.\n * This will prepend the base url to the url.\n * @param url \n * @param data \n * @param params \n * @returns \n */\n public async POST(url: string, data: any, params?: A.IReqParams): Promise<any> {\n return this.post(this.baseUrl + url, data, params);\n }\n\n /**\n * Performs a file upload request (HTTP POST).\n * This will prepend the base url to the url.\n * @param url \n * @param blob \n * @param params \n * @returns \n */\n public async UPLOAD(url: string, blob: Blob, params?: A.IUploadReqParams): Promise<any> {\n return this.upload(this.baseUrl + url, blob, params);\n }\n }\n}","import { IDictionary } from \"../common/dictionary\";\nimport { Api } from \"./api\";\nimport { BruceApi } from \"./bruce-api\";\nimport { GlobalApi } from \"./global-api\";\nimport { GuardianApi } from \"./guardian-api\";\n\n/**\n * Utility for managing multiple API instances.\n * Example: {\n * const api = new ApiGetters({\n * accountId: \"123\",\n * env: Api.EEnv.PROD\n * });\n * \n * // Returns default API instance specified in constructor.\n * const bruce1 = api.GetBruceApi();\n * // Returns API instance for account 456.\n * const bruce2 = api.GetBruceApi({\n * accountId: \"456\"\n * });\n * \n * const global = api.GetGlobalApi();\n * const guardian = api.GetGuardianApi();\n * }\n */\nexport class ApiGetters {\n private bruce: IDictionary<BruceApi.Api> = {};\n private guardian: IDictionary<GuardianApi.Api> = {};\n private global: IDictionary<GlobalApi.Api> = {};\n // Default account ID to use when one is unspecified.\n private accountId: string;\n // Default environment to use when one is unspecified.\n private env: Api.EEnv;\n // Session ID to use for all API instances.\n private sessionId: string;\n\n constructor(params: {\n // Optional account ID to use. If unspecified, the default account ID will be used.\n accountId: string,\n // Optional environment to use. If unspecified, the default environment will be used.\n // Default is PROD.\n env?: Api.EEnv,\n // Session ID to use for all API instances.\n sessionId?: string\n }) {\n this.accountId = params?.accountId;\n this.env = params?.env ? params.env : Api.EEnv.PROD;\n this.sessionId = params?.sessionId;\n }\n\n /**\n * Clears all cache items in all API instances.\n */\n public ClearCache() {\n for (const key in this.bruce) {\n this.bruce[key]?.Cache?.Clear();\n }\n for (const key in this.guardian) {\n this.guardian[key]?.Cache?.Clear();\n }\n for (const key in this.global) {\n this.global[key]?.Cache?.Clear();\n }\n }\n\n /**\n * Sets the default account ID to use when one is unspecified.\n * @param accountId \n */\n public SetAccountId(accountId: string) {\n this.accountId = accountId;\n\n // Queue load of regional config in case an instance was made earlier without it.\n // We want the default account to always go through the fastest regional endpoint.\n const api = this.GetBruceApi({\n accountId: accountId,\n loadConfig: true\n });\n api.LoadConfig({\n guardian: this.GetGuardianApi({\n env: this.env\n })\n });\n }\n\n /**\n * Returns the default account ID to use when one is unspecified.\n * @returns \n */\n public GetAccountId(): string {\n return this.accountId;\n }\n\n /**\n * Sets the default environment to use when one is unspecified.\n * @param env \n */\n public SetEnv(env: Api.EEnv) {\n this.env = env;\n }\n\n /**\n * Returns the default environment to use when one is unspecified.\n * @returns \n */\n public GetEnv(): Api.EEnv {\n return this.env;\n }\n\n /**\n * Updates the session ID for all API instances.\n * This will auto-clear all cache items.\n * @param sessionId \n */\n public SetSessionId(sessionId: string) {\n this.sessionId = sessionId;\n for (const key in this.bruce) {\n this.bruce[key].SetSessionId(sessionId);\n }\n for (const key in this.guardian) {\n this.guardian[key].SetSessionId(sessionId);\n }\n for (const key in this.global) {\n this.global[key].SetSessionId(sessionId);\n }\n this.ClearCache();\n }\n\n /**\n * Returns the session ID.\n * @returns \n */\n public GetSessionId(): string {\n return this.sessionId;\n }\n\n /**\n * Returns a BruceApi instance.\n * @param params \n * @returns \n */\n public GetBruceApi(params?: {\n // Optional accountId to use. If unspecified, the default account ID will be used.\n accountId?: string,\n // Optional environment to use. If unspecified, the default environment will be used.\n env?: Api.EEnv,\n // If true, the regional base URL will be loaded.\n // This is only read if the API instance is not already created.\n loadConfig?: boolean,\n // If true, the websocket will be connected.\n // This is only read if the API instance is not already created.\n loadWebSocket?: boolean\n }): BruceApi.Api {\n if (!params) {\n params = {};\n }\n let {accountId, env, loadConfig, loadWebSocket} = params;\n accountId = accountId ? accountId : this.accountId;\n env = env ? env : this.env;\n const key = `${accountId}-${env}`;\n if (!this.bruce[key]) {\n this.bruce[key] = new BruceApi.Api({\n accountId,\n env,\n loadConfig: loadConfig != null ? true : loadConfig,\n loadWebSocket: loadWebSocket,\n guardian: this.GetGuardianApi({\n env\n }),\n });\n this.bruce[key].SetSessionId(this.sessionId);\n }\n return this.bruce[key];\n }\n\n /**\n * Returns a BruceApi getter instance.\n * This is a micro-utility that is used to request the bruce-api specifically for various client accounts.\n * @deprecated: use the full api-getters instance instead.\n * @returns \n */\n public GetBruceGetter(): BruceApi.IGetter {\n return {\n accountId: this.accountId,\n env: this.env,\n getApi: (accountId?: string, env?: Api.EEnv) => {\n return this.GetBruceApi({\n accountId, \n env\n });\n }\n }\n }\n\n /**\n * Returns a GlobalApi instance.\n * @param params \n * @returns \n */\n public GetGlobalApi(params?: {\n // Optional environment to use. If unspecified, the default environment will be used.\n env?: Api.EEnv\n }): GlobalApi.Api {\n if (!params) {\n params = {};\n }\n let {env} = params;\n env = env ? env : this.env;\n const key = `${env}`;\n if (!this.global[key]) {\n this.global[key] = new GlobalApi.Api({\n env\n });\n this.global[key].SetSessionId(this.sessionId);\n }\n return this.global[key];\n }\n\n /**\n * Returns a GuardianApi instance.\n * @param params \n * @returns \n */\n public GetGuardianApi(params?: {\n // Optional environment to use. If unspecified, the default environment will be used.\n env?: Api.EEnv\n }): GuardianApi.Api {\n if (!params) {\n params = {};\n }\n let {env} = params;\n env = env ? env : this.env;\n const key = `${env}`;\n if (!this.guardian[key]) {\n this.guardian[key] = new GuardianApi.Api({\n env\n });\n this.guardian[key].SetSessionId(this.sessionId);\n }\n return this.guardian[key];\n }\n}","import { Api as A } from \"./api/api\";\nimport { ApiGetters } from \"./api/api-getters\";\n\ninterface IParams {\n isSelfManaged?: boolean;\n accountId?: string;\n env?: A.EEnv;\n sessionId?: string;\n apiGetters?: ApiGetters;\n}\n\n// Global instance for smaller use-cases where you don't want to manage the getters yourself.\nlet _getters: ApiGetters;\n\nexport namespace ENVIRONMENT {\n // If true, then defaults are not touched and it's assumed this is being managed.\n export let IS_SELF_MANAGED = false;\n // Unused if IS_SELF_MANAGED is false.\n export let PARAMS: IParams = {\n // Default client account ID.\n accountId: \"\",\n // Default environment.\n env: A.EEnv.UAT,\n // Default session ID.\n sessionId: \"\"\n };\n\n /**\n * Returns the ApiGetters instance.\n * This is used to communicate with any Nextspace API instance.\n * @returns \n */\n export function Api() {\n if (IS_SELF_MANAGED) {\n throw(\"Self managed mode ON. You are getting this error because you didn't pass an Api instance to a function.\");\n }\n if (!_getters) {\n _getters = new ApiGetters({\n accountId: PARAMS.accountId,\n env: PARAMS.env ? PARAMS.env : A.EEnv.UAT,\n sessionId: PARAMS.sessionId\n });\n }\n return _getters;\n }\n\n /**\n * Resets the environment to the specified params.\n * @param params \n */\n export function Reset(params?: IParams) {\n if (IS_SELF_MANAGED) {\n throw(\"Self managed mode ON. You are getting this error because you didn't pass an Api instance to a function.\");\n }\n if (_getters) {\n _getters.ClearCache();\n if (params.accountId) {\n _getters.SetAccountId(params.accountId);\n }\n if (params.sessionId) {\n _getters.SetSessionId(params.sessionId);\n }\n if (params.env) {\n _getters.SetEnv(params.env);\n }\n }\n PARAMS = {\n ...PARAMS,\n ...params\n };\n }\n}","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { ENVIRONMENT } from \"../environment\";\n\ntype Type = AnnDocument.EType | string;\n\n/**\n * Describes communication with the \"Annotated Document\" concept in Bruce.\n * Annotated documents are files with hotspots that can link to Entity records.\n */\nexport namespace AnnDocument {\n /**\n * Describes an annotated document record.\n */\n export interface IDocument {\n ID?: number;\n Type: Type;\n Name: string;\n \"ClientFile.ID\": string;\n Settings?: ISettings;\n }\n\n /**\n * The types of supported annotated documents.\n */\n export enum EType {\n SVG = \"SVG\"\n }\n\n /**\n * Describes settings for an annotated document.\n */\n export interface ISettings {\n Hotspots?: IHotspot[];\n DrawingScaleFactorX?: number;\n DrawingScaleFactorY?: number;\n }\n\n /**\n * Describes a hotspot on an annotated document.\n * Hotspots are areas of interest on the document that can be linked to Entity records.\n */\n export interface IHotspot {\n X: number;\n Y: number;\n Key: string;\n Description?: string;\n LinkedEntity?: {\n \"Entity.ID\": string;\n };\n }\n\n /**\n * Returns an annotated document by ID.\n * @param params \n * @returns \n */\n export async function Get(params: {\n api?: BruceApi.Api,\n docId: number,\n req?: Api.IReqParams\n }): Promise<{\n document: IDocument\n }> {\n let { api, docId, req: reqParams } = params;\n if (!docId) {\n throw(\"Doc ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const key = GetCacheKey(docId);\n const cache = await api.GetCacheItem(key, reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(`documentView/${docId}`, Api.PrepReqParams(reqParams));\n res({\n document: data\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key,\n value: prom,\n req: reqParams\n });\n return prom;\n }\n\n /**\n * Returns a list of annotated documents by type.\n * @param params \n * @returns \n */\n export async function GetList(params: {\n api?: BruceApi.Api,\n // If not specified, all types are returned.\n docType?: Type,\n // If true, the settings for each document are expanded.\n // By default they are removed to reduce payload size.\n expandSettings?: boolean,\n // Filters list to documents that have hotspots related to this ID.\n entityId?: string,\n req?: Api.IReqParams\n }): Promise<{\n documents: IDocument[]\n }> {\n let { api, docType: type, req: reqParams, entityId, expandSettings } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n if (!type) {\n type = \"\";\n }\n \n const cache = await api.GetCacheItem(GetListCacheKey(type, entityId, expandSettings), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const req: Promise<any> = new Promise(async (res, rej) => {\n try {\n const urlParams = new URLSearchParams();\n if (type) {\n urlParams.append(\"type\", type);\n }\n if (entityId) {\n urlParams.append(\"entityId\", entityId);\n }\n if (expandSettings) {\n urlParams.append(\"expandSettings\", \"true\");\n }\n\n const url = \"documentViews\" + `?${urlParams.toString()}`;\n const data = await api.GET(url, Api.PrepReqParams(reqParams));\n res({\n documents: data.Items\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key: GetListCacheKey(type, entityId, expandSettings),\n value: req,\n req: reqParams\n });\n return req;\n }\n\n /**\n * Returns cache identifier for an annotated document by ID.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetCacheKey(1);\n * api.Cache.Remove(key);\n * }\n * @param id \n * @returns \n */\n export function GetCacheKey(id: number) {\n return `${Api.ECacheKey.AnnDocument}${Api.ECacheKey.Id}${id}`;\n }\n\n /**\n * Returns cache identifier for a list of annotated documents by type.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetListCacheKey(\"SVG\");\n * api.Cache.Remove(key);\n * }\n * @param type \n * @param entityId\n * @param expandSettings\n * @returns \n */\n export function GetListCacheKey(type: Type, entityId?: string, expandSettings?: boolean) {\n if (!expandSettings) {\n expandSettings = false;\n }\n if (!entityId) {\n entityId = \"\";\n }\n return Api.ECacheKey.AnnDocument + type + entityId + expandSettings;\n }\n}","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { ENVIRONMENT } from \"../environment\";\nimport { CustomFormContent } from \"./custom-form-content\";\n\n/**\n * Describes the \"Custom Form\" concept within Nextspace.\n * Custom forms are dynamic dialogs that get populated with Entity data.\n */\nexport namespace CustomForm {\n /**\n * Describes a custom form record.\n */\n export interface IForm {\n ID?: number;\n // This is the entity type ID that this custom form is associated with.\n \"EntityType.ID\"?: string;\n // Human readable custom form name.\n Name?: string;\n // Custom form content.\n Settings?: CustomFormContent.IContent | any;\n // Custom form type. This helps identify how to parse the settings.\n Type?: EType;\n }\n\n /**\n * Types of custom forms available.\n */\n export enum EType {\n // Deprecated types.\n Form = \"GENERIC\",\n Markup = \"MARKUP\",\n // Supported types.\n ComponentStack = \"COMPONENT_STACK\"\n }\n\n /**\n * Gets a custom form by ID.\n * @param params \n * @returns \n */\n export async function Get(params: {\n api?: BruceApi.Api,\n // The ID of the custom form to get.\n formId: number,\n req?: Api.IReqParams\n }): Promise<{\n // The custom form record associated with the ID.\n form: IForm\n }> {\n let { api, formId: id, req: reqParams } = params;\n if (!id) {\n throw(\"Id is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n \n const cache = await api.GetCacheItem(GetCacheKey(id), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(`customForm/${id}`, Api.PrepReqParams(reqParams));\n res({\n form: data\n });\n } catch (err) {\n rej(err);\n }\n });\n await api.SetCacheItem({\n key: GetCacheKey(id),\n value: prom,\n req: reqParams\n });\n return prom;\n }\n\n /**\n * Deletes a custom form by ID.\n * @param params \n */\n export async function Delete(params: {\n api?: BruceApi.Api,\n // The ID of the custom form to delete.\n formId: number,\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, formId: id, req: reqParams } = params;\n if (!id) {\n return Promise.resolve();\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n await api.DELETE(`customForm/${id}`, Api.PrepReqParams(reqParams))\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.CustomForm);\n }\n\n /**\n * Gets a list of custom forms by entity type ID.\n * @param params \n * @returns \n */\n export async function GetList(params: {\n api?: BruceApi.Api,\n // The ID of the entity type to get custom forms for.\n entityTypeId: string,\n req?: Api.IReqParams\n }): Promise<{\n // The list of custom forms associated with the entity type ID.\n forms: IForm[]\n }> {\n let { api, entityTypeId: typeId, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const url = typeId ? `entityType/${typeId}/customForms` : \"customForms\";\n const cache = await api.GetCacheItem(GetListCacheKey(typeId), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const req = api.GET(url, Api.PrepReqParams(reqParams));\n const prom = req.then((data) => {\n return {\n forms: data.Items\n };\n });\n await api.SetCacheItem({\n key: GetListCacheKey(typeId),\n value: prom,\n req: reqParams\n });\n return prom;\n }\n\n /**\n * Creates or updates a custom form record.\n * @param params \n * @returns \n */\n export async function Update(params: {\n api?: BruceApi.Api,\n // The custom form record to create or update.\n // To create a record don't set the ID property.\n form: IForm,\n reqParams?: Api.IReqParams\n }): Promise<{\n // The custom form record that was created or updated.\n form: IForm\n }> {\n let { api, form: data, reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n if (!data.ID) {\n data.ID = 0;\n }\n const res = await api.POST(`customForm/${data.ID}`, data, Api.PrepReqParams(reqParams));\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.CustomForm);\n return {\n form: res\n };\n }\n\n /**\n * Returns cache identifier for a Custom Form by ID.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetCacheKey(1);\n * api.Cache.Remove(key);\n * }\n * @param id \n * @returns \n */\n export function GetCacheKey(id: number): string {\n return Api.ECacheKey.CustomForm + Api.ECacheKey.Id + id;\n }\n \n /**\n * Returns cache identifier for a list of Custom Forms by Entity Type ID.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetListCacheKey(\"123\");\n * api.Cache.Remove(key);\n * }\n * @param typeId \n * @returns \n */\n export function GetListCacheKey(typeId: string): string {\n if (typeId) {\n return Api.ECacheKey.CustomForm + Api.ECacheKey.EntityType + Api.ECacheKey.Id + typeId;\n }\n return Api.ECacheKey.CustomForm;\n }\n}","/**\n * Dictionary of CSS color names and their hex values.\n */\nexport const COLOR_CSS_DEFAULTS = {\n \"aliceblue\": \"#F0F8FF\",\n \"antiquewhite\": \"#FAEBD7\",\n \"aqua\": \"#00FFFF\",\n \"aquamarine\": \"#7FFFD4\",\n \"azure\": \"#F0FFFF\",\n \"beige\": \"#F5F5DC\",\n \"bisque\": \"#FFE4C4\",\n \"black\": \"#000000\",\n \"blanchedalmond\": \"#FFEBCD\",\n \"blue\": \"#0000FF\",\n \"blueviolet\": \"#8A2BE2\",\n \"brown\": \"#A52A2A\",\n \"burlywood\": \"#DEB887\",\n \"cadetblue\": \"#5F9EA0\",\n \"chartreuse\": \"#7FFF00\",\n \"chocolate\": \"#D2691E\",\n \"coral\": \"#FF7F50\",\n \"cornflowerblue\": \"#6495ED\",\n \"cornsilk\": \"#FFF8DC\",\n \"crimson\": \"#DC143C\",\n \"cyan\": \"#00FFFF\",\n \"darkblue\": \"#00008B\",\n \"darkcyan\": \"#008B8B\",\n \"darkgoldenrod\": \"#B8860B\",\n \"darkgray\": \"#A9A9A9\",\n \"darkgreen\": \"#006400\",\n \"darkgrey\": \"#A9A9A9\",\n \"darkkhaki\": \"#BDB76B\",\n \"darkmagenta\": \"#8B008B\",\n \"darkolivegreen\": \"#556B2F\",\n \"darkorange\": \"#FF8C00\",\n \"darkorchid\": \"#9932CC\",\n \"darkred\": \"#8B0000\",\n \"darksalmon\": \"#E9967A\",\n \"darkseagreen\": \"#8FBC8F\",\n \"darkslateblue\": \"#483D8B\",\n \"darkslategray\": \"#2F4F4F\",\n \"darkslategrey\": \"#2F4F4F\",\n \"darkturquoise\": \"#00CED1\",\n \"darkviolet\": \"#9400D3\",\n \"deeppink\": \"#FF1493\",\n \"deepskyblue\": \"#00BFFF\",\n \"dimgray\": \"#696969\",\n \"dimgrey\": \"#696969\",\n \"dodgerblue\": \"#1E90FF\",\n \"firebrick\": \"#B22222\",\n \"floralwhite\": \"#FFFAF0\",\n \"forestgreen\": \"#228B22\",\n \"fuchsia\": \"#FF00FF\",\n \"gainsboro\": \"#DCDCDC\",\n \"ghostwhite\": \"#F8F8FF\",\n \"gold\": \"#FFD700\",\n \"goldenrod\": \"#DAA520\",\n \"gray\": \"#808080\",\n \"green\": \"#008000\",\n \"greenyellow\": \"#ADFF2F\",\n \"grey\": \"#808080\",\n \"honeydew\": \"#F0FFF0\",\n \"hotpink\": \"#FF69B4\",\n \"indianred\": \"#CD5C5C\",\n \"indigo\": \"#4B0082\",\n \"ivory\": \"#FFFFF0\",\n \"khaki\": \"#F0E68C\",\n \"lavender\": \"#E6E6FA\",\n \"lavenderblush\": \"#FFF0F5\",\n \"lawngreen\": \"#7CFC00\",\n \"lemonchiffon\": \"#FFFACD\",\n \"lightblue\": \"#ADD8E6\",\n \"lightcoral\": \"#F08080\",\n \"lightcyan\": \"#E0FFFF\",\n \"lightgoldenrodyellow\": \"#FAFAD2\",\n \"lightgray\": \"#D3D3D3\",\n \"lightgreen\": \"#90EE90\",\n \"lightgrey\": \"#D3D3D3\",\n \"lightpink\": \"#FFB6C1\",\n \"lightsalmon\": \"#FFA07A\",\n \"lightseagreen\": \"#20B2AA\",\n \"lightskyblue\": \"#87CEFA\",\n \"lightslategray\": \"#778899\",\n \"lightslategrey\": \"#778899\",\n \"lightsteelblue\": \"#B0C4DE\",\n \"lightyellow\": \"#FFFFE0\",\n \"lime\": \"#00FF00\",\n \"limegreen\": \"#32CD32\",\n \"linen\": \"#FAF0E6\",\n \"magenta\": \"#FF00FF\",\n \"maroon\": \"#800000\",\n \"mediumaquamarine\": \"#66CDAA\",\n \"mediumblue\": \"#0000CD\",\n \"mediumorchid\": \"#BA55D3\",\n \"mediumpurple\": \"#9370DB\",\n \"mediumseagreen\": \"#3CB371\",\n \"mediumslateblue\": \"#7B68EE\",\n \"mediumspringgreen\": \"#00FA9A\",\n \"mediumturquoise\": \"#48D1CC\",\n \"mediumvioletred\": \"#C71585\",\n \"midnightblue\": \"#191970\",\n \"mintcream\": \"#F5FFFA\",\n \"mistyrose\": \"#FFE4E1\",\n \"moccasin\": \"#FFE4B5\",\n \"navajowhite\": \"#FFDEAD\",\n \"navy\": \"#000080\",\n \"oldlace\": \"#FDF5E6\",\n \"olive\": \"#808000\",\n \"olivedrab\": \"#6B8E23\",\n \"orange\": \"#FFA500\",\n \"orangered\": \"#FF4500\",\n \"orchid\": \"#DA70D6\",\n \"palegoldenrod\": \"#EEE8AA\",\n \"palegreen\": \"#98FB98\",\n \"paleturquoise\": \"#AFEEEE\",\n \"palevioletred\": \"#DB7093\",\n \"papayawhip\": \"#FFEFD5\",\n \"peachpuff\": \"#FFDAB9\",\n \"peru\": \"#CD853F\",\n \"pink\": \"#FFC0CB\",\n \"plum\": \"#DDA0DD\",\n \"powderblue\": \"#B0E0E6\",\n \"purple\": \"#800080\",\n \"rebeccapurple\": \"#663399\",\n \"red\": \"#FF0000\",\n \"rosybrown\": \"#BC8F8F\",\n \"royalblue\": \"#4169E1\",\n \"saddlebrown\": \"#8B4513\",\n \"salmon\": \"#FA8072\",\n \"sandybrown\": \"#F4A460\",\n \"seagreen\": \"#2E8B57\",\n \"seashell\": \"#FFF5EE\",\n \"sienna\": \"#A0522D\",\n \"silver\": \"#C0C0C0\",\n \"skyblue\": \"#87CEEB\",\n \"slateblue\": \"#6A5ACD\",\n \"slategray\": \"#708090\",\n \"slategrey\": \"#708090\",\n \"snow\": \"#FFFAFA\",\n \"springgreen\": \"#00FF7F\",\n \"steelblue\": \"#4682B4\",\n \"tan\": \"#D2B48C\",\n \"teal\": \"#008080\",\n \"thistle\": \"#D8BFD8\",\n \"tomato\": \"#FF6347\",\n \"turquoise\": \"#40E0D0\",\n \"violet\": \"#EE82EE\",\n \"wheat\": \"#F5DEB3\",\n \"white\": \"#FFFFFF\",\n \"whitesmoke\": \"#F5F5F5\",\n \"yellow\": \"#FFFF00\",\n \"yellowgreen\": \"#9ACD32\"\n};","import { COLOR_CSS_DEFAULTS } from \"./color-css-defaults\";\n\nexport namespace Color {\n export interface IColor {\n // Max: 255, Min: 0.\n red: number;\n green: number;\n blue: number;\n // Max: 1, Min: 0.\n alpha: number ;\n }\n\n /**\n * Setting for how a colour should be applied in certain contexts.\n * For example should a 3D model's colour be replaced or blended with?\n */\n export enum EBlendMode {\n HIGHLIGHT,\n REPLACE,\n MIX\n }\n\n export interface IBlendSettings {\n blendMode?: EBlendMode;\n // 1 = 100% new color. 0 = original color.\n blendPercent?: number;\n }\n\n export function RandomColor(): IColor {\n // https://stackoverflow.com/a/7352887\n const brightness = 4;\n const rgb = [Math.random() * 256, Math.random() * 256, Math.random() * 256];\n const mix = [brightness * 51, brightness * 51, brightness * 51];\n const mixedrgb = [rgb[0] + mix[0], rgb[1] + mix[1], rgb[2] + mix[2]].map(function(x){\n return Math.round(x / 2.0);\n });\n const str = \"rgba(\" + mixedrgb.join(\",\") + \",0.9\" + \")\";\n return ColorFromStr(str);\n }\n\n /**\n * Attempts to parse a given css-color.\n * On failure null is returned.\n * @param str \n * @returns \n */\n export function ColorFromStr(str: string): IColor {\n if (!str || typeof str != \"string\") {\n return <any>null;\n }\n\n // Check for known CSS keywords.\n const knownHex = COLOR_CSS_DEFAULTS[str.toLowerCase()];\n if (knownHex) {\n str = knownHex;\n }\n \n if (str.charAt(0) == \"#\") {\n str = str.substring(1);\n }\n let r: number, g: number, b: number, a: number;\n const rgba = /^rgba?\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*([^\\)]+)\\s*)?\\)$/.exec(str);\n if (rgba) {\n r = parseInt(rgba[1]);\n g = parseInt(rgba[2]);\n b = parseInt(rgba[3]);\n a = rgba[4] != null ? parseFloat(rgba[4]) : 1;\n return {\n red: r,\n green: g,\n blue: b,\n alpha: a\n }\n }\n if (str.length == 6) {\n // rgb.\n const parsed = /^(.{2})(.{2})(.{2})/.exec(str);\n if (!parsed) {\n return <any>null;\n }\n r = parseInt(parsed[1], 16);\n g = parseInt(parsed[2], 16);\n b = parseInt(parsed[3], 16);\n a = 1;\n }\n else if (str.length == 8) {\n // rgba.\n const parsed = /^(.{2})(.{2})(.{2})(.{2})/.exec(str);\n if (!parsed) {\n return <any>null;\n }\n r = parseInt(parsed[1], 16);\n g = parseInt(parsed[2], 16);\n b = parseInt(parsed[3], 16);\n a = parseInt(parsed[4], 16);\n if (a != 0) {\n a = a/255;\n }\n }\n else {\n return <any>null;\n }\n if (a == null) {\n a = 1;\n }\n return {\n red: r,\n blue: b,\n green: g,\n alpha: a\n }\n }\n}","import { Carto } from \"./carto\";\n\n/**\n * Describes vector geometry that Bruce uses.\n */\nexport namespace Geometry {\n export interface IGeometry {\n // Polygon array is an array of rings.\n // There should be 1 outer ring and 0 or more inner rings.\n Polygon?: IPolygonRing[];\n MultiGeometry?: IGeometry[];\n Point?: string;\n LineString?: string;\n MultiSurface?: string;\n }\n\n export interface IPolygonRing {\n LinearRing: string;\n Facing: EPolygonRingType;\n Height?: number;\n }\n\n export enum EPolygonRingType {\n Boundaries = \"out\",\n Hole = \"in\"\n }\n\n /**\n * Turns an array of points into string vector geometry that Bruce can use.\n * This is used for saving polyline and polygon data.\n * @param points \n * @returns \n */\n export function LineStrFromPoints(points: Carto.ICarto[]): string {\n if (!points.length) {\n throw(\"points is empty.\");\n }\n let carto: Carto.ICarto = points[0];\n let lineString = `${carto.longitude},${carto.latitude}` + (carto.altitude != null ? `,${carto.altitude}` : \"\");\n for (let i = 1; i < points.length; i++) {\n carto = points[i];\n lineString += ` ${carto.longitude},${carto.latitude}` + (carto.altitude != null ? `,${carto.altitude}` : \"\");\n }\n return lineString;\n }\n\n /**\n * Removes same points that occur in a row.\n * This will not modify the original array.\n * @param positions \n * @returns \n */\n export function RemoveRepeatPoints(positions: Carto.ICarto[]): Carto.ICarto[] {\n const filteredList = [];\n for (let i = 0; i < positions.length; i++) {\n const pos = positions[i];\n const lastPos = filteredList.length > 0 ? filteredList[filteredList.length - 1] : null;\n if (!lastPos || (pos.latitude != lastPos.latitude || pos.longitude != lastPos.longitude || pos.altitude != lastPos.altitude)) {\n filteredList.push(pos); \n }\n }\n return filteredList;\n }\n\n /**\n * Parses a string of points into an array of points.\n * @param pointsStr \n * @returns \n */\n export function ParsePoints(pointsStr: string): Carto.ICarto[] {\n pointsStr = pointsStr.replace(/[^\\d.,-\\s]/g, \"\");\n\n let splitterCoordinates = \" \";\n let splitterAxis = \",\";\n const commaIndex = pointsStr.indexOf(\",\");\n const spaceIndex = pointsStr.indexOf(\" \");\n if ((spaceIndex > -1 && commaIndex > spaceIndex) || commaIndex <= -1) {\n splitterCoordinates = \",\";\n splitterAxis = \" \";\n }\n\n let points = pointsStr.trim().split(splitterCoordinates);\n points = points.filter(a => a != \"\");\n\n const result: Carto.ICarto[] = [];\n for (let i = 0; i < points.length; i++) {\n const pointData = points[i];\n const coords = pointData.trim().split(splitterAxis);\n if (coords.length == 2 || coords.length == 3) {\n const longitude = Number(coords[0]);\n const latitude = Number(coords[1]);\n const altitude = Number(coords.length >= 3 ? coords[2] : 0);\n if (longitude != null && latitude != null) {\n result.push({\n altitude: altitude,\n latitude: latitude,\n longitude: longitude\n });\n }\n else {\n console.warn(\"Invalid point data detected.\", pointData);\n }\n }\n }\n return result;\n }\n\n /**\n * Parses both string and object Bruce geometry.\n * String geometry is legacy Bruce data.\n * @param geometry \n * @returns \n */\n export function ParseGeometry(geometry: any): IGeometry {\n if (typeof geometry == \"string\") {\n let positions: Carto.ICarto[] = [];\n const geometryParsed: string[] = (geometry || \"\").split(\";\");\n for (let i = 0; i < geometryParsed.length; i++) {\n const data = geometryParsed[i];\n const points = ParsePoints(data);\n if (points && points.length > 0) {\n positions = positions.concat(points);\n }\n }\n positions = RemoveRepeatPoints(positions);\n const newGeometry: IGeometry = {};\n if (positions.length > 0) {\n const topPoint = positions[0];\n newGeometry.Point = `${topPoint.latitude},${topPoint.longitude}` + (topPoint.altitude != null ? `,${topPoint.altitude}` : \"\");\n if (positions.length > 1) {\n newGeometry.Polygon = [{ Facing: EPolygonRingType.Boundaries, LinearRing: LineStrFromPoints(positions) }];\n }\n if (positions.length > 2) {\n newGeometry.LineString = LineStrFromPoints(positions);\n }\n }\n return newGeometry;\n }\n return geometry;\n }\n}","export namespace ObjectUtils {\n const DEFAULT_LENGTH = 36;\n\n /**\n * Generates a Nextspace compatible UID.\n * @returns \n */\n export function UId(length: number = DEFAULT_LENGTH): string {\n if (!length) {\n length = DEFAULT_LENGTH;\n }\n if (length <= 0) {\n return \"\";\n }\n\n // Our default spec.\n if (length === DEFAULT_LENGTH) {\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, function(c) {\n const r = Math.random() * 16 | 0, v = c === \"x\" ? r : (r & 0x3 | 0x8);\n return v.toString(16);\n });\n }\n // Arbitrary random hex string.\n else {\n let result = \"\";\n for (let i = 0; i < length; i++) {\n const randomHex = Math.random() * 16 | 0;\n result += randomHex.toString(16);\n }\n return result;\n }\n }\n}","/**\n * Describes an entity type schema attribute.\n */\nexport namespace EntityAttribute {\n /**\n * Describes an entity attribute.\n * This sits within an entity type schema.\n */\n export interface IAttribute {\n // The attribute JSON key.\n Key: string;\n // The attribute human readable name.\n Name?: string;\n // The attribute human readable description.\n Description?: string;\n // The attribute type.\n Type?: EType;\n // If this attribute is indexed or not.\n // Indexed attributes can be searched on.\n IsIndexed?: boolean;\n // If this attribute is important or not.\n // This indicates it should be displayed in tables and lists.\n IsImportant?: boolean;\n // If this attribute is an array or not.\n // @warning, low support.\n IsArray?: boolean;\n // If this attribute is a structure, this is the structure definition.\n Structure?: IAttribute[];\n // (Optional) The max-size of a string attribute.\n // @warning, this will limit the column size.\n // @deprecated, use metadata.\n Size?: number;\n // Metadata for displaying the attributes.\n Metadata?: IMetadata;\n // Family attributes are shared across all entities of a type instead of having a per-entity definition.\n // @warning, low support.\n IsFamilyAttribute?: boolean;\n // If this attribute has a default value.\n // This will pre-populate for new entities on entity creation.\n // @warning, low support.\n IsFamilyAttributeDefault?: boolean;\n // TODO: document.\n Sources?: string[];\n }\n\n export enum EType {\n // Arbitrary text attribute.\n String = \"String\",\n // Floating point number attribute.\n Double = \"Double\",\n // Whole number attribute.\n Integer = \"Integer\",\n // iso8601 date time string.\n Datetime = \"Datetime\",\n // Group of attributes.\n Structure = \"Structure\",\n // Nextspace vector geometry.\n Geometry = \"Geometry\",\n // True/false attribute.\n Boolean = \"Boolean\"\n }\n\n /**\n * Describes additional metadata for an attribute.\n */\n export interface IMetadata {\n // Dictionary will let the user select from a set of attribute values.\n dictionary?: IDictionary;\n // Default is infinite.\n // Only applies to string attributes.\n maxLength?: number;\n // Number min/max.\n // Only applies to number attributes.\n min?: number;\n max?: number;\n // Units to display alongside the value.\n // Only applies to number attributes.\n unit?: string;\n }\n \n /**\n * Describes a dictionary of values for an attribute.\n */\n export interface IDictionary {\n // Default is false.\n enabled?: boolean;\n // The source entity type for retrieving the dictionary values.\n entityTypeId?: string;\n // The attribute path to retrieve the dictionary values from.\n attrPath?: string;\n }\n\n /**\n * Returns an attribute from a provided hierarchy of attributes.\n * Eg: Use the path: [\"Bruce\", \"ID\"] to find the \"ID\" attribute.\n * @param items \n * @param path \n * @returns \n */\n export function GetAttribute(items: IAttribute[], path: string[]): IAttribute {\n if (!items || !path || !path.length) {\n return null;\n }\n const key = path[0];\n const item = items.find((i) => i.Key === key);\n if (!item || !item.Structure || !path.length) {\n return item;\n }\n return GetAttribute(item.Structure, path.slice(1));\n }\n\n /**\n * Removes an attribute from a provided hierarchy of attributes.\n * Eg: Use the path: [\"Bruce\", \"ID\"] to remove the \"ID\" attribute.\n * This will mutate the items array.\n * @param items \n * @param path \n */\n export function RemoveAttribute(items: IAttribute[], path: string[]): void {\n if (!items || !path?.length) {\n return;\n }\n const key = path[0];\n if (path.length === 1) {\n // If we're at the last key in the path, remove the item from the items array.\n const index = items.findIndex((i) => i.Key === key);\n if (index !== -1) {\n items.splice(index, 1);\n }\n return;\n }\n // If we're not at the end of the path, dig further.\n const item = items.find((i) => i.Key === key);\n if (item && item.Structure) {\n RemoveAttribute(item.Structure, path.slice(1));\n }\n }\n\n /**\n * Adds an attribute to a provided hierarchy of attributes.\n * Eg: Use the path: [\"Bruce\", \"ID\"] to add the \"ID\" attribute.\n * This will mutate the items array.\n * This requires the path to be valid and for a parent attribute to exist.\n * @param items \n * @param path \n * @param attribute \n */\n export function AddAttribute(items: IAttribute[], path: string[], attribute: IAttribute): void {\n if (!items || !path?.length) {\n return;\n }\n const key = path[0];\n if (path.length === 1) {\n // If we're at the last key in the path, add the attribute to the items array.\n const index = items.findIndex((i) => i.Key === key);\n if (index !== -1) {\n // Overwrite existing attribute if it already exists.\n items[index] = attribute;\n } \n else {\n // Add new attribute if it doesn't exist.\n items.push(attribute);\n }\n return;\n }\n // If we're not at the end of the path, dig further.\n let item = items.find((i) => i.Key === key);\n if (!item) {\n item = { Key: key, Structure: [] };\n items.push(item);\n }\n if (!item.Structure) {\n item.Structure = [];\n }\n AddAttribute(item.Structure, path.slice(1), attribute);\n }\n}","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { PendingAction } from \"../bruce-models\";\nimport { UTC } from \"../common/utc\";\nimport { ENVIRONMENT } from \"../environment\";\nimport { ObjectUtils } from \"../util/object-utils\";\nimport { Entity } from \"./entity\";\nimport { EntityAttribute } from \"./entity-attribute\";\nimport { EntityTypeVisualSettings } from \"./entity-type-visual-settings\";\n\n/**\n * Describes the \"Entity Type\" concept within Nextspace.\n * An entity type is an \"expectation\" of what data \"should\" look like in a particular entity record.\n * The schema is stencils onto entity data to filter out what we should display or search against.\n */\nexport namespace EntityType {\n /**\n * Describes an entity type record.\n */\n export interface IType {\n // ID of the entity type.\n ID?: string;\n // Whether or not the entity type is deleted.\n // Unlikely to ever surface to client.\n IsDeleted?: boolean;\n // Human readable name of the entity type.\n Name: string;\n // Description of the entity type.\n Description?: string;\n // An entity record used for default values.\n Data?: Entity.IEntity;\n // If entity type access (and entity access) should be restricted.\n // When an entity type is restricted a user must have the \"EntityType_<typeId>\" permission.\n IsAccessRestricted?: boolean;\n // The data schema defining expected attributes for entities to have.\n DataSchema?: {\n Key: \"root\",\n Name?: \"Root\",\n Structure: EntityAttribute.IAttribute[],\n Type: EntityAttribute.EType.Structure\n };\n // Split by comma then use \"BrucePathUtils.ParsePath(..) on each item\".\n // This is an array of attribute paths to use for display name.\n // The default will be the entity's ID.\n DisplayNameAttributePath?: string;\n // If this schema is \"strict\". If entities in an entity type are different enough between each-other then the schema is not strict.\n // This will dictate how UI will display the attributes.\n IsStrictSchema?: boolean;\n // Default style for the corresponding entities.\n \"DisplaySetting.ID\"?: number;\n // Last updated date/time.\n \"LastUpdate.Time\"?: UTC.IUTC;\n // ID of the parent entity type.\n // This is used for organization. When a parent type is deleted, the child types are also deleted.\n \"Parent.EntityType.ID\"?: string;\n // This acts as a barrier from deleting an entity type.\n // Set to true to block any deletion attempts for the entity type records.\n // Default is false.\n IsDeleteDisabled?: boolean;\n // Beta. Temporal/historical data settings.\n HistoricDataSettings?: any;\n // @deprecated.\n VisualSettings?: EntityTypeVisualSettings.ISettings;\n // @deprecated.\n AuthoringSettings?: {\n enabledTools: string[];\n defaultTool: string;\n };\n }\n\n /**\n * Gets an entity type record.\n * @param params \n * @returns \n */\n export async function Get(params: {\n api?: BruceApi.Api,\n // ID of the entity type.\n entityTypeId: string,\n req?: Api.IReqParams\n }): Promise<{\n // Entity type record.\n entityType: IType\n }> {\n let { api, entityTypeId: typeId, req: reqParams } = params;\n if (!typeId) {\n throw(\"Type ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const key = GetCacheKey(typeId);\n const cache = await api.GetCacheItem(key, reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(`entitytype/${typeId}`, Api.PrepReqParams(reqParams));\n appendInternalAttrSchema(data);\n res({\n entityType: data\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key,\n value: prom,\n req: reqParams\n });\n return prom;\n }\n\n /**\n * Deletes an entity type record and all corresponding entities.\n * @param params \n */\n export async function Delete(params: {\n api?: BruceApi.Api,\n // ID of the entity type.\n entityTypeId: string,\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, entityTypeId: typeId, req: reqParams } = params;\n if (!typeId) {\n throw(\"Type ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n await api.DELETE(`entitytype/${typeId}`, Api.PrepReqParams(reqParams));\n api.Cache.Remove(GetCacheKey(typeId));\n api.Cache.RemoveByStartsWith(GetListCacheKey());\n }\n\n /**\n * Gets a list of entity types.\n * @param params \n * @returns \n */\n export async function GetList(params: {\n // Optionally restrict to child entity types of a specified parent type.\n parentTypeId?: string;\n // Optionally query for specific entity types.\n entityTypeIds?: string[],\n api?: BruceApi.Api,\n req?: Api.IReqParams\n }): Promise<{\n // List of entity types.\n entityTypes: IType[]\n }> {\n let { entityTypeIds, api, req: reqParams, parentTypeId } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const cache = parentTypeId ? null : await api.GetCacheItem(GetListCacheKey(entityTypeIds), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const req: Promise<any> = new Promise(async (res, rej) => {\n try {\n // If we have an array of typeIds then we'll request in batches to avoid overflowing the URL.\n const BATCH_SIZE = 20;\n const reqs: Promise<any>[] = [];\n\n if (entityTypeIds) {\n for (let i = 0; i < entityTypeIds.length; i += BATCH_SIZE) {\n const batch = entityTypeIds.slice(i, i + BATCH_SIZE);\n const urlParams = new URLSearchParams();\n for (const id of batch) {\n urlParams.append(\"typeId\", id);\n }\n if (parentTypeId) {\n urlParams.append(\"parentEntityTypeID\", parentTypeId);\n }\n reqs.push(api.GET(\"entitytypes?\" + urlParams.toString(), Api.PrepReqParams(reqParams)));\n }\n }\n else {\n const urlParams = new URLSearchParams();\n if (parentTypeId) {\n urlParams.append(\"parentEntityTypeID\", parentTypeId);\n }\n reqs.push(api.GET(\"entitytypes?\" + urlParams.toString(), Api.PrepReqParams(reqParams)));\n }\n\n const data = await Promise.all(reqs);\n\n // Populate array, while checking for already added types.\n const types: EntityType.IType[] = [];\n for (const item of data) {\n for (const type of item.Items) {\n appendInternalAttrSchema(type);\n if (!types.find(x => x.ID == type.ID)) {\n types.push(type);\n }\n }\n }\n\n res({\n entityTypes: types\n });\n }\n catch (e) {\n rej(e);\n }\n });\n\n if (!parentTypeId) {\n await api.SetCacheItem({\n key: GetListCacheKey(entityTypeIds),\n value: req,\n req: reqParams,\n duration: 60 * 5 // 5 minutes.\n });\n }\n\n return req;\n }\n\n /**\n * Updates or creates an entity type record.\n * @param params \n * @returns \n */\n export async function Update(params: {\n api?: BruceApi.Api,\n // Entity type record.\n entityType: IType,\n req?: Api.IReqParams\n }): Promise<{\n // Entity type record.\n entityType: IType\n }> {\n let { api, entityType: data, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n if (!data) {\n data = <any>{};\n }\n if (!data.ID) {\n data.ID = ObjectUtils.UId();\n }\n if (!data.Name) {\n data.Name = data.ID;\n }\n appendInternalAttrSchema(data);\n const res = await api.POST(`entitytype/${data.ID}`, data, Api.PrepReqParams(reqParams));\n api.Cache.Remove(GetCacheKey(<string>data.ID));\n api.Cache.RemoveByStartsWith(GetListCacheKey());\n return {\n entityType: res\n };\n }\n\n /**\n * Starts a re-index background action on a specified Entity Type.\n * This will ensure searchable data follows the current schema version.\n * This will also perform certain data cleanup so that the data is consistent.\n * @param params \n * @returns \n */\n export async function ReIndex(params: {\n api?: BruceApi.Api,\n entityTypeId: string,\n // Optional ID of the data transformation to apply.\n dataTransformId?: number,\n req?: Api.IReqParams\n }): Promise<PendingAction.IAction> {\n let { api, entityTypeId: typeId, req } = params;\n if (!typeId) {\n throw(\"Type ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const urlParams = new URLSearchParams();\n if (params.dataTransformId) {\n urlParams.append(\"dataTransformID\", String(params.dataTransformId));\n }\n const url = `entitytype/${typeId}/reindex?${urlParams.toString()}`;\n\n req = Api.PrepReqParams(req);\n const pa: PendingAction.IAction = await api.POST(url, {}, req);\n return pa;\n }\n\n /**\n * Counts the total number of Entities in an Entity Type.\n * @param params \n * @returns \n */\n export async function Count(params: {\n entityTypeId: string,\n api?: BruceApi.Api,\n req?: Api.IReqParams\n }): Promise<number> {\n let { entityTypeId, api, req } = params;\n if (!entityTypeId) {\n throw(\"Type ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n const url = `entityType/${entityTypeId}/entitiesCount`;\n const {TotalEntities} = await api.GET(url, Api.PrepReqParams(req));\n return TotalEntities;\n }\n\n /**\n * Returns cache identifier for an entity type.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetCacheKey(\"abc\");\n * api.Cache.Remove(key);\n * }\n * @param typeId\n * @returns \n */\n export function GetCacheKey(typeId: string): string {\n return `${Api.ECacheKey.EntityType}${Api.ECacheKey.Id}${typeId}`;\n }\n\n /**\n * Returns cache identifier for a list of entity types.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetListCacheKey();\n * api.Cache.Remove(key);\n * }\n * @param typeIds\n * @returns \n */\n export function GetListCacheKey(typeIds?: string[]): string {\n if (!typeIds) {\n typeIds = [];\n }\n return Api.ECacheKey.EntityType + (typeIds.length ? Api.ECacheKey.Id : \"\") + typeIds.join(\",\");\n }\n}\n\n/**\n * Adds expected internal structure items even if they aren't there.\n * Our API should be including them but this is a safety net.\n * @param type \n */\nfunction appendInternalAttrSchema(type: EntityType.IType) {\n // Schema not loaded. We'll ignore.\n if (type == null || type.DataSchema == null) {\n return;\n }\n\n // Append internal attributes.\n if (!type.DataSchema.Structure) {\n type.DataSchema.Structure = [];\n }\n let bruce = type.DataSchema.Structure.find(a => a.Key == \"Bruce\");\n if (!bruce) {\n bruce = {\n Key: \"Bruce\",\n Name: \"Bruce\",\n Description: \"Nextspace internal attributes.\",\n Type: EntityAttribute.EType.Structure,\n Structure: [],\n IsIndexed: true,\n IsImportant: false\n };\n type.DataSchema.Structure.push(bruce);\n }\n if (!bruce.Structure) {\n bruce.Structure = [];\n }\n\n // Append any missing internal attributes.\n if (!bruce.Structure.find(x => x.Key == \"Location\")) {\n bruce.Structure.push({\n Key: \"Location\",\n Name: \"Location\",\n Description: \"Location data.\",\n Type: EntityAttribute.EType.Structure,\n Structure: [\n {\n Key: \"latitude\",\n Name: \"Latitude\",\n Type: EntityAttribute.EType.Double,\n IsIndexed: true,\n IsImportant: false\n },\n {\n Key: \"longitude\",\n Name: \"Longitude\",\n Type: EntityAttribute.EType.Double,\n IsIndexed: true,\n IsImportant: false\n },\n {\n Key: \"altitude\",\n Name: \"Altitude\",\n Type: EntityAttribute.EType.Double,\n IsIndexed: true,\n IsImportant: false\n }\n ]\n });\n }\n if (!bruce.Structure.find(x => x.Key == \"Boundaries\")) {\n bruce.Structure.push({\n Key: \"Boundaries\",\n Name: \"Boundaries\",\n Description: \"Boundaries data.\",\n Type: EntityAttribute.EType.Structure,\n Structure: [\n {\n Key: \"minLongitude\",\n Name: \"Min Longitude\",\n Type: EntityAttribute.EType.Double,\n IsIndexed: true,\n IsImportant: false\n },\n {\n Key: \"maxLongitude\",\n Name: \"Max Longitude\",\n Type: EntityAttribute.EType.Double,\n IsIndexed: true,\n IsImportant: false\n },\n {\n Key: \"minLatitude\",\n Name: \"Min Latitude\",\n Type: EntityAttribute.EType.Double,\n IsIndexed: true,\n IsImportant: false\n },\n {\n Key: \"maxLatitude\",\n Name: \"Max Latitude\",\n Type: EntityAttribute.EType.Double,\n IsIndexed: true,\n IsImportant: false\n },\n {\n Key: \"minAltitude\",\n Name: \"Min Altitude\",\n Type: EntityAttribute.EType.Double,\n IsIndexed: true,\n IsImportant: false\n },\n {\n Key: \"maxAltitude\",\n Name: \"Max Altitude\",\n Type: EntityAttribute.EType.Double,\n IsIndexed: true,\n IsImportant: false\n }\n ]\n });\n }\n if (!bruce.Structure.find(x => x.Key == \"Transform\")) {\n bruce.Structure.push({\n Key: \"Transform\",\n Name: \"Transform\",\n Description: \"Transform data.\",\n IsIndexed: true,\n IsImportant: false,\n Type: EntityAttribute.EType.Structure,\n Structure: [\n {\n Key: \"heading\",\n Name: \"Heading\",\n IsIndexed: true,\n IsImportant: false,\n Type: EntityAttribute.EType.Double\n },\n {\n Key: \"pitch\",\n Name: \"Pitch\",\n IsIndexed: true,\n IsImportant: false,\n Type: EntityAttribute.EType.Double\n },\n {\n Key: \"roll\",\n Name: \"Roll\",\n IsIndexed: true,\n IsImportant: false,\n Type: EntityAttribute.EType.Double\n },\n {\n Key: \"scale\",\n Name: \"Scale\",\n IsIndexed: true,\n IsImportant: false,\n Type: EntityAttribute.EType.Double\n }\n ]\n });\n }\n if (!bruce.Structure.find(x => x.Key == \"VectorGeometry\")) {\n bruce.Structure.push({\n Key: \"VectorGeometry\",\n Name: \"Geometry\",\n Description: \"Geometry data.\",\n Type: EntityAttribute.EType.Geometry,\n IsIndexed: true,\n IsImportant: false\n });\n }\n\n // Filter out migrated/outdated ones.\n // Removed from root and the internal structure.\n const OUTDATED_INTERNAL = [\"position\", \"geometry\", \"location\", \"boundaries\", \"transform\"];\n bruce.Structure = bruce.Structure.filter(a => !OUTDATED_INTERNAL.includes(a.Key));\n type.DataSchema.Structure = type.DataSchema.Structure.filter(a => !OUTDATED_INTERNAL.includes(a.Key));\n}","/**\n * Utility to help with parsing and wrapping Nextspace paths.\n */\nexport namespace PathUtils {\n /**\n * Parses a Bruce string path into an array of strings.\n * Example of path: \"\\\"location\\\"/\\\"latitude\\\"\" or \"location/latitude\".\n * @param str \n * @returns \n */\n export function Parse(str: string): string[] {\n if (!str?.length) {\n return [];\n }\n const broken: string[] = str.split(\"/\");\n // Remove quotes from the first and last chars.\n for (let i = 0; i < broken.length; i++) {\n let piece = broken[i];\n if (piece.startsWith(\"\\\"\")) {\n piece = piece.substring(1);\n }\n if (piece.endsWith(\"\\\"\")) {\n piece = piece.substring(0, piece.length - 1);\n }\n broken[i] = piece;\n }\n return broken;\n }\n\n /**\n * Wraps an array of strings into a Nextspace string path.\n * @param path \n * @returns \n */\n export function Wrap(path: string[]): string {\n if (!path?.length) {\n return \"\";\n }\n let tmp: string = \"\\\"\";\n for (let i = 0; i < path.length; i++) {\n let section = path[i];\n tmp += section;\n if (i < path.length - 1) {\n tmp += \"\\\"/\\\"\";\n }\n }\n tmp += \"\\\"\";\n return tmp;\n }\n\n /**\n * Parses a Nextspace legacy string path into an array of strings.\n * @param str \n * @returns \n */\n export function ParseLegacy(str: string): string[] {\n if (!str?.length) {\n return [];\n }\n const broken: string[] = str.split(\".\");\n for (let i = 0; i < broken.length; i++) {\n let piece = broken[0];\n if (piece.charAt(0) == \"\\\"\") {\n piece = broken[0] = piece.substring(1);\n }\n if (piece.charAt(piece.length - 1) == \"\\\"\") {\n broken[0] = piece.substring(0, piece.length - 1);\n }\n }\n return broken;\n }\n}","import { Style } from \"../bruce-models\";\n\n/**\n * Describes an expectation on what should be rendered for a menu item-\n * between a min-max distance of an entity to the camera.\n */\nexport namespace ZoomControl {\n /**\n * Describes a menu item's zoom control row.\n * Typically there is an array of these for a menu item.\n */\n export interface IItem {\n // The minimum distance in meters from the camera to enable this item.\n MinZoom?: number,\n // The maximum distance in meters from the camera to enable this item.\n MaxZoom?: number,\n // The display type to use for this item.\n DisplayType?: EDisplayType,\n // The style to use for this item.\n StyleID?: number,\n Style?: Style.IEntitySettings;\n // The LOD category to use for this item.\n LODCategoryID?: string,\n // The LOD level to use for this item.\n LODLevel?: number | string;\n }\n\n /**\n * Available display types for a menu item.\n */\n export enum EDisplayType {\n // Hidden means it will not be rendered.\n Hidden = \"hidden\",\n // Point will try render a point based on any available Entity data.\n Point = \"point\",\n // Geometry means it will try render multi-geometry, polygon, polyline, or point in order of priority.\n Geometry = \"geometry\",\n // 3D means it will try render 3D model, multi-geometry, polygon, polyline, or point in order of priority.\n Model3D = \"3d\"\n }\n}","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { IDictionary } from \"../common/dictionary\";\nimport { ENVIRONMENT } from \"../environment\";\nimport { PathUtils } from \"../util/path-utils\";\nimport { Entity } from \"./entity\";\n\nexport namespace EntityHistoricData {\n export interface IData {\n // Path to the date-time attribute. Eg: '\"my_properties\"\\\"creation_date\"'.\n // Use PathUtils.Parse() to convert into array.\n attrKey: string;\n // ISO-8601 date-time string.\n dateTime: string;\n // Related Entity ID. This is only included in certain requests such as 'Update'.\n entityId?: string;\n // Historic data itself.\n // This excludes internal fields found inside the \"Bruce\" attribute.\n data: any;\n }\n\n export interface IStats {\n // Path to the date-time attribute. Eg: '\"my_properties\"\\\"creation_date\"'.\n // Use PathUtils.Parse() to convert into array.\n attrKey: string;\n // ISO-8601 date-time string.\n dateTimeMax: string;\n // ISO-8601 date-time string.\n dateTimeMin: string;\n // Number of historic records.\n count: number;\n }\n\n /**\n * Returns historic data for an array of Entity IDs.\n * A maximum number of records will be returned per Entity ID, this information is returned in the response.\n * @param params \n * @returns \n */\n export async function GetList(params: {\n entityIds: string[];\n // Path to the date-time attribute.\n // Eg: [\"my_properties\", \"creation_date\"].\n attrKey: string | string[];\n // ISO-8601 date-time string.\n dateTimeFrom: string;\n // ISO-8601 date-time string.\n dateTimeTo: string;\n api?: BruceApi.Api,\n req?: Api.IReqParams\n }): Promise<{\n recordsByIds: IDictionary<IData[]>;\n limitPerEntity: number;\n }> {\n let { entityIds, attrKey, dateTimeFrom, dateTimeTo, api, req } = params;\n\n // Save time and just return a none response if no entity IDs are provided.\n if (!entityIds?.length) {\n return {\n limitPerEntity: 0,\n recordsByIds: {}\n }\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n if (typeof attrKey != \"string\") {\n attrKey = PathUtils.Wrap(attrKey);\n }\n\n const cacheKey = GetListCacheKey(entityIds, attrKey, dateTimeFrom, dateTimeTo);\n const cached = api.GetCacheItem(cacheKey, req);\n if (cached?.found) {\n return cached.data;\n }\n\n const urlParams = new URLSearchParams();\n for (const entityId of entityIds) {\n urlParams.append(\"entityId\", entityId);\n }\n urlParams.append(\"attrKey\", attrKey);\n urlParams.append(\"dateTimeFrom\", dateTimeFrom);\n urlParams.append(\"dateTimeTo\", dateTimeTo);\n\n const prom = api.GET(`v1/entity/historicData?${urlParams.toString()}`, Api.PrepReqParams(req));\n api.SetCacheItem({\n key: cacheKey,\n value: prom,\n req: req,\n // Short cache. 30 seconds.\n duration: 30000\n });\n return prom;\n }\n\n /**\n * Returns historic data statistics for an array of Entity IDs.\n * @param params \n * @returns \n */\n export async function GetStats(params: {\n entityIds: string[];\n api?: BruceApi.Api,\n req?: Api.IReqParams\n }): Promise<{\n stats: IStats[];\n }> {\n let { entityIds, api, req } = params;\n\n // Save time and just return a none response if no entity IDs are provided.\n if (!entityIds?.length) {\n return {\n stats: []\n }\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n req = Api.PrepReqParams(req);\n\n const cacheKey = GetStatsCacheKey(entityIds);\n const cached = api.GetCacheItem(cacheKey, req);\n if (cached?.found) {\n return cached.data;\n }\n\n const prom = await api.POST(\"v1/entity/historicData/stats\", {\n entityIds: entityIds\n }, req);\n api.SetCacheItem({\n key: cacheKey,\n value: prom,\n req: req,\n // Short cache. 60 seconds.\n duration: 60000\n })\n return prom;\n }\n\n /**\n * Creates or updates historic data records.\n * Please note that the expected input/output does not include internal fields found inside the \"Bruce\" attribute. \n * @param params \n * @returns \n */\n export async function Update(params: {\n records: IData[];\n api?: BruceApi.Api,\n req?: Api.IReqParams\n }): Promise<{\n records: IData[];\n // Includes any errors that occurred during the update.\n // For example it may say that 3 records were not updated because of invalid data.\n errors?: string[];\n }> {\n let { records, api, req } = params;\n\n // Save time and just return a none response if no records are provided.\n if (!records?.length) {\n return {\n records: []\n }\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const res = await api.POST(\"v1/entity/historicData\", {\n records: records\n }, Api.PrepReqParams(req));\n\n // Kill cache for every unique attrKey.\n let attrKeys = records.map(r => r.attrKey);\n attrKeys = attrKeys.filter((v, i) => attrKeys.indexOf(v) === i);\n for (const attrKey of attrKeys) {\n api.Cache.RemoveByContains(Entity.GetHistoricContainsKey(attrKey));\n }\n\n // Kill any stats cache that includes any of the Entity IDs.\n if (res.records?.length) {\n const entityIds: string[] = res.records.map(r => r.entityId).filter((v, i) => v && res.records.indexOf(v) === i);\n ClearCacheByEntityIds(api, entityIds);\n }\n\n return res;\n }\n\n /**\n * Deletes historic data records for an array of Entity IDs.\n * This deletes all records within a provided key + range.\n * @param params \n * @returns \n */\n export async function Delete(params: {\n entityIds: string[];\n // Path to the date-time attribute.\n // Eg: [\"my_properties\", \"creation_date\"].\n attrKey: string | string[];\n // ISO-8601 date-time string.\n dateTimeFrom: string;\n // ISO-8601 date-time string.\n dateTimeTo: string;\n api?: BruceApi.Api,\n req?: Api.IReqParams\n }): Promise<void> {\n let { entityIds, attrKey, dateTimeFrom, dateTimeTo, api, req } = params;\n if (!entityIds?.length) {\n return;\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n if (!attrKey || !dateTimeFrom || !dateTimeTo) {\n throw new Error(\"Invalid parameters provided.\");\n }\n\n if (typeof attrKey != \"string\") {\n attrKey = PathUtils.Wrap(attrKey);\n }\n\n const urlParams = new URLSearchParams();\n for (const entityId of entityIds) {\n urlParams.append(\"entityId\", entityId);\n }\n urlParams.append(\"attrKey\", attrKey);\n urlParams.append(\"dateTimeFrom\", dateTimeFrom);\n urlParams.append(\"dateTimeTo\", dateTimeTo);\n\n await api.DELETE(`v1/entity/historicData?${urlParams.toString()}`, Api.PrepReqParams(req));\n\n // Kill cache for all Entity cached Entity records related to the attrKey.\n api.Cache.RemoveByContains(Entity.GetHistoricContainsKey(attrKey));\n // Kill any stats cache that includes any of the Entity IDs.\n ClearCacheByEntityIds(api, entityIds);\n }\n\n export function GetListCacheKey(entityIds: string[], attrKey: string, dateTimeFrom: string, dateTimeTo: string): string {\n return Api.ECacheKey.EntityHistoricDataRec + Api.ECacheKey.Id + entityIds.join(\",\") + Api.ECacheKey.Id + attrKey + Api.ECacheKey.Id + dateTimeFrom + Api.ECacheKey.Id + dateTimeTo;\n }\n\n export function GetStatsCacheKey(entityIds: string[]): string {\n return Api.ECacheKey.EntityHistoricDataStats + Api.ECacheKey.Id + entityIds.join(\",\");\n }\n\n export function ClearCacheByEntityIds(api: BruceApi.Api, entityIds: string[]) {\n if (!api || !entityIds?.length) {\n return;\n }\n\n const REC_KEY_PREFIX = Api.ECacheKey.EntityHistoricDataRec + Api.ECacheKey.Id;\n const STATS_KEY_PREFIX = Api.ECacheKey.EntityHistoricDataStats + Api.ECacheKey.Id;\n\n api.Cache.RemoveByCallback((key) => {\n let keyStr = String(key);\n if (!keyStr.startsWith(STATS_KEY_PREFIX) && !keyStr.startsWith(REC_KEY_PREFIX)) {\n return false;\n }\n // Shorten to speed up the next step.\n keyStr = keyStr.replace(STATS_KEY_PREFIX, \"\").replace(REC_KEY_PREFIX, \"\");\n // Look for any matching Entity IDs.\n for (let i = 0; i < entityIds.length; i++) {\n const entityId = entityIds[i];\n if (keyStr.includes(entityId)) {\n return true;\n }\n }\n return false;\n });\n }\n}","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { Bounds } from \"../common/bounds\";\nimport { Geometry } from \"../common/geometry\";\nimport { ObjectUtils } from \"../util/object-utils\";\nimport { Transform } from \"../common/transform\";\nimport { UTC } from \"../common/utc\";\nimport { EntityType } from \"./entity-type\";\nimport { PathUtils } from \"../util/path-utils\";\nimport { IDictionary } from \"../common/dictionary\";\nimport { ENVIRONMENT } from \"../environment\";\nimport { ZoomControl } from \"../project/zoom-control\";\nimport { Carto } from \"../common/carto\";\nimport { EntityHistoricData } from \"./entity-historic-data\";\nimport { EntityCoords } from \"./entity-coords\";\n\ntype _any = any;\n\n// Interface describing the 2D vector data we're migrating into the internal data.\n// This helps reduce doubling up within the interface definitions.\ninterface ILegacyEntityVectorData {\n // Entity location.\n location?: Carto.ICarto;\n // Entity boundaries.\n boundaries?: Bounds.IBounds;\n // Entity transformation.\n transform?: Transform.ITransform;\n // Entity vector geometry.\n geometry?: Geometry.IGeometry;\n}\n\ninterface ILegacyEntityExpandedLocation {\n // Related tileset ids if any.\n // Available if expandLocation is true.\n tilesetID?: string[];\n // Relative offset to parent node.\n // Available if expandLocation is true.\n worldPosition?: number[][];\n worldPivot?: number[];\n // Radius in meters for the related 3D model.\n // Available if expandLocation is true.\n geometryRadius?: number;\n geometryPivot?: number[];\n}\n\n// Added attributes when an Entity is requested with $expand=location.\ninterface IEntityExpandedLocation {\n // Array of associated Tileset IDs (if any).\n \"TilesetIDs\"?: string[];\n // Relative offset to the root node of the assembly.\n // This is a combined matrix for the full hierarchy to this node.\n \"AssemblyWorldPosition\"?: number[][];\n // Prepared version of the GeometryPivot to be multiplied as a transform against the world position.\n // (HPR of the UCS + GeometryWorldPivot) * AssemblyWorldPosition = WorldPosition.\n \"GeometryWorldPivot\"?: number[];\n // Offset of the Entity's LOD.\n // This is for when the graphics don't sit at the exact center if their \"0,0,0\".\n // This is from the GLB/GLTF model if any exists.\n \"GeometryPivot\"?: number[];\n // Radius in meters from the center of the Entity's LOD.\n // This is from the GLB/GLTF model if any eixsts.\n \"GeometryRadius\"?: number;\n}\n\n// Added attributes when an Entity is requested with $expand=import.\ninterface IEntityExpandedImport {\n // Array of associated import IDs (if any).\n \"ImportIDs\"?: number[];\n}\n\ninterface IEntityExpandedRelations {\n // Array of all immediate downstream relationships for this entity.\n // This is a read-only calculated property.\n \"Relations\"?: Entity.IRelationData[];\n}\n\n/**\n * Describes the \"Entity\" concept within Nextspace.\n * An entity is a JSON blob containing both internal data and user-defined data.\n * Entity records have many thinks linked to them through their UIDs such as links, files and relationships.\n */\nexport namespace Entity {\n /**\n * Describes the internal data of an entity.\n * As we're migrating 2D vector data into the internal portion you will find some overlap.\n */\n export interface IInternalData extends IEntityExpandedLocation, IEntityExpandedImport, IEntityExpandedRelations {\n // ID of the entity.\n // If unset an ID will be generated during the Update request.\n \"ID\"?: string;\n // Nextspace internal ID.\n // Readonly and created on Entity creation.\n \"InternalID\"?: number;\n\n // Entity type ID.\n \"EntityType.ID\": string;\n\n // ID of the user who created the entity.\n // Will be set automatically on creation.\n \"CreatedBy.User.ID\"?: string;\n // Created date/time of the entity.\n // Will be set automatically on creation.\n \"CreatedTime\"?: UTC.IUTC;\n // Array of associated tags (Used to be called layers).\n // Update to change what tags are associated. Exclude from data to keep it the same.\n \"Layer.ID\"?: number[];\n\n // If we're retrieving historic records, then these values are populated,\n // to indicate the historic data key and date-time.\n \"HistoricAttrKey\"?: string;\n \"HistoricDateTime\"?: string;\n\n // Marker that indicates the entity is a calculated alternative schema.\n // This is used to indicate that the entity is read-only and should not be saved.\n \"SchemaID\"?: string;\n\n // Entity relative position to parent within an assembly.\n \"AssemblyPosition\"?: number[][];\n\n // Entity location in degrees/meters.\n // This is typically relative to the active scene's terrain.\n // However what its relative to is dictated by the Entity Style during rendering.\n // This dictates where 3D models are placed, in the absence of VectorGeometry-\n //this is used to place vector points as well.\n \"Location\"?: EntityCoords.ILocation;\n\n // These are applied only to the Entity's LOD and not the VectorGeometry.\n \"Transform\"?: Transform.ITransform;\n\n // Entity boundaries in degrees/meters.\n \"Boundaries\"?: Bounds.IBounds;\n // Entity vector geometry. Eg: a point, polyline, or polygon to draw.\n \"VectorGeometry\"?: Geometry.IGeometry;\n }\n\n /**\n * Describes an entity record.\n * \n * @warning: Vector data is being migrated into the internal data.\n * It will exist in both locations until migration is complete where it'll only exist in the internal data.\n * It is recommended to check both locations if new code is written until further notice.\n * \n * @example\n * {\n * \"Bruce\": {\n * \"ID\": \"my_entity_id\",\n * \"EntityType.ID\": \"my_entity_type\"\n * }\n * }\n */\n export interface IEntity extends ILegacyEntityVectorData, ILegacyEntityExpandedLocation, _any {\n // Nextspace internal data.\n \"Bruce\": IInternalData;\n // User-defined data..\n // Eg: \"MyAttribute\": \"MyValue\"\n }\n\n /**\n * Available if expandRelations=true.\n * Describes a downstream relationship between the entity and another.\n * This is a read-only calculated property.\n */\n export interface IRelationData {\n // ID of the related child entity.\n \"Other.Entity.ID\": string;\n // ID of the relationship type.\n \"RelationType.ID\": string;\n }\n\n /**\n * Returns an entity record for the given entity id.\n * @param params \n * @returns \n */\n export async function Get(params: {\n api?: BruceApi.Api,\n // ID of the entity.\n entityId: string,\n // Acknowledges that internal attributes have been migrated.\n // Does not return them in both locations and instead only in the new one.\n // Default is false but will eventually be true by default on API side.\n migrated?: boolean;\n // (Optional) Entity type ID to load specific schema.\n entityTypeId?: string;\n // (Optional) Specific schema to load under the related Entity Type.\n // @warning this will be considered read-only data. It should not be shipped to API for saving.\n schemaId?: string;\n // (Optional) If true, will calculate the location of a relative entity and include tilesetIds.\n expandLocation?: boolean,\n // (Optional) If true, will include all immediate downstream relationships for this entity.\n expandRelations?: boolean,\n // (Optional) Historic data key and date range to scan for historic records.\n // The first found record will replace the Entity current Entity contents.\n // If none are found then the current record is returned.\n historicKey?: string,\n historicFrom?: string,\n historicTo?: string,\n historicPoint?: string\n req?: Api.IReqParams\n }): Promise<{\n // Entity record.\n entity: IEntity\n }> {\n let { api, entityId, migrated, schemaId, req: reqParams, expandLocation, expandRelations, entityTypeId, historicFrom, historicKey, historicTo, historicPoint } = params;\n if (!entityId) {\n throw(\"Entity ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const key = GetCacheKey({\n entityId,\n entityTypeId,\n expandLocation,\n expandRelations,\n historicFrom,\n historicKey,\n historicTo,\n historicPoint,\n schemaId\n });\n const cache = api.GetCacheItem(key, reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n const urlParams = new URLSearchParams();\n let expand: string;\n if (expandLocation) {\n expand = \"location\";\n }\n if (expandRelations) {\n if (expand) {\n expand += \",\"; \n }\n expand += \"relation\";\n }\n if (expand) {\n urlParams.append(\"$expand\", expand);\n }\n if (entityTypeId) {\n urlParams.append(\"BruceEntityType\", entityTypeId);\n }\n if (historicKey) {\n urlParams.set(\"historicKey\", historicKey);\n }\n if (historicFrom) {\n urlParams.set(\"historicFrom\", historicFrom);\n }\n if (historicTo) {\n urlParams.set(\"historicTo\", historicTo);\n }\n if (historicPoint) {\n urlParams.set(\"historicPoint\", historicPoint);\n }\n if (schemaId) {\n urlParams.set(\"schema\", schemaId);\n }\n urlParams.set(\"hasMigrated\", String(Boolean(migrated)));\n const data = await api.GET(\n `entity/${entityId}?${urlParams.toString()}`,\n Api.PrepReqParams(reqParams)\n );\n res({\n entity: data\n });\n }\n catch (e) {\n rej(e);\n }\n });\n api.SetCacheItem({\n key,\n value: prom,\n req: reqParams\n });\n return prom;\n }\n\n /**\n * Returns a list of entity records for the given entity ids.\n * @param params \n * @returns \n */\n export async function GetListByIds(params: {\n api?: BruceApi.Api,\n // Array of entity IDs.\n entityIds: string[],\n // Acknowledges that internal attributes have been migrated.\n // Does not return them in both locations and instead only in the new one.\n // Default is false but will eventually be true by default on API side.\n migrated?: boolean;\n // (Optional) schema to map the loaded data into.\n // This will turn the real records into read-only calculated ones.\n schemaId?: string,\n // (Optional) If true, will calculate the location of a relative entity and include tilesetIds.\n // Does not support expanding location and relations at the same time.\n expandLocation?: boolean,\n // (Optional) If true, will include all immediate downstream relationships for this entity.\n // Does not support expanding location and relations at the same time.\n expandRelations?: boolean,\n // (Optional) If true, will includes external sources in the entity data.\n // This can significantly decrease performance.\n expandSources?: boolean,\n // (Optional) Historic data key and date range to scan for historic records.\n // The first found record will replace the Entity current Entity contents.\n // If none are found then the current record is returned.\n historicKey?: string,\n historicFrom?: string,\n historicTo?: string,\n historicPoint?: string,\n req?: Api.IReqParams\n }): Promise<{\n // Array of entity records.\n entities: IEntity[]\n }> {\n let { api, entityIds, migrated, schemaId, req: reqParams, expandRelations, expandLocation, historicFrom, historicKey, historicTo, historicPoint, expandSources } = params;\n if (!entityIds.length) {\n throw(\"Entity IDs are required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const crashRiskReqs: Promise<{ entity: IEntity }>[] = [];\n const reqIds: string[] = [];\n for (let i = 0; i < entityIds.length; i++) {\n const entityId = entityIds[i];\n const key = GetCacheKey({ entityId, expandRelations, expandLocation });\n const cache = api.GetCacheItem(key, reqParams);\n if (cache?.found) {\n crashRiskReqs.push(cache.data);\n }\n else {\n reqIds.push(entityId);\n }\n }\n const reqData = {\n Filter: {\n ID: {\n in: reqIds\n }\n },\n PageSize: reqIds.length\n };\n if (expandRelations) {\n reqData[\"Expand\"] = \"relation\";\n }\n if (expandLocation) {\n if (reqData[\"Expand\"]) {\n reqData[\"Expand\"] += \",location\";\n }\n else {\n reqData[\"Expand\"] = \"location\";\n }\n }\n if (expandSources) {\n reqData[\"ExpandSources\"] = true;\n }\n if (historicKey) {\n reqData[\"historicKey\"] = historicKey;\n }\n if (historicFrom) {\n reqData[\"historicFrom\"] = historicFrom;\n }\n if (historicTo) {\n reqData[\"historicTo\"] = historicTo;\n }\n if (historicPoint) {\n reqData[\"historicPoint\"] = historicPoint;\n }\n const urlParams = new URLSearchParams();\n if (schemaId) {\n urlParams.set(\"schema\", schemaId);\n }\n urlParams.set(\"hasMigrated\", String(Boolean(migrated)));\n const url = `entities?${urlParams.toString()}`;\n\n const reqs: Promise<{ entity: IEntity }>[] = [];\n if (reqIds.length > 0) {\n const req: Promise<Api.IList<Entity.IEntity>> = api.POST(url, reqData, Api.PrepReqParams(reqParams));\n for (let i = 0; i < reqIds.length; i++) {\n const entityId = reqIds[i];\n const key = GetCacheKey({ \n entityId, \n expandLocation, \n expandRelations,\n expandSources,\n entityTypeId: null,\n historicFrom: historicFrom,\n historicKey: historicKey,\n historicTo: historicTo,\n historicPoint: historicPoint,\n schemaId: schemaId\n });\n const prom: Promise<{ entity: IEntity }> = new Promise(async (res) => {\n try {\n const data = await req;\n const item = data.Items.find(x => x.Bruce.ID == entityId);\n res({\n entity: item\n });\n }\n catch (e) {\n // No showing error as we don't want to see it 2000 times.\n }\n res(<any>null);\n });\n api.SetCacheItem({\n key,\n value: prom,\n req: reqParams\n });\n reqs.push(prom);\n }\n }\n\n const entities = (await Promise.all(reqs)).map(x => x?.entity).filter(x => !!x);\n\n // We'll try/catch the crash-risk ones and append the results.\n for (let i = 0; i < crashRiskReqs.length; i++) {\n const req = crashRiskReqs[i];\n try {\n const data = await req;\n if (data?.entity) {\n entities.push(data.entity);\n }\n }\n catch (e) {\n // No showing error as we don't want to see it 2000 times.\n }\n }\n\n return {\n entities: entities\n };\n }\n\n /**\n * Deletes an entity record.\n * @param params \n */\n export async function Delete(params: {\n api?: BruceApi.Api,\n // ID of the entity.\n entityId: string,\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, entityId, req: reqParams } = params;\n if (!entityId) {\n throw(\"Entity ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n await api.DELETE(`entity/${entityId}`, Api.PrepReqParams(reqParams));\n api.Cache.RemoveByContains(GetContainsKey(entityId));\n EntityHistoricData.ClearCacheByEntityIds(api, [entityId]);\n }\n\n /**\n * Deletes a list of entity records.\n * @param params \n */\n export async function DeleteList(params: {\n api?: BruceApi.Api,\n // Array of entity IDs.\n entityIds: string[],\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, entityIds, req: reqParams } = params;\n if (!entityIds?.length) {\n throw(\"Entity IDs are required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n await api.POST(\"deleteEntities\", {\n Items: entityIds\n }, Api.PrepReqParams(reqParams));\n for (let i = 0; i < entityIds.length; i++) {\n const entityId = entityIds[i];\n api.Cache.RemoveByContains(GetContainsKey(entityId));\n }\n EntityHistoricData.ClearCacheByEntityIds(api, entityIds);\n }\n\n /**\n * Creates or updates an entity record.\n * @param params \n * @returns \n */\n export async function Update(params: {\n api?: BruceApi.Api,\n // Entity record.\n entity: IEntity,\n // Acknowledges that internal attributes have been migrated.\n // Does not return them in both locations and instead only in the new one.\n // Default is false but will eventually be true by default on API side.\n migrated?: boolean;\n // If true, will override any existing data.\n // If false, only supplied attributes will be updated.\n // Ensure your data-schema matches the data well otherwise sub-attributes will be overridden regardless!\n override: boolean,\n req?: Api.IReqParams\n }): Promise<{\n // Entity record.\n entity: IEntity\n }> {\n let { api, entity: data, override, req: reqParams, migrated } = params;\n if (!data?.Bruce?.[\"EntityType.ID\"]) {\n throw(\"Entity Type ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n if (!data?.Bruce?.ID) {\n data.Bruce = {\n ...data.Bruce,\n ID: ObjectUtils.UId()\n };\n }\n let reqUrl = `entity/${data.Bruce.ID}/?dataoverride=${override}&BruceEntityType=${data.Bruce[\"EntityType.ID\"]}`;\n if (migrated) {\n reqUrl += \"&hasMigrated=true\";\n }\n const res = await api.POST(reqUrl, data, Api.PrepReqParams(reqParams));\n api.Cache.RemoveByContains(GetContainsKey(<string>data.Bruce.ID));\n EntityHistoricData.ClearCacheByEntityIds(api, [data.Bruce.ID]);\n return {\n entity: res\n };\n }\n\n /**\n * Util to remove a tag from an entity.\n * @warning This does not save the entity record.\n * @param params \n */\n export function RemoveTag(params: {\n // Entity record.\n entity: IEntity,\n // ID of the tag to remove.\n tagId: number\n }): void {\n const { entity: data, tagId } = params;\n const tags = data.Bruce[\"Layer.ID\"] ?? [];\n const index = tags.indexOf(tagId);\n if (index >= 0) {\n tags.splice(index, 1);\n data.Bruce[\"Layer.ID\"] = tags;\n }\n }\n\n /**\n * Util to add a tag to an entity.\n * @warning This does not save the entity record.\n * @param params \n */\n export function AddTag(params: {\n // Entity record.\n entity: IEntity,\n // ID of the tag to add.\n tagId: number\n }): void {\n const { entity: data, tagId } = params;\n const tags = data.Bruce[\"Layer.ID\"] ?? [];\n if (!tags.includes(tagId)) {\n tags.push(tagId);\n data.Bruce[\"Layer.ID\"] = tags;\n }\n }\n\n /**\n * Util to set a value on an entity.\n * @warning This does not save the entity record.\n * @param params \n */\n export function SetValue(params: {\n // Entity record.\n entity: IEntity,\n // Path to the value to set.\n path: string[] | string,\n // Value to set.\n value: any\n }): void {\n let { entity: data, path, value } = params;\n if (!path || !path.length) {\n return;\n }\n if (typeof path == \"string\") {\n path = PathUtils.Parse(path);\n }\n\n let curData = data;\n for (let i = 0; i < path.length; i++) {\n const step = path[i];\n if (!curData[step] || typeof curData[step] != \"object\") {\n curData[step] = {};\n }\n if (i >= path.length - 1) {\n curData[step] = value;\n break;\n }\n curData = curData[step];\n }\n }\n\n /**\n * Util to get a value from an entity.\n * @param params \n * @returns \n */\n export function GetValue(params: {\n // Entity record.\n entity: IEntity,\n // Path to the value to get.\n path: string[] | string,\n // If legacy checks are enabled or we should take the data as is.\n // An example is we used to store ID inside the top level rather than inside Bruce.\n // If enabled, we'll check both paths for the value.\n // This is enabled by default.\n handleLegacy?: boolean\n }): any {\n let { entity: data, path, handleLegacy: checkAgainstLegacy } = params;\n if (checkAgainstLegacy == null) {\n checkAgainstLegacy = true;\n }\n if (!path || !path.length) {\n return null;\n }\n if (typeof path == \"string\") {\n path = PathUtils.Parse(path);\n }\n \n // Backwards compatibility for incredibly old data.\n if (checkAgainstLegacy && path.length == 1 && path[0] == \"ID\") {\n return data.Bruce?.ID;\n }\n\n const checkForValue = (path: string[]) => {\n let curData = data;\n for (let i = 0; i < path.length; i++) {\n const step = path[i];\n if (!curData[step]) {\n return null;\n }\n if (i >= path.length - 1) {\n return curData[step];\n }\n curData = curData[step];\n }\n return null;\n };\n\n // Check using the path provided.\n let value = checkForValue(path);\n\n // Check for the same path but in both top-level and internal data.\n // This is done for specific paths we're migrating.\n \n if (value == null && checkAgainstLegacy) {\n // We're migrating 2D vector data into the internal data.\n // So we'll check against both locations until migration is complete.\n\n // First we'll check against properties that could be found inside the internal section.\n if (path[0] == \"location\") {\n value = checkForValue([\"Bruce\", \"Location\"].concat(path.slice(1)));\n }\n else if (path[0] == \"transform\") {\n value = checkForValue([\"Bruce\", \"Transform\"].concat(path.slice(1)));\n }\n else if (path[0] == \"geometry\") {\n value = checkForValue([\"Bruce\", \"VectorGeometry\"].concat(path.slice(1)));\n }\n else if (path[0] == \"boundaries\") {\n value = checkForValue([\"Bruce\", \"Boundaries\"].concat(path.slice(1)));\n }\n else if (path[0] == \"geometryPivot\") {\n value = checkForValue([\"Bruce\", \"GeometryPivot\"].concat(path.slice(1)));\n }\n else if (path[0] == \"worldPivot\") {\n value = checkForValue([\"Bruce\", \"GeometryWorldPivot\"].concat(path.slice(1)));\n }\n else if (path[0] == \"worldPosition\") {\n value = checkForValue([\"Bruce\", \"AssemblyWorldPosition\"].concat(path.slice(1)));\n }\n else if (path[0] == \"tilesetID\") {\n value = checkForValue([\"Bruce\", \"TilesetIDs\"].concat(path.slice(1)));\n }\n else if (path[0] == \"geometryRadius\") {\n value = checkForValue([\"Bruce\", \"GeometryRadius\"].concat(path.slice(1)));\n }\n // Now we'll check against properties that could still be in the top-level and haven't been migrated yet.\n if (path[0] == \"Bruce\" && path.length > 1) {\n if (path[1] == \"Location\") {\n value = checkForValue([\"location\"].concat(path.slice(2)));\n }\n else if (path[1] == \"Transform\") {\n value = checkForValue([\"transform\"].concat(path.slice(2)));\n }\n else if (path[1] == \"VectorGeometry\") {\n value = checkForValue([\"geometry\"].concat(path.slice(2)));\n }\n else if (path[1] == \"Boundaries\") {\n value = checkForValue([\"boundaries\"].concat(path.slice(2)));\n }\n else if (path[1] == \"GeometryPivot\") {\n value = checkForValue([\"geometryPivot\"].concat(path.slice(2)));\n }\n else if (path[1] == \"GeometryWorldPivot\") {\n value = checkForValue([\"worldPivot\"].concat(path.slice(2)));\n }\n else if (path[1] == \"AssemblyWorldPosition\") {\n value = checkForValue([\"worldPosition\"].concat(path.slice(2)));\n }\n else if (path[1] == \"TilesetIDs\") {\n value = checkForValue([\"tilesetID\"].concat(path.slice(2)));\n }\n else if (path[1] == \"GeometryRadius\") {\n value = checkForValue([\"geometryRadius\"].concat(path.slice(2)));\n }\n else if (path[1] == \"relations\") {\n value = checkForValue([\"Bruce\", \"Relations\"].concat(path.slice(2)));\n }\n else if (path[1] == \"Relations\") {\n value = checkForValue([\"Bruce\", \"relations\"].concat(path.slice(2)));\n }\n }\n }\n\n return value;\n }\n\n /**\n * Removes a value from an entity.\n * This will mutate the entity record and run \"delete\" on the object property.\n * @warning This does not save the entity record.\n * @param params \n */\n export function RemoveValue(params: {\n // Entity record.\n entity: IEntity,\n // Path to the value to delete.\n path: string[] | string\n }) {\n let { entity: data, path } = params;\n if (!path || !path.length) {\n return;\n }\n if (typeof path == \"string\") {\n path = PathUtils.Parse(path);\n }\n\n let curData = data;\n for (let i = 0; i < path.length; i++) {\n const step = path[i];\n if (typeof curData != \"object\" || curData == null) {\n return;\n }\n if (i >= path.length - 1) {\n delete curData[step];\n return;\n }\n curData = curData[step];\n }\n }\n\n /**\n * Calculates an entity's name based on attribute priority set in the type.\n * @param params\n * @returns\n */\n export function CalculateName(params: {\n entity: IEntity,\n type: EntityType.IType,\n // If true, will return the entity ID if no name can be calculated.\n defaultToId?: boolean\n }): string {\n const { entity, type, defaultToId = true } = params;\n const attrStr = type.DisplayNameAttributePath;\n if (attrStr) {\n const attrPaths = attrStr.split(\",\");\n for (let i = 0; i < attrPaths.length; i++) {\n const pathStr = attrPaths[i];\n const path = PathUtils.Parse(pathStr);\n const name = Entity.GetValue({\n entity: entity,\n path\n });\n if (name && typeof name != \"object\") {\n return name;\n }\n }\n }\n return defaultToId ? entity.Bruce.ID : null;\n }\n\n /**\n * Calculates an entity name.\n * This will request data if entity or type is not provided.\n * @param params \n * @returns \n */\n export async function CalculateNameAsync(params: {\n api?: BruceApi.Api,\n // Either entityId or entity is required.\n entityId?: string;\n entity?: IEntity;\n // Type and typeId are optional.\n // They will be sampled from the entity if not provided.\n typeId?: string;\n type?: EntityType.IType;\n // If true, will return the entity ID if no name can be calculated.\n defaultToId?: boolean;\n }) {\n let { api, entityId, entity, typeId, type, defaultToId } = params;\n if (entityId && !entity) {\n const { entity: data } = await Get({\n api,\n entityId,\n entityTypeId: typeId,\n migrated: true\n });\n entity = data;\n }\n if (!entity) {\n return null;\n }\n if (!typeId) {\n typeId = entity.Bruce?.[\"EntityType.ID\"];\n }\n if (typeId && !type) {\n const { entityType: data } = await EntityType.Get({\n api,\n entityTypeId: typeId\n });\n type = data;\n }\n if (!type) {\n return null;\n }\n return CalculateName({\n entity,\n type,\n defaultToId\n });\n }\n\n /**\n * Describes a filter for entity records.\n */\n export interface IFilter {\n // (Optional) Order by attribute.\n orderBy?: any;\n // (Optional) Entity type ID.\n entityTypeId?: string;\n // (Optional) Array of tag IDs to restrict against.\n layerIds?: number[];\n // @Deprecated version of layerIds.\n layerId?: number;\n // Default is \"equals\" for backwards compatibility.\n layerIdsOperator?: \"equals\" | \"in\";\n // (Optional) Graphical bounds to restrict against.\n bounds?: Bounds.IReqBounds;\n // (Optional) Page size.\n pageSize?: number;\n // (Optional) Page index. Default is 0.\n pageIndex?: number;\n // (Optional) LOD category ID.\n lodCategoryId?: string;\n // (Optional) Sort order.\n sortOrder?: Api.ESortOrder;\n // (Optional) Entity type conditions.\n // This is a filter against the entity attributes.\n // Ensure attributes are indexed for best results.\n entityTypeConditions?: IDictionary<any>;\n }\n\n /**\n * Returns a list of entity records for the given filter.\n * @param params \n * @returns \n */\n export async function GetList(params: {\n api?: BruceApi.Api,\n // Filter to apply.\n filter: IFilter,\n // Acknowledges that internal attributes have been migrated.\n // Does not return them in both locations and instead only in the new one.\n // Default is false but will eventually be true by default on API side.\n migrated?: boolean;\n // (Optional) schema to map the loaded data into.\n // This will turn the real records into read-only calculated ones.\n schemaId?: string,\n // (Optional) If true, will calculate the location of a relative entity and include tilesetIds.\n // Does not support expanding location and relations at the same time.\n expandLocation?: boolean,\n // (Optional) If true, will include all immediate downstream relationships for each entity.\n expandRelations?: boolean,\n // (Optional) If true, will includes external sources in the entity data.\n // This can significantly decrease performance.\n expandSources?: boolean,\n // Default = false. If false then only analysis data is returned instead of the entities.\n // TODO: Requires a provided entityTypeId. This is out of date in API.\n analysis?: boolean,\n // Default = false.\n viaCdn?: boolean;\n // (Optional) Cache killing token to append to the request url.\n viaCdnCacheToken?: number | string;\n // (Optional) Historic data key and date range to scan for historic records.\n // The first found record will replace the Entity current Entity contents.\n // If none are found then the current record is returned.\n historicKey?: string,\n historicFrom?: string,\n historicTo?: string\n historicPoint?: string;\n req?: Api.IReqParams\n }): Promise<{\n // Returned if analysis=false.\n entities?: IEntity[];\n // Returned if analysis=true.\n totalCount?: number;\n }> {\n let { api, filter, migrated, schemaId, req: reqParams, viaCdn, viaCdnCacheToken, analysis, expandRelations, historicFrom, historicKey, historicTo, historicPoint, expandLocation, expandSources } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n let requestFilter: any = {};\n if (filter.entityTypeConditions) {\n requestFilter = {\n ...filter.entityTypeConditions\n };\n }\n if (filter.layerIds != null && filter.layerIds.length > 0) {\n const operator = filter.layerIdsOperator ?? \"equals\";\n requestFilter[\"Bruce.Layer.ID\"] = {\n [operator]: filter.layerIds\n };\n }\n else if (filter.layerId != null) {\n requestFilter[\"Bruce.Layer.ID\"] = {\n equals: filter.layerId\n }\n }\n if (filter.bounds) {\n requestFilter[\"geometry\"] = {\n \"intersects\": [\n filter.bounds.south,\n filter.bounds.north,\n filter.bounds.west,\n filter.bounds.east\n ]\n };\n }\n\n const body = {\n SortOrder: filter.sortOrder == Api.ESortOrder.Asc ? \"ASC\" : \"DESC\",\n OrderBy: filter.orderBy,\n Filter: requestFilter,\n LODType: filter.lodCategoryId,\n BruceEntityType: filter.entityTypeId,\n PageIndex: filter.pageIndex,\n PageSize: filter.pageSize,\n historicKey: historicKey,\n historicFrom: historicFrom,\n historicTo: historicTo,\n historicPoint: historicPoint,\n ExpandSources: expandSources\n };\n if (expandLocation || expandRelations) {\n let expand = \"\";\n if (expandLocation) {\n expand += \"location\";\n }\n if (expandRelations) {\n if (expand) {\n expand += \",\"; \n }\n expand += \"relation\";\n }\n if (expand) {\n body[\"Expand\"] = expand;\n }\n }\n\n let totalCount: number;\n let entities = [];\n if (analysis || expandRelations || (viaCdn && api.GetCdnBaseUrl())) {\n const urlParams = new URLSearchParams();\n urlParams.set(\"cacheToken\", String(viaCdnCacheToken ? viaCdnCacheToken : 0));\n if (body.SortOrder) {\n urlParams.set(\"SortOrder\", body.SortOrder);\n }\n if (body.OrderBy) {\n urlParams.set(\"OrderBy\", body.OrderBy);\n }\n if (body.Filter) {\n urlParams.set(\"Filter\", JSON.stringify(body.Filter));\n }\n if (body.LODType) {\n urlParams.set(\"LODType\", body.LODType);\n }\n if (body.BruceEntityType) {\n urlParams.set(\"BruceEntityType\", body.BruceEntityType);\n }\n if (body.PageIndex) {\n urlParams.set(\"PageIndex\", String(body.PageIndex));\n }\n if (body.PageSize) {\n urlParams.set(\"PageSize\", String(body.PageSize));\n }\n if (expandRelations) {\n urlParams.append(\"$expand\", \"relation\");\n }\n if (expandLocation) {\n urlParams.append(\"$expand\", \"location\");\n }\n if (expandSources) {\n urlParams.append(\"ExpandSources\", \"true\");\n }\n if (historicKey) {\n urlParams.set(\"historicKey\", historicKey);\n }\n if (historicFrom) {\n urlParams.set(\"historicFrom\", historicFrom);\n }\n if (historicTo) {\n urlParams.set(\"historicTo\", historicTo);\n }\n if (historicPoint) {\n urlParams.set(\"historicPoint\", historicPoint);\n }\n if (schemaId) {\n urlParams.set(\"schema\", schemaId);\n }\n urlParams.set(\"hasMigrated\", String(Boolean(migrated)));\n\n const urlStr = api.ConstructUrl({\n cdn: !analysis && viaCdn,\n url: analysis ? \"entities/summary\" : \"entities\",\n urlParams: urlParams\n });\n \n const data = await api.get(urlStr, Api.PrepReqParams(reqParams));\n if (!analysis) {\n entities = data.Items;\n }\n totalCount = data.TotalCount;\n }\n else {\n const urlParams = new URLSearchParams();\n if (expandRelations) {\n urlParams.append(\"$expand\", \"relation\");\n }\n if (expandLocation) {\n urlParams.append(\"$expand\", \"location\");\n }\n if (schemaId) {\n urlParams.set(\"schema\", schemaId);\n }\n urlParams.set(\"hasMigrated\", String(Boolean(migrated)));\n\n const urlStr = api.ConstructUrl({\n cdn: false,\n url: analysis ? \"entities/summary\" : \"entities\",\n urlParams: urlParams\n })\n\n const data = await api.post(urlStr, body, Api.PrepReqParams(reqParams));\n if (!analysis) {\n entities = data.Items;\n // Only caching when non-CDN.\n for (let i = 0; i < entities.length; i++) {\n const entity = entities[i];\n const id = entity.Bruce.ID;\n api.SetCacheItem({\n key: GetCacheKey({\n entityId: id,\n expandRelations,\n expandLocation,\n expandSources,\n entityTypeId: filter.entityTypeId,\n historicFrom: historicFrom,\n historicKey: historicKey,\n historicTo: historicTo,\n schemaId: schemaId\n }),\n value: {\n entity: entity\n },\n req: reqParams\n });\n }\n }\n totalCount = data.TotalCount;\n }\n return {\n entities,\n totalCount\n };\n }\n\n /**\n * Helper method that returns an Entity object.\n * This will ensure the basics exist (\"Bruce\" structure).\n * @param params\n */\n export function Assert(params?: {\n // Base Entity to extend.\n // If provided, will extend the base Entity with the new ID and EntityType.\n baseEntity?: IEntity;\n // ID of the Entity.\n // If not provided, the base Entity will be referenced for an ID.\n // If the base Entity does not have an ID, a new one will be generated.\n entityId?: string;\n // ID of the EntityType.\n // If not provided, the base Entity will be referenced for an EntityType.\n // If the base Entity does not have an EntityType, it will be null.\n entityTypeId?: string;\n }): IEntity {\n let { entityId, entityTypeId, baseEntity } = params ? params : {} as any;\n\n if (!entityId) {\n entityId = baseEntity?.[\"Bruce\"]?.[\"ID\"];\n }\n if (!entityId) {\n entityId = ObjectUtils.UId();\n }\n if (!entityTypeId) {\n entityTypeId = baseEntity?.[\"Bruce\"]?.[\"EntityType.ID\"];\n }\n\n let bruce: Entity.IInternalData = baseEntity?.[\"Bruce\"];\n if (!bruce) {\n bruce = {\n \"EntityType.ID\": null\n };\n }\n bruce[\"ID\"] = entityId;\n bruce[\"EntityType.ID\"] = entityTypeId;\n\n return {\n ...baseEntity,\n \"Bruce\": bruce\n };\n }\n\n /**\n * Helper method that returns a geojson object for a given set of Entities.\n * @param params \n * @returns \n */\n export function ToGeoJson(params: {\n entities: Entity.IEntity[];\n // Default = false.\n // If true, will exclude altitude values from the GeoJSON.\n excludeAltitude?: boolean;\n // Overrides altitude of all points if provided.\n altitude?: number;\n // Default = true.\n // This will include the full user data in the GeoJSON properties.\n // When false only Nextspace internal data will be included.\n includeUserData?: boolean;\n // If null then all types are allowed.\n // Default = null.\n // Geometry = polygon and polyline. Point = point.\n allowedDisplayTypes?: ZoomControl.EDisplayType[];\n }): any {\n const { entities, excludeAltitude, altitude, includeUserData, allowedDisplayTypes } = params;\n const features: any[] = [];\n const allowPoint = allowedDisplayTypes == null || allowedDisplayTypes.includes(ZoomControl.EDisplayType.Point);\n const allowGeometry = allowedDisplayTypes == null || allowedDisplayTypes.includes(ZoomControl.EDisplayType.Geometry);\n\n const cloneObj = (obj: any) => {\n return JSON.parse(JSON.stringify(obj));\n };\n\n const areCoordinatesEqual = (coord1, coord2) => {\n return coord1[0] === coord2[0] && coord1[1] === coord2[1] && (coord1[2] === coord2[2] || (coord1.length < 3 && coord2.length < 3));\n };\n\n const removeConsecutiveDuplicates = (coordinates) => {\n return coordinates.filter((coord, index, array) => {\n return index === 0 || !areCoordinatesEqual(coord, array[index - 1]);\n });\n }; \n\n const closePolygonCoordinates = (coordinates) => {\n if (coordinates.length > 0 && !areCoordinatesEqual(coordinates[0], coordinates[coordinates.length - 1])) {\n const firstPointCopy = [...coordinates[0]];\n coordinates.push(firstPointCopy);\n }\n return coordinates;\n };\n \n const populateProperties = (feature: any, entity: Entity.IEntity) => {\n let properties = null;\n // All properties.\n if (includeUserData != false) {\n properties = cloneObj(entity);\n // We exclude geometry since the geojson is supposed to represent that attribute.\n delete properties.geometry;\n }\n // Only specific internal properties.\n else {\n properties = {\n Bruce: entity.Bruce ? cloneObj(entity.Bruce) : null,\n location: entity.location ? cloneObj(entity.location) : null,\n transform: entity.transform ? cloneObj(entity.transform) : null,\n boundaries: entity.boundaries ? cloneObj(entity.boundaries) : null,\n };\n }\n feature.properties = properties;\n };\n \n const processGeometry = (geometry: Geometry.IGeometry, entity: Entity.IEntity) => {\n const feature: any = {\n type: \"Feature\",\n properties: {},\n geometry: null\n };\n \n populateProperties(feature, entity);\n \n if (geometry.MultiGeometry?.length && allowGeometry) {\n geometry.MultiGeometry.forEach(geo => processGeometry(geo, entity));\n return;\n }\n else if (geometry.Polygon?.length && allowGeometry) {\n const sortedPolygons = geometry.Polygon.sort((a, b) =>\n a.Facing === Geometry.EPolygonRingType.Boundaries ? -1 : 1\n );\n \n const coordinates = sortedPolygons.map(polygonRing =>\n closePolygonCoordinates(\n removeConsecutiveDuplicates(\n polygonRing.LinearRing.split(' ').map(coord => {\n const [lon, lat, alt] = coord.split(',').map(Number);\n return excludeAltitude ? [lon, lat] : [lon, lat, altitude !== undefined ? altitude : (alt !== undefined ? alt : [])];\n })\n )\n )\n );\n \n // Check if the polygon has at least 4 points.\n const isValidPolygon = coordinates.every(polygon => polygon.length >= 4);\n if (!isValidPolygon) {\n // Perhaps try other geometry instead of returning?\n return;\n }\n \n feature.geometry = {\n type: \"Polygon\",\n coordinates: coordinates,\n };\n }\n else if (geometry.LineString && (allowedDisplayTypes == null || allowedDisplayTypes.includes(ZoomControl.EDisplayType.Geometry))) {\n const coordinates = removeConsecutiveDuplicates(geometry.LineString.split(' ').map(coord => {\n const [lon, lat, alt] = coord.split(',').map(Number);\n return excludeAltitude ? [lon, lat] : [lon, lat, altitude !== undefined ? altitude : (alt !== undefined ? alt : [])];\n }));\n\n // Check if the polyline has at least 2 points.\n if (coordinates.length < 2) {\n // Perhaps try other geometry instead of returning?\n return;\n }\n\n feature.geometry = {\n type: \"LineString\",\n coordinates,\n };\n }\n else if (geometry.Point && allowPoint) {\n const [lon, lat, alt] = geometry.Point.split(',').map(Number);\n const coordinates = excludeAltitude ? [lon, lat] : [lon, lat, altitude !== undefined ? altitude : (alt !== undefined ? alt : [])];\n feature.geometry = {\n type: \"Point\",\n coordinates,\n };\n }\n \n if (feature.geometry) {\n features.push(feature);\n }\n };\n \n entities.forEach(entity => {\n if (!entity?.Bruce?.ID) {\n return;\n }\n let geometry = entity.geometry;\n if (!geometry && (entity.location?.longitude && entity.location?.latitude)) {\n geometry = {\n Point: `${entity.location.longitude},${entity.location.latitude}` + (entity.location.altitude != null ? `,${entity.location.altitude}` : \"\"),\n };\n }\n if (geometry) {\n processGeometry(geometry, entity);\n }\n });\n \n return {\n type: \"FeatureCollection\",\n features,\n };\n }\n\n /**\n * Returns cache identifier for an entity record.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetCacheKey({...});\n * api.Cache.Remove(key);\n * }\n * @param params \n * @returns \n */\n export function GetCacheKey(params: {\n entityId: string,\n entityTypeId?: string,\n expandLocation?: boolean,\n expandRelations?: boolean,\n expandSources?: boolean,\n historicKey?: string,\n historicFrom?: string,\n historicTo?: string,\n historicPoint?: string,\n schemaId?: string\n }): string {\n let { entityId, entityTypeId, schemaId, expandLocation, expandRelations, expandSources, historicFrom, historicKey, historicTo, historicPoint } = params;\n if (!entityTypeId) {\n entityTypeId = \"\";\n }\n if (!historicKey) {\n historicKey = \"\";\n }\n if (!historicFrom) {\n historicFrom = \"\";\n }\n if (!historicTo) {\n historicTo = \"\";\n }\n if (!historicPoint) {\n historicPoint = \"\";\n }\n if (!schemaId) {\n schemaId = \"\";\n }\n\n let key = `${Api.ECacheKey.Entity}${Api.ECacheKey.Id}${entityId}${String(entityTypeId)}${schemaId}`;\n key += `${String(Boolean(expandLocation))}${String(Boolean(expandRelations))}${String(Boolean(expandSources))}`;\n key += `${Api.ECacheKey.EntityHistoricData}${Api.ECacheKey.Id}${historicKey}-${historicFrom}-${historicTo}-${historicPoint}`;\n return key;\n }\n \n /**\n * Returns cache identifier for an entity record.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetCacheKey(\"abc\");\n * api.Cache.Remove(key);\n * }\n * @param entityId \n * @returns \n */\n export function GetContainsKey(entityId: string) {\n return `${Api.ECacheKey.Entity}${Api.ECacheKey.Id}${entityId}`;\n }\n\n /**\n * Returns cache identifier for entity records that have historic data.\n * @param attrKey \n * @returns \n */\n export function GetHistoricContainsKey(attrKey: string) {\n if (!attrKey) {\n attrKey = \"\";\n }\n return `${Api.ECacheKey.EntityHistoricData}${Api.ECacheKey.Id}${attrKey}`;\n }\n}","import { Entity } from \"../entity/entity\";\nimport { PathUtils } from \"../util/path-utils\";\n\n/**\n * Gets the first Bruce variable in a string.\n * @param str \n * @returns \n */\nfunction getVariable(str: string): { text: string, path: string } {\n const start = str.indexOf(\"${\");\n if (start > -1) {\n const end = str.indexOf(\"}\");\n if (end > -1) {\n if (start < end) {\n const path = str.substring(start + 2, end);\n const txt = str.substring(start, end + 1);\n return { path: path, text: txt };\n }\n }\n }\n return <any>null;\n}\n\n/**\n * Utilities for parsing \"Bruce variables\", typically within strings.\n *\n * A Bruce variable is a string that starts with \"${\" and ends with \"}\".\n * Within those brackets is a path to an attribute in an entity.\n */\nexport namespace BruceVariable {\n /**\n * Replaces all Bruce variables in a string with the value of the attribute.\n * @param str\n * @param data\n * @param legacyParse\n * @returns\n */\n export function SwapValues(params: {\n str: string,\n entity: Entity.IEntity,\n legacyParse?: boolean\n }): string {\n let { str, entity: data, legacyParse } = params;\n if (!legacyParse) {\n legacyParse = false;\n }\n while (true) {\n const variable = getVariable(str);\n if (variable) {\n const path = legacyParse ? PathUtils.ParseLegacy(variable.path) : PathUtils.Parse(variable.path);\n let value = \"\";\n if (path.length > 0) {\n value = Entity.GetValue({\n entity: data,\n path: path\n });\n }\n str = str.replace(variable.text, value);\n }\n else {\n break;\n }\n }\n return str;\n }\n}","import { Color } from \"../common/color\";\nimport { Entity } from \"../entity/entity\";\nimport { BruceVariable } from \"../common/bruce-variable\";\nimport { PathUtils } from \"../util/path-utils\";\n\n/**\n * Example: ${Test.Test1}\n * Needs to become [\"Test\", \"Test1\"].\n * We need to cull this in admin-ui.\n * @param path\n * @returns Possible paths this legacy one could mean.\n */\nfunction parseLegacyPath(path: string): string[][] {\n if (!path) {\n return [];\n }\n let paths = [];\n if (path.startsWith(\"${\") && path.endsWith(\"}\")) {\n path = path.replace(\"${\", \"\");\n path = path.replace(\"}\", \"\");\n }\n // Split by dots.\n paths.push(PathUtils.ParseLegacy(path));\n // Take string as is.\n paths.push([path]);\n // Split by backslashes.\n paths.push(PathUtils.Parse(path));\n // Remove duplicates.\n const tmpPaths = [];\n for (let i = 0; i < paths.length; i++) {\n const path = paths[i];\n let found = false;\n for (let j = 0; j < tmpPaths.length; j++) {\n const tmpPath = tmpPaths[j];\n if (tmpPath.length == path.length) {\n let match = true;\n for (let k = 0; k < tmpPath.length; k++) {\n const tmpPathPart = tmpPath[k];\n const pathPart = path[k];\n if (tmpPathPart != pathPart) {\n match = false;\n break;\n }\n }\n if (match) {\n found = true;\n break;\n }\n }\n }\n if (!found) {\n tmpPaths.push(path);\n }\n }\n paths = tmpPaths;\n return paths;\n}\n\n/**\n * Utility for calculating values from Nextspace fields.\n * These fields are typically found in entity styles.\n */\nexport namespace Calculator {\n /**\n * Possible types of values that can be calculated.\n * This will determine how to calculate the values, and if extra levels of validation for specific value types are done.\n */\n export enum EValueType {\n Color,\n Input,\n Gradient,\n Mapping,\n TagColor,\n RandomColor\n }\n\n /**\n * A mapping option for a mapping value.\n */\n export interface IMappingOption {\n // Value to compare the attribute value against.\n fieldValue: string;\n // Value to return if the attribute value matches the field value.\n appliedValue: string;\n }\n\n /**\n * A mapping value.\n * This is a comparison between an attribute value to a set of available values.\n * If the attribute value matches a field value, then the applied value is returned.\n */\n export interface IMappingValue {\n // The attribute to compare against.\n // This is a string path. Check 'PathUtils.Wrap([...])'.\n field: string;\n // The available values to compare against.\n values: IMappingOption[];\n }\n\n /**\n * A gradient point.\n */\n export interface IGradientPoint {\n // The value we're comparing the attribute value against.\n position: number;\n // The color to return if the attribute value matches the position or falls between two positions.\n color: string;\n }\n\n export interface IGradientValue {\n // The attribute to compare against.\n field: string;\n // The available values to compare against.\n points: IGradientPoint[];\n // Deprecated.\n // It will be calculated from the provided points.\n min?: number;\n max?: number;\n }\n\n /**\n * A field option.\n * This is a value that can be calculated based on outlined settings.\n */\n export interface IField {\n // Settings that outline how to calculate the value based on the provided 'type'.\n value: IGradientValue | IMappingValue | string | number;\n // The type of calculation to perform.\n type: EValueType;\n }\n\n /**\n * Calculates the value of arbitrary field options.\n * The context calling this should validate results and parse stuff if needed.\n * @deprecated use specific calls: eg GetColor or GetNumber.\n * @param fields\n * @param entity\n * @param tags\n * @returns\n */\n export function GetValue(fields: IField[], entity: Entity.IEntity, tags: any[]): string | number | Color.IColor {\n if (!fields?.length) {\n return null;\n }\n if (!tags) {\n tags = [];\n }\n if (!entity) {\n entity = <any>{};\n }\n for (let i = 0; i < fields.length; i++) {\n const field = fields[i];\n let value: any;\n switch (field.type) {\n case EValueType.Color:\n value = <string>field.value;\n if (value) {\n value = Color.ColorFromStr(value);\n }\n break;\n case EValueType.Gradient:\n value = GetGradientValue(<IGradientValue>field.value, entity);\n break;\n case EValueType.Input:\n value = GetInputValue(<string>field.value, entity);\n break;\n case EValueType.Mapping:\n value = GetMappingValue(<IMappingValue>field.value, entity);\n break;\n case EValueType.RandomColor:\n value = Color.RandomColor();\n break;\n case EValueType.TagColor:\n for (let i = 0; i < tags.length; i++) {\n const tag = tags[i];\n if (tag.Color) {\n value = Color.ColorFromStr(tag.Color);\n break;\n }\n }\n break;\n }\n if (value || value == 0) {\n return value;\n }\n }\n return <any>null;\n }\n\n /**\n * Calculates the value of arbitrary field options with assumption that desired result is a color.\n * Will return null if a color is not found.\n * @param fields\n * @param entity\n * @param tags\n */\n export function GetColor(fields: IField[], entity: Entity.IEntity, tags: any[]): Color.IColor {\n if (!fields?.length) {\n return null;\n }\n if (!tags) {\n tags = [];\n }\n if (!entity) {\n entity = <any>{};\n }\n for (let i = 0; i < fields.length; i++) {\n const field = fields[i];\n let value: any;\n switch (field.type) {\n case EValueType.Color:\n value = <string>field.value;\n break;\n case EValueType.Gradient:\n value = GetGradientValue(<IGradientValue>field.value, entity);\n break;\n case EValueType.Input:\n value = GetInputValue(<string>field.value, entity);\n break;\n case EValueType.Mapping:\n value = GetMappingValue(<IMappingValue>field.value, entity);\n break;\n case EValueType.RandomColor:\n value = Color.RandomColor();\n break;\n case EValueType.TagColor:\n for (let i = 0; i < tags.length; i++) {\n const tag = tags[i];\n if (tag.Color) {\n value = Color.ColorFromStr(tag.Color);\n break;\n }\n }\n break;\n }\n if (typeof value === \"string\") {\n value = Color.ColorFromStr(value);\n }\n if (value && typeof value === \"object\" && (value.red || value.red == 0)) {\n return value;\n }\n }\n return <any>null;\n }\n\n /**\n * Calculates the value of arbitrary field options with assumption that desired result is a number.\n * Will return null if a number is not found.\n * @param fields \n * @param entity \n * @param tags \n * @returns \n */\n export function GetNumber(fields: IField[], entity: Entity.IEntity, tags: any[]): number {\n if (!fields?.length) {\n return null;\n }\n if (!tags) {\n tags = [];\n }\n if (!entity) {\n entity = <any>{};\n }\n for (let i = 0; i < fields.length; i++) {\n const field = fields[i];\n let value: any;\n switch (field.type) {\n case EValueType.Gradient:\n value = GetGradientValue(<IGradientValue>field.value, entity);\n break;\n case EValueType.Color:\n case EValueType.Input:\n value = GetInputValue(<string>field.value, entity);\n break;\n case EValueType.Mapping:\n value = GetMappingValue(<IMappingValue>field.value, entity);\n break;\n }\n if (value != \"\" && value != null && value != undefined) {\n value = Number(value);\n }\n if (value || value == 0) {\n return value;\n }\n }\n return <any>null;\n }\n\n /**\n * Calculates the value of arbitrary field options with assumption that desired result is a string.\n * Will return null if a string is not found.\n * @param fields \n * @param entity \n * @param tags \n * @returns \n */\n export function GetString(fields: IField[], entity: Entity.IEntity, tags: any[]): string {\n if (!fields?.length) {\n return null;\n }\n if (!tags) {\n tags = [];\n }\n if (!entity) {\n entity = <any>{};\n }\n\n for (let i = 0; i < fields.length; i++) {\n const field = fields[i];\n let value: any;\n switch (field.type) {\n case EValueType.Gradient:\n {\n const tmp = GetGradientValue(<IGradientValue>field.value, entity);\n // This avoids null turning into \"null\".\n if (tmp) {\n value = String(tmp);\n }\n }\n break;\n case EValueType.Color:\n case EValueType.Input:\n {\n const tmp = GetInputValue(<string>field.value, entity);\n // This avoids null turning into \"null\".\n if (tmp) {\n value = String(tmp);\n }\n }\n break;\n case EValueType.Mapping:\n {\n const tmp = GetMappingValue(<IMappingValue>field.value, entity);\n // This avoids null turning into \"null\".\n if (tmp) {\n value = String(tmp);\n }\n }\n break;\n case EValueType.RandomColor:\n // Would be nice to randomize based on an attribute or entity ID instead of pure random.\n var color = Color.RandomColor();\n value = `rgba(${color.red},${color.green},${color.blue},${color.alpha})`;\n break;\n case EValueType.TagColor:\n for (let i = 0; i < tags.length; i++) {\n const tag = tags[i];\n if (tag.Color) {\n value = tag.Color;\n break;\n }\n }\n break;\n }\n if (value) {\n return value;\n }\n }\n return <any>null;\n }\n\n /**\n * Calculates a mapping value. This can return any value type.\n * It is intended to be parsed and validated within a value-type context. Eg: GetColor, GetNumber, GetString.\n * @param value \n * @param entity \n * @returns \n */\n export function GetMappingValue(value: IMappingValue, entity: Entity.IEntity): string | number {\n const attrPaths: string[][] = parseLegacyPath(value.field);\n for (let i = 0; i < attrPaths.length; i++) {\n const attrPath = attrPaths[i];\n let eValue: any = Entity.GetValue({\n entity: entity,\n path: attrPath\n });\n const isValueNum = !isNaN(+eValue);\n\n for (let i = 0; i < value.values.length; i++) {\n const option = value.values[i];\n const mapValue = option.fieldValue;\n const isMapValueNum = !isNaN(+mapValue);\n\n if (isValueNum && (isMapValueNum || mapValue.includes(\"-\"))) {\n if (+mapValue == +eValue) {\n return option.appliedValue;\n }\n const mapSplit = mapValue.split(\"-\");\n if (mapSplit.length == 2) {\n const min = mapSplit[0];\n const max = mapSplit[1];\n if (min != \"\") {\n if (+eValue < +min) {\n continue;\n }\n }\n if (max != \"\") {\n if (+eValue > +max) {\n continue;\n }\n }\n if (min == \"\" && max == \"\") {\n continue;\n }\n return option.appliedValue;\n }\n }\n else {\n if (mapValue == eValue) {\n return option.appliedValue;\n }\n }\n }\n }\n return <any>null;\n }\n\n /**\n * Calculates a gradient value. This can return any value type.\n * It is intended to be parsed and validated within a value-type context. Eg: GetColor, GetNumber, GetString.\n * @param value \n * @param entity \n * @returns \n */\n export function GetGradientValue(value: IGradientValue, entity: Entity.IEntity): Color.IColor {\n const min = +value.points[0].position;\n const max = +value.points[value.points.length - 1].position;\n\n const attrPaths: string[][] = parseLegacyPath(value.field);\n for (let i = 0; i < attrPaths.length; i++) {\n const attrPath = attrPaths[i];\n let eValue: any = Entity.GetValue({\n entity: entity,\n path: attrPath\n });\n if (typeof eValue == \"string\") {\n eValue = Number(eValue);\n }\n\n if ((!eValue && eValue != 0) || isNaN(eValue)) {\n continue;\n }\n\n if (eValue >= max) {\n return Color.ColorFromStr(value.points[value.points.length - 1].color);\n }\n else if (eValue <= min) {\n return Color.ColorFromStr(value.points[0].color);\n }\n\n for (let i = 0; i < value.points.length - 1; i++) {\n const pointA = value.points[i];\n const pointB = value.points[i+1];\n\n if (eValue >= pointA.position && eValue <= pointB.position) {\n if (pointA.position == pointB.position) {\n return Color.ColorFromStr(pointA.color);\n }\n const distance = (eValue - pointA.position)/(pointB.position - pointA.position);\n const colorA = Color.ColorFromStr(pointA.color);\n const colorB = Color.ColorFromStr(pointB.color);\n return {\n red: colorA.red + (colorB.red - colorA.red) * distance,\n green: colorA.green + (colorB.green - colorA.green) * distance,\n blue: colorA.blue + (colorB.blue - colorA.blue) * distance,\n alpha: colorA.alpha + (colorB.alpha - colorA.alpha) * distance\n }\n }\n }\n }\n return Color.ColorFromStr(value.points[0].color);\n }\n\n /**\n * Calculates an input value. This can return any value type.\n * It is intended to be parsed and validated within a value-type context. Eg: GetColor, GetNumber, GetString.\n * @param value \n * @param entity \n * @returns \n */\n export function GetInputValue(value: string, entity: Entity.IEntity): string | number {\n if (typeof value == \"string\") {\n try {\n value = BruceVariable.SwapValues({\n str: value,\n entity: entity\n });\n\n const isJsEval = value.startsWith(\"JS:\");\n const MATH_REGEX = /(\\d+\\.?\\d*|\\.\\d+)([+\\-*/])(\\d+\\.?\\d*|\\.\\d+)/;\n const isMathEval = isJsEval || MATH_REGEX.test(value);\n\n if (isJsEval || isMathEval) {\n if (isJsEval) {\n value = value.replace(\"JS:\", \"\");\n value = value.trim();\n }\n\n // https://rollupjs.org/guide/en/#avoiding-eval\n // This stops eval warning.\n const eval2 = eval;\n return eval2(value);\n }\n }\n catch (exception) {\n const e = exception as any;\n let suppress: boolean = false;\n if (e && typeof e == \"object\") {\n const msg: string = e.message;\n suppress = !!msg && (msg.includes(\"Unexpected end\") || msg.includes(\"got end of script\"));\n }\n if (!suppress) {\n console.error(e);\n }\n }\n }\n return value;\n }\n}","import { Entity } from \"../entity/entity\";\nimport { Carto } from \"./carto\";\nimport { Geometry } from \"./geometry\";\n\nexport namespace Bounds {\n /**\n * Description of an entity's bounding box.\n */\n export interface IBounds {\n // Values are in degrees.\n maxLatitude: number;\n maxLongitude: number;\n minLatitude: number;\n minLongitude: number;\n // Values are in meters.\n maxAltitude?: number;\n minAltitude?: number;\n }\n\n /**\n * Describes the boundaries used in entity requests.\n */\n export interface IReqBounds {\n south: number;\n west: number;\n north: number;\n east: number;\n\n // Used to exclude requests from UI that fall outside of min-max boundaries.\n // TODO: Migrate into \"entity-filter-getter.ts\", \"entity-globe.ts\" and then remove from here.\n alt?: number;\n }\n\n /**\n * Calculates boundaries from entity.\n * This will not use the entity's boundaries and instead calculate from geometry and location.\n * @param entity \n */\n export function FromEntity(entity: Entity.IEntity): IBounds {\n const bounds: IBounds = {\n maxAltitude: null,\n maxLatitude: null,\n maxLongitude: null,\n minAltitude: null,\n minLatitude: null,\n minLongitude: null\n };\n const points: Carto.ICarto[] = [];\n\n const location = Entity.GetValue({\n entity: entity,\n path: [\"Bruce\", \"Location\"]\n })\n if (location) {\n points.push(location);\n }\n\n const geometry = Entity.GetValue({\n entity: entity,\n path: [\"Bruce\", \"VectorGeometry\"]\n });\n const processGeometry = (geometry: Geometry.IGeometry, depth = 0) => {\n if (!geometry || depth > 5) {\n return;\n }\n if (geometry.Point) {\n points.push(...Geometry.ParsePoints(geometry.Point));\n }\n if (geometry.LineString) {\n points.push(...Geometry.ParsePoints(geometry.LineString));\n }\n if (geometry.Polygon) {\n for (const ring of geometry.Polygon) {\n points.push(...Geometry.ParsePoints(ring.LinearRing));\n }\n }\n if (geometry.MultiGeometry) {\n for (const multiGeometry of geometry.MultiGeometry) {\n processGeometry(multiGeometry, depth + 1);\n }\n }\n };\n\n processGeometry(geometry);\n \n for (const point of points) {\n if (bounds.maxLatitude == null || point.latitude > bounds.maxLatitude) {\n bounds.maxLatitude = point.latitude;\n }\n if (bounds.maxLongitude == null || point.longitude > bounds.maxLongitude) {\n bounds.maxLongitude = point.longitude;\n }\n if (bounds.maxAltitude == null || point.altitude > bounds.maxAltitude) {\n bounds.maxAltitude = point.altitude;\n }\n if (bounds.minLatitude == null || point.latitude < bounds.minLatitude) {\n bounds.minLatitude = point.latitude;\n }\n if (bounds.minLongitude == null || point.longitude < bounds.minLongitude) {\n bounds.minLongitude = point.longitude;\n }\n if (bounds.minAltitude == null || point.altitude < bounds.minAltitude) {\n bounds.minAltitude = point.altitude;\n }\n }\n \n return bounds;\n }\n}","interface IBruceEventCallback {\n _id: number;\n removeCallback: () => void;\n callback: (data: any) => void;\n}\n\n/**\n * Simple event utility.\n * Instantiate the model, then subscribe and trigger events.\n */\nexport class BruceEvent<TArgs> {\n // Counter to help differentiate subscriptions.\n private _counter: number = 0;\n // Record of all callback subscriptions for this event.\n private callbacks: IBruceEventCallback[] = [];\n\n /**\n * Subscribes to this event.\n * The provided callback will be called when the event is triggered.\n * @param callback \n * @returns A function that can be called to unsubscribe from this event.\n */\n public Subscribe(callback: (data: TArgs) => void): (() => void) {\n let id = this._counter++;\n let newBruceEventCallback: IBruceEventCallback = {\n \t_id: id,\n \tremoveCallback: () => {\n \t\tthis.Unsubscribe(id);\n \t},\n \tcallback: callback\n };\n this.callbacks.push(newBruceEventCallback);\n return newBruceEventCallback.removeCallback;\n }\n\n /**\n * Unsubscribes from this event.\n * @param id specific subscription entry to remove.\n * @warning please use the returned function from Subscribe() instead of this function.\n */\n public Unsubscribe(id: number): void {\n let index = this.callbacks.findIndex(x => x._id == id);\n if (index > -1) {\n this.callbacks.splice(index, 1);\n }\n }\n\n /**\n * Triggers this event with optional data.\n * This will call all subscribed callbacks.\n * @param data \n */\n public Trigger(data?: TArgs): void {\n let callbacks = this.callbacks;\n for (let i = 0; i < callbacks.length; i++) {\n let callback = callbacks[i];\n if (callback.callback) {\n callback.callback(data);\n }\n }\n }\n\n /**\n * Clears all subscriptions.\n */\n public Clear(): void {\n this.callbacks = [];\n }\n}","export namespace Camera {\n export enum EFrustum {\n Perspective,\n Orthographic\n }\n}","/**\n * Describes 2d and 3d coordinates.\n * \n * In 2d the x/y typically refers to a window left/top offset.\n * In 3d the x/y/z, the units are in meters.\n */\nexport namespace Cartes {\n export interface ICartes2 {\n x: number;\n y: number;\n }\n\n export interface ICartes3 extends ICartes2 {\n z: number;\n }\n\n export function ValidateCartes2(cartes: ICartes2): boolean {\n if (!cartes) {\n return false;\n }\n else if (!cartes.x && cartes.x != 0) {\n return false;\n }\n else if (!cartes.y && cartes.y != 0) {\n return false;\n }\n return true;\n }\n\n export function ValidateCartes3(cartes: ICartes3): boolean {\n if (!ValidateCartes2(cartes)) {\n return false;\n }\n else if (!cartes.z && cartes.z != 0) {\n return false;\n }\n return true;\n }\n\n export function IsEqualCartes2(a: ICartes2, b: ICartes2): boolean {\n if (a.x != b.x) {\n return false;\n }\n else if (a.y != b.y) {\n return false;\n }\n return true;\n }\n\n export function IsEqualCartes3(a: ICartes3, b: ICartes3): boolean {\n if (!IsEqualCartes2(a, b)) {\n return false;\n }\n else if (a.z != b.z) {\n return false;\n }\n return true;\n }\n\n /**\n * Returns true if the given ring is closed.\n * A ring is closed if the first and last point are equal.\n * A ring with less than 2 points is not closed.\n * @param points \n * @returns \n */\n export function IsRing2Closed(points: ICartes2[]) {\n if (points.length < 2) {\n return false;\n }\n else if (!IsEqualCartes2(points[0], points[points.length - 1])) {\n return false;\n }\n return true;\n }\n\n /**\n * Returns true if the given ring is closed.\n * A ring is closed if the first and last point are equal.\n * A ring with less than 2 points is not closed.\n * @param points \n * @returns \n */\n export function IsRing3Closed(points: ICartes3[]) {\n if (points.length < 2) {\n return false;\n }\n else if (!IsEqualCartes3(points[0], points[points.length - 1])) {\n return false;\n }\n return true;\n }\n\n /**\n * Closes given ring by adding the first point to the end of the array.\n * This will mutate the given array.\n * Will not do anything if the ring is already closed.\n * @param points \n * @returns \n */\n export function CloseRing2(points: ICartes2[]) {\n if (points.length < 2) {\n return;\n }\n else if (IsRing2Closed(points)) {\n return;\n }\n points.push(points[0]);\n }\n\n /**\n * Closes given ring by adding the first point to the end of the array.\n * This will mutate the given array.\n * Will not do anything if the ring is already closed.\n * @param points \n * @returns \n */\n export function CloseRing3(points: ICartes3[]) {\n if (points.length < 2) {\n return;\n }\n else if (IsRing3Closed(points)) {\n return;\n }\n points.push(points[0]);\n }\n}","/**\n * Describes a geographic point.\n * The units of the stored data should be in Degrees.\n * Utilities may use this in Radians for temporary calculations.\n */\nexport namespace Carto {\n export interface ICarto {\n latitude: number;\n longitude: number;\n altitude: number;\n }\n\n export function ValidateCarto(carto: ICarto): boolean {\n if (!carto) {\n return false;\n }\n else if (!carto.longitude && carto.longitude != 0) {\n return false;\n }\n else if (!carto.latitude && carto.latitude != 0) {\n return false;\n }\n return true;\n }\n\n export function IsEqual(a: ICarto, b: ICarto): boolean {\n if (a.longitude != b.longitude) {\n return false;\n }\n else if (a.latitude != b.latitude) {\n return false;\n }\n return true;\n }\n\n export function GetCenter(list: ICarto[]): ICarto {\n let center = { \n longitude: 0, \n latitude: 0, \n altitude: 0 \n };\n for (let i = 0; i < list.length; i++) {\n const carto = list[i];\n center.longitude += carto.longitude;\n center.latitude += carto.latitude;\n if (carto.altitude) {\n center.altitude += carto.altitude;\n }\n }\n if (center.longitude) {\n center.longitude /= list.length;\n }\n if (center.latitude) {\n center.latitude /= list.length;\n }\n if (center.altitude) {\n center.altitude /= list.length;\n }\n return center;\n }\n}","/**\n * Controls the flow of method calls.\n * If you have a method that may be called often, but you don't want it to run often, use this.\n */\nexport class DelayQueue {\n // The callback is the method we want to control queue for.\n private callback: () => void;\n // Millisecond delay.\n public delay: number = 200;\n // Date-time stamp for the last callback call.\n private lastCallTime: number = <any>null;\n // The delay timeout for calling update.\n private delayTimeout: any;\n\n constructor(callback: () => void, delay: number = 200) {\n this.callback = callback;\n this.delay = delay;\n }\n\n /**\n * Request a call on the callback.\n * @param force If true, the callback will be called immediately.\n */\n public Call(force: boolean = false): void {\n if (this.lastCallTime == null) {\n force = true;\n }\n if (force) {\n let endDate = new Date().getTime();\n this.doCall(endDate);\n }\n else {\n const endDate = new Date().getTime();\n const seconds = (endDate - this.lastCallTime) / 1000;\n const delay = this.delay / 1000;\n if (seconds > delay) {\n this.doCall(endDate);\n }\n else if (this.delayTimeout == null) {\n const diff = (delay - seconds) * 1000;\n this.delayTimeout = setTimeout(() => {\n this.delayTimeout = null;\n this.Call();\n }, diff + 0.02);\n }\n }\n }\n\n private doCall(endDate: number): void {\n if (this.delayTimeout != null) {\n clearTimeout(this.delayTimeout);\n this.delayTimeout = null;\n }\n this.lastCallTime = endDate;\n this.callback();\n }\n\n /**\n * Dispose of this object.\n */\n public Dispose(): void {\n if (this.delayTimeout != null) {\n clearTimeout(this.delayTimeout);\n this.delayTimeout = null;\n }\n }\n}","/**\n * Describes a Bruce stored date.\n */\nexport namespace UTC {\n export enum EMonth {\n January = 1,\n February = 2,\n March = 3,\n April = 4,\n May = 5,\n June = 6,\n July = 7,\n August = 8,\n September = 9,\n October = 10,\n November = 11,\n December = 12\n }\n\n export interface IUTC {\n d: number;\n hh: number;\n m: EMonth | number;\n mm: number;\n ss: number;\n y: number;\n }\n\n /**\n * Returns an ISO 8601 string representation of the provided date.\n * @param utc \n */\n export function ToString(utc: IUTC): string {\n return ToDate(utc).toISOString();\n }\n\n export function ToDate(utc: IUTC): Date {\n return new Date(Date.UTC(utc.y, utc.m - 1, utc.d, utc.hh, utc.mm, utc.ss, 0));\n }\n\n export function FromDate(utc: Date): IUTC {\n return {\n y: utc.getUTCFullYear(),\n m: utc.getUTCMonth() + 1,\n d: utc.getUTCDate(),\n hh: utc.getUTCHours(),\n mm: utc.getUTCMinutes(),\n ss: utc.getUTCSeconds()\n };\n }\n\n /**\n * Returns how many seconds have passed between two dates.\n * If the second date is not provided, it will be the current date.\n * @param from \n * @param to \n * @returns \n */\n export function GetPassedSeconds(from: IUTC, to?: IUTC): number {\n if (!to) {\n to = FromDate(new Date());\n }\n const fromTime = ToDate(from).getTime();\n const toTime = ToDate(to).getTime();\n return Math.floor((toTime - fromTime) / 1000);\n }\n\n /**\n * Returns a human-readable string that describes how much time has passed since the provided date.\n * @param utc \n */\n export function GetPassedTime(utc: IUTC): string {\n const passedSeconds = GetPassedSeconds(utc);\n if (passedSeconds < 60) {\n return `${passedSeconds} second${passedSeconds > 1 ? \"s\" : \"\"} ago`;\n }\n const passedMinutes = Math.floor(passedSeconds / 60);\n if (passedMinutes < 60) {\n return `${passedMinutes} minute${passedMinutes > 1 ? \"s\" : \"\"} ago`;\n }\n const passedHours = Math.floor(passedMinutes / 60);\n if (passedHours < 24) {\n return `${passedHours} hour${passedHours > 1 ? \"s\" : \"\"} ago`;\n }\n const passedDays = Math.floor(passedHours / 24);\n if (passedDays < 30) {\n return `${passedDays} day${passedDays > 1 ? \"s\" : \"\"} ago`;\n }\n const passedMonths = Math.floor(passedDays / 30);\n if (passedMonths < 12) {\n return `${passedMonths} month${passedMonths > 1 ? \"s\" : \"\"} ago`;\n }\n const passedYears = Math.floor(passedMonths / 12);\n return `${passedYears} year${passedYears > 1 ? \"s\" : \"\"} ago`;\n }\n\n /**\n * Returns a human-readable string that describes the provided date.\n * If a timezone is not provided then it will use the locale timezone.\n * @param utc \n * @param timezone\n */\n export function GetDateTime(utc: IUTC, timezone?: string): string {\n const date = ToDate(utc);\n // Possibly could just pass the timezone and it might get ignored if missing.\n if (timezone) {\n return date.toLocaleString(\"en-US\", { \n timeZone: timezone,\n hour12: true,\n hour: \"numeric\",\n minute: \"numeric\",\n year: \"2-digit\",\n month: \"2-digit\",\n day: \"2-digit\"\n }) + \" \" + getTimezoneName(timezone);\n }\n return date.toLocaleString(undefined, { \n hour12: true, \n hour: \"numeric\", \n minute: \"numeric\", \n year: \"2-digit\", \n month: \"2-digit\", \n day: \"2-digit\" \n });\n }\n}\n\n// Found here https://stackoverflow.com/questions/9772955/how-can-i-get-the-timezone-name-in-javascript\n// Formats a given timezone into a human readable format.\nfunction getTimezoneName(timezone: string): string {\n const today = new Date();\n const short = today.toLocaleDateString(undefined, { timeZone: timezone });\n const full = today.toLocaleDateString(undefined, { timeZoneName: \"long\", timeZone: timezone });\n\n // Trying to remove date from the string in a locale-agnostic way\n const shortIndex = full.indexOf(short);\n if (shortIndex >= 0) {\n const trimmed = full.substring(0, shortIndex) + full.substring(shortIndex + short.length);\n\n // by this time `trimmed` should be the timezone's name with some punctuation -\n // trim it from both sides\n return trimmed.replace(/^[\\s,.\\-:;]+|[\\s,.\\-:;]+$/g, \"\");\n }\n\n // in some magic case when short representation of date is not present in the long one, \n // just return the long one as a fallback, since it should contain the timezone's name\n return full;\n}","/**\n * A simple LRU cache implementation.\n * LRU cache is a cache that evicts the least recently used item when it is full.\n */\nexport class LRUCache<TKey, TValue> {\n private readonly capacity: number;\n private readonly cache: Map<TKey, TValue>;\n\n constructor(capacity: number) {\n this.capacity = capacity;\n this.cache = new Map<TKey, TValue>();\n }\n\n /**\n * Get a value from the cache.\n * @param key \n * @returns \n */\n public Get(key: TKey): TValue | undefined {\n const value = this.cache.get(key);\n if (value) {\n this.cache.delete(key);\n this.cache.set(key, value);\n }\n return value;\n }\n\n /**\n * Set a value in the cache.\n * @param key \n * @param value \n */\n public Set(key: TKey, value: TValue): void {\n if (this.cache.size >= this.capacity) {\n const leastRecentlyUsedKey = this.cache.keys().next().value;\n this.cache.delete(leastRecentlyUsedKey);\n }\n this.cache.set(key, value);\n }\n\n public Entries(): IterableIterator<[TKey, TValue]> {\n return this.cache.entries();\n }\n\n public Clear() {\n this.cache.clear();\n }\n}\n","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { ENVIRONMENT } from \"../environment\";\n\ntype Type = EntityAttachmentType.EType | string;\n\n/**\n * Describes the \"Entity Attachment Type\" concept within Nextspace.\n * It is a record that describes the purpose of an attachment.\n */\nexport namespace EntityAttachmentType {\n /**\n * Describes an attachment type record.\n */\n export interface IType {\n // Attachment type description.\n Description: string;\n // Attachment type ID.\n ID: Type;\n // Human readable attachment type name.\n Name: string;\n }\n\n // Known attachment types.\n export enum EType {\n // Attachments with this type will appear in the media tab within the entity details.\n Photo = \"photo\",\n Document = \"document\"\n }\n\n /**\n * Gets an attachment type record by ID.\n * @param params \n * @returns \n */\n export async function Get(params: {\n attachmentTypeId: Type;\n api?: BruceApi.Api,\n req?: Api.IReqParams\n }): Promise<{\n attachmentType: IType\n }> {\n let { api, attachmentTypeId, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n if (!attachmentTypeId) {\n throw(\"Type ID is required.\");\n }\n\n reqParams = Api.PrepReqParams(reqParams);\n const cacheData = api.GetCacheItem(GetCacheKey(attachmentTypeId), reqParams);\n if (cacheData?.found) {\n return cacheData.data;\n }\n const prom = api.GET(`entityAttachmentType/${attachmentTypeId}`, Api.PrepReqParams(reqParams));\n api.SetCacheItem({\n key: GetCacheKey(attachmentTypeId),\n value: prom,\n req: reqParams\n });\n return prom;\n }\n\n /**\n * Deletes an attachment type.\n * @param params \n */\n export async function Delete(params: {\n api?: BruceApi.Api,\n // The attachment type ID to delete.\n attachmentTypeId: Type,\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, attachmentTypeId, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n if (!attachmentTypeId) {\n throw(\"Type ID is required.\");\n }\n await api.DELETE(`entityAttachmentType/${attachmentTypeId}`, Api.PrepReqParams(reqParams));\n api.Cache.Remove(GetCacheKey(attachmentTypeId));\n api.Cache.Remove(GetListCacheKey());\n }\n\n /**\n * Creates or updates an attachment type.\n * @param params \n * @returns \n */\n export async function Update(params: {\n api?: BruceApi.Api,\n // The attachment type to create or update.\n attachmentType: IType,\n req?: Api.IReqParams\n }): Promise<{\n attachmentType: IType\n }> {\n let { api, attachmentType: data, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n if (!data?.ID) {\n throw(\"Type ID is required.\");\n }\n const res = await api.POST(`entityAttachmentType/${data.ID}`, data, Api.PrepReqParams(reqParams));\n api.Cache.Remove(GetCacheKey(data.ID));\n api.Cache.Remove(GetListCacheKey());\n return {\n attachmentType: res\n };\n }\n\n /**\n * Gets a list of all attachment types.\n * @param params \n * @returns \n */\n export async function GetList(params: {\n api?: BruceApi.Api,\n req?: Api.IReqParams\n }): Promise<{\n // The list of attachment types.\n attachmentTypes: IType[]\n }> {\n let { api, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const cache = await api.GetCacheItem(GetListCacheKey(), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const req: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(`entityAttachmentTypes`, Api.PrepReqParams(reqParams));\n res({\n attachmentTypes: data.Items\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key: GetListCacheKey(),\n value: req,\n req: reqParams\n });\n return req;\n }\n\n /**\n * Returns cache identifier for an attachment type by ID.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetCacheKey(\"123\");\n * api.Cache.Remove(key);\n * }\n * @param id \n * @returns \n */\n export function GetCacheKey(id: Type): string {\n return Api.ECacheKey.AttachmentType + Api.ECacheKey.Id + id;\n }\n \n /**\n * Returns cache identifier for a list of attachment types.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetListCacheKey();\n * api.Cache.Remove(key);\n * }\n * @param typeId \n * @returns \n */\n export function GetListCacheKey(): string {\n return Api.ECacheKey.AttachmentType;\n }\n}","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { ClientFile } from \"../client-file/client-file\";\nimport { ENVIRONMENT } from \"../environment\";\nimport { EntityAttachmentType } from \"./entity-attachment-type\";\n\ntype Type = EntityAttachmentType.EType | string;\n\n/**\n * Describes the \"Entity Attachment\" concept within Nextspace.\n * An entity attachment is an arbitrary file record that is linked to an entity record.\n * The same file can be attached to multiple entities.\n */\nexport namespace EntityAttachment {\n /**\n * Describes an attachment record.\n */\n export interface IAttachment {\n // Attachment ID.\n ID: number;\n // Associated client file record.\n ClientFile?: ClientFile.IFile;\n // Associated client file ID.\n \"ClientFile.ID\": string;\n // Display order among sibling attachments.\n DisplayOrder?: number;\n // Entity this attachment is associated with.\n \"Entity.ID\": string;\n // Attachment type ID.\n \"EntityAttachmentType.ID\": Type;\n // @deprecated. Use attachment types as groups.\n Group?: string;\n }\n\n /**\n * Updates one or many attachment records.\n * @param params \n * @returns \n */\n export async function Update(params: {\n api?: BruceApi.Api,\n // The entity ID the record is associated with.\n entityId: string,\n // Attachments to update.\n attachments: IAttachment[],\n req?: Api.IReqParams\n }): Promise<{\n attachments: IAttachment[]\n }> {\n let { api, attachments, req, entityId } = params;\n if (!attachments?.length) {\n return Promise.resolve({\n attachments: []\n });\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const res = await api.POST(`entity/${entityId}/attachments`, {\n attachments\n }, Api.PrepReqParams(req));\n for (let i = 0; i < attachments.length; i++) {\n if (attachments[i].ID) {\n api.Cache.Remove(GetCacheKey(attachments[i].ID));\n }\n }\n await api.Cache.Remove(GetListCacheKey(entityId));\n return {\n attachments: res.attachments\n };\n }\n\n /**\n * Updates the display order of attachments.\n * @param params \n */\n export async function UpdateOrder(params: {\n api?: BruceApi.Api,\n // The entity ID the record is associated with.\n entityId: string,\n // The attachment type ID.\n attachmentTypeId: Type,\n // Attachments to update.\n attachments: IAttachment[],\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, entityId, attachmentTypeId: typeId, attachments, req: reqParams } = params;\n if (!entityId || !typeId) {\n throw(\"Entity ID and Type ID are required.\");\n }\n if (!attachments?.length) {\n return Promise.resolve();\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const reqData = {\n \t\"DisplayOrder.Start\": 0,\n \t\"ClientFile.ID\": attachments.map(x => x[\"ClientFile.ID\"])\n };\n await api.POST(`entity/${entityId}/attachments/${typeId}/setOrder`, reqData, Api.PrepReqParams(reqParams));\n for (let i = 0; i < attachments.length; i++) {\n api.Cache.Remove(GetCacheKey(attachments[i].ID));\n }\n await api.Cache.RemoveByStartsWith(GetListCacheKey(entityId));\n }\n\n /**\n * Deletes an attachment record.\n * @param params \n */\n export async function Delete(params: {\n api?: BruceApi.Api,\n entityId: string,\n attachmentId: number,\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, attachmentId, entityId, req } = params;\n if (!attachmentId || !entityId) {\n throw(\"Entity id and attachment id.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n await api.DELETE(`entity/${entityId}/attachments/${attachmentId}`, Api.PrepReqParams(req));\n await api.Cache.Remove(GetCacheKey(attachmentId));\n await api.Cache.Remove(GetListCacheKey(params.entityId));\n }\n\n /**\n * Gets a list of attachments for an entity.\n * @param params \n * @returns \n */\n export async function GetListByEntityId(params: {\n api?: BruceApi.Api,\n // The entity ID to get attachments for.\n entityId: string,\n req?: Api.IReqParams\n }): Promise<{\n // The list of attachments.\n attachments: IAttachment[]\n }> {\n let { api, entityId, req: reqParams } = params;\n if (!entityId) {\n throw(\"Entity ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const cache = await api.GetCacheItem(GetListCacheKey(entityId), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const req: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(`entity/${entityId}/attachments`, Api.PrepReqParams(reqParams));\n res({\n attachments: (data.attachments ? data.attachments : data.Items)\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key: GetListCacheKey(entityId),\n value: req,\n req: reqParams\n });\n return req;\n }\n\n /**\n * Uploads a file as an attachment to an entity.\n * This will create a client file record for the file.\n * @param params \n * @returns \n */\n export async function Upload(params: {\n api?: BruceApi.Api,\n // The file to upload.\n file: File,\n // The entity ID to attach the file to.\n entityId: string,\n // The attachment type ID.\n attachmentTypeId: Type,\n req?: Api.IUploadReqParams\n }): Promise<{\n // The created attachment record.\n attachment: IAttachment\n }> {\n let { api, file, entityId, attachmentTypeId: typeId, req: reqParams } = params;\n if (!entityId || !typeId || !file) {\n throw(\"Entity ID, Type ID, and File are required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const url = `entity/${entityId}/attachment/${typeId}`;\n const res = await api.UPLOAD(url, file, Api.PrepReqParams(reqParams));\n api.Cache.Remove(GetListCacheKey(entityId));\n return {\n attachment: res\n };\n }\n\n /**\n * Returns cache identifier for an attachment by ID.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetCacheKey(\"123\");\n * api.Cache.Remove(key);\n * }\n * @param id \n * @returns \n */\n export function GetCacheKey(id: number): string {\n return Api.ECacheKey.Attachment + Api.ECacheKey.Id + id;\n }\n\n /**\n * Returns cache identifier for a list of attachments for an entity.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetListCacheKey(\"abc\");\n * api.Cache.Remove(key);\n * }\n * @param typeId \n * @returns \n */\n export function GetListCacheKey(entityId: string): string {\n return Api.ECacheKey.Attachment + Api.ECacheKey.Entity + Api.ECacheKey.Id + entityId;\n }\n}","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { UTC } from \"../common/utc\";\nimport { ENVIRONMENT } from \"../environment\";\n\n/**\n * Describes the \"Entity Comment\" concept within Nextspace.\n * An entity comment is a user written message that is linked to an entity record.\n * \n * @deprecated: The Navigator now uses Entity records directly.\n * a utility is being made to manage those records.\n */\nexport namespace EntityComment {\n /**\n * Describes a comment record.\n */\n export interface IComment {\n // Comment text.\n Comment: string;\n // User who created the comment.\n \"Created.ByUser.ID\": string;\n // Date the comment was created.\n \"Created.Date\": UTC.IUTC;\n // Comment ID.\n ID: number;\n // Cache of the number of replies to this comment.\n // Real number is calculated by traversing child comments.\n RepliesCount: number;\n // Comment this comment is a reply to.\n \"ReplyTo.Comment.ID\": number;\n // Target we're commenting on. Typically an entity ID.\n \"TargetObject.ID\": string;\n // Type of target we're commenting on. Typically an entity type ID.\n \"TargetObject.Type\": string;\n }\n\n /**\n * Creates or updates a comment.\n * @param params \n * @returns \n */\n export async function Update(params: {\n api?: BruceApi.Api,\n // The comment to create or update.\n comment: IComment,\n req?: Api.IReqParams\n }): Promise<{\n // The created or updated comment.\n comment: IComment\n }> {\n let { api, comment: data, req: reqParams } = params;\n if (!data?.[\"TargetObject.ID\"]) {\n throw(\"TargetObject.ID (entity id) is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const url = `entity/${data[\"TargetObject.ID\"]}/comment` + (data.ID == null ? \"\" : \"/\" + data.ID);\n const res = await api.POST(url, data, Api.PrepReqParams(reqParams));\n api.Cache.Remove(GetCacheKey(data.ID));\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Comment + Api.ECacheKey.Entity);\n\n return {\n comment: res\n };\n }\n\n /**\n * Deletes a comment.\n * @param params \n */\n export async function Delete(params: {\n api?: BruceApi.Api,\n // The entity ID to delete the comment from.\n entityId: string,\n // The comment ID to delete.\n commentId: number,\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, entityId, commentId, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n if (!commentId) {\n throw(\"Comment ID is required.\");\n }\n await api.DELETE(`entity/${entityId}/comment/${commentId}`, Api.PrepReqParams(reqParams));\n api.Cache.Remove(GetCacheKey(commentId));\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Comment + Api.ECacheKey.Entity);\n }\n\n /**\n * Gets a list of comments for an entity.\n * @param params \n * @returns \n */\n export async function GetListByEntityId(params: {\n api?: BruceApi.Api,\n // The entity ID to get comments for.\n entityId: string,\n req?: Api.IReqParams\n }): Promise<{\n // The list of comments.\n comments: IComment[]\n }> {\n let { api, entityId, req: reqParams } = params;\n if (!entityId) {\n throw(\"Entity ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const cache = await api.GetCacheItem(GetListCacheKey(entityId), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const req: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(`entity/${entityId}/comments`, Api.PrepReqParams(reqParams));\n res({\n comments: data.Items\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key: GetListCacheKey(entityId),\n value: req,\n req: reqParams\n });\n return req;\n }\n\n /**\n * Returns cache identifier for a comment by ID.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetCacheKey(\"123\");\n * api.Cache.Remove(key);\n * }\n * @param id \n * @returns \n */\n export function GetCacheKey(id: number): string {\n return Api.ECacheKey.Comment + Api.ECacheKey.Id + id;\n }\n \n /**\n * Returns cache identifier for a list of comments for an entity.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetListCacheKey(\"abc\");\n * api.Cache.Remove(key);\n * }\n * @param entityId \n * @returns \n */\n export function GetListCacheKey(entityId: string): string {\n return Api.ECacheKey.Comment + Api.ECacheKey.Entity + Api.ECacheKey.Id + entityId;\n }\n}","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { ENVIRONMENT } from \"../environment\";\n\n/**\n * Describes the \"Entity Link\" concept within Nextspace.\n * An entity link is an external URL linked to an entity record.\n */\nexport namespace EntityLink {\n /**\n * Describes a link record.\n */\n export interface ILink {\n // Human readable name of the link.\n DisplayName: string;\n // Link ID.\n ID?: number;\n // ID of the entity this link is linked to.\n \"Entity.ID\": string;\n // URL of the link.\n URL: string;\n }\n\n /**\n * Creates or updates a link record.\n * @param params \n * @returns \n */\n export async function Update(params: {\n api?: BruceApi.Api,\n // Link record to create or update.\n link: ILink,\n req?: Api.IReqParams\n }): Promise<{\n // The link record.\n link: ILink\n }> {\n let { api, link: data, req: reqParams } = params;\n if (!data?.[\"Entity.ID\"]) {\n throw(\"Entity ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const url = `entity/${data[\"Entity.ID\"]}/link` + (data.ID == null ? \"\" : \"/\" + data.ID);\n const res = await api.POST(url, data, Api.PrepReqParams(reqParams));\n api.Cache.Remove(GetCacheKey(<number>data.ID));\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Link + Api.ECacheKey.Entity);\n\n return {\n link: res\n };\n }\n\n /**\n * Deletes a link record.\n * @param params \n */\n export async function Delete(params: {\n api?: BruceApi.Api,\n // The entity ID to delete the link from.\n entityId: string,\n // The link ID to delete.\n linkId: number,\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, entityId, linkId, req: reqParams } = params;\n if (!linkId || !entityId) {\n throw(\"Link ID and Entity ID are required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n \n await api.DELETE(`entity/${entityId}/link/${linkId}`, Api.PrepReqParams(reqParams));\n api.Cache.Remove(GetCacheKey(linkId));\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Link + Api.ECacheKey.Entity);\n }\n\n /**\n * Returns a list of links for an entity.\n * @param params \n * @returns \n */\n export async function GetListByEntityId(params: {\n api?: BruceApi.Api,\n // The entity ID to get links for.\n entityId: string,\n req?: Api.IReqParams\n }): Promise<{\n // The list of links.\n links: ILink[]\n }> {\n let { api, entityId, req: reqParams } = params;\n if (!entityId) {\n throw(\"Entity ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const cache = await api.GetCacheItem(GetListCacheKey(entityId), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const req: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(`entity/${entityId}/links`, Api.PrepReqParams(reqParams));\n res({\n links: data.Items\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key: GetListCacheKey(entityId),\n value: req,\n req: reqParams\n });\n return req;\n }\n\n /**\n * Returns cache identifier for a link record.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetCacheKey(1);\n * api.Cache.Remove(key);\n * }\n * @param id \n * @returns \n */\n export function GetCacheKey(id: number): string {\n return Api.ECacheKey.Link + Api.ECacheKey.Id + id;\n }\n \n /**\n * Returns cache identifier for a list of links for an entity.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetListCacheKey(\"abc\");\n * api.Cache.Remove(key);\n * }\n * @param entityId \n * @returns \n */\n export function GetListCacheKey(entityId: string): string {\n return Api.ECacheKey.Link + Api.ECacheKey.Entity + Api.ECacheKey.Id + entityId;\n }\n}","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { ClientFile } from \"../client-file/client-file\";\nimport { ENVIRONMENT } from \"../environment\";\n\n/**\n * Describes the \"Entity LOD\" concept within Nextspace.\n * LOD stands for Level of Detail.\n * An lod record is a possible 2d/3d visualization of the entity record.\n * The most common kind is a GLB.\n */\nexport namespace EntityLod {\n /**\n * Describes an entity lod record.\n * This is a 2d/3d visualization of the entity record.\n * The most common kind is a GLB.\n */\n export interface ILod {\n // Corresponding client file record.\n ClientFile?: ClientFile.IFile;\n // ID of the related client file record.\n \"ClientFile.ID\": string;\n // ID of the related entity record.\n \"Entity.ID\": string;\n // Entity Type ID for LOD records that are tied to a type rather than an Entity.\n \"EntityType.ID\"?: string;\n // ID of the lod category.\n \"LODCategory.Key\": string;\n // Level of detail. 0 is the highest.\n Level: number;\n // LOD group within its entity type.\n Group?: string;\n }\n\n /**\n * Describes an entity lod record update.\n */\n export interface IEntityLodUpdate {\n // ID of the related client file record.\n \"ClientFile.ID\": string;\n // ID of the lod category.\n \"LODCategory.Key\": string;\n // Level of detail. 0 is the highest.\n Level: number;\n }\n\n /**\n * Returns a url for an entity lod record file.\n * @param params \n * @returns \n */\n export function GetUrl(params: {\n api?: BruceApi.Api,\n // ID of the related entity record.\n entityId: string,\n // ID of the lod category.\n categoryId: string,\n // Level of detail. 0 is the highest.\n level: number,\n // Whether to use strict mode.\n // When not strict it will find the closest level of detail available.\n strict?: boolean\n }): {\n // Url for the entity lod record file.\n url: string\n } {\n let { api, entityId, categoryId, level, strict } = params;\n if (!entityId) {\n throw(\"Entity ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n if (!categoryId) {\n categoryId = \"GLB\";\n }\n if (!level) {\n level = 0;\n }\n return {\n url: api.ConstructUrl({\n url: `entity/${entityId}/lod/${categoryId}/${level}`,\n urlParams: {\n \"strict\": strict ? \"true\" : \"false\"\n }\n })\n };\n }\n\n /**\n * Returns the client file id for an entity lod record file.\n * @param params \n * @returns \n */\n export async function GetUrlFileId(params: {\n api?: BruceApi.Api,\n // Url for the entity lod record file.\n url: string,\n req?: Api.IReqParams\n }): Promise<{\n // ID of the related client file record.\n clientFileId: string\n }> {\n let { api, url, req: reqParams } = params;\n if (!url) {\n throw(\"Url is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const cache = await api.GetCacheItem(GetCacheKey(url), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const req: Promise<any> = new Promise(async (res, rej) => {\n try {\n const record: ILod = await api.get(url, Api.PrepReqParams(reqParams));\n res({\n clientFileId: record[\"ClientFile.ID\"]\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key: GetCacheKey(url),\n value: req,\n req: reqParams\n });\n return req;\n }\n\n /**\n * Returns lods for a specified filter.\n * @param params \n * @returns \n */\n export async function GetLods(params: {\n api?: BruceApi.Api,\n // Filter for the lods to return.\n filter: Filter.IListParams,\n req?: Api.IReqParams\n }): Promise<{\n // List of lods matching the specified filter.\n lods: Filter.IListResItem[]\n }> {\n let { api, filter, req: reqParams } = params;\n if (!filter?.Items?.length) {\n return Promise.resolve({\n lods: []\n });\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const data = await api.POST(\"entity/getlods\", filter, reqParams);\n return {\n lods: data.Items\n };\n }\n\n /**\n * Returns all lods for a specified entity.\n * @param params \n * @returns \n */\n export async function GetEntityLods(params: {\n api?: BruceApi.Api,\n // ID of the related entity record.\n entityId: string,\n req?: Api.IReqParams\n }): Promise<{\n // List of lods for the specified entity.\n lods: ILod[]\n }> {\n let { api, entityId, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n if (!entityId) {\n throw(\"Entity id is required.\");\n }\n const cache = await api.GetCacheItem(GetEntityListKey(entityId), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const req = api.GET(`entity/${entityId}/lods?includeClientFiles=yes`, Api.PrepReqParams(reqParams));\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await req;\n res({\n lods: data.Items\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key: GetEntityListKey(entityId),\n value: prom,\n req: reqParams\n });\n return prom;\n }\n\n /**\n * Returns lods for a specified entity type.\n * @param params\n */\n export async function GetTypeLods(params: {\n api?: BruceApi.Api,\n // ID of the related entity type record.\n entityTypeId: string,\n // LOD group within its entity type.\n group?: string,\n req?: Api.IReqParams\n }): Promise<{\n // List of lods for the specified entity type.\n lods: ILod[]\n }> {\n let { api, entityTypeId: typeId, group, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n if (!group) {\n group = \"DEFAULT\";\n }\n\n const cache = await api.GetCacheItem(GetTypeListKey(typeId, group), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const url = `entityType/${typeId}/lods?includeClientFiles=yes` + (group ? \"&group=\" + group : \"\");\n const req = api.GET(url, Api.PrepReqParams(reqParams));\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await req;\n res({\n lods: data.Items\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key: GetTypeListKey(typeId, group),\n value: prom,\n req: reqParams\n });\n return prom;\n }\n\n /**\n * Updates an entity lod record.\n * @param params \n * @returns \n */\n export async function Update(params: {\n api?: BruceApi.Api,\n // ID of the related entity record.\n entityId: string,\n req?: Api.IReqParams\n } & IEntityLodUpdate): Promise<void> {\n let { api, entityId, req: reqParams } = params;\n if (!params[\"ClientFile.ID\"] || !params[\"LODCategory.Key\"] || (!params.Level && params.Level !== 0)) {\n throw(\"ClientFile.ID, LODCategory.Key and Level are required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const res = await api.POST(`entity/${entityId}/lod/${params[\"LODCategory.Key\"]}/${params.Level}`, {\n \"Level\": params.Level,\n \"ClientFile.ID\": params[\"ClientFile.ID\"]\n }, Api.PrepReqParams(reqParams));\n api.Cache.Remove(GetEntityListKey(entityId));\n return res;\n }\n\n /**\n * Deletes an entity lod record.\n * @param params \n */\n export async function Delete(params: {\n api?: BruceApi.Api,\n // ID of the related entity record.\n entityId: string,\n // ID of the related lod category record.\n lodCategoryId: string,\n // Level of detail. 0 is the highest.\n level: number,\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, entityId, lodCategoryId, level, req: reqParams } = params;\n if (!entityId || !lodCategoryId) {\n throw(\"Entity ID and LOD Category ID are required.\");\n }\n level = +level;\n if (isNaN(level)) {\n throw(\"Level is required. It must be a number.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n await api.POST(`entity/${entityId}/deleteLODs`, {\n Items: [{ \"LODCategory.Key\": lodCategoryId, \"Level\": level }]\n }, Api.PrepReqParams(reqParams));\n api.Cache.Remove(GetEntityListKey(entityId));\n }\n\n /**\n * Describes a filter for getting entity lods.\n */\n export namespace Filter {\n export interface IListParamsItem {\n // ID of the related entity record.\n \"entityId\": string,\n // ID of the related lod category record.\n \"categoryId\": string,\n // LOD group within its entity type.\n \"group\"?: string,\n // Level of detail. 0 is the highest.\n \"level\"?: number\n }\n\n export interface IListParams {\n // Whether to use strict mode.\n // When not strict it will find the closest level of detail available.\n \"strict\": boolean,\n // Whether to traverse external sources. This is much slower.\n \"externalSources\": boolean,\n // List of entity lod filter items.\n \"Items\": IListParamsItem[]\n }\n\n export interface IListResItem {\n // ID of the lod client file.\n clientFileId: string;\n // ID of the related entity record.\n entityId: string;\n // Client account ID where the lod client file is stored.\n accountId: string;\n }\n }\n\n /**\n * Returns cache identifier for an entity lod record.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetCacheKey(\"abc\");\n * api.Cache.Remove(key);\n * }\n * @param url \n * @returns \n */\n export function GetCacheKey(url: string): string {\n return Api.ECacheKey.Lod + Api.ECacheKey.Id + url;\n }\n \n /**\n * Returns cache identifier for a list of entity lods.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetListCacheKey(\"abc\", \"def\");\n * api.Cache.Remove(key);\n * }\n * @param typeId \n * @param group \n * @returns \n */\n export function GetTypeListKey(typeId: string, group: string): string {\n return Api.ECacheKey.Lod + Api.ECacheKey.EntityType + typeId + Api.ECacheKey.Id + group;\n }\n \n /**\n * Returns cache identifier for a list of entity lods.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetListCacheKey(\"abc\");\n * api.Cache.Remove(key);\n * }\n * @param entityId \n * @returns \n */\n export function GetEntityListKey(entityId: string): string {\n return Api.ECacheKey.Lod + Api.ECacheKey.Entity + entityId;\n }\n}","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { ENVIRONMENT } from \"../environment\";\n\n/**\n * Describes the \"Entity LOD Category\" concept within Nextspace.\n * An LOD category is a level of categorization for LODs.\n * This is typically used to group LODs by their extension.\n */\nexport namespace EntityLodCategory {\n /**\n * Describes an entity lod category record.\n */\n export interface ICategory {\n // Description of the category.\n Description?: string;\n // Unique identifier for the category.\n // This is case-insensitive.\n Key: string;\n // Name of the category.\n Name: string;\n }\n\n /**\n * Returns a list of entity lod categories.\n * @param params \n * @returns \n */\n export async function GetList(params: {\n api?: BruceApi.Api,\n req?: Api.IReqParams\n }): Promise<{\n // List of entity lod categories.\n categories: ICategory[]\n }> {\n let { api, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const cache = await api.GetCacheItem(GetListCacheKey(), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const req: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(\"lodCategories\", Api.PrepReqParams(reqParams));\n res({\n categories: data.Items\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key: GetListCacheKey(),\n value: req,\n req: reqParams\n });\n return req;\n }\n\n /**\n * Returns an entity lod category record matching the specified id.\n * @param params \n * @returns \n */\n export async function Get(params: {\n api?: BruceApi.Api,\n // The id of the entity lod category record to return.\n categoryId: string,\n req?: Api.IReqParams\n }): Promise<{\n // Entity lod category record.\n category: ICategory\n }> {\n let { api, categoryId: id, req: reqParams } = params;\n if (!id) {\n throw(\"Lod category id is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const cache = await api.GetCacheItem(GetCacheKey(id), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const req: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(`lodCategory/${id}`, Api.PrepReqParams(reqParams));\n res({\n category: data\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key: GetCacheKey(id),\n value: req,\n req: reqParams\n });\n return req;\n }\n\n /**\n * Deletes an entity lod category record matching the specified id.\n * @param params \n */\n export async function Delete(params: {\n api?: BruceApi.Api,\n // The id of the entity lod category record to delete.\n categoryId: string,\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, categoryId: id, req: reqParams } = params;\n if (!id) {\n throw(\"Lod category id is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n await api.DELETE(`lodCategory/${id}`, Api.PrepReqParams(reqParams));\n api.Cache.Remove(GetCacheKey(id));\n api.Cache.Remove(GetListCacheKey());\n }\n\n /**\n * Creates or updates an entity lod category record.\n * @param params \n * @returns \n */\n export async function Update(params: {\n api?: BruceApi.Api,\n // The entity lod category record to create or update.\n category: ICategory,\n req?: Api.IReqParams\n }): Promise<{\n // Entity lod category record.\n category: ICategory\n }> {\n let { api, category: data, req: reqParams } = params;\n if (!data.Key || !data.Name) {\n throw(\"Lod category key and name are required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const res = await api.POST(`lodCategory/${data.Key}`, data, Api.PrepReqParams(reqParams));\n api.Cache.Remove(GetCacheKey(data.Key));\n api.Cache.Remove(GetListCacheKey());\n\n return {\n category: res\n };\n }\n\n /**\n * Returns cache identifier for an entity lod category record.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetCacheKey(\"abc\");\n * api.Cache.Remove(key);\n * }\n * @param id \n * @returns \n */\n export function GetCacheKey(id: string): string {\n return Api.ECacheKey.LodCategory + Api.ECacheKey.Id + id;\n }\n \n /**\n * Returns cache identifier for a list of entity lod categories.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetListCacheKey();\n * api.Cache.Remove(key);\n * }\n * @returns \n */\n export function GetListCacheKey(): string {\n return Api.ECacheKey.LodCategory;\n }\n}","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { ENVIRONMENT } from \"../environment\";\nimport { ObjectUtils } from \"../util/object-utils\";\n\n/**\n * Describes the \"Entity Relationship Type\" concept within Nextspace.\n * A relationship type record describes the purpose of a relationship.\n */\nexport namespace EntityRelationType {\n /**\n * Describes an entity relation type record.\n */\n export interface IType {\n // ID of the relation type.\n ID: string;\n // Name of the \"parent to child\" direction.\n ForwardName: string;\n // Name of the \"child to parent\" direction.\n ReverseName: string;\n // Name of the relationship type as a whole.\n Name: string;\n // If the drawn direction should be flipped.\n // A drawn direction is the 3D parabola that is drawn between related entities.\n FlipDisplayDirection?: boolean;\n // Style ID for the rendered relationship.\n EntityDisplaySettingID?: string | number;\n // ID of the entity type used to define the schema.\n \"Relation.EntityType.ID\"?: string;\n }\n\n /**\n * Gets a single entity relation type record.\n * @param params \n * @returns \n */\n export async function Get(params: {\n api?: BruceApi.Api,\n // ID of the entity relation type.\n relationTypeId: string,\n req?: Api.IReqParams\n }): Promise<{\n // Entity relation type record.\n relationType: IType\n }> {\n let { api, relationTypeId: typeId, req: reqParams } = params;\n if (!typeId) {\n throw(\"Type ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const key = GetCacheKey(typeId);\n const cache = await api.GetCacheItem(key, reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(`entityRelationType/${typeId}`, Api.PrepReqParams(reqParams));\n res({\n relationType: data\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key,\n value: prom,\n req: reqParams\n });\n return prom;\n }\n\n /**\n * Deletes an entity relation type record.\n * @param params \n */\n export async function Delete(params: {\n api?: BruceApi.Api,\n // ID of the entity relation type.\n relationTypeId: string,\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, relationTypeId: typeId, req: reqParams } = params;\n if (!typeId) {\n throw(\"Type ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n await api.DELETE(`entityRelationType/${typeId}`, Api.PrepReqParams(reqParams));\n api.Cache.Remove(GetCacheKey(typeId));\n api.Cache.Remove(GetListCacheKey());\n }\n\n /**\n * Gets a list of entity relation type records.\n * @param params \n * @returns \n */\n export async function GetList(params: {\n api?: BruceApi.Api,\n req?: Api.IReqParams\n }): Promise<{\n // List of entity relation type records.\n relationTypes: IType[]\n }> {\n let { api, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const cache = await api.GetCacheItem(GetListCacheKey(), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const req: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(\"entityRelationTypes\", Api.PrepReqParams(reqParams));\n res({\n relationTypes: data.Items\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key: GetListCacheKey(),\n value: req,\n req: reqParams\n });\n return req;\n }\n\n /**\n * Creates or updates an entity relation type record.\n * @param params \n * @returns \n */\n export async function Update(params: {\n api?: BruceApi.Api,\n // Entity relation type record to create or update.\n relationType: IType,\n req?: Api.IReqParams\n }): Promise<{\n // Entity relation type record.\n relationType: IType\n }> {\n let { api, relationType: data, req: reqParams } = params;\n if (!data?.ForwardName || !data?.ReverseName) {\n throw(\"Forward and reverse names are required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n if (!data.ID) {\n data.ID = ObjectUtils.UId();\n }\n const res = await api.POST(`entityRelationType/${data.ID}`, data, Api.PrepReqParams(reqParams));\n api.Cache.Remove(GetCacheKey(data.ID));\n api.Cache.Remove(GetListCacheKey());\n return {\n relationType: res\n };\n }\n\n /**\n * Returns cache identifier for an entity relation type record.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetCacheKey(\"abc\");\n * api.Cache.Remove(key);\n * }\n * @param id \n * @returns \n */\n export function GetCacheKey(id: string): string {\n return Api.ECacheKey.RelationType + Api.ECacheKey.Id + id;\n }\n\n /**\n * Returns cache identifier for a list of entity relation types.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetListCacheKey();\n * api.Cache.Remove(key);\n * }\n * @returns \n */\n export function GetListCacheKey(): string {\n return Api.ECacheKey.RelationType;\n }\n}","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { ENVIRONMENT } from \"../environment\";\nimport { Entity } from \"./entity\";\n\n/**\n * Describes the \"Entity Relationship\" concept within Nextspace.\n * An entity relationship is an arbitrary link between two entity records.\n * The relationship can have a \"data entity\" linked to it as well for the relationship to store arbitrary data about itself.\n */\nexport namespace EntityRelation {\n /**\n * Describes an entity relation record.\n */\n export interface IRelation {\n // ID of the principal (parent) entity.\n \"Principal.Entity.ID\": string;\n // ID of the related (child) entity.\n \"Related.Entity.ID\": string;\n // Related entity data.\n RelatedEntity?: Entity.IEntity;\n // Principal entity data.\n PrincipalEntity?: Entity.IEntity;\n // ID of the relation type.\n \"Relation.Type.ID\": string;\n // Relation type data.\n RelationType?: any;\n // ID of the data entity.\n // The data entity is where the relationship attribute data is stored.\n \"Data.Entity.ID\"?: string;\n }\n\n export interface IListParams {\n // ID of the relation type.\n relationTypeId?: string;\n // If the relation should be one-way only.\n // If false only child relationships will be loaded for the entity.\n oneWayOnly?: boolean;\n // If entity data should be loaded for the related entities.\n loadEntityData?: boolean;\n }\n\n /**\n * Creates a new entity relation.\n * @param params \n */\n export async function Create(params: {\n api?: BruceApi.Api,\n // Entity relation data.\n relation: IRelation,\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, relation: data, req: reqParams } = params;\n if (!data[\"Principal.Entity.ID\"] || !data[\"Related.Entity.ID\"] || !data[\"Relation.Type.ID\"]) {\n throw(\"Principal Entity ID, Related Entity ID, and Relation Type ID are required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const reqData = {\n \"Related.Entity.ID\": [data[\"Related.Entity.ID\"]]\n };\n const url = `entity/${data[\"Principal.Entity.ID\"]}/relation/${data[\"Relation.Type.ID\"]}/add`;\n await api.POST(url, reqData, Api.PrepReqParams(reqParams));\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Relation + Api.ECacheKey.Id + data[\"Principal.Entity.ID\"]);\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Relation + Api.ECacheKey.Id + data[\"Related.Entity.ID\"]);\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Relation + Api.ECacheKey.RelationType);\n if (data[\"Data.Entity.ID\"]) {\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Relation + Api.ECacheKey.Entity + Api.ECacheKey.Id + data[\"Data.Entity.ID\"]);\n }\n }\n\n /**\n * Deletes an entity relation.\n * @param params \n */\n export async function Delete(params: {\n api?: BruceApi.Api,\n // ID of the principal (parent) entity.\n principalEntityId: string,\n // ID of the related (child) entity.\n relatedEntityId: string,\n // ID of the relation type.\n relationTypeId: string,\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, principalEntityId, relatedEntityId, relationTypeId, req: reqParams } = params;\n if (!principalEntityId || !relatedEntityId || !relationTypeId) {\n throw new Error(\"Principal Entity ID, Related Entity ID, and Relation Type ID are required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const url = `entity/${principalEntityId}/relation/${relationTypeId}/delete`;\n await api.POST(url, {\n \"Related.Entity.ID\": [relatedEntityId]\n }, Api.PrepReqParams(reqParams));\n\n // Remove related cache entries\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Relation + Api.ECacheKey.Id + principalEntityId);\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Relation + Api.ECacheKey.Id + relatedEntityId);\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Relation + Api.ECacheKey.RelationType + Api.ECacheKey.Id + relationTypeId);\n }\n\n /**\n * Updates an entity relation.\n * Eg: data entity ID was changed.\n * @param params \n */\n export async function Update(params: {\n api?: BruceApi.Api,\n // Entity relation data.\n relation: IRelation,\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, relation: data, req: reqParams } = params;\n if (!data[\"Principal.Entity.ID\"] || !data[\"Related.Entity.ID\"] || !data[\"Relation.Type.ID\"]) {\n throw(\"Principal Entity ID, Related Entity ID, and Relation Type ID are required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const url = `entity/${data[\"Principal.Entity.ID\"]}/otherEntityID/${data[\"Related.Entity.ID\"]}/relation/${data[\"Relation.Type.ID\"]}/update`;\n const res = await api.POST(url, data, Api.PrepReqParams(reqParams));\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Relation + Api.ECacheKey.Id + data[\"Principal.Entity.ID\"]);\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Relation + Api.ECacheKey.Id + data[\"Related.Entity.ID\"]);\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Relation + Api.ECacheKey.RelationType + Api.ECacheKey.Id + data[\"Relation.Type.ID\"]);\n if (data[\"Data.Entity.ID\"]) {\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Relation + Api.ECacheKey.Entity + Api.ECacheKey.Id + data[\"Data.Entity.ID\"]);\n }\n }\n\n /**\n * Returns a list of relationships for an entity.\n * @param params \n * @returns \n */\n export async function GetList(params: {\n api?: BruceApi.Api,\n // ID of the entity to get relationships for.\n entityId: string,\n // Filter parameters.\n filter: IListParams,\n req?: Api.IReqParams\n }): Promise<{\n // List of entity relations.\n relations: IRelation[]\n }> {\n let { api, entityId, filter, req: reqParams } = params;\n if (!entityId) {\n throw(\"Entity ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n filter = {\n relationTypeId: \"\",\n oneWayOnly: false,\n loadEntityData: false,\n ...filter\n }\n const cache = await api.GetCacheItem(GetListCacheKey(entityId, filter), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const req: Promise<any> = new Promise(async (res, rej) => {\n try {\n let url = `entity/${entityId}/relations`;\n if (filter.relationTypeId) {\n url += \"/\" + filter.relationTypeId;\n }\n url += `?Oneway=${filter.oneWayOnly}&LoadInfo=${filter.loadEntityData}`;\n const data = await api.GET(url, Api.PrepReqParams(reqParams));\n res({\n relations: data.Items\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key: GetListCacheKey(entityId, filter),\n value: req,\n req: reqParams\n });\n return req;\n }\n\n /**\n * Returns an entity relationship by the data entity ID.\n * @param params \n * @returns \n */\n export async function GetByDataEntityId(params: {\n api?: BruceApi.Api,\n // ID of the data entity.\n entityId: string,\n req?: Api.IReqParams\n }): Promise<{\n // Entity relation record.\n relation: IRelation\n }> {\n let { api, entityId, req: reqParams } = params;\n if (!entityId) {\n throw(\"Entity ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const cache = await api.GetCacheItem(GetEntityCacheKey(entityId), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(`entity/relation/${entityId}/dataentity`, Api.PrepReqParams(reqParams));\n res({\n relation: data\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key: GetEntityCacheKey(entityId),\n value: prom,\n req: reqParams\n });\n return prom;\n }\n\n /**\n * Returns cache identifier for an entity relation record.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetCacheKey(\"abc\", \"def\", \"ghi\");\n * api.Cache.Remove(key);\n * }\n * @param id \n * @returns \n */\n export function GetCacheKey(entityA: string, entityB: string, typeId: string): string {\n return `${Api.ECacheKey.Relation}${Api.ECacheKey.Id}${entityA}${Api.ECacheKey.Id}${entityB}${Api.ECacheKey.Id}${typeId}`;\n }\n \n /**\n * Returns cache identifier for a list of entity relations.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetCacheKey(\"abc\");\n * api.Cache.Remove(key);\n * }\n * @param id \n * @returns \n */\n export function GetEntityCacheKey(entityId: string): string {\n return Api.ECacheKey.Relation + Api.ECacheKey.Entity + Api.ECacheKey.Id + entityId;\n }\n \n /**\n * Returns cache identifier for a list of entity relations.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetCacheKey(\"abc\", {...});\n * api.Cache.Remove(key);\n * }\n * @param id \n * @returns \n */\n export function GetListCacheKey(entityId: string, params: IListParams): string {\n return Api.ECacheKey.Relation + Api.ECacheKey.RelationType +\n Api.ECacheKey.Id + params.relationTypeId +\n Api.ECacheKey.Id + params.oneWayOnly +\n Api.ECacheKey.Id + params.loadEntityData +\n Api.ECacheKey.Entity + Api.ECacheKey.Id + entityId;\n }\n}","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { IDictionary } from \"../common/dictionary\";\nimport { ENVIRONMENT } from \"../environment\";\n/**\n * Describes the \"Entity Source\" concept within Nextspace.\n * An entity source is a record which links an arbitrary source id to a Nextspace entity id.\n * For example an OSM building id to a Nextspace entity id.\n */\nexport namespace EntitySource {\n /**\n * Describes an entity source record.\n */\n export interface ISource {\n // ID of the data source.\n \"Source.ID\": number;\n // ID of the Nextspace entity.\n \"Entity.ID\": string;\n // Key of the external source entity.\n \"SourceRecord.Key\": string;\n }\n\n /**\n * Returns an entity source record for the given source id and source key.\n * @param params \n * @returns \n */\n export async function Get(params: {\n api?: BruceApi.Api,\n // ID of the data source.\n sourceId: number,\n // ID of the external source entity.\n sourceKey: string,\n req?: Api.IReqParams\n }): Promise<{\n // Entity source record.\n source: ISource\n }> {\n let { api, sourceId, sourceKey, req: reqParams } = params;\n if (!sourceId || !sourceKey) {\n throw(\"Source ID and Source Key are required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const res = await GetListByKeys({\n api: api,\n sourceId: sourceId,\n sourceKeys: [sourceKey],\n req: reqParams\n })\n return {\n source: res.sources?.length ? res.sources[0] : null\n };\n }\n\n /**\n * Returns a list of entity source records for the given source id and source keys.\n * @param params \n * @returns \n */\n export async function GetListByKeys(params: {\n api?: BruceApi.Api,\n // ID of the data source.\n sourceId: number,\n // Array of external source IDs.\n sourceKeys: string[],\n req?: Api.IReqParams\n }): Promise<{\n // Array of entity source records.\n sources: ISource[]\n }> {\n let { api, sourceId, sourceKeys, req: reqParams } = params;\n if (!sourceId) {\n throw(\"Source ID is required.\");\n }\n if (!sourceKeys?.length) {\n return Promise.resolve({\n sources: []\n });\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const reqKeys: string[] = [];\n const reqs: Promise<ISource>[] = [];\n for (let i = 0; i < sourceKeys.length; i++) {\n const sourceKey = sourceKeys[i];\n const cache = await api.GetCacheItem(GetCacheKey(sourceId, sourceKey), reqParams);\n if (cache?.found) {\n reqs.push(cache.data);\n }\n else {\n reqKeys.push(sourceKey);\n }\n }\n if (reqKeys.length) {\n const prom: Promise<ISource[]> = new Promise(async (res, rej) => {\n try {\n const data = await api.POST(`entitysource/${sourceId}`, { SourceRecordKeys: reqKeys }, Api.PrepReqParams(reqParams));\n res(data.Items);\n }\n catch (e) {\n rej(e);\n }\n });\n for (let i = 0; i < reqKeys.length; i++) {\n const req: Promise<ISource> = new Promise(async (res, rej) => {\n try {\n const sources = await prom;\n res(<ISource>sources.find((s: ISource) => s[\"SourceRecord.Key\"] === reqKeys[i]));\n }\n catch (e) {\n rej(<any>e);\n }\n });\n reqs.push(req);\n }\n }\n return {\n sources: (await Promise.all(reqs)).filter(x => !!x)\n };\n }\n\n /**\n * Returns a mapping of entity source records for the given source id and source keys.\n * @param params \n * @returns \n */\n export async function GetEntityIdsBySourceKeys(params: {\n api?: BruceApi.Api,\n // ID of the data source.\n sourceId: number,\n // Array of external source IDs.\n sourceKeys: string[],\n req?: Api.IReqParams\n }): Promise<{\n // Source key to entity id mapping.\n idMapping: IDictionary<string>\n }> {\n let { api, sourceId, sourceKeys, req: reqParams } = params;\n if (!sourceId) {\n throw(\"Source ID and Source Keys are required.\");\n }\n if (!sourceKeys?.length) {\n return Promise.resolve({\n idMapping: {}\n });\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const result: IDictionary<string> = {};\n if (sourceKeys.length > 0) {\n const {sources} = await GetListByKeys({\n api,\n sourceId,\n sourceKeys,\n req: reqParams\n });\n for (let i = 0; i < sources.length; i++) {\n const source = sources[i];\n for (let i = 0; i < sourceKeys.length; i++) {\n const key = sourceKeys[i];\n if (key == source[\"SourceRecord.Key\"]) {\n result[key] = source[\"Entity.ID\"];\n }\n }\n }\n }\n return {\n idMapping: result\n };\n }\n\n /**\n * Creates a new entity source record.\n * @param params \n * @returns \n */\n export async function CreateLink(params: {\n api?: BruceApi.Api\n // Entity source record.\n source: ISource\n }): Promise<{\n // Created entity source record.\n source: ISource\n }> {\n let {source, api} = params;\n if (!source[\"Entity.ID\"] || !source[\"Source.ID\"] || !source[\"SourceRecord.Key\"]) {\n throw(\"Entity ID, Source ID and Source Key are required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const res = await api.POST(\"entitysource\", source);\n const cacheKey = GetCacheKey(source[\"Source.ID\"], source[\"SourceRecord.Key\"]);\n await api.Cache.Remove(cacheKey);\n return {\n source: res\n }\n }\n\n /**\n * Returns cache identifier for an entity source record.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetCacheKey(1, \"def\");\n * api.Cache.Remove(key);\n * }\n * @param sourceId\n * @param sourceKey \n * @returns \n */\n export function GetCacheKey(sourceId: number, sourceKey: string): string {\n return `${Api.ECacheKey.EntitySource}${Api.ECacheKey.Id}${sourceId}${Api.ECacheKey.Id}${sourceKey}`;\n }\n}","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { ENVIRONMENT } from \"../environment\";\n\n/**\n * Describes the \"Entity Tag\" concept within Nextspace.\n * An entity tag is used to categorize an entity record.\n * Entity tags can be used in filters, or to restrict entity access.\n */\nexport namespace EntityTag {\n /**\n * Describes an entity tag record.\n */\n export interface ITag {\n // ID of the tag.\n ID: number;\n // Human readable name of the tag.\n Name?: string;\n // Description of the tag.\n Description?: string;\n // If tag access (and tagged entity access) should be restricted.\n // When a tag is restricted a user must have the \"Layer_<tag_id>\" permission to view the tag.\n IsAccessRestricted?: boolean;\n // If the tag is restricted to a specific entity type.\n \"EntityType.ID\"?: string;\n // Colour of the tag to use when styling entities or displaying a tag icon.\n Color?: string;\n // Parent tag ID.\n // Purely for organizational purposes.\n \"Parent.Layer.ID\"?: number;\n }\n\n /**\n * Returns an entity tag record for the given tag id.\n * @param params \n * @returns \n */\n export async function Get(params: {\n api?: BruceApi.Api,\n // ID of the tag.\n tagId: number,\n req?: Api.IReqParams\n }): Promise<{\n // Entity tag record.\n tag: ITag\n }> {\n let { api, tagId, req: reqParams } = params;\n if (!tagId) {\n throw(\"Tag ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const {tags} = await GetListByIds({\n api,\n tagIds: [tagId],\n req: reqParams\n });\n return {\n tag: tags.length ? tags[0] : null\n };\n }\n\n /**\n * Returns a list of entity tag records for the given tag ids.\n * @param params \n * @returns \n */\n export async function GetListByIds(params: {\n api?: BruceApi.Api,\n // Array of tag IDs.\n tagIds: number[],\n req?: Api.IReqParams\n }): Promise<{\n // Array of entity tag records.\n tags: ITag[]\n }> {\n let { api, tagIds, req: reqParams } = params;\n if (!tagIds.length) {\n return Promise.resolve({\n tags: []\n });\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const reqIds: number[] = [];\n const reqs: Promise<{ tag: ITag }>[] = [];\n for (let i = 0; i < tagIds.length; i++) {\n const tagId = tagIds[i];\n const cache = api.GetCacheItem(GetCacheKey(tagId), reqParams);\n if (cache?.found) {\n if (cache.data instanceof Promise) {\n // Request that is in progress.\n reqs.push(cache.data);\n }\n else if (cache.data) {\n // Direct tag record.\n if (cache.data.ID) {\n reqs.push({\n tag: cache.data\n } as any);\n }\n // Resolved promise. So an object with a \"tag\" property that contains the record.\n else {\n reqs.push(cache.data);\n }\n }\n }\n else {\n reqIds.push(tagId);\n }\n }\n\n if (reqIds.length) {\n const prom: Promise<ITag[]> = new Promise(async (res, rej) => {\n try {\n const data = await api.POST(\"layers/get\", { layerIds: reqIds }, Api.PrepReqParams(reqParams));\n res(data.Items);\n }\n catch (e) {\n rej(e);\n }\n });\n for (let i = 0; i < reqIds.length; i++) {\n const id = reqIds[i];\n const req: Promise<{ tag: ITag }> = new Promise(async (res, rej) => {\n try {\n const tags = await prom;\n const tag = tags.find((t: ITag) => t.ID === id);\n res({\n tag: tag\n });\n }\n catch (e) {\n rej(<any>e);\n }\n });\n await api.SetCacheItem({\n key: GetCacheKey(id),\n value: req,\n req: reqParams\n });\n reqs.push(req);\n }\n }\n \n return {\n tags: (await Promise.all(reqs)).map(x => x?.tag).filter(x => !!x)\n };\n }\n\n /**\n * Returns a list of entity tag records.\n * @param params \n * @returns \n */\n export async function GetList(params: {\n api?: BruceApi.Api,\n // ID of the entity type to filter by.\n entityTypeId?: string,\n req?: Api.IReqParams\n }): Promise<{\n // Array of entity tag records.\n tags: ITag[]\n }> {\n let { api, entityTypeId, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const cache = await api.GetCacheItem(GetListCacheKey(entityTypeId), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const req: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(entityTypeId ? `entityType/${entityTypeId}/layers` : \"layers\", Api.PrepReqParams(reqParams));\n res({\n tags: data.Items\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key: GetListCacheKey(entityTypeId),\n value: req,\n req: reqParams\n });\n return req;\n }\n\n /**\n * Deletes an entity tag record.\n * @param params \n */\n export async function Delete(params: {\n api?: BruceApi.Api,\n // ID of the tag.\n tagId: number,\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, tagId, req: reqParams } = params;\n if (!tagId) {\n throw(\"Tag ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n await api.DELETE(`layer/${tagId}`, Api.PrepReqParams(reqParams));\n api.Cache.Remove(GetCacheKey(tagId));\n await api.Cache.RemoveByStartsWith(GetListCacheKey());\n }\n\n /**\n * Creates or updates an entity tag record.\n * @param params \n * @returns \n */\n export async function Update(params: {\n api?: BruceApi.Api,\n // Entity tag record.\n tag: ITag,\n req?: Api.IReqParams\n }): Promise<{\n // Entity tag record.\n tag: ITag\n }> {\n let { api, tag: data, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n \n const url = data.ID ? `layer/${data.ID}` : \"layer\";\n const res = await api.POST(url, data, Api.PrepReqParams(reqParams));\n api.Cache.Remove(GetCacheKey(data.ID));\n await api.Cache.RemoveByStartsWith(GetListCacheKey());\n return {\n tag: res\n };\n }\n\n /**\n * Returns cache identifier for an entity tag record.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetCacheKey(1);\n * api.Cache.Remove(key);\n * }\n * @param tagId \n * @returns \n */\n export function GetCacheKey(tagId: number): string {\n return `${Api.ECacheKey.Tag}${Api.ECacheKey.Id}${tagId}`;\n }\n \n /**\n * Returns cache identifier for a list of entity tags.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetListCacheKey(\"abc\");\n * api.Cache.Remove(key);\n * }\n * @param entityTypeId \n * @returns \n */\n export function GetListCacheKey(entityTypeId?: string): string {\n if (entityTypeId) {\n return Api.ECacheKey.Tag + Api.ECacheKey.EntityType + Api.ECacheKey.Id + entityTypeId;\n }\n return Api.ECacheKey.Tag;\n }\n}","export namespace MathUtils {\n /**\n * Rounds a number to a given number of decimal places.\n * @param num \n * @param decimals \n * @returns \n */\n export function Round(num: number, decimals: number = 0): number {\n if (decimals <= 0) {\n return Math.round(num);\n }\n let tmp = \"1\";\n for (let i = 0; i < decimals; i++) {\n tmp += \"0\";\n }\n const d = parseFloat(tmp);\n return Math.round((num + Number.EPSILON) * d) / d;\n }\n\n /**\n * Returns a random integer between min (inclusive) and max (inclusive).\n * @param min \n * @param max \n * @returns \n */\n export function RandInt(min: number, max: number): number {\n if (min == max) {\n return min;\n }\n else if (min > max) {\n throw(\"Min is greater than max.\");\n }\n return Math.floor(Math.random() * (max - min + 1)) + min;\n }\n}","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { Carto } from \"../common/carto\";\nimport { Transform } from \"../common/transform\";\nimport { ENVIRONMENT } from \"../environment\";\nimport { MathUtils } from \"../util/math-utils\";\n\n/**\n * This is a utility to help calculate and manage UCS coordinates for entities.\n */\nexport namespace EntityCoords {\n export const UCS_ENTITY_TYPE_ID = \"Bruce_UCS_Type\";\n\n export interface ILocation extends Carto.ICarto {\n coordinates?: {\n // Original Entity where the X/Y/Z came from.\n \"Entity.ID\"?: string;\n // X/Y/Z offset from origin.\n x?: number;\n y?: number;\n z?: number;\n // Eg: \"EPSG:4326\".\n SRID?: string;\n }\n }\n\n /**\n * Describes a UCS record.\n */\n export interface IUcs {\n // Human readable name of the UCS.\n name: string;\n // ID of the UCS entity.\n \"Entity.ID\": string;\n // UCS location.\n location: ILocation;\n // UCS transform.\n transform: Transform.ITransform;\n }\n\n /**\n * Describes an Entity's coordinates.\n * This includes its own relative assembly position, and the UCS it references (if any).\n */\n export interface IEntityCoords {\n // The Entity's ID.\n \"Entity.ID\": string;\n // The UCS the entity is relative to (if any).\n ucs?: IUcs;\n // Entity's relative assembly position.\n position?: number[][];\n // Entity's transform to the UCS.\n // This allows independent rotation and offsetting from the UCS.\n transform?: Transform.ITransform;\n // Entity's independent location.\n // This is typically set when there is no UCS.\n location?: Carto.ICarto;\n }\n\n /**\n * Params for shifting an entity to be relative to a point.\n */\n export interface IRelToPointParams {\n // Point to be relative to.\n point: Carto.ICarto;\n // If this is a test. Tests are not saved.\n test: boolean;\n // Human readable name of the UCS.\n name?: string;\n }\n\n /**\n * Params for shifting an entity to be relative to an EPSG.\n */\n export interface IRelToEpsgParams {\n // EPSG to be relative to.\n epsg: number;\n // If this is a test. Tests are not saved.\n test: boolean;\n // Human readable name of the UCS.\n name?: string;\n }\n\n /**\n * Params for shifting an entity to be relative to a UCS.\n */\n export interface IRelToUcsParams {\n // UCS to be relative to.\n ucsId: string;\n // If this is a test. Tests are not saved.\n test: boolean;\n // Human readable name of the UCS.\n name?: boolean;\n }\n\n /**\n * Returns an entity's location with expanded UCS information.\n * @param params \n * @returns \n */\n export async function GetEntityCoords(params: {\n api?: BruceApi.Api,\n // Entity to get UCS for. Typically the root entity of a hierarchy.\n rootEntityId: string,\n req?: Api.IReqParams\n }): Promise<{\n // The UCS information for the entity.\n coords: IEntityCoords\n }> {\n let { api, rootEntityId: entityId, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const cache = await api.GetCacheItem(GetCacheKey(entityId), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(`entity/${entityId}/ucs`, reqParams);\n res({\n coords: data\n });\n } catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key: GetCacheKey(entityId),\n value: prom,\n req: reqParams\n });\n return prom;\n }\n\n /**\n * Returns coordinates for an entity when relative to a point.\n * @param params \n * @returns \n */\n export async function EntityRelativeToPoint(params: {\n api?: BruceApi.Api,\n // Entity to get UCS for. Typically the root entity of a hierarchy.\n rootEntityId: string,\n req?: Api.IReqParams\n } & IRelToPointParams): Promise<{\n // The UCS information for the entity.\n coords: IEntityCoords\n }> {\n let { api, rootEntityId: entityId, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n if (!params.test) {\n await UnlinkCoords({\n api,\n rootEntityId: entityId,\n req: reqParams\n });\n }\n const point = params.point;\n const name = params.name || `${MathUtils.Round(point.latitude, 4)}, ${MathUtils.Round(point.longitude, 4)}`;\n const res = await api.POST(`entity/${entityId}/ucs`, {\n \"ucs\": {\n \"Entity.ID\": null,\n \"name\": name,\n \"location\": {\n \"latitude\": point.latitude,\n \"longitude\": point.longitude,\n \"altitude\": point.altitude,\n \"coordinates\": {\n \"Entity.ID\": entityId\n }\n }\n },\n \"test\": params.test\n }, reqParams);\n if (!params.test) {\n api.Cache.Remove(GetCacheKey(entityId));\n }\n return {\n coords: res\n };\n }\n\n /**\n * Returns coordinates for an entity when relative to an EPSG.\n * @param params \n * @returns \n */\n export async function EntityRelativeToEpsg(params: {\n api?: BruceApi.Api,\n // Entity to get UCS for. Typically the root entity of a hierarchy.\n rootEntityId: string,\n req?: Api.IReqParams\n } & IRelToEpsgParams): Promise<{\n // The UCS information for the entity.\n coords: IEntityCoords\n }> {\n let { api, rootEntityId: entityId, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n if (!params.test) {\n await UnlinkCoords({\n api,\n rootEntityId: entityId,\n req: reqParams\n });\n }\n const epsg = params.epsg;\n const name = params.name ?? \"EPSG: \" + epsg;\n const res = await api.POST(`entity/${entityId}/ucs`, {\n \"ucs\": {\n \"Entity.ID\": null,\n \"name\": name,\n \"location\": {\n \"coordinates\": {\n \"SRID\": \"EPSG:\" + epsg,\n \"Entity.ID\": entityId\n }\n }\n },\n \"test\": params.test\n }, reqParams);\n if (!params.test) {\n api.Cache.Remove(GetCacheKey(entityId));\n }\n return {\n coords: res\n };\n }\n\n /**\n * Returns coordinates for an entity when relative to a UCS.\n * @param params \n * @returns \n */\n export async function EntityRelativeToUcs(params: {\n api?: BruceApi.Api,\n // Entity to get UCS for. Typically the root entity of a hierarchy.\n rootEntityId: string,\n req?: Api.IReqParams\n } & IRelToUcsParams): Promise<{\n // The UCS information for the entity.\n coords: IEntityCoords\n }> {\n let { api, rootEntityId: entityId, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n if (!params.test) {\n await UnlinkCoords({\n api,\n rootEntityId: entityId,\n req: reqParams\n });\n }\n const ucsId = params.ucsId;\n const res = await api.POST(`entity/${entityId}/ucs`, {\n \"ucs\": {\n \"Entity.ID\": ucsId\n },\n \"test\": params.test\n }, reqParams);\n if (!params.test) {\n api.Cache.Remove(GetCacheKey(entityId));\n }\n return {\n coords: res\n };\n }\n\n /**\n * Unlinks UCS coordinates from an entity.\n * @param params \n * @returns \n */\n export async function UnlinkCoords(params: {\n api?: BruceApi.Api,\n // Entity to get UCS for. Typically the root entity of a hierarchy.\n rootEntityId: string,\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, rootEntityId: entityId, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n return api.DELETE(`entity/${entityId}/ucs`, reqParams);\n }\n\n /**\n * Returns cache identifier for a UCS by entity id.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetCacheKey(\"123\");\n * api.Cache.Remove(key);\n * }\n * @param entityId \n * @returns \n */\n export function GetCacheKey(entityId: string): string {\n return Api.ECacheKey.EntityCoords + Api.ECacheKey.Entity + Api.ECacheKey.Id + entityId;\n }\n}","/**\n * Deprecated settings for entity types.\n * We now store selection settings within project views.\n */\nexport namespace EntityTypeVisualSettings {\n export enum EAction {\n LeftClick = \"LeftClick.CustomForm.ID\",\n RightClick = \"RightClick.CustomForm.ID\",\n DoubleClick = \"DoubleClick.CustomForm.ID\",\n MouseHover = \"MouseHover.CustomForm.ID\"\n }\n\n export interface ISettings {\n // Custom forms to display when a certain action is performed on related entities.\n // If the form is set to 0, that means use the default panel instead of a form.\n // When the form value is -1 that means don't display anything.\n CustomForms?: {\n // Default is 0.\n [EAction.LeftClick]?: number,\n // Default is -1.\n [EAction.RightClick]?: number,\n // Default is -1.\n [EAction.MouseHover]?: number,\n // Default is -1.\n [EAction.DoubleClick]?: number\n }\n }\n}","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { Calculator } from \"../calculator/calculator\";\nimport { ENVIRONMENT } from \"../environment\";\n\n/**\n * Represents a Table View record.\n * This is a record of how to display a collection of Entities.\n */\nexport namespace EntityTableView {\n export interface IView {\n ID?: number;\n DisplayName: string;\n Description?: string;\n Settings?: {\n // Array of allowed data-lab queries.\n // If empty, all queries are allowed.\n // If only one is set then the user is not prompted to select one.\n dataLabQueryIds?: number[];\n // When no columns are specified, some defaults will be populated.\n columns?: IColumn[];\n // Settings for the rows as a whole.\n row?: {\n // How to colour the row. If unset then it will be a default colour.\n // If set, a calculation is performed against the row's Entity to determine the colour.\n bgColor?: Calculator.IField[];\n }\n };\n }\n\n /**\n * Represents a column in a table view.\n */\n export interface IColumn {\n // Name of the column.\n name: string;\n // Path to the attribute.\n // In some column types this not present as the value is a known calculated type.\n attrPath?: string;\n // Attribute is an editable box, text just displays the contents.\n type: \"ATTRIBUTE\" | \"TEXT\" | \"NAME\" | \"CALCULATOR\";\n \n // Settings specific to the calculator special type.\n // CalcType allows the table to know what kind of value to expect.\n calcType?: \"COLOR\" | \"NUMBER\" | \"PROGRESS_BAR\" | \"TEXT\" | \"FONT_AWESOME_ICON\";\n // Value to pass into our calculator alongside the Entity data.\n calcValue?: Calculator.IField[];\n // Min/Max values for the progress bar.\n // This can be either fixed or calculated per-entity based on the Entity data.\n calcProgressBarMin?: Calculator.IField[];\n calcProgressBarMax?: Calculator.IField[];\n\n // For FontAwesomeIcon, this is the color of the icon.\n // In the future this may impact other things like the cell text.\n color?: Calculator.IField[];\n // For FontAwesomeIcon, this is the background color of the cell.\n // In the future this may impact other cell types.\n bgColor?: Calculator.IField[];\n }\n \n /**\n * Returns a record matching the given viewId.\n * @param params \n */\n export async function Get(params: {\n viewId: number;\n api?: BruceApi.Api;\n req?: Api.IReqParams;\n }): Promise<{\n view: IView;\n }> {\n let { viewId, api, req } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n req = Api.PrepReqParams(req);\n\n const res = await api.GET(`ui.tableview/${viewId}`, req);\n\n return {\n view: res\n };\n }\n\n /**\n * Returns the list of all available Table Views.\n * @param params \n */\n export async function GetList(params?: {\n api?: BruceApi.Api;\n req?: Api.IReqParams;\n }): Promise<{\n views?: IView[];\n }> {\n if (!params) {\n params = {};\n }\n let { api, req } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n req = Api.PrepReqParams(req);\n\n const res = await api.GET(\"ui.tableviews\", req);\n let items = res?.Items;\n if (!items) {\n items = [];\n }\n\n return {\n views: items\n }\n }\n\n /**\n * Creates or updates a Table View record.\n */\n export async function Update(params: {\n view: IView;\n api?: BruceApi.Api;\n req?: Api.IReqParams;\n }): Promise<{\n view: IView;\n }> {\n let { view, api, req } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n req = Api.PrepReqParams(req);\n\n let viewId = view.ID;\n if (!viewId) {\n // New record.\n viewId = 0;\n }\n const res = await api.POST(`ui.tableview/${viewId}`, view, req);\n\n return {\n view: res\n };\n }\n\n /**\n * Deletes a Table View record.\n * @param params \n */\n export async function Delete(params: {\n viewId: number;\n api?: BruceApi.Api;\n req?: Api.IReqParams;\n }): Promise<void> {\n let { viewId, api, req } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n req = Api.PrepReqParams(req);\n return await api.DELETE(`ui.tableview/${viewId}`, req);\n }\n}","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { Calculator } from \"../calculator/calculator\";\nimport { ENVIRONMENT } from \"../environment\";\n\n/**\n * Describes the \"Style\" concept within Nextspace.\n * A legacy way of referring to styles is \"entity display settings\".\n *\n * A style is a collection of settings (which can be calculations to perform on entity data) that\n * describe how an entity should be displayed.\n */\nexport namespace Style {\n /**\n * Types of styles available.\n * The type will dictate what settings are available.\n */\n export enum EType {\n Entity = \"ENTITY\",\n EntityRelationship = \"ENTITY_RELATIONSHIP\"\n }\n\n /**\n * Available types of points.\n * Default is POINT.\n */\n export enum EPointType {\n // Render a sphere with a fixed pixel size.\n Point = \"POINT\",\n // Render an icon.\n Icon = \"ICON\",\n // Render a cylinder with a fixed meter size.\n Cylinder = \"CYLINDER\"\n }\n\n /**\n * Settings for rendering points\n */\n export interface IPointSettings {\n // The type of point. This helps dictate what settings are relevant.\n // The default when unspecific will be \"POINT\".\n Type?: EPointType;\n // CSS color string to use for the point.\n // Only used for the \"POINT\" type.\n color?: Calculator.IField[];\n // The size in pixels of the point.\n // This is only relevant for \"POINT\" types. For \"ICON\" types the size is dictated by the icon image itself.\n // This must resolve in a number to be valid, otherwise it'll default to the application's default value.\n size?: Calculator.IField[];\n // Client file ID of the icon to load.\n // This is to use in place of an icon URL.\n iconId?: string;\n // The url to load an icon from.\n // This is only relevant for \"ICON\" types.\n iconUrl?: Calculator.IField[];\n // The scale factor of the icon.\n // This is only relevant for \"ICON\" types.\n // For example a 50x50 icon with a scale of 2 will render as 100x100 on the screen.\n // This must resolve in a number to be valid, otherwise it'll default to the application's default value.\n iconScale?: Calculator.IField[];\n // The colour to apply to the icon.\n // When empty or null, the icon will render as is.\n iconTintColor?: Calculator.IField[];\n // This dictates what the altitude value of an Entity should mean.\n // For example if you set this to be clamp-to-ground then the altitude value will be ignored.\n // Default is clamped to ground.\n altitudeOption?: any;\n // Indicates if depth-test should be disabled which forces the point to render above all other entities.\n // This is currently for icon points exclusively.\n renderOnTop?: boolean;\n // To review.\n CylinderFillColor?: Calculator.IField[];\n CylinderFillExtrusion?: Calculator.IField[];\n CylinderRadius?: Calculator.IField[];\n CylinderBorderEnabled?: boolean;\n CylinderBorderExtrusion?: Calculator.IField[];\n CylinderBorderWidth?: Calculator.IField[];\n CylinderBorderColor?: Calculator.IField[];\n // To remove.\n ClusterNearbyEntities?: boolean;\n MinimumEntitiesCountForClustering?: Calculator.IField[];\n }\n\n /**\n * Settings for rendering polygons.\n */\n export interface IPolygonSettings {\n // If the polygon should be extruded.\n useExtrusion: boolean;\n // The height of the extrusion in meters.\n // This must resolve into a number to be valid, otherwise it will not extrude.\n extrusionPath: Calculator.IField[];\n // The colour of the fill.\n // This must resolve into a css colour string to be valid, otherwise it'll default to the application's default value.\n fillColor: Calculator.IField[];\n // The colour of the outline.\n // This must resolve into a css colour string to be valid, otherwise it'll default to the application's default value.\n lineColor: Calculator.IField[];\n // Width of outline in meters.\n // This must resolve into a number to be valid, otherwise it'll default to the application's default value.\n lineWidth: Calculator.IField[];\n // Default is \"m\".\n // When units are in px the lines will draw as Cesium Polyline graphics, for meters corridors are used.\n // Meters are more stable and will reduce crashes. Pixels have better FPS.\n lineWidthUnits?: \"px\" | \"m\";\n // Dictates what the altitude value of an Entity should mean.\n // When not set to \"clamp-to-ground\" each individual's altitude will be used.\n // Default is clamped to ground.\n altitudeOption?: any;\n // The z index will dictate what vector appears on top vertically.\n // It is only applied when the altitude option is set to \"clamped-to-ground\".\n // For example a higher z index will appear on top of a lower z index.\n zIndex?: Calculator.IField[];\n // If the polygon should be draped over the terrain or tilesets + terrain.\n // Default is just terrain.\n drapeOver?: \"TERRAIN\" | \"ALL\";\n }\n\n /**\n * Settings for rendering polylines.\n */\n export interface IPolylineSettings {\n // The colour of the line.\n // This must resolve into a css colour string to be valid, otherwise it'll default to the application's default value.\n lineColor: Calculator.IField[];\n // The width of the line in either pixels or meters based on the units specified.\n // This must resolve into a number to be valid, otherwise it'll default to the application's default value.\n lineWidth: Calculator.IField[];\n // Default is \"px\" for backward compatibility.\n // When units are in px the lines will draw as Cesium Polyline graphics, for meters corridors are used.\n // Meters are more stable and will reduce crashes. Pixels have better FPS.\n lineWidthUnits?: \"px\" | \"m\";\n // Polylines do not support relative to ground positioning.\n // When set to \"absolute\" then each point's altitude will be used rather than clamping to the ground.\n // Default is clamped to ground.\n altitudeOption?: any;\n // The z index will dictate what vector appears on top vertically.\n // It is only applied when the altitude option is set to \"clamped-to-ground\".\n // For example a higher z index will appear on top of a lower z index.\n zIndex?: Calculator.IField[];\n // If the polyline should be draped over the terrain or tilesets + terrain.\n // Default is just terrain.\n drapeOver?: \"TERRAIN\" | \"ALL\";\n }\n\n /**\n * Settings for rendering 3d models.\n */\n export interface IModelSettings {\n // Indicates if the 3D model should be coloured by the Style.\n // Default is false.\n customize: boolean;\n // The colour to apply to the model if customize is set to true.\n // This must resolve into a css colour string to be valid, otherwise it'll default to the application's default value.\n fillColor: Calculator.IField[];\n // The model's scale factor.\n // This is multiplied against the Entity's transform scale.\n // For example if the Entity has a scale of 2 and this resolves to 3 then the final scale will be 6.\n // This must resolve into a number to be valid, otherwise it'll default to the application's default value (1).\n scale: Calculator.IField[];\n // Dictates how the colour specified should be applied to the model.\n fillColorBlendMode?: any;\n // If blend is set to \"Mix\" then this will dictate how much of the source colour should be used.\n // This is value between 0 and 1, default is \"0.5\". 1 means only the applied colour is used.\n fillColorBlendAmount?: number;\n // Dictates what the altitude value of an Entity should mean.\n // Default is relative to ground.\n altitudeOption?: any;\n // Dictates LOD group to retreieve from.\n // Default is 'DEFAULT'.\n lodGroup?: Calculator.IField[];\n }\n\n /**\n * Settings for rendering a node in the 2D viewer (graph viewer).\n */\n export interface IGraphNodeSettings {\n shape?: \"CIRCLE\" | \"RECT_LABEL\";\n }\n\n /**\n * Settings for rendering entities.\n */\n export interface IEntitySettings {\n // Settings are split up by the visual's type.\n pointStyle?: IPointSettings;\n polygonStyle?: IPolygonSettings;\n polylineStyle?: IPolylineSettings;\n // 3D model styling is used for both Tileset Entities and 3D model Entities.\n modelStyle?: IModelSettings;\n // Settings for an entity node in the graph viewer.\n graphNode?: IGraphNodeSettings;\n }\n\n /**\n * Settings for rendering entity relationships.\n */\n export interface IRelationSettings {\n // The colour of the parabola line.\n lineColor?: Calculator.IField[];\n // The width of the parabola line in pixels.\n lineWidth?: Calculator.IField[];\n // The height fraction to define the vertex height.\n // For example a \"0.25\" ratio means the height is 1/4 of the distance. A \"0\" ratio results in a straight line. \n heightDistanceRatio?: Calculator.IField[];\n // The duration of the animation in seconds.\n duration?: Calculator.IField[];\n }\n\n export type Settings = IEntitySettings | IRelationSettings;\n\n /**\n * Describes a style record.\n */\n export interface IStyle {\n // ID of the style record.\n ID: number;\n // Human readable name of the style.\n Name: string;\n // Settings based on the style's type.\n Settings: Settings;\n // Type of style.\n Type: EType;\n }\n\n /**\n * Returns a list of styles.\n * @param params \n * @returns \n */\n export async function GetList(params: {\n api?: BruceApi.Api,\n req?: Api.IReqParams\n }): Promise<{\n // List of styles.\n styles: IStyle[]\n }> {\n let { api, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const cache = await api.GetCacheItem(GetListCacheKey(), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const res: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(\"ui.entityDisplaySettings\", Api.PrepReqParams(reqParams));\n res({\n styles: data.Items\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key: GetListCacheKey(),\n value: res,\n req: reqParams\n });\n return res;\n }\n\n /**\n * Returns a style.\n * @param params \n * @returns \n */\n export async function Get(params: {\n api?: BruceApi.Api,\n // ID of the style record.\n styleId: number,\n req?: Api.IReqParams\n }): Promise<{\n // The style record.\n style: IStyle\n }> {\n let { api, styleId: id, req: reqParams } = params;\n if (!id) {\n throw(\"Style ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const cache = await api.GetCacheItem(GetCacheKey(id), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(`ui.entityDisplaySetting/${id}`, Api.PrepReqParams(reqParams));\n res({\n style: data\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key: GetCacheKey(id),\n value: prom,\n req: reqParams\n });\n return prom;\n }\n\n /**\n * Creates or updates a style.\n * @param params \n * @returns \n */\n export async function Update(params: {\n api?: BruceApi.Api,\n // The style record to create or update.\n style: IStyle,\n req?: Api.IReqParams\n }): Promise<{\n // The style record.\n style: IStyle\n }> {\n let { api, style: data, req: reqParams } = params;\n if (!data?.Name) {\n throw(\"Style name is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n if (!data.ID) {\n data.ID = 0;\n }\n const res = await api.POST(`ui.entityDisplaySetting/${data.ID}`, data, Api.PrepReqParams(reqParams));\n api.Cache.Remove(GetCacheKey(data.ID));\n api.Cache.Remove(GetListCacheKey());\n return {\n style: res\n };\n }\n\n /**\n * Deletes a style.\n * @param params \n */\n export async function Delete(params: {\n api?: BruceApi.Api,\n // ID of the style record to delete.\n styleId: number,\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, styleId: id, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n if (!id) {\n throw(\"Style ID is required.\");\n }\n await api.DELETE(`ui.entityDisplaySetting/${id}`, Api.PrepReqParams(reqParams));\n api.Cache.Remove(GetCacheKey(id));\n api.Cache.Remove(GetListCacheKey());\n }\n\n /**\n * Returns cache identifier for a style.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetCacheKey(1);\n * api.Cache.Remove(key);\n * }\n * @param id\n * @returns \n */\n export function GetCacheKey(id: number): string {\n return Api.ECacheKey.Style + Api.ECacheKey.Id + id;\n }\n \n /**\n * Returns cache identifier for a list of styles.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetListCacheKey();\n * api.Cache.Remove(key);\n * }\n * @returns\n */\n export function GetListCacheKey(): string {\n return Api.ECacheKey.Style;\n }\n}","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { UTC } from \"../common/utc\";\nimport { Entity } from \"../entity/entity\";\nimport { EntityAttribute } from \"../entity/entity-attribute\";\nimport { EntityRelationType } from \"../entity/entity-relation-type\";\nimport { EntityType } from \"../entity/entity-type\";\nimport { ENVIRONMENT } from \"../environment\";\nimport { ProjectViewBookmark } from \"../project/project-view-bookmark\";\nimport { Style } from \"../style/style\";\n\n/**\n * Generic comment record and related functions.\n * This uses Entity records with a specific Entity Type.\n * This replaced the original comment system and allows for comments to be placed on any Entity, or by themselves.\n */\nexport namespace Comment {\n // Entity Type used for storing comment records.\n export const ENTITY_TYPE_ID = \"COMMENTS\";\n // Relationship Type ID for linking relies to comments.\n export const REPLY_RELATIONSHIP_TYPE_ID = \"COMMENTS_REPLY\";\n\n // Possible kinds of comments.\n export enum EType {\n Comment = \"COMMENT\",\n Reply = \"REPLY\"\n }\n\n /**\n * Represents a comment Entity record.\n */\n export interface IRecord extends Entity.IEntity {\n // Associated project view.\n viewId: string;\n // Associated bookmark, if any.\n bookmarkId?: string;\n // Comment text content.\n text: string;\n type: EType;\n // Date-time of the last update.\n // If the user makes an edit then this field is updated.\n lastUpdateTime?: UTC.IUTC;\n updates?: number;\n // Related Entity, if any.\n // This is used when you want to link a comment to an Entity.\n entityId?: string;\n // Indicates if the comment is edited.\n edited?: boolean;\n // Stored camera position.\n // This is used to fly to the camera position where the comment was made.\n camera?: ProjectViewBookmark.Web3d.ICamera;\n // Parent comment, if any.\n // This is for replies to comments.\n // @todo possible not needed as we create a relationship between a comment/reply.\n parentId?: string;\n }\n\n /**\n * Returns a list of comments based on the provided filter.\n * @param params \n * @returns \n */\n export async function GetList(params: {\n api?: BruceApi.Api,\n req?: Api.IReqParams,\n filter: {\n viewId?: string;\n bookmarkId?: string;\n userId?: string;\n amount?: number;\n index?: number;\n text?: string;\n entityId?: string;\n }\n }): Promise<{\n comments: IRecord[]\n }> {\n let { api, req, filter } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n req = Api.PrepReqParams(req);\n\n if (!await getEntityTypeExists(api, req)) {\n return {\n comments: []\n }\n }\n\n const reqFilter = {};\n if (filter.viewId) {\n reqFilter[\"viewId\"] = {\n \"equals\": filter.viewId\n };\n }\n if (filter.userId) {\n reqFilter[\"CreatedBy.User.ID\"] = {\n \"equals\": filter.userId\n };\n }\n if (filter.text) {\n reqFilter[\"text\"] = {\n \"contains\": filter.text\n };\n }\n if (filter.entityId) {\n reqFilter[\"entityId\"] = {\n \"equals\": filter.entityId\n };\n }\n\n const records = (await Entity.GetList({\n api,\n req,\n filter: {\n entityTypeId: ENTITY_TYPE_ID,\n pageSize: filter.amount == null ? 20 : filter.amount,\n pageIndex: filter.index == null ? 0 : filter.index,\n entityTypeConditions: reqFilter,\n orderBy: \"lastUpdateTime\"\n },\n migrated: true\n })).entities as IRecord[];\n\n return {\n comments: records\n }\n }\n\n /**\n * Ensure the Entity Type exists.\n * If it does not exist, it will be created.\n * @param params \n */\n export async function AssertEntityType(params: {\n api?: BruceApi.Api,\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, req } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n req = Api.PrepReqParams(req);\n\n // If the Entity Type does not exist, create it.\n if (!await getEntityTypeExists(api, req)) {\n // Create Style and set it to the Entity Type.\n const styleId = await ensureStyleExists(api);\n const template: EntityType.IType = JSON.parse(JSON.stringify(ENTITY_TYPE_TEMPLATE));\n template[\"DisplaySetting.ID\"] = styleId;\n await EntityType.Update({\n api,\n entityType: template\n });\n }\n }\n\n /**\n * Ensure the Relation Type exists.\n * If it does not exist, it will be created.\n * @param params \n */\n export async function AssertRelationType(params: {\n api?: BruceApi.Api,\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, req } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n req = Api.PrepReqParams(req);\n\n await ensureRelationExists(api, req);\n }\n}\n\nasync function getEntityTypeExists(api: BruceApi.Api, req?: Api.IReqParams): Promise<boolean> {\n try {\n const {entityType: data} = await EntityType.Get({\n api,\n req: req,\n entityTypeId: Comment.ENTITY_TYPE_ID\n });\n return !!data;\n }\n catch (e) {\n // TODO: suppress if the error is related to not being found.\n console.error(e);\n }\n return false;\n}\n\nasync function ensureStyleExists(api: BruceApi.Api, req?: Api.IReqParams) {\n try {\n const template: Style.Settings = JSON.parse(JSON.stringify(STYLE_SETTINGS_TEMPLATE));\n const {style} = await Style.Update({\n api,\n req: req,\n style: {\n Name: \"Comment Style\",\n Settings: template,\n Type: Style.EType.Entity,\n ID: 0\n }\n });\n return style.ID;\n }\n catch (e) {\n console.error(e);\n }\n return 0;\n}\n\nasync function ensureRelationExists(api: BruceApi.Api, req?: Api.IReqParams): Promise<void> {\n try {\n const {relationType: data} = await EntityRelationType.Get({\n api,\n req: req,\n relationTypeId: Comment.REPLY_RELATIONSHIP_TYPE_ID\n });\n if (!data) {\n throw(\"Relation Type not found\");\n }\n }\n catch (e) {\n await EntityRelationType.Update({\n api,\n req: req,\n relationType: {\n ID: Comment.REPLY_RELATIONSHIP_TYPE_ID,\n ForwardName: \"Parent of\",\n ReverseName: \"Reply to\",\n Name: \"Comment Reply\"\n }\n });\n }\n}\n\nconst STYLE_SETTINGS_TEMPLATE: Style.Settings = {\n pointStyle: {\n \"color\": [\n {\n \"type\": 0,\n \"value\": \"rgba(33,150,243,0.8)\"\n }\n ],\n \"CylinderBorderEnabled\": false,\n \"CylinderBorderWidth\": [\n {\n \"type\": 1,\n \"value\": \"15\"\n }\n ],\n \"CylinderFillExtrusion\": [\n {\n \"type\": 1,\n \"value\": \"40\"\n }\n ],\n \"Type\": Style.EPointType.Icon,\n \"iconId\": null,\n \"altitudeOption\": {\n \"name\": \"Absolute position\",\n \"id\": 1\n },\n \"size\": [\n {\n \"type\": 1,\n \"value\": \"20\"\n }\n ],\n \"CylinderFillColor\": [\n {\n \"type\": 1,\n \"value\": \"rgba(33,150,243,0.8)\"\n }\n ],\n \"CylinderBorderExtrusion\": [\n {\n \"type\": 1,\n \"value\": \"35\"\n }\n ],\n \"CylinderRadius\": [\n {\n \"type\": 1,\n \"value\": \"20\"\n }\n ],\n \"iconUrl\": [\n {\n \"type\": 1,\n \"value\": \"https://template.api.nextspace-uat.net/file/faf2194d-3a95-40cc-a6b3-6a7aa223f766.png\"\n }\n ],\n \"ClusterNearbyEntities\": false,\n \"CylinderBorderColor\": [\n {\n \"type\": 1,\n \"value\": \"rgba(33,150,243,0.8)\"\n }\n ],\n \"iconScale\": [\n {\n \"type\": 1,\n \"value\": 1\n }\n ],\n \"MinimumEntitiesCountForClustering\": [\n {\n \"type\": 1,\n \"value\": \"2\"\n }\n ]\n }\n};\n\nconst ENTITY_TYPE_TEMPLATE: EntityType.IType = {\n ID: Comment.ENTITY_TYPE_ID,\n Name: \"Comments\",\n DataSchema: {\n \"Key\": \"root\",\n \"Name\": \"Root\",\n \"Type\": EntityAttribute.EType.Structure,\n Structure: [\n {\n \"IsIndexed\": true,\n \"IsImportant\": false,\n \"Type\": EntityAttribute.EType.String,\n \"IsArray\": false,\n \"Size\": 40,\n \"Key\": \"ID\",\n \"Name\": \"Identity\",\n \"IsFamilyAttribute\": false,\n \"IsFamilyAttributeDefault\": false\n },\n {\n \"IsIndexed\": false,\n \"IsImportant\": false,\n \"Type\": EntityAttribute.EType.Geometry,\n \"IsArray\": false,\n \"Size\": 0,\n \"Key\": \"geometry\",\n \"Name\": \"Geometry\",\n \"IsFamilyAttribute\": false,\n \"IsFamilyAttributeDefault\": false\n },\n {\n \"IsImportant\": false,\n \"Type\": EntityAttribute.EType.Structure,\n \"IsArray\": false,\n \"Structure\": [\n {\n \"IsIndexed\": true,\n \"IsImportant\": false,\n \"Type\": EntityAttribute.EType.Double,\n \"IsArray\": false,\n \"Key\": \"minLongitude\",\n \"Name\": \"Min Longitude\",\n \"IsFamilyAttribute\": false,\n \"IsFamilyAttributeDefault\": false\n },\n {\n \"IsIndexed\": true,\n \"IsImportant\": false,\n \"Type\": EntityAttribute.EType.Double,\n \"IsArray\": false,\n \"Key\": \"minLatitude\",\n \"Name\": \"Min Latitude\",\n \"IsFamilyAttribute\": false,\n \"IsFamilyAttributeDefault\": false\n },\n {\n \"IsIndexed\": true,\n \"IsImportant\": false,\n \"Type\": EntityAttribute.EType.Double,\n \"IsArray\": false,\n \"Size\": 0,\n \"Key\": \"minAltitude\",\n \"Name\": \"Min Altitude\",\n \"IsFamilyAttribute\": false,\n \"IsFamilyAttributeDefault\": false\n },\n {\n \"IsIndexed\": true,\n \"IsImportant\": false,\n \"Type\": EntityAttribute.EType.Double,\n \"IsArray\": false,\n \"Key\": \"maxLongitude\",\n \"Name\": \"Max Longitude\",\n \"IsFamilyAttribute\": false,\n \"IsFamilyAttributeDefault\": false\n },\n {\n \"IsIndexed\": true,\n \"IsImportant\": false,\n \"Type\": EntityAttribute.EType.Double,\n \"IsArray\": false,\n \"Key\": \"maxLatitude\",\n \"Name\": \"Max Latitude\",\n \"IsFamilyAttribute\": false,\n \"IsFamilyAttributeDefault\": false\n },\n {\n \"IsIndexed\": true,\n \"IsImportant\": false,\n \"Type\": EntityAttribute.EType.Double,\n \"IsArray\": false,\n \"Size\": 0,\n \"Key\": \"maxAltitude\",\n \"Name\": \"Max Altitude\",\n \"IsFamilyAttribute\": false,\n \"IsFamilyAttributeDefault\": false\n }\n ],\n \"Key\": \"boundaries\",\n \"Name\": \"Boundaries\",\n \"IsFamilyAttribute\": false,\n \"IsFamilyAttributeDefault\": false\n },\n {\n \"IsImportant\": false,\n \"Type\": EntityAttribute.EType.Structure,\n \"IsArray\": false,\n \"Structure\": [\n {\n \"IsIndexed\": true,\n \"IsImportant\": false,\n \"Type\": EntityAttribute.EType.Double,\n \"IsArray\": false,\n \"Key\": \"latitude\",\n \"Name\": \"Latitude\",\n \"IsFamilyAttribute\": false,\n \"IsFamilyAttributeDefault\": false\n },\n {\n \"IsIndexed\": true,\n \"IsImportant\": false,\n \"Type\": EntityAttribute.EType.Double,\n \"IsArray\": false,\n \"Key\": \"longitude\",\n \"Name\": \"Longitude\",\n \"IsFamilyAttribute\": false,\n \"IsFamilyAttributeDefault\": false\n },\n {\n \"IsIndexed\": true,\n \"IsImportant\": false,\n \"Type\": EntityAttribute.EType.Double,\n \"IsArray\": false,\n \"Key\": \"altitude\",\n \"Name\": \"Altitude\",\n \"IsFamilyAttribute\": false,\n \"IsFamilyAttributeDefault\": false\n }\n ],\n \"Key\": \"location\",\n \"Name\": \"Location\",\n \"IsFamilyAttribute\": false,\n \"IsFamilyAttributeDefault\": false\n },\n {\n \"IsIndexed\": true,\n \"IsImportant\": true,\n \"Type\": EntityAttribute.EType.String,\n \"IsArray\": false,\n \"Size\": 60,\n \"Key\": \"viewId\",\n \"Name\": \"View Id\",\n \"IsFamilyAttribute\": false,\n \"IsFamilyAttributeDefault\": false\n },\n {\n \"IsIndexed\": true,\n \"IsImportant\": true,\n \"Type\": EntityAttribute.EType.String,\n \"IsArray\": false,\n \"Size\": 60,\n \"Key\": \"bookmarkId\",\n \"Name\": \"Bookmark Id\",\n \"IsFamilyAttribute\": false,\n \"IsFamilyAttributeDefault\": false\n },\n {\n \"IsIndexed\": true,\n \"IsImportant\": true,\n \"Type\": EntityAttribute.EType.String,\n \"IsArray\": false,\n \"Key\": \"text\",\n \"Name\": \"Comment\",\n \"IsFamilyAttribute\": false,\n \"IsFamilyAttributeDefault\": false\n },\n {\n \"IsIndexed\": true,\n \"IsImportant\": true,\n \"Type\": EntityAttribute.EType.Datetime,\n \"IsArray\": false,\n \"Key\": \"lastUpdateTime\",\n \"Name\": \"Last Update Time\",\n \"IsFamilyAttribute\": false,\n \"IsFamilyAttributeDefault\": false\n },\n {\n \"IsIndexed\": true,\n \"IsImportant\": true,\n \"Type\": EntityAttribute.EType.String,\n \"IsArray\": false,\n \"Key\": \"entityId\",\n \"Name\": \"Related Entity ID\",\n \"IsFamilyAttribute\": false,\n \"IsFamilyAttributeDefault\": false\n }\n ]\n },\n \"DisplaySetting.ID\": 0\n};","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { ENVIRONMENT } from \"../environment\";\nimport { ObjectUtils } from \"../util/object-utils\";\n\n/**\n * Utility for uploading files.\n */\nexport namespace Uploader {\n export const MIN_LARGE_FILE_SIZE = 100000000; // 100MB.\n\n export interface IProgress {\n percent: number;\n uploaded: boolean;\n }\n\n /**\n * Uploads a file to the server.\n * @param params \n * @returns \n */\n export async function DoMultiPartUpload(params: {\n // File to upload.\n file: File,\n // API to use for upload.\n api?: BruceApi.Api,\n // URL suffix to use for upload.\n // This is appended to the API's base url.\n urlSuffix: string,\n req?: Api.IUploadReqParams,\n // Callback for progress updates.\n onProgress?: (progress: IProgress) => void\n }) {\n let { file, api, urlSuffix: url, req, onProgress } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const FILE_PORTION_SIZE = 100000000; // 100MB.\n let fileSize = file.size;\n let fileOffset = 0;\n let filePartsCount = fileSize / FILE_PORTION_SIZE;\n let t = Math.trunc(filePartsCount);\n filePartsCount = filePartsCount > t ? t + 1 : t;\n let filePartIndex = 1;\n let uploadToken = ObjectUtils.UId();\n let data: any;\n while (fileOffset < fileSize) {\n let partSize = Math.min(FILE_PORTION_SIZE, fileSize - fileOffset);\n let retryCount: number = 5;\n let retryWait: number = 1000;\n while (retryCount > 0) {\n try {\n const blob = file.slice(fileOffset, fileOffset + partSize);\n const partialFile = new File([blob], file.name, { type: file.type });\n const formData = new FormData();\n formData.append(\"originalFileName\", file.name);\n formData.append(\"token\", uploadToken);\n formData.append(\"count\", \"\" + filePartsCount);\n formData.append(\"part\", \"\" + filePartIndex);\n formData.append(\"file\", partialFile);\n const reqParams = Api.PrepReqParams(req) as Api.IUploadReqParams;\n reqParams.formData = formData;\n reqParams.onProgress = (progress: ProgressEvent) => {\n const sofar = fileOffset + progress.loaded;\n const percent = Math.round ((sofar / file.size) * 100);\n onProgress?.({\n percent: percent,\n uploaded: false\n });\n };\n data = await api.UPLOAD(url, partialFile, reqParams)\n retryCount = 0;\n }\n catch (up) {\n retryCount -= 1;\n if (retryCount <= 0) {\n throw up;\n }\n await new Promise((res) => setTimeout(res, retryWait));\n retryWait = retryWait * 2;\n }\n }\n fileOffset += partSize;\n filePartIndex++;\n }\n onProgress?.({\n percent: 100,\n uploaded: true\n });\n return data;\n }\n}","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { IDictionary, UrlUtils } from \"../bruce-models\";\nimport { UTC } from \"../common/utc\";\nimport { ENVIRONMENT } from \"../environment\";\nimport { Uploader } from \"../internal/uploader\";\n\n/**\n * Describes the \"Client File\" concept within Nextspace.\n * A client file is a record of a file uploaded to Bruce.\n */\nexport namespace ClientFile {\n /**\n * Describes a client file record.\n */\n export interface IFile {\n // The ID of the file.\n ID: string;\n // The file's extension.\n // Currently a mess with conflicting records with and without the dot.\n FileExt: string;\n // The file's mime type.\n MIMEType: string;\n // The file's original name. This includes the extension.\n OriginalFileName: string;\n // The file's size in bytes.\n OriginalLength: number;\n // The user's ID who uploaded the file.\n \"UploadedByUser.ID\": string;\n // An optional category for the file.\n // Some Nextspace default purposes have additional meaning.\n Purpose: Purpose;\n // UTC date/time when the file was uploaded.\n UploadedTimeUTC: UTC.IUTC;\n }\n\n // Client file purpose. This is an optional level of categorization for a file.\n export type Purpose = string | EPurpose;\n export enum EPurpose {\n // Use this purpose for uploading bookmark thumbnail images.\n // This will allow lower level privileges to upload (small) bookmark thumbnails.\n BookmarkThumbnail = \"Bookmark Thumbnail\"\n }\n\n /**\n * Returns the URL for a client file.\n * @param params \n * @returns \n */\n export function GetUrl(params: {\n api?: BruceApi.Api,\n // The related client file ID.\n fileId: string,\n // If true, and if the CDN url is set in the API, the CDN url will be returned.\n // Default = false.\n viaCdn?: boolean\n }): string {\n let { api, fileId, viaCdn } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n return api.ConstructUrl({\n cdn: viaCdn,\n url: `file/${fileId}`,\n urlParams: {\n // Invalidating cache manually because we have a wave of invalid headers now cached across devices.\n cc: \"1\"\n }\n });\n }\n\n /**\n * Returns the URL for a client file with the extension.\n * @param params \n * @returns \n */\n export function GetUrlWithExt(params: {\n api?: BruceApi.Api,\n // The related client file record.\n file: IFile,\n // If true, and if the CDN url is set in the API, the CDN url will be returned.\n // Default = false.\n viaCdn?: boolean\n }): string {\n let { api, file, viaCdn } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n let ext = file.FileExt;\n if (!ext && file.OriginalFileName && file.OriginalFileName.includes(\".\")) {\n ext = file.OriginalFileName.split(\".\").pop();\n }\n if (ext && !ext.startsWith(\".\")) {\n ext = \".\" + ext;\n }\n const urlSuffix = ext ? `file/${file.ID}${ext}` : `file/${file.ID}`;\n\n return api.ConstructUrl({\n cdn: viaCdn,\n url: urlSuffix,\n urlParams: {\n // Invalidating cache manually because we have a wave of invalid headers now cached across devices.\n cc: \"1\"\n }\n });\n }\n\n /**\n * Returns a client file record by ID.\n * @param params \n * @returns \n */\n export async function Get(params: {\n api?: BruceApi.Api,\n fileId: string,\n req?: Api.IReqParams\n }): Promise<{\n clientFile: IFile\n }> {\n let { api, fileId, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n if (!fileId) {\n throw(\"File ID is required.\");\n }\n const key = GetCacheKey(fileId);\n const cache = await api.GetCacheItem(key, reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(`file/${fileId}/details`, Api.PrepReqParams(reqParams));\n res({\n clientFile: data\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key,\n value: prom,\n req: reqParams\n });\n return prom;\n }\n\n /**\n * Deletes one or many client file records by IDs.\n * @param params \n */\n export async function Delete(params: {\n api?: BruceApi.Api,\n fileIds: string[],\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, fileIds, req: reqParams } = params;\n if (!fileIds.length) {\n return Promise.resolve();\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n const data = {\n Items: fileIds\n };\n await api.POST(\"deleteFiles\", data, Api.PrepReqParams(reqParams));\n for (let i = 0; i < fileIds.length; i++) {\n const key = GetCacheKey(fileIds[i]);\n api.Cache.Remove(key);\n }\n }\n\n /**\n * Uploads a file and creates a new client file record.\n * @param params \n * @returns \n */\n export async function Upload(params: {\n api?: BruceApi.Api,\n file: File,\n purpose?: string,\n onProgress?: (progress: Uploader.IProgress) => void,\n req?: Api.IUploadReqParams\n }): Promise<{\n clientFile: IFile\n }> {\n let { api, file, purpose, req, onProgress } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n if (!file) {\n throw(\"File is required.\");\n }\n const size = file?.size;\n if (!size) {\n throw(\"You cannot upload a 0byte sized file.\");\n }\n req = Api.PrepReqParams(req) as Api.IUploadReqParams;\n let clientFile: IFile;\n if (size > Uploader.MIN_LARGE_FILE_SIZE) {\n clientFile = await Uploader.DoMultiPartUpload({\n api,\n file,\n urlSuffix: \"fileUpload\",\n req,\n onProgress\n });\n // TODO: Check if we can add it to the request like the small file upload.\n if (clientFile?.ID && purpose) {\n await UpdatePurpose({\n api,\n fileId: clientFile.ID,\n purpose,\n req\n })\n }\n }\n else {\n req.onProgress = (progress: ProgressEvent) => {\n const percent = Math.round ((progress.loaded / file.size) * 100);\n onProgress?.({\n percent: percent,\n uploaded: false\n });\n };\n if (purpose) {\n req.formData = {\n Purpose: purpose\n };\n }\n clientFile = await api.UPLOAD(\"file/uploadNew\", file, req);\n }\n onProgress?.({\n percent: 100,\n uploaded: true\n });\n return {\n clientFile\n };\n }\n\n /**\n * Updates the purpose of a client file.\n * @param params \n */\n export async function UpdatePurpose(params: {\n api?: BruceApi.Api,\n fileId: string,\n purpose: string,\n req?: Api.IReqParams\n }) {\n let { api, fileId, purpose, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n if (!purpose) {\n purpose = \"\";\n }\n await api.POST(\"file/updatepurpose/\" + fileId + \"/?Purpose=\" + purpose, {\n Purpose: purpose\n }, Api.PrepReqParams(reqParams));\n const cacheKey = GetCacheKey(fileId);\n api.Cache.RemoveByContains(cacheKey);\n }\n\n /**\n * Uploads a temp file.\n * This will return a temp file ID.\n * @param params\n * @returns\n */\n export async function UploadTemp(params: {\n api?: BruceApi.Api,\n file: File,\n onProgress?: (progress: Uploader.IProgress) => void,\n req?: Api.IUploadReqParams\n }): Promise<{\n tempFileId: string\n }> {\n let { api, file, req, onProgress } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n if (!file) {\n throw(\"File is required.\");\n }\n const size = file?.size;\n if (!size) {\n throw(\"You cannot upload a 0byte sized file.\");\n }\n req = Api.PrepReqParams(req) as Api.IUploadReqParams;\n let tempFile: any;\n if (size > Uploader.MIN_LARGE_FILE_SIZE) {\n tempFile = await Uploader.DoMultiPartUpload({\n api,\n file,\n urlSuffix: \"tempFileUpload\",\n req,\n onProgress\n });\n }\n else {\n req.onProgress = (progress: ProgressEvent) => {\n const percent = Math.round ((progress.loaded / file.size) * 100);\n onProgress?.({\n percent: percent,\n uploaded: false\n });\n };\n tempFile = await api.UPLOAD(\"file/uploadTemp\", file, req);\n }\n onProgress?.({\n percent: 100,\n uploaded: true\n });\n return {\n tempFileId: tempFile[\"TempFile.ID\"]\n };\n }\n\n /**\n * Returns a dictionary of purpose counts for client files.\n * @param params \n * @returns \n */\n export async function GetCountsPurpose(params: {\n api?: BruceApi.Api,\n req?: Api.IReqParams\n }): Promise<{\n counts: IDictionary<number>\n }> {\n let { api, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n reqParams = Api.PrepReqParams(reqParams);\n\n const key = GetCountsPurposeCacheKey();\n const cache = api.GetCacheItem(key, reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(\"file/purpose/counts\", Api.PrepReqParams(reqParams));\n res({\n counts: data\n });\n }\n catch (e) {\n rej(e);\n }\n });\n api.SetCacheItem({\n key,\n value: prom,\n req: reqParams,\n // Short 30 second cache duration.\n duration: 30 * 1000\n });\n return prom;\n }\n\n /**\n * Returns a dictionary of MIME type counts for client files.\n * @param params \n * @returns \n */\n export async function GetCountsExtension(params: {\n api?: BruceApi.Api,\n req?: Api.IReqParams\n }): Promise<{\n counts: IDictionary<number>\n }> {\n let { api, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n reqParams = Api.PrepReqParams(reqParams);\n\n const key = GetCountsExtensionCacheKey();\n const cache = api.GetCacheItem(key, reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(\"file/extension/counts\", Api.PrepReqParams(reqParams));\n res({\n counts: data\n });\n }\n catch (e) {\n rej(e);\n }\n });\n api.SetCacheItem({\n key,\n value: prom,\n req: reqParams,\n // Short 30 second cache duration.\n duration: 30 * 1000\n });\n return prom;\n }\n\n /**\n * Returns a dictionary of MIME type counts for client files.\n * @param params \n * @returns \n */\n export async function GetCountsMIMEType(params: {\n api?: BruceApi.Api,\n req?: Api.IReqParams\n }): Promise<{\n counts: IDictionary<number>\n }> {\n let { api, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n reqParams = Api.PrepReqParams(reqParams);\n\n const key = GetCountsMIMETypeCacheKey();\n const cache = api.GetCacheItem(key, reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(\"file/mimetype/counts\", Api.PrepReqParams(reqParams));\n res({\n counts: data\n });\n }\n catch (e) {\n rej(e);\n }\n });\n api.SetCacheItem({\n key,\n value: prom,\n req: reqParams,\n // Short 30 second cache duration.\n duration: 30 * 1000\n });\n return prom;\n }\n\n /**\n * Returns a dictionary of user counts for client files.\n * @param params \n * @returns \n */\n export async function GetCountsUser(params: {\n api?: BruceApi.Api,\n req?: Api.IReqParams\n }): Promise<{\n counts: IDictionary<number>\n }> {\n let { api, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n reqParams = Api.PrepReqParams(reqParams);\n\n const key = GetCountsUserCacheKey();\n const cache = api.GetCacheItem(key, reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(\"file/user/counts\", Api.PrepReqParams(reqParams));\n res({\n counts: data\n });\n }\n catch (e) {\n rej(e);\n }\n });\n api.SetCacheItem({\n key,\n value: prom,\n req: reqParams,\n // Short 30 second cache duration.\n duration: 30 * 1000\n });\n return prom;\n }\n\n /**\n * Filter definitions for requesting a list of client files.\n */\n export namespace Filter {\n export enum EColumn {\n ID = \"id\",\n Name = \"name\",\n DateTime = \"datetime\",\n MIMEType = \"mimeType\",\n Size = \"size\",\n User = \"user\",\n Extension = \"extension\"\n }\n\n export enum ESortOrder {\n ASC = \"asc\",\n DEC = \"desc\"\n }\n\n export enum ERowOperator {\n AND = \"AND\",\n OR = \"OR\"\n }\n\n export interface IRow {\n column: EColumn;\n value: any;\n valueOperator: string;\n includes: boolean;\n rowOperator: ERowOperator;\n rows?: IRow[];\n }\n }\n\n export interface IFilter {\n PageSize?: number;\n PageIndex?: number;\n OrderBy?: Filter.EColumn;\n SortOrder?: Filter.ESortOrder;\n Purpose?: string;\n FilterRows?: Filter.IRow[];\n }\n\n /**\n * Returns a list of client files matching the filter.\n * @param params \n * @returns \n */\n export async function GetList(params: {\n api?: BruceApi.Api,\n filter: IFilter,\n req?: Api.IReqParams\n }): Promise<{\n clientFiles: IFile[],\n // Total available matching the filter.\n // This is not the total returned in the current page.\n totalCount: number\n }> {\n let { api, filter, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const data = await api.POST(\"files/filtered\", filter, Api.PrepReqParams(reqParams));\n return {\n clientFiles: data.Items,\n totalCount: data.TotalCount\n };\n }\n\n /**\n * Deletes a list of client files matching the filter.\n * @param params \n */\n export async function DeleteList(params: {\n api?: BruceApi.Api,\n filter: IFilter,\n req?: Api.IReqParams\n }): Promise<{\n success: boolean,\n deletedCount: number\n }> {\n let { api, filter, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const res = await api.POST(\"files/filtered/delete\", filter, Api.PrepReqParams(reqParams));\n\n // We'll clear cache if at least one file was deleted.\n if (res?.OK && res?.DeleteFilesCount > 0) {\n api.Cache.RemoveByStartsWith(Api.ECacheKey.ClientFile);\n }\n\n return {\n success: res?.OK,\n deletedCount: res?.DeleteFilesCount\n }\n }\n\n /**\n * Utility for processing client files.\n * Commonly used to convert a file to a different format. Eg: FBX to GLB.\n */\n export namespace Processor {\n /**\n * Describes the result of a file processing operation.\n */\n export interface IResult {\n success: boolean;\n clientFileId: string;\n clientFileName: string;\n }\n\n /**\n * The desired file format to convert to.\n */\n export enum EConvertExt {\n // Recommended.\n GLB = \".glb\",\n // Unstable.\n SKP = \".skp\",\n }\n\n export async function ConvertFormat(params: {\n api?: BruceApi.Api,\n // ID of client file we're processing.\n fileId: string,\n // The desired file format to convert to.\n // If not specified, the file will be converted to GLB.\n ext?: EConvertExt | string,\n req?: Api.IReqParams\n }): Promise<IResult> {\n let { api, fileId: clientFileId, ext, req: reqParams } = params;\n if (!clientFileId) {\n throw(\"Client File ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n if (!ext) {\n ext = EConvertExt.GLB;\n }\n \n return api.POST(\"convertFileToFile\", {\n clientFileId: clientFileId,\n destinationFormat: ext,\n operations: []\n }, reqParams);\n }\n }\n\n /**\n * Returns cache identifier for a client file by ID.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetCacheKey(\"123\");\n * api.Cache.Remove(key);\n * }\n * @param fileId \n * @returns \n */\n export function GetCacheKey(fileId: string): string {\n return `${Api.ECacheKey.ClientFile}${Api.ECacheKey.Id}${fileId}`;\n }\n\n export function GetCountsPurposeCacheKey() {\n return `${Api.ECacheKey.ClientFile}${Api.ECacheKey.ClientFileCountsPurpose}`;\n }\n\n export function GetCountsExtensionCacheKey() {\n return `${Api.ECacheKey.ClientFile}${Api.ECacheKey.ClientFileCountsExtension}`;\n }\n\n export function GetCountsMIMETypeCacheKey() {\n return `${Api.ECacheKey.ClientFile}${Api.ECacheKey.ClientFileCountsMIMEType}`;\n }\n\n export function GetCountsUserCacheKey() {\n return `${Api.ECacheKey.ClientFile}${Api.ECacheKey.ClientFileCountsUser}`;\n }\n}","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { ENVIRONMENT } from \"../environment\";\n\ntype Id = ProgramKey.EProgramId | string;\n\n/**\n * Describes the \"Program Key\" concept within Nextspace.\n * A program key is an access token for an arbitrary software.\n */\nexport namespace ProgramKey {\n /**\n * Known program IDs that Nextspace applications will reference.\n */\n export enum EProgramId {\n // Cesium Ion token. Used for Cesium World Terrain and Bing Maps within CesiumJS.\n CesiumIon = \"CesiumIon\",\n // Bing Maps key. Used for Bing Maps within Unreal.\n BingMaps = \"BingMaps\",\n // Mapbox key. Used for Mapbox within CesiumJS and Unreal.\n Mapbox = \"Mapbox\",\n // Google Maps key. Used for Google Maps 3D tileset for CesiumJS and Unreal.\n Google = \"Google\",\n // Stadiamaps key. Used for watercolor and toner\n StadiaMaps = \"StadiaMaps\",\n // Thunderforest key, Used for cycle and transport and landscape\n Thunderforest = \"Thunderforest\"\n }\n\n /**\n * Describes a program key record.\n */\n export interface IKey {\n // ID of the program key record.\n ProgramId: Id;\n // The program key.\n Key: string;\n // If access to the plugin should be restricted.\n // When a plugin is restricted a user must have the \"ProgramKey_<pluginId>\" permission.\n IsAccessRestricted?: boolean;\n }\n\n /**\n * Returns a program key record.\n * @param params \n * @returns \n */\n export async function Get(params: {\n api?: BruceApi.Api,\n // ID of the program key record.\n programId: Id,\n req?: Api.IReqParams\n }): Promise<{\n // The program key record.\n programKey: IKey\n }> {\n let { api, programId, req: reqParams } = params;\n if (!programId) {\n throw(\"Program ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n // Our API throws an error when a key is not set which is a bit annoying.\n // Since we only use these keys for a few specific things we'll just request the list and avoid the error.\n // If this becomes useful for more things we'll make requesting a key that doesn't exist just return empty JSON.\n\n const prom = await GetList({\n api,\n req: reqParams\n });\n const key = prom.programKeys.find(k => k.ProgramId === programId);\n \n\n // const key = GetCacheKey(programId);\n // const cache = await api.GetCacheItem(key, reqParams);\n // if (cache?.found) {\n // return cache.data;\n // }\n // const prom: Promise<any> = new Promise(async (res, rej) => {\n // try {\n // const data = await api.GET(`programkey/${programId}`, Api.PrepReqParams(reqParams));\n // res({\n // programKey: data\n // });\n // }\n // catch (e) {\n // rej(e);\n // }\n // });\n // await api.SetCacheItem({\n // key,\n // value: prom,\n // req: reqParams\n // });\n\n return {\n programKey: key\n };\n }\n\n /**\n * Returns a list of program key records.\n * @param params \n * @returns \n */\n export async function GetList(params: {\n api?: BruceApi.Api,\n req?: Api.IReqParams\n }): Promise<{\n // The list of program key records.\n programKeys: IKey[]\n }> {\n let { api, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const cache = await api.GetCacheItem(GetListCacheKey(), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const req: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(\"programkeys\", Api.PrepReqParams(reqParams));\n res({\n programKeys: data.Items\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key: GetListCacheKey(),\n value: req,\n req: reqParams\n });\n return req;\n }\n\n /**\n * Deletes a program key record.\n * @param params \n */\n export async function Delete(params: {\n api?: BruceApi.Api,\n // ID of the program key record.\n programId: Id,\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, programId, req: reqParams } = params;\n if (!programId) {\n throw(\"Program ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n await api.DELETE(`programkey/${programId}`, Api.PrepReqParams(reqParams));\n api.Cache.Remove(GetCacheKey(programId));\n api.Cache.Remove(GetListCacheKey());\n }\n\n /**\n * Creates or updates a program key record.\n * @param params \n * @returns \n */\n export async function Update(params: {\n api?: BruceApi.Api,\n // The program key record.\n programKey: IKey,\n req?: Api.IReqParams\n }): Promise<{\n // The program key record.\n programKey: IKey\n }> {\n let { api, programKey: data, req: reqParams } = params;\n if (!data?.ProgramId) {\n throw(\"Program ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const res = await api.POST(\"programkey\", data, Api.PrepReqParams(reqParams));\n api.Cache.Remove(GetCacheKey(data.ProgramId));\n api.Cache.Remove(GetListCacheKey());\n return {\n programKey: res\n };\n }\n\n /**\n * Returns cache identifier for a program key.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetCacheKey(\"abc\");\n * api.Cache.Remove(key);\n * }\n * @param programId\n * @returns \n */\n export function GetCacheKey(programId: string): string {\n return Api.ECacheKey.ProgramKey + Api.ECacheKey.Id + programId;\n }\n \n /**\n * Returns cache identifier for a list of program keys.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetListCacheKey();\n * api.Cache.Remove(key);\n * }\n * @returns\n */\n export function GetListCacheKey(): string {\n return Api.ECacheKey.ProgramKey;\n }\n}","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { UTC } from \"../common/utc\";\nimport { PendingAction } from \"../server/pending-action\";\nimport { GlobalApi } from \"../api/global-api\";\nimport { Transform } from \"../common/transform\";\nimport { Carto } from \"../common/carto\";\nimport { Bounds } from \"../common/bounds\";\nimport { Uploader } from \"../internal/uploader\";\nimport { IDictionary } from \"../common/dictionary\";\nimport { ENVIRONMENT } from \"../environment\";\nimport { Account, AccountSettings, ApiGetters } from \"../bruce-models\";\n\n/**\n * Converts legacy records into something easier to work with alongside the newer ones.\n * On save we'll convert back to the legacy format.\n * @param record record we need to convert into a new version\n * @param newer supplementary newer one that lacks the legacy fields\n * @returns \n */\nfunction convertLegacyRec(record: any, newer?: Tileset.ITileset): Tileset.ITileset {\n const tileset: Tileset.ITileset = {\n id: record.ID,\n name: record.Name,\n type: record.Type ?? newer?.type,\n rootFileName: record.RootFileName,\n settings: {\n creationTypeId: record[\"TilesetCreation.EntityType.ID\"],\n creationEntityFilter: record[\"TilesetCreation.EntitiesFilter\"],\n creationTerrainSrc: record[\"TilesetCreation.TerrainSource\"],\n creationSettings: record[\"TilesetCreation.Settings\"],\n creationZoomControl: record[\"TilesetCreation.ZoomControl\"],\n origin: {\n ...record.Settings?.origin\n },\n positionOffset: {\n ...record.Settings?.positionOffset\n },\n rotation: {\n ...record.Settings?.rotation\n },\n visual: {\n ...record.Settings?.visual\n },\n dontRotate: record.Settings?.etc?.dontRotate,\n dontTransform: record.Settings?.etc?.dontTransform,\n ExternalTilesetURL: record.Settings?.etc?.ExternalTilesetURL,\n showAdvancedSettings: record.Settings?.etc?.showAdvancedSettings\n } as Tileset.Settings.ILegacy,\n // Not returned in legacy data.\n creationTime: newer?.creationTime,\n // Not returned in legacy data.\n fileIds: newer?.fileIds,\n // Not returned in legacy data.\n generateVersion: newer?.generateVersion,\n // Not returned in legacy data.\n loadUrl: null,\n // Not returned in legacy data.\n modificationTime: newer?.modificationTime,\n // Not returned in legacy data.\n isDeleteDisabled: newer?.isDeleteDisabled,\n // Not returned in legacy data.\n isRestricted: newer?.isRestricted\n };\n return tileset;\n}\n\nfunction convertBackToLegacy(tileset: Tileset.ITileset): any {\n const settings = (tileset.settings ?? {}) as Tileset.Settings.ILegacy;\n const record: any = {\n ID: tileset.id,\n Name: tileset.name,\n Type: tileset.type,\n RootFileName: tileset.rootFileName,\n Settings: {\n origin: {\n ...settings?.origin\n },\n positionOffset: {\n ...settings?.positionOffset\n },\n rotation: {\n ...settings?.rotation\n },\n visual: {\n ...settings?.visual\n },\n etc: {\n dontRotate: settings?.dontRotate,\n dontTransform: settings?.dontTransform,\n showAdvancedSettings: settings?.showAdvancedSettings,\n ExternalTilesetURL: settings?.ExternalTilesetURL\n }\n },\n \"TilesetCreation.EntityType.ID\": settings?.creationTypeId,\n \"TilesetCreation.EntitiesFilter\": settings?.creationEntityFilter,\n \"TilesetCreation.TerrainSource\": settings?.creationTerrainSrc,\n \"TilesetCreation.Settings\": settings?.creationSettings,\n \"TilesetCreation.ZoomControl\": settings?.creationZoomControl\n };\n return record;\n}\n\ntype Settings = Tileset.Settings.IPointcloud |\n Tileset.Settings.ICad |\n Tileset.Settings.IEntitiesMap |\n Tileset.Settings.IEntities |\n Tileset.Settings.IExternalMap |\n Tileset.Settings.IExternalTerrain |\n Tileset.Settings.IMap |\n Tileset.Settings.ITerrain |\n Tileset.Settings.ILegacy;\n\n/**\n * Describes the \"Tileset\" concept in Nextspace.\n *\n * Tilesets come in three possible variants,\n * 1- A set of instructions to generate a tileset.\n * 2- Settings to load a tileset hosted elsewhere.\n * 3- A set of user-provided files to serve.\n *\n * Read the individual tileset-type settings for each variant.\n */\nexport namespace Tileset {\n /**\n * Describes a tileset record.\n */\n export interface ITileset {\n // ID of the tileset record.\n id: string;\n // Human readable name of the tileset.\n name: string;\n // Type of the tileset.\n type: EType;\n // Root file name. Default = \"tileset.json\".\n rootFileName?: string;\n // Tileset settings.\n settings?: Settings;\n // Array of files that make up the tileset.\n fileIds?: string[];\n // Date/time the tileset was created.\n creationTime?: UTC.IUTC;\n // Date/time the tileset was last modified.\n modificationTime?: UTC.IUTC;\n // Version of the tileset. This is bumped on regeneration.\n generateVersion?: number;\n // If deletion is locked. If locked the deleting will throw an error.\n isDeleteDisabled?: boolean;\n // URL to load the tileset with.\n loadUrl?: string;\n // If access to the tileset should be restricted.\n // When a tileset is restricted a user must have the \"Tileset_<tilesetId>\" permission.\n isRestricted?: boolean;\n }\n\n /**\n * Available tileset types.\n */\n export enum EType {\n PointCloud = \"POINT_CLOUD\",\n GeoMap = \"GEO_MAP\", // Previously gtfRasterMaps.\n EntitiesMap = \"ENTITIES_MAP\", // Previously rasterMap.\n EntitiesSet = \"ENTITIES_SET\", // Previously dynamic.\n Cad = \"MODEL\", // Generated CAD tileset from entity id.\n Terrain = \"GEO_TERR\",\n ExternalTerrain = \"EXTERNAL_TERR\",\n ExternalGeoMap = \"EXTERNAL_MAP\",\n LegacyEntitiesSet = \"D\",\n LegacyStatic = \"S\",\n LegacyExternal = \"X\"\n }\n\n /**\n * Available tileset pivot types.\n */\n export enum EPivot {\n // Leaves the pivot as is. This will use the root entity's defined position.\n // Recommended.\n None = \"none\",\n // Moves pivot to the center of the bounding box.\n Box = \"box\",\n // Moves pivot to the graphical center.\n // This will try ignore anomalies.\n Weight = \"weight\",\n // @deprecated.\n UCS = \"ucs\"\n }\n\n /**\n * Returns a tileset record.\n * @param params \n * @returns \n */\n export async function Get(params: {\n api?: BruceApi.Api,\n // ID of the tileset record.\n tilesetId: string,\n // If the tileset files should be loaded.\n // Recommended to be false.\n loadFiles?: boolean,\n req?: Api.IReqParams\n }): Promise<{\n // The tileset record.\n tileset: ITileset\n }> {\n let { api, tilesetId, loadFiles, req: reqParams } = params;\n if (!tilesetId) {\n throw(\"Tileset ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const cache = await api.GetCacheItem(GetCacheKey(tilesetId, loadFiles), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n let data = await api.GET(`tileset/get/${tilesetId}?noFiles=${Boolean(loadFiles) ? 0 : 1}`, reqParams) as Tileset.ITileset;\n // If this is a legacy record we have to re-request using the old endpoint and convert.\n if (data.type == EType.LegacyEntitiesSet || data.type == EType.LegacyStatic || data.type == EType.LegacyExternal) {\n const tmp = await api.GET(`ui.tileset/${tilesetId}`, reqParams);\n data = convertLegacyRec(tmp, data);\n }\n\n res({\n tileset: data\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key: GetCacheKey(tilesetId, loadFiles),\n value: prom,\n req: reqParams\n });\n return prom;\n }\n\n /**\n * Returns tileset types for given tileset ids.\n * @param params\n * @deprecated Just use GetList and Get to find the type from the tileset record.\n * @returns\n */\n export async function GetTypes(params: {\n api?: BruceApi.Api,\n tilesetIds: string[],\n req?: Api.IReqParams\n }): Promise<{\n // Tileset id -> type mapping.\n typeMapping: IDictionary<EType>\n }> {\n // UPDATE: This was corrected, this will be removed.\n // Our api is auto-converting legacy types right now which makes it impossible to know what they are.\n // This uses the legacy end-point which doesn't do that...\n let { api, tilesetIds, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const mapping = {};\n if (tilesetIds.length == 1) {\n const tileset = await api.GET(\"ui.tileset/\" + tilesetIds[0], Api.PrepReqParams(reqParams));\n if (tileset) {\n mapping[tilesetIds[0]] = tileset.Type;\n }\n }\n else if (tilesetIds.length > 1) {\n const tilesets = await api.GET(\"ui.tilesets\", Api.PrepReqParams(reqParams));\n for (const tileset of tilesets) {\n if (tilesetIds.indexOf(tileset.ID) >= 0) {\n mapping[tileset.ID] = tileset.Type;\n }\n }\n }\n return {\n typeMapping: mapping\n };\n }\n\n /**\n * Returns a list of tileset records.\n * @param params \n * @returns \n */\n export async function GetList(params: {\n api?: BruceApi.Api,\n req?: Api.IReqParams\n }): Promise<{\n // The list of tileset records.\n tilesets: ITileset[]\n }> {\n let { api, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const cache = await api.GetCacheItem(GetListCacheKey(), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const req: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(\"tileset/getList\", reqParams) as ITileset[];\n\n // Convert legacy records.\n // Commented out because it spams :)\n // Should use the legacy getList perhaps and substitute needed records.\n /*\n for (let i = 0; i < data.length; i++) {\n const record = data[i];\n if (record.type == EType.LegacyEntitiesSet || record.type == EType.LegacyStatic || record.type == EType.LegacyExternal) {\n data[i] = convertLegacyRec(await api.GET(`ui.tileset/${record.id}`, reqParams), data[i]);\n }\n }\n */\n \n res({\n tilesets: data\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key: GetListCacheKey(),\n value: req,\n req: reqParams\n });\n return req;\n }\n\n /**\n * Deletes a tileset record.\n * @param params \n */\n export async function Delete(params: {\n api?: BruceApi.Api,\n // ID of the tileset record to delete.\n tilesetId: string,\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, tilesetId, req: reqParams } = params;\n if (!tilesetId) {\n throw(\"Tileset ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n await api.DELETE(`tileset/delete/${tilesetId}`, reqParams);\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Tileset + Api.ECacheKey.Id + tilesetId);\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Tileset);\n }\n\n /**\n * Creates or updates a tileset record.\n * @param params \n * @returns \n */\n export async function Update(params: {\n api?: BruceApi.Api,\n // Tileset record to create or update.\n tileset: ITileset,\n req?: Api.IReqParams\n }): Promise<{\n // The tileset record.\n tileset: ITileset\n }> {\n let { api, tileset: data, req: reqParams } = params;\n if (!data?.name || !data?.type) {\n throw(\"Tileset name and type are required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n // We check if the tileset has settings.\n // This is to stop invalid responses from API when we make new tilesets and call an update on them.\n const hasSettings = data.settings && Object.keys(data.settings).length > 0;\n const isNew = !data.id;\n\n if (isNew) {\n const res: ITileset = await api.GET(`tileset/new?type=${data.type}&name=${Api.Encode(data.name)}`, reqParams);\n data = {\n ...res,\n ...data,\n settings: {\n ...res.settings,\n ...data.settings\n },\n id: res.id\n }\n }\n\n // Legacy path. We use a different endpoint and we convert before saving.\n if (data.type == EType.LegacyEntitiesSet || data.type == EType.LegacyStatic || data.type == EType.LegacyExternal) {\n const legacy = convertBackToLegacy(data);\n await api.POST(`ui.tileset/${data.id}`, legacy, Api.PrepReqParams(reqParams));\n }\n else {\n // Avoid calling an update on a new tileset with no settings.\n if (!isNew || hasSettings) {\n await api.POST(`tileset/update/${data.id}`, data, Api.PrepReqParams(reqParams));\n }\n }\n\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Tileset + Api.ECacheKey.Id + data.id);\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Tileset);\n return {\n tileset: data\n };\n }\n\n /**\n * Uploads a file to a tileset.\n * @param params \n */\n export async function UploadFile(params: {\n api?: BruceApi.Api,\n // ID of the tileset to upload to.\n tilesetId: string,\n // File to upload.\n file: File,\n // (Optional) Progress callback.\n onProgress?: (progress: Uploader.IProgress) => void,\n req?: Api.IUploadReqParams\n }): Promise<void> {\n let { api, file, req, tilesetId, onProgress } = params;\n if (!tilesetId || !file) {\n throw(\"Tileset ID and file are required.\");\n }\n const size = file?.size;\n if (!size) {\n throw(\"You cannot upload a 0byte sized file.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n req = Api.PrepReqParams(req) as Api.IUploadReqParams;\n if (size > Uploader.MIN_LARGE_FILE_SIZE) {\n await Uploader.DoMultiPartUpload({\n api,\n file,\n urlSuffix: `tileset/uploadFileEx/${tilesetId}/add`,\n req,\n onProgress\n });\n }\n else {\n req.onProgress = (progress: ProgressEvent) => {\n const percent = Math.round ((progress.loaded / file.size) * 100);\n onProgress?.({\n percent: percent,\n uploaded: false\n });\n };\n await api.UPLOAD(`tileset/uploadFile/${tilesetId}/files`, file, req);\n }\n api.Cache.Remove(GetCacheKey(tilesetId, true));\n onProgress?.({\n percent: 100,\n uploaded: true\n });\n }\n\n /**\n * Deletes a file from a tileset.\n * @param params \n */\n export async function DeleteFile(params: {\n api?: BruceApi.Api,\n // ID of the tileset to delete from.\n tilesetId: string,\n // Name of the file to delete.\n file: string,\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, tilesetId, file, req: reqParams } = params;\n if (!tilesetId || !file) {\n throw(\"Tileset ID and file are required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n await api.DELETE(`tileset/deleteFile/${tilesetId}/files/${file}`, reqParams);\n api.Cache.Remove(GetCacheKey(tilesetId, true));\n }\n\n /**\n * Deletes all files from a tileset.\n * @param params \n */\n export async function DeleteAllFiles(params: {\n api?: BruceApi.Api,\n // ID of the tileset to delete all files from.\n tilesetId: string\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, tilesetId, req } = params;\n if (!tilesetId) {\n throw(\"Tileset ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n req = Api.PrepReqParams(req);\n await api.DELETE(`ui.tileset/${tilesetId}/files`, req);\n\n const cacheKey = `${Api.ECacheKey.Tileset}${Api.ECacheKey.Id}${tilesetId}`;\n api.Cache.RemoveByStartsWith(cacheKey);\n }\n\n /**\n * Uploads a file to a tileset.\n * Src files are used to generate tilesets.\n * @param params \n * @returns \n */\n export async function UploadSrcFile(params: {\n api?: BruceApi.Api,\n // ID of the tileset to upload to.\n tilesetId: string,\n // File to upload.\n file: File,\n // (Optional) Progress callback.\n onProgress?: (progress: Uploader.IProgress) => void,\n req?: Api.IUploadReqParams\n }): Promise<void> {\n let { api, file, req, tilesetId, onProgress } = params;\n if (!tilesetId || !file) {\n throw(\"Tileset ID and file are required.\");\n }\n const size = file?.size;\n if (!size) {\n throw(\"You cannot upload a 0byte sized file.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n req = Api.PrepReqParams(req) as Api.IUploadReqParams;\n if (size > Uploader.MIN_LARGE_FILE_SIZE) {\n await Uploader.DoMultiPartUpload({\n api,\n file,\n urlSuffix: `tileset/uploadFileEx/${tilesetId}/src`,\n req,\n onProgress\n });\n }\n else {\n req.onProgress = (progress: ProgressEvent) => {\n const percent = Math.round ((progress.loaded / file.size) * 100);\n onProgress?.({\n percent: percent,\n uploaded: false\n });\n };\n await api.UPLOAD(`tileset/uploadFile/${tilesetId}/src`, file, req);\n }\n api.Cache.Remove(GetCacheKey(tilesetId, true));\n onProgress?.({\n percent: 100,\n uploaded: true\n });\n return;\n }\n\n /**\n * Deletes a file from a tileset.\n * Src files are used to generate tilesets.\n * @param params \n */\n export async function DeleteSrcFile(params: {\n api?: BruceApi.Api,\n // ID of the tileset to delete from.\n tilesetId: string,\n // Name of the file to delete.\n file: string,\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, tilesetId, file, req: reqParams } = params;\n if (!tilesetId || !file) {\n throw(\"Tileset ID and file are required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n await api.DELETE(`tileset/deleteFile/${tilesetId}/src/${file}`, reqParams);\n api.Cache.Remove(GetCacheKey(tilesetId, true));\n }\n\n /**\n * Returns file url for a file + tileset.\n * @param params \n * @returns \n */\n export function GetFileUrl(params: {\n api?: BruceApi.Api,\n // ID of the tileset.\n tilesetId: string,\n // Default = false.\n viaCdn?: boolean,\n // (Optional) Cache killing token to append to the request url.\n // It is recommended to pass the tileset's generation version.\n cacheToken?: number | string,\n // If this is a legacy tileset, eg: static or dynamic.\n // They have a slightly different folder structure so we adjust the url.\n legacy?: boolean,\n // File or file path to get.\n file: string,\n }): string {\n let { api, tilesetId, file, cacheToken, legacy, viaCdn } = params;\n if (!tilesetId) {\n throw(\"Tileset ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n if (!file) {\n file = \"\";\n }\n return api.ConstructUrl({\n cdn: viaCdn,\n url: `v3/tilesets/${tilesetId}/files/${legacy ? \"\" : \"files/\"}${file}`,\n urlParams: {\n \"cacheToken\": String(cacheToken ? cacheToken : 0)\n }\n });\n }\n\n /**\n * Returns file url for a src file + tileset.\n * @param params \n * @returns \n */\n export function GetSrcFileUrl(params: {\n api?: BruceApi.Api,\n // ID of the tileset.\n tilesetId: string,\n // Name of the file.\n file: string\n }): string {\n let { api, tilesetId, file } = params;\n if (!tilesetId) {\n throw(\"Tileset ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n if (!file) {\n file = \"\";\n }\n return api.ConstructUrl({\n url: `tileset/getFile/${tilesetId}/src/${file}`\n });\n }\n\n /**\n * Returns file url for a file + tileset.\n * @param params \n * @deprecated Use GetFileUrl instead.\n * @returns \n */\n export function GetPublicFileUrl(params: {\n api?: BruceApi.Api,\n // ID of the tileset.\n tilesetId: string,\n // Default = false.\n viaCdn?: boolean,\n // (Optional) Cache killing token to append to the request url.\n viaCdnCacheToken?: number | string,\n file: string\n }): string {\n let { api, tilesetId, file, viaCdn, viaCdnCacheToken } = params;\n if (!tilesetId) {\n throw(\"Tileset ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n if (!file) {\n file = \"\";\n }\n return api.ConstructUrl({\n cdn: viaCdn,\n url: `tileset/file/${tilesetId}/${file}`,\n urlParams: {\n \"cacheToken\": String(viaCdnCacheToken ? viaCdnCacheToken : 0)\n }\n });\n }\n\n /**\n * Calls the generate end-point for a tileset.\n * The requirements for successful generation are based on the type of tileset.\n * @param params \n * @returns \n */\n export async function Generate(params: {\n api?: BruceApi.Api,\n // ID of the tileset to generate.\n tilesetId: string,\n req?: Api.IReqParams\n }): Promise<{\n // ID of the pending action to monitor.\n pendingActionId: number\n }> {\n let { api, tilesetId, req: reqParams } = params;\n if (!tilesetId) {\n throw(\"Tileset ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const res: PendingAction.IAction = await api.GET(`tileset/generate/${tilesetId}`, Api.PrepReqParams(reqParams));\n return {\n pendingActionId: res.ID\n };\n }\n\n /**\n * Utils for publishing the tileset to other Nextspace accounts.\n */\n export namespace Publish {\n export function GetCacheKey(accountId: string, tilesetId?: string): string {\n if (!tilesetId) {\n tilesetId = \"\";\n }\n return Api.ECacheKey.PublishTileset + Api.ECacheKey.Id + accountId + Api.ECacheKey.Id + tilesetId;\n }\n\n export function GetAccessAllowedCacheKey(tilesetId: string, sourceAccountId: string, forAccountId: string) {\n return Api.ECacheKey.PublishTileset + Api.ECacheKey.TilesetAccess + Api.ECacheKey.Id + tilesetId + Api.ECacheKey.Id + sourceAccountId + Api.ECacheKey.Id + forAccountId;\n }\n\n export interface IPublish {\n ID?: number;\n Name: string;\n \"Tileset.ID\"?: string;\n \"PublishedBy.ClientAccount.ID\"?: string;\n \"PublishedBy.User.ID\"?: string;\n \"Published.DateTime\"?: UTC.IUTC;\n IsPublic: boolean;\n \"EnabledFor.ClientAccount.ID\"?: string[];\n }\n\n export async function Update(params: {\n api?: GlobalApi.Api,\n published: IPublish,\n req?: Api.IReqParams\n }): Promise<{\n published: IPublish\n }> {\n let { api, published: data, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetGlobalApi();\n }\n\n if (!data?.[\"Tileset.ID\"] || !data?.[\"PublishedBy.ClientAccount.ID\"] || !data?.[\"PublishedBy.User.ID\"]) {\n throw(\"Tileset ID, client account ID, and user ID are required.\");\n }\n if (!data.ID) {\n data.ID = 0;\n }\n const res: IPublish = await api.POST(`tileset/${data.ID}`, data, reqParams);\n const req = {\n \"ClientAccount.ID\": data[\"EnabledFor.ClientAccount.ID\"]\n };\n data.ID = res.ID;\n await api.POST(`tileset/${data.ID}/enableForAccounts`, req, reqParams);\n await api.Cache.Remove(GetCacheKey(data[\"PublishedBy.ClientAccount.ID\"], data[\"Tileset.ID\"]));\n await api.Cache.Remove(GetCacheKey(data[\"PublishedBy.ClientAccount.ID\"]));\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.PublishTileset + Api.ECacheKey.TilesetAccess);\n return {\n published: data\n };\n }\n\n export async function Get(params: {\n api?: GlobalApi.Api,\n accountId: string,\n tilesetId: string,\n req?: Api.IReqParams\n }): Promise<{\n published: IPublish\n }> {\n let { api, accountId, tilesetId, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetGlobalApi();\n }\n\n if (!accountId || !tilesetId) {\n throw(\"Client account ID and tileset ID are required.\");\n }\n const cache = await api.GetCacheItem(GetCacheKey(accountId, tilesetId), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(`tilesetByPublisher/${accountId}/${tilesetId}`, reqParams);\n res({\n published: data\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key: GetCacheKey(accountId, tilesetId),\n value: prom,\n req: reqParams\n });\n return prom;\n }\n\n export async function GetList(params: {\n api?: GlobalApi.Api,\n accountId: string,\n req?: Api.IReqParams\n }): Promise<{\n published: IPublish[]\n }> {\n let { api, accountId, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetGlobalApi();\n }\n\n if (!accountId) {\n throw(\"Client account ID is required.\");\n }\n const cache = await api.GetCacheItem(GetCacheKey(accountId), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const req: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(`tilesets/enabledForAccount/${accountId}`, reqParams);\n res({\n published: data.Items\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key: GetCacheKey(accountId),\n value: req,\n req: reqParams\n });\n return req;\n }\n\n /**\n * Returns if a given tileset is allowed to be loaded for a given account.\n * @param params \n */\n export async function IsAccessAllowed(params: {\n // Tileset + account from which to load.\n tilesetId: string,\n sourceAccountId: string,\n getters?: ApiGetters,\n // Account we're loading in.\n forAccountId?: string,\n // Default is true.\n checkFreeOption?: boolean,\n req?: Api.IReqParams\n }): Promise<boolean> {\n let { tilesetId, sourceAccountId, getters, forAccountId, checkFreeOption, req } = params;\n if (!forAccountId) {\n forAccountId = ENVIRONMENT.PARAMS.accountId;\n }\n if (checkFreeOption == null) {\n checkFreeOption = true;\n }\n\n // Null source account id means it's a tileset from within the same account.\n // We also don't want to bother looking for records if we're loading in our own account.\n if (forAccountId == sourceAccountId || !sourceAccountId) {\n return true;\n }\n if (!getters) {\n getters = ENVIRONMENT.Api();\n }\n req = Api.PrepReqParams(req);\n const globalApi = getters.GetGlobalApi();\n\n const key = GetAccessAllowedCacheKey(tilesetId, sourceAccountId, forAccountId);\n const cacheData = globalApi.GetCacheItem(key, req);\n if (cacheData?.found) {\n return cacheData.data;\n }\n const prom: Promise<boolean> = new Promise(async (res, rej) => {\n try {\n // We try find the published record for the tileset.\n // If it doesn't exist, then it's not published.\n const {published} = await GetList({\n accountId: forAccountId,\n api: globalApi,\n });\n const tileset = published.find(x => x[\"Tileset.ID\"] == tilesetId && x[\"PublishedBy.ClientAccount.ID\"] == sourceAccountId);\n const allowed = tileset != null;\n if (allowed) {\n res(true);\n }\n\n // If not allowed we'll check if this is a CC3D tileset and if it's set as the selected \"free\" one.\n // This is a placeholder feature until a marketplace system is made.\n if (String(sourceAccountId).toLowerCase().trim() == \"cc3d\" && checkFreeOption) {\n const settings = (await Account.GetAppSettings({\n accountId: forAccountId,\n appId: Account.EAppId.Navigator,\n api: getters.GetGuardianApi()\n })).settings as AccountSettings.INavigator;\n const cc3dTilesetId = settings?.published?.freeCC3dTilesetId;\n if (cc3dTilesetId == tilesetId) {\n res(true);\n }\n }\n\n res(false);\n }\n catch (e) {\n rej(e);\n }\n });\n globalApi.SetCacheItem({\n key: key,\n value: prom,\n req: req\n });\n return prom;\n }\n }\n\n export namespace Settings {\n export interface ICad {\n rootEntityId: string;\n entityTypeId: string;\n styleId?: number;\n lodKey?: string;\n movePivot?: Tileset.EPivot;\n ucsId?: number;\n epsg?: number;\n thumbFileId?: string;\n location?: Carto.ICarto;\n offset?: any;\n transform?: Transform.ITransform;\n doubleSided?: boolean;\n b3dmFileSize?: number;\n maximumScreenSpaceError?: number;\n }\n\n export enum EMapTileSize {\n IMG_256 = 256,\n IMG_512 = 512,\n IMG_1024 = 1024,\n IMG_2048 = 2048\n }\n\n export interface IEntitiesMap {\n imageSize: EMapTileSize;\n levelMin: number;\n levelMax: number;\n entityTypeId: string;\n styleId: number;\n filter: any;\n boundaries: Bounds.IBounds;\n }\n\n export interface IEntities {\n zoomControl?: any[];\n boundaries?: Bounds.IBounds;\n filter?: any;\n altitudeRefType?: string;\n terrainSource?: string;\n terrainUri?: string;\n doubleSided?: boolean;\n entityTypeId?: string;\n styleId?: number;\n tilesetId?: string;\n }\n\n export enum EExternalMapType {\n TileMapImagery = \"TileMapImagery\",\n OpenStreetMapImagery = \"OpenStreetMapImagery\",\n MapBoxImagery = \"MapBoxImagery\",\n CesiumIon = \"CesiumIon\",\n CustomTemplate = \"Static\"\n }\n\n export interface IExternalMap {\n url?: string;\n mapType?: EExternalMapType;\n fileExtension?: string;\n externalId?: number | string;\n styleId?: string;\n account?: string;\n key?: string;\n iconClientFileId?: string;\n }\n\n export interface IExternalTerrain {\n requestVertexNormals?: boolean;\n url?: string;\n }\n\n export interface IMap {\n sourceFileId: string;\n imageSize: number;\n levelMin: number;\n levelMax: number;\n boundaries?: Bounds.IBounds;\n }\n\n export interface IPointcloud {\n sourceFileIds: string[];\n location: Carto.ICarto;\n transform: Transform.ITransform;\n pntFileSize?: number;\n epsg?: number;\n attenuation?: boolean;\n attenuationMax?: number;\n movePivot?: Tileset.EPivot;\n maximumScreenSpaceError?: number;\n }\n\n export interface ITerrain {\n sourceFileId?: string;\n startLevel?: number;\n }\n\n /**\n * Legacy settings for legacy tileset types that we still need to upgrade.\n */\n export interface ILegacy {\n creationTypeId?: string;\n creationEntityFilter?: any;\n creationTerrainSrc?: any; \n creationSettings?: any;\n creationZoomControl?: any;\n origin?: {\n latitude: number;\n longitude: number;\n altitude: number;\n usingBoundingBox: boolean;\n };\n positionOffset?: {\n north: number;\n east: number;\n altitude: number;\n };\n rotation?: {\n x: number;\n y: number;\n z: number;\n };\n visual?: {\n maximumScreenSpaceError?: number;\n attenuation?: boolean;\n attenuationMax?: number;\n colorMask?: string;\n },\n dontRotate?: boolean;\n dontTransform?: boolean;\n showAdvancedSettings?: boolean;\n ExternalTilesetURL?: string;\n }\n }\n\n /**\n * Returns cache identifier for a tileset.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetCacheKey(\"abc\", false);\n * api.Cache.Remove(key);\n * }\n * @param tilesetId\n * @param loadFiles\n * @returns \n */\n export function GetCacheKey(tilesetId: string, loadFiles: boolean): string {\n return `${Api.ECacheKey.Tileset}${Api.ECacheKey.Id}${tilesetId}${Api.ECacheKey.Id}${loadFiles}`;\n }\n\n /**\n * Returns cache identifier for a list of tilesets.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetListCacheKey();\n * api.Cache.Remove(key);\n * }\n * @returns\n */\n export function GetListCacheKey(): string {\n return Api.ECacheKey.Tileset;\n }\n}","import {IDictionary} from \"../bruce-models\";\nimport { Entity } from \"../entity/entity\";\nimport { Tileset } from \"../tileset/tileset\";\nimport { ObjectUtils } from \"../util/object-utils\";\nimport { ZoomControl } from \"./zoom-control\";\n\n/**\n * Describes a menu item found in project views.\n * Menu items are used to dictate what data to load in a scene.\n * A menu item may be a container for other items.\n */\nexport namespace MenuItem {\n /**\n * Possible types of menu items.\n */\n export enum EType {\n // Container for other menu items.\n None = \"NONE\",\n // Renders Nextspace Entities based on an Entity Type ID and optional attribute filter.\n Entities = \"BruceEntity\",\n // Renders a single Entity by ID.\n Entity = \"SingleEntity\",\n // Renders Cesium OSM Buildings.\n Osm = \"OSMBuildingsTileset\",\n // Renders a Cesium Tileset made from importing an assembly file into Nextspace.\n CadTileset = \"ModelTileset\",\n // Renders legacy Nextspace tilesets.\n // This is primarily used for static Tilesets as they don't have an upgraded version yet.\n ArbTileset = \"ArbitraryTileset\",\n // Renders a Cesium Tileset by Ion asset ID.\n IonTileset = \"Cesium3DTileset\",\n // Renders a KML file in Cesium.\n // No data is managed, this is purely visual.\n Kml = \"StaticKML\",\n // Renders rows of a CSV as Cesium Entities.\n // This a single-purpose proof of concept feature. Avoid using.\n Csv = \"StaticCSV\",\n // Renders a Cesium Tileset made from arbitrary Nextspace Entities.\n EntityTileset = \"EntitiesTileset\",\n // Renders a Cesium Imagery made from arbitrary Nextspace Entities.\n // @deprecated.\n EntityRaster = \"RasterEntitiesTileset\",\n // Renders a Cesium Point Cloud imported from LAS/LAZ file into Nextspace.\n PointCloud = \"PointCloudTileset\",\n // Renders preloaded Entity records.\n EntitiesLoaded = \"LoadedEntities\",\n // Renders Entities matching specific IDs.\n EntitiesIds = \"EntitiesIds\",\n // @deprecated. Use Relationships instead.\n Relations = \"Relations\",\n // Renders Entity relationships.\n // This renders specified downstream relationship types for specified Entity IDs.\n Relationships = \"Relationships\",\n // Renders the Cesium Google photogrammetry tileset.\n GooglePhotoTileset = \"GooglePhotoTileset\",\n // Renders the result of a Google search.\n // Eg: the Menu Item can be configured to render 'restaurants' around the viewport.\n GoogleSearch = \"GoogleSearch\",\n // Renders a ArcGIS I3S scene.\n I3sTileset = \"I3STileset\",\n }\n\n /**\n * @derepcated.\n */\n export interface ILegend {\n model3d: boolean;\n point: boolean;\n polygon: boolean;\n polylines: boolean;\n tileset3d: boolean;\n }\n\n /**\n * Settings related to how authoring for a menu item should behave.\n */\n export interface IAuthorSettings {\n // If true, the clicked entity will be read and used to update the authored entity.\n readClickedEntity?: boolean;\n // Optional relationship type to use when relating to the clicked entity.\n clickedRelationTypeId?: string;\n // If set, specified attributes will be copied between the clicked and authored entities.\n copyClickedAttrMapping?: {\n // String is a wrapped path, check PathUtils.\n fromPathStr: string;\n toPathStr: string;\n }[];\n }\n\n /**\n * Describes a menu item found in project views.\n */\n export interface IItem {\n // Unique id for this menu item.\n id: string;\n // Human readable name for this menu item.\n Caption: string;\n // Description for this menu item. Optional.\n Description?: string;\n // If this menu item is pinned.\n // This makes it visible to viewers without it having been enabled in the bookmark.\n // This is used to focus the panel to only parts the editor wants the viewer to control.\n Pinned?: boolean;\n // If the item's type is null or None then it is a container for other items.\n Children?: IItem[];\n // The type of menu item.\n Type: EType;\n // If true, the menu item's children will be hidden from UI.\n hideChildren?: boolean;\n // @deprecated.\n legend?: ILegend;\n // If true, the menu item will allow the user to author entities in the scene.\n // This is only available for certain menu item types.\n authoringEnabled?: boolean;\n // Settings related to how authoring for a menu item should behave.\n authoring?: IAuthorSettings;\n // @deprecated.\n LabelColor?: string;\n // Priority in relation to other menu items.\n // Higher number priority graphics take priority over lower number priority graphics.\n // This is important of two of the same entity are rendered between different menu items.\n renderPriority?: number;\n // Default = false.\n cdnEnabled?: boolean;\n // Used to kill cache. Default = 0.\n // Tilesets have their own counter within their records.\n // This is used for non-tileset items.\n cdnCounter?: number;\n }\n\n /**\n * Creates a menu item for a single entity.\n * @param entityId \n * @param typeId \n * @param styleId \n * @returns \n */\n export function CreateFromEntityId(entityId: string, typeId: string, styleId?: number): IItem {\n return <Item.IEntity>{\n id: ObjectUtils.UId(),\n Type: EType.Entity,\n Caption: \"Generated Entity Menu Item\",\n BruceEntity: {\n \"EntityType.ID\": typeId,\n EntityId: entityId\n },\n CameraZoomSettings: [\n {\n DisplayType: ZoomControl.EDisplayType.Model3D,\n MaxZoom: 1000000,\n MinZoom: 0,\n StyleID: styleId\n }\n ]\n };\n }\n\n /**\n * Creates a menu item for an entity type.\n * @param typeId \n * @param styleId \n * @returns \n */\n export function CreateFromTypeId(typeId: string, styleId?: number): IItem {\n return <Item.IEntities>{\n id: ObjectUtils.UId(),\n Type: EType.Entities,\n Caption: \"Generated Entity Type Menu Item\",\n BruceEntity: {\n \"EntityType.ID\": typeId\n },\n CameraZoomSettings: [\n {\n DisplayType: ZoomControl.EDisplayType.Model3D,\n MaxZoom: 100000,\n MinZoom: 0,\n StyleID: styleId\n }\n ]\n };\n }\n\n /**\n * Creates a menu item for a tileset.\n * @param tilesetId \n * @param type \n * @returns \n */\n export function CreateFromTilesetId(tilesetId: string, type: Tileset.EType): IItem {\n if (type === Tileset.EType.Cad) {\n return <Item.ICadTileset>{\n\t id: ObjectUtils.UId(),\n\t Type: EType.CadTileset,\n Caption: \"Generated CAD Menu Item\",\n\t FlyTo: false,\n\t\t\t\ttileset: {\n\t\t\t\t\tTilesetID: tilesetId\n\t\t\t\t}\n };\n }\n else if (type == Tileset.EType.EntitiesSet) {\n return <Item.IEntitiesTileset>{\n id: ObjectUtils.UId(),\n Type: EType.EntityTileset,\n Caption: \"Generated Entities Menu Item\",\n FlyTo: false,\n tileset: {\n TilesetID: tilesetId\n }\n };\n }\n else if (type == Tileset.EType.PointCloud) {\n return <Item.IPointcloud>{\n id: ObjectUtils.UId(),\n Type: EType.PointCloud,\n Caption: \"Generated Point Cloud Menu Item\",\n FlyTo: false,\n tileset: {\n TilesetID: tilesetId\n }\n };\n }\n else if (type == Tileset.EType.EntitiesMap) {\n return <Item.IEntitiesRaster>{\n id: ObjectUtils.UId(),\n Type: EType.EntityRaster,\n Caption: \"Generated Entities Menu Item\",\n tileset: {\n TilesetID: tilesetId\n }\n };\n }\n throw(\"Tileset type not supported.\");\n }\n\n export namespace Item {\n /**\n * Tileset load information.\n */\n export interface ITileset {\n // Failsafe. Not recommended to use.\n TilesetURL?: string;\n // Client account ID where the tileset is hosted.\n // If unspecified then it will assume the same account as the project view.\n ClientAccountID?: string;\n // Tileset ID.\n TilesetID?: string;\n // @deprecated.\n TilesetName?: string;\n }\n\n /**\n * Settings related to how entity clustering should behave.\n */\n export interface IClustering {\n // Minimum distance to an entity for it to cluster.\n // bruce-cesium/point-clustering.ts will have 5000 as default.\n minDistance?: number;\n // Minimum total loaded for the menu item for clustering to kick in.\n // bruce-cesium/point-clustering.ts will have 0 as default.\n // It will always try to cluster when points are near each-other and camera is far away.\n minTotalCount?: number;\n // TODO: Zoom control-like settings for clustering.\n // Between x and y meters the points should cluster with z distance.\n // Eg: \"Between 5,000 and 15,000 meters the points should cluster within 500 meters.\"\n }\n\n /**\n * Menu item for loading Nextspace vector or 3D model entities.\n */\n export interface IEntities extends IItem {\n Type: EType.Entities;\n BruceEntity: {\n // Entity type ID to filter against.\n \"EntityType.ID\": string;\n // (Optional) Entity attribute filter.\n Filter?: IDictionary<string>;\n\n // (Optional) Attribute path to filter for historic Entity records.\n // The viewer's date-time value will be used in combination with this attribute to filter records.\n // When set, the Menu Item will monitor the date-time value changing and re-request records.\n historicAttrKey?: string;\n\n // (Optional) alternative schema to request.\n // This is used to calculate read-only entity data.\n schemaId?: string;\n\n // (Optional) If true, Menu Item will display individual sub-items for Tags.\n ExpandLayers?: boolean;\n // If ExpandLayers = true, this is the saved sub-items to render.\n // If this is null or empty, that means there is nothing to render for this menu item.\n SelectedExpandLayers?: number[];\n };\n // Zoom control to dictate how entities look at different distances from the camera.\n CameraZoomSettings?: ZoomControl.IItem[];\n // If true, historic Entities will interpolate between records based on current scene time.\n // This will slow down initial render as more data will be required for the render.\n historicInterpolation?: boolean;\n\n // If true, menu item will render point and icon entities as clustered points when close together.\n enableClustering?: boolean;\n clustering?: IClustering;\n\n // If BruceEntity.ExpandLayers = true,\n // this will dictate if camera should be used to scan for tags in view.\n filterLayersByCameraLocation?: boolean;\n showAllLayersExcludeBelow?: boolean;\n layers?: number[];\n extLayers?: {\n ID: number,\n checked: boolean\n }[];\n\n // Experimental flag for rendering entities as geojson.\n // This only supports polygons and polylines.\n // Only works OK with flat terrain and no ground occlusion.\n renderAsGeojson?: boolean;\n }\n\n /**\n * Menu item for loading a single Nextspace vector or 3D model entity.\n */\n export interface IEntity extends IItem {\n Type: EType.Entity;\n BruceEntity: {\n // Entity type ID to filter against.\n \"EntityType.ID\"?: string;\n // Entity ID to load.\n EntityId: string;\n };\n // Zoom control to dictate how entities look at different distances from the camera.\n CameraZoomSettings?: ZoomControl.IItem[];\n showAllLayers?: boolean;\n showAllLayersExcludeBelow?: boolean;\n }\n\n /**\n * Menu item for loading a legacy tileset.\n */\n export interface IArbTileset extends IItem {\n Type: EType.ArbTileset | EType.IonTileset;\n // @deprecated\n FlyTo?: boolean;\n BruceEntity?: {\n // Preferred entity type ID for making new entity records.\n // When a graphic is selected in UI and no record is found, this type ID will be used as the suggested type.\n \"EntityType.ID\"?: string;\n };\n // Tileset load information.\n tileset?: ITileset;\n // Style mapping between entity type IDs to style IDs.\n StyleMapping?: any[];\n // Fallback style ID when no mapped style is found.\n styleId?: number;\n // If true, the menu item will apply styles to the tileset.\n ApplyStyles?: boolean;\n // If set, an ion asset is loaded in place of a Nextspace tileset.\n IonResource?: {\n AssetID: string | number;\n // If not supplied then the client account default is used.\n AccessToken?: string;\n }\n }\n export interface IIonTileset extends IArbTileset {}\n\n /**\n * Menu item for loading a CAD tileset.\n */\n export interface ICadTileset extends IItem {\n Type: EType.CadTileset;\n // Tileset load information.\n tileset: ITileset;\n // @deprecated\n FlyTo?: boolean;\n // Style mapping between entity type IDs to style IDs.\n StyleMapping?: any[];\n // Setting for how the style colours should be blended.\n StyleBlending?: {\n // Hightlight = 0, replace = 1, mix = 2.\n blendMode: 0 | 1 | 2;\n // 1 = 100% new colour. 0 = original colour.\n blendPercent: number;\n };\n // Fallback style ID when no mapped style is found.\n styleId?: number;\n BruceEntity?: {\n // Optional restriction.\n // When not null, only entities matching supplied ids will be visible.\n EntityIds?: string[];\n // Optional styling.\n // When entity ids are set, other entities can optionally be \"ghosts\".\n // This means they will be available but at low opacity.\n Ghosts?: boolean;\n }\n }\n\n /**\n * Menu item for loading a point cloud tileset.\n */\n export interface IPointcloud extends IItem {\n Type: EType.PointCloud;\n // @deprecated\n FlyTo?: boolean;\n // Tileset load information.\n tileset: ITileset;\n }\n\n /**\n * Menu item for loading a raster tileset.\n * This is deprecated and unsupported in the latest web-Navigator.\n * If needed, load through the imagery panel.\n */\n export interface IEntitiesRaster extends IItem {\n Type: EType.EntityRaster;\n tileset: ITileset;\n }\n\n /**\n * Menu item for loading a Cesium OSM tileset.\n */\n export interface IOsm extends IItem {\n Type: EType.Osm;\n BruceEntity?: {\n // Preferred entity type ID for making new entity records.\n // When a graphic is selected in UI and no record is found, this type ID will be used as the suggested type.\n \"EntityType.ID\"?: string;\n // Source record for loading and saving the mapping between OSM IDs and Nextspace IDs.\n SourceId: string;\n };\n // If enabled then pending OSM buildings will be partially transparent.\n // A building is considered pending while it hasn't checked for a corresponding Nextspace ID.\n ghostLoading?: boolean;\n }\n\n /**\n * Menu item for loading a static KML file.\n */\n export interface IKml extends IItem {\n Type: EType.Kml;\n // Array of KML files to load.\n KML?: {\n // KML file to load.\n ClientFile?: {\n ID: string;\n },\n // Arbitrarily hosted file to load instead of a client file.\n fileUrl?: string;\n }[]\n }\n\n /**\n * Menu item for loading a static CSV file.\n * This is made for a specific proof of concept purpose and will likely not work with other CSV files.\n * Avoid using.\n */\n export interface ICsv extends IItem {\n Type: EType.Csv;\n // Array of CSV files to load.\n CSV?: {\n // CSV file to load.\n ClientFile?: {\n ID: string;\n },\n // Arbitrarily hosted file to load instead of a client file.\n fileUrl?: string;\n // 3D model client file ID used for animated CSV \"journey\" lines.\n vehicleFileId?: string;\n // CSS color string for the line.\n lineColor?: string;\n // File to use for the alert icons.\n alertFileId?: string;\n // Entity ID to link the vehicle to.\n // This will make the vehicle selectable in the scene.\n vehicleEntityId?: string;\n }[]\n }\n\n /**\n * Menu item for loading a tileset made from entities.\n */\n export interface IEntitiesTileset extends IItem {\n BruceEntity?: {\n // Preferred entity type ID for making new entity records.\n // When a graphic is selected in UI and no record is found, this type ID will be used as the suggested type.\n // (Commonly used for shared tilesets across accounts).\n \"EntityType.ID\"?: string;\n };\n Type: EType.EntityTileset;\n // @deprecated\n FlyTo: boolean;\n // Tileset load information.\n tileset: ITileset;\n // Point cloud settings as this tileset can include point clouds and 3d models.\n // The use-case is that this tileset is made from entities and what the user wants to show between bookmarks is different.\n // Bookmarks have \"menuItemAlternations\" to have different settings for menu items per bookmark.\n attenuation?: boolean;\n attenuationMax?: number;\n // Style ID to apply when ApplyStyles is true.\n styleId?: number;\n // If true, the menu item will apply styles to the tileset.\n // Only 3d-model styling is applied as all entities in this tileset are considered 3d-models.\n ApplyStyles?: boolean;\n }\n\n /**\n * Menu item that loads preloaded entity records.\n */\n export interface IEntitiesLoaded extends MenuItem.IItem {\n Type: EType.EntitiesLoaded;\n BruceEntity: {\n // TODO: is this needed?\n \"EntityType.ID\"?: string;\n // Array of entity records to load.\n Entities: Entity.IEntity[];\n };\n // Zoom control to dictate how entities look at different distances from the camera.\n CameraZoomSettings?: ZoomControl.IItem[];\n\n // Experimental flag for rendering entities as geojson.\n // This only supports polygons and polylines.\n // Only works OK with flat terrain and no ground occlusion.\n renderAsGeojson?: boolean;\n }\n\n /**\n * Menu item that loads specific entity ids.\n */\n export interface IEntityIds extends MenuItem.IItem {\n Type: EType.EntitiesIds;\n BruceEntity: {\n // Array of entity ids to load.\n EntityIds: string[];\n };\n // Zoom control to dictate how entities look at different distances from the camera.\n CameraZoomSettings?: ZoomControl.IItem[];\n\n // If true, menu item will render point and icon entities as clustered points when close together.\n // Default = false.\n enableClustering?: boolean;\n clustering?: IClustering;\n\n // Experimental flag for rendering entities as geojson.\n // This only supports polygons and polylines.\n // Only works OK with flat terrain and no ground occlusion.\n renderAsGeojson?: boolean;\n }\n\n /**\n * Auto-generated menu item when entity-relationships are marked to be rendered.\n * @deprecated, use IRelationships instead.\n */\n export interface ILegacyRelationships extends MenuItem.IItem {\n Type: EType.Relations;\n BruceEntity?: {\n EntityIds?: string[];\n },\n }\n\n /**\n * Describes a relationship group to render.\n */\n export interface IRenderedRelations {\n // Entities to drawn relationships for.\n // Downstream relationships will be drawn for these entities.\n entityIds: string[];\n // The relationship type to render for the ids.\n relationTypeId: string;\n }\n\n /**\n * Auto-generated menu item when entity-relationships are marked to be rendered.\n */\n export interface IRelationships extends MenuItem.IItem {\n Type: EType.Relationships;\n // Relationships to render.\n // This is an entityIds -> relationship type grouping.\n // The relationships will be drawn downstream only.\n relations?: IRenderedRelations[];\n }\n\n export interface IGooglePhotoTileset extends IItem {\n Type: EType.GooglePhotoTileset;\n // Css color string to apply to the tileset.\n // This follows Cesium logic for when color is pure white,\n // that means don't apply colour and only apply alpha.\n colorMask?: string;\n }\n\n export interface IGoogleSearch extends IItem {\n Type: EType.GoogleSearch;\n // Search keyword, eg: 'restaurants'.\n keyword: string;\n // Google API Key to use.\n // If not provided then the account default will be used.\n accessToken?: string;\n }\n\n export interface II3sTileset extends IItem {\n Type: EType.I3sTileset;\n // Terrain provider which provides geoid conversion between gravity related and ellipsoidal based height systems.\n geoidServiceUrl?: string;\n tileset?: {\n // URL to the Tileset we want to load.\n TilesetURL?: string;\n }\n }\n }\n}","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { Camera } from \"../common/camera\";\nimport { IDictionary } from \"../common/dictionary\";\nimport { UTC } from \"../common/utc\";\nimport { ENVIRONMENT } from \"../environment\";\nimport { Markup } from \"../markup/markup\";\nimport { Section } from \"../common/section\";\nimport { MenuItem } from \"./menu-item\";\nimport { ProjectViewTile } from \"./project-view-tile\";\n\n/**\n * Describe the \"Project View Bookmark\" concept within Nextspace.\n * This is referred to as \"slides\" in older code.\n *\n * A bookmark is a snapshot of what should be displayed and how in a particular project view.\n */\nexport namespace ProjectViewBookmark {\n // This is the expected default version for the DataVersion value.\n // This value should NOT be changed without looking at our API and seeing what the default value is.\n export const DEFAULT_DATA_VERSION = 2;\n\n /**\n * Describes a bookmark record.\n */\n export interface IBookmark {\n // ID of the bookmark record.\n ID?: string;\n // Human readable title of the bookmark.\n Title?: string;\n // Human readable description of the bookmark.\n Note?: string;\n // ID of the client file used for the bookmark thumbnail.\n // Must be set. Use an empty string if no thumbnail is desired.\n \"Screenshot.ClientFile.ID\"?: string;\n // ID of the associated project view.\n \"UI.View.ID\"?: string;\n // ID of the user who created the bookmark.\n \"Created.ByUser.ID\"?: string;\n // Date/time the bookmark was created.\n \"Created.Date\"?: UTC.IUTC;\n // Bookmark grouping ID.\n \"UI.SlideGroup.ID\"?: number;\n // This is the version of the data in the bookmark.\n // This is used to determine how to parse the bookmark's settings.\n // 1 - 10,000 are reserved for Nextspace use.\n DataVersion: number;\n // Display order related to sibling bookmarks.\n DisplayOrder?: number;\n // Settings for the bookmark.\n Settings?: Settings;\n // Bookmark camera position.\n Camera?: Web3d.ICamera | Web2d.ICamera;\n // Clipping planes to apply to terrain/entities in the scene.\n // A clipping plane is associated with a tileset by root entity id.\n sections?: Section.ISection[];\n }\n\n export type Settings = ISettings | IWeb3dSettings | IWeb2dSettings;\n\n export interface ISettings {\n // No shared settings yet!\n }\n\n /**\n * Describes the content of a bookmark.\n * As part of a deal we've been commissioned to create an alternative bookmark type to embed content.\n */\n export enum EContentType {\n WEB_3D = \"WEB_3D\",\n IFRAME = \"IFRAME\"\n }\n\n /**\n * These are the base settings expected in any 3D bookmark.\n * The only exception is data-version = 1 which is our deprecated legacy format.\n */\n export interface IWeb3dSettings extends ISettings {\n // Default is WEB_3D. This will render the typical CesiumJS experience.\n // IFRAME will render an embedded iframe in the bookmark.\n contentType?: EContentType;\n // This is the URL to the iframe content.\n // This is only used when contentType = IFRAME.\n iframeUrl?: string;\n\n menuItemIds?: string[];\n // This is a map of menu item ids to their alternations.\n // An alternation is a menu item that has varied settings to the base menu item.\n // For example, the base menu item might be \"enabled certain tags\", and the alternation is \"enabled x,y,z certain tags\" to be specific in a bookmark.\n menuItemAlternations?: IDictionary<MenuItem.IItem>;\n // Array of entity ids for which to draw labels for.\n // If empty, no labels are drawn.\n labelledEntityIds?: string[];\n // Bookmark-wide relationships to render.\n // The lines will render regardless of entities being rendered.\n renderedRelations?: MenuItem.Item.IRenderedRelations[];\n groundOcclusion?: boolean;\n // Null = use default, empty array = no imagery.\n imagery?: ProjectViewTile.IBookmarkImagery[];\n terrain?: ProjectViewTile.IBookmarkTerrain;\n // Css color string to apply to the base globe.\n globeColor?: string;\n // 0 = 0%, 1 = 100%. Default is 100%.\n globeAlpha?: number;\n // If true, the globe will be hidden. Default is false.\n globeHidden?: boolean;\n markup?: Markup.IMarkup;\n shadows?: Web3d.IShadows;\n ambientOcclusion?: Web3d.IAmbientOcclusion;\n lighting?: Web3d.ILighting;\n quality?: Web3d.IQuality;\n contours?: Web3d.IContours;\n // iso8601 date time string.\n // String itself includes timezone information. Navigator will create a UTC string when saving.\n // Eg: '2023-11-20T23:00:00Z' = 2023-11-20 11:00:00 PM UTC.\n dateTime?: string;\n // DateTime movement settings.\n timeline?: Web3d.ITimeline;\n // Entity id -> opacity. Where 1 = 100% opacity.\n entityOpacityMap?: IDictionary<number>;\n // Null = use default, empty array = deselect.\n // If default is null then selected ids should not be altered.\n selectedEntityIds?: string[];\n hiddenEntityIds?: string[];\n isolatedEntityIds?: string[];\n // This enables lighting that makes terrain elevation apparent.\n hillShades?: boolean;\n // This is a list of entity ids that are refreshed every x seconds.\n // We'll enforce about 200 maximum ids. Refresh every 2 - 5 seconds.\n liveEntityIds?: string[];\n // This will enable the wireframe view for the terrain provider.\n terrainWireframe?: boolean;\n // A bit of an awkward transition from the old system.\n // We render \"all\" relationships for given entity ids.\n // This will create a menu item under the hood, later we will use menu items directly.\n // @deprecated, use 'renderedRelations' instead.\n renderedEntityRelations?: string[];\n }\n\n /**\n * These are the base settings expected in any 2D bookmark.\n * This is our WIP graph viewer.\n * @warning as this project is in beta, all updates are subject to breaking changes.\n */\n export interface IWeb2dSettings extends ISettings {\n // Definition for the background of the view.\n background?: Web2d.IBackground;\n // Camera location and zoom level.\n camera?: Web2d.ICamera;\n // Selected Entity IDs.\n selectedIds?: string[];\n // Selected relationship.\n selectedRelation?: Web2d.IRelationMetadata;\n // Rendered array of relationships.\n // Likely to be moved into a client file JSON representing a rendered scene.\n relationships?: Web2d.IRelationship[];\n // Rendered array of entities.\n // Likely to be moved into a client file JSON representing a rendered scene.\n entities?: Web2d.IEntity[];\n }\n\n /**\n * Gets a bookmark record.\n * @param params \n * @returns \n */\n export async function Get(params: {\n api?: BruceApi.Api,\n // ID of the associated project view.\n viewId: string,\n // Bookmark record ID.\n bookmarkId: string,\n req?: Api.IReqParams\n }): Promise<{\n // Bookmark record.\n bookmark: IBookmark\n }> {\n let { api, viewId, bookmarkId, req: reqParams } = params;\n if (!viewId || !bookmarkId) {\n throw(\"View ID and Bookmark ID are required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n \n const key = GetCacheKey(viewId, bookmarkId);\n const cache = await api.GetCacheItem(key, reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(`ui.view/${viewId}/slide/${bookmarkId}`, Api.PrepReqParams(reqParams));\n res({\n bookmark: data\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key,\n value: prom,\n req: reqParams\n });\n return prom;\n }\n\n /**\n * Deletes a bookmark record.\n * @param params \n */\n export async function Delete(params: {\n api?: BruceApi.Api,\n // ID of the associated project view.\n viewId: string,\n // Bookmark record ID.\n bookmarkId: string,\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, viewId, bookmarkId, req: reqParams } = params;\n if (!viewId || !bookmarkId) {\n throw(\"View ID and Bookmark ID are required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n await api.DELETE(`ui.view/${viewId}/slide/${bookmarkId}`, Api.PrepReqParams(reqParams));\n api.Cache.Remove(GetCacheKey(viewId, bookmarkId));\n api.Cache.Remove(GetListCacheKey(viewId));\n }\n\n /**\n * Gets a list of bookmark records.\n * @param params \n * @returns \n */\n export async function GetList(params: {\n api?: BruceApi.Api,\n // ID of the associated project view.\n viewId: string,\n req?: Api.IReqParams\n }): Promise<{\n // List of bookmark records.\n bookmarks: IBookmark[]\n }> {\n let { api, viewId, req: reqParams } = params;\n if (!viewId) {\n throw(\"View ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const cache = await api.GetCacheItem(GetListCacheKey(viewId), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const req: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(`ui.view/${viewId}/slides`, Api.PrepReqParams(reqParams));;\n const items = data.Items ? data.Items : [];\n // Cache individual items.\n // Maybe better to load list cache when getting 1 slide and seeing if it's in there.\n // WARNING: Right now the data matches, in the future the list may contain a shortened result.\n for (let i = 0; i < items.length; i++) {\n const item = items[i] as ProjectViewBookmark.IBookmark;\n const prom = new Promise((res) => {\n res({\n bookmark: item\n });\n });\n await api.SetCacheItem({\n key: GetCacheKey(viewId, item.ID),\n value: prom,\n req: reqParams\n });\n }\n res({\n bookmarks: items\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key: GetListCacheKey(viewId),\n value: req,\n req: reqParams\n });\n return req;\n }\n\n /**\n * Creates or updates a bookmark record.\n * @param params \n * @returns \n */\n export async function Update(params: {\n api?: BruceApi.Api,\n // ID of the associated project view.\n viewId: string,\n // Bookmark record.\n bookmark: IBookmark,\n req?: Api.IReqParams\n }): Promise<{\n // Bookmark record.\n bookmark: IBookmark\n }> {\n let { api, viewId, bookmark: data, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n if (!data?.Title) {\n data.Title = data.ID;\n }\n const res = await api.POST(`ui.view/${viewId}/slide/${data.ID ? data.ID : \"\"}`, data, Api.PrepReqParams(reqParams));\n api.Cache.Remove(GetCacheKey(viewId, <string>data.ID));\n api.Cache.Remove(GetListCacheKey(viewId));\n return {\n bookmark: res\n };\n }\n\n /**\n * Sets the order of bookmarks within a project view.\n * @param params \n */\n export async function SetOrder(params: {\n api?: BruceApi.Api,\n // ID of the associated project view.\n viewId: string,\n // List of bookmark IDs in the order they should be displayed.\n bookmarkIds: string[],\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, viewId, bookmarkIds, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const reqData = {\n \t\"UISlide.ID\": bookmarkIds,\n \t\"DisplayOrder.Start\": 0\n };\n await api.POST(`ui.view/${viewId}/slides/setOrder`, reqData, Api.PrepReqParams(reqParams));\n await api.Cache.RemoveByStartsWith(GetListCacheKey(viewId));\n }\n\n /**\n * Interfaces for 3D bookmark settings.\n */\n export namespace Web3d {\n /**\n * Describes the terrain contours overlay.\n */\n export interface IContours {\n // Default is false.\n enabled: boolean;\n // Units are in meters.\n // Default is 100.\n spacing: number;\n // Units are in meters.\n // Default is 2.\n width: number;\n // Default is true.\n drawLabels: boolean;\n // CSS color string. Alpha will be excluded and applied through the alpha property.\n // Default is white.\n color: string;\n // 0 - 1, 1 = 100% opacity.\n // Default = 0.5.\n alpha: number;\n }\n\n /**\n * Describes the shadows settings for a bookmark.\n */\n export interface IShadows {\n // If true, shadows are enabled.\n enabled: boolean;\n // If true, shadow edges are softened.\n soften: boolean;\n // Pixel size determines shadow quality.\n // This typically increments in sets of 1024.\n pixelSize: number;\n // Darkness of shadows.\n // Default is \"0.3\".\n darkness: number;\n }\n\n /**\n * Describes the ambient occlusion settings for a bookmark.\n */\n export interface IAmbientOcclusion {\n // If true, ambient occlusion is enabled.\n enabled: boolean;\n intensity: number;\n lengthCap: number;\n bias: number;\n blurStepSize: number;\n stepSize: number;\n }\n\n /**\n * Describes the lighting settings for a bookmark.\n */\n export interface ILighting {\n // Colour of the sun.\n color: string;\n // Intensity of the sun.\n intensity: number;\n }\n\n /**\n * Describes the quality settings for a bookmark.\n */\n export interface IQuality {\n // If true, \"smooth rendering\" is enabled.\n fxaa: boolean;\n }\n\n /**\n * Describes the camera settings for a bookmark.\n */\n export interface ICamera {\n // Meters relative to ground.\n altitude: number;\n // In degrees.\n latitude: number;\n longitude: number;\n heading: number;\n pitch: number;\n roll: number;\n // Milliseconds transition from current position to bookmark.\n transition?: number;\n // If frustum is different between two bookmarks, transition should be instant.\n cameraFrustum?: Camera.EFrustum;\n }\n\n export interface ITimeline {\n // ISO8601 date time string for the start of the timeline.\n start: string;\n // ISO8601 date time string for the end of the timeline.\n end: string;\n // Indicates that time should move between start and end at the provided speed.\n playing: boolean;\n // 1 = 1 second per second.\n speed: number;\n }\n }\n\n /**\n * Interfaces for 2D bookmark settings.\n * @warning as this project is in beta, all updates are subject to breaking changes.\n */\n export namespace Web2d {\n export interface ICamera {\n x: number;\n y: number;\n zoom: number;\n }\n\n export interface IBackground {\n type?: \"NONE\" | \"DOTTED\" | \"GRID\" | \"IMAGE\";\n dotColor?: string;\n dotSize?: number;\n dotSpacing?: number;\n bgCssColor?: string;\n gridColor?: string;\n gridStep?: number;\n // Client File ID.\n imageFileId?: string;\n // Cross at center.\n drawCenter?: boolean;\n }\n\n /**\n * Represents a rendered Nextspace Entity.\n */\n export interface IEntity {\n entityId: string;\n x: number;\n y: number;\n size?: number;\n cssColor?: string;\n }\n\n export interface IRelationship {\n // Relationship type ID to draw.\n typeId: string;\n // Specific Entity IDs to render between. If not specified, render between all Entities in scene.\n entityIds?: string[];\n // Width in pixels of the relationship lines.\n width?: number;\n }\n\n export interface IRelationMetadata {\n parentEntityId: string;\n childEntityId: string;\n relationTypeId: string;\n } \n }\n\n /**\n * Returns cache identifier for a bookmark.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetCacheKey(\"abc\", \"def\");\n * api.Cache.Remove(key);\n * }\n * @param viewId\n * @param bookmarkId\n * @returns \n */\n export function GetCacheKey(viewId: string, bookmarkId: string): string {\n return `${Api.ECacheKey.ProjectViewBookmark}${Api.ECacheKey.Id}${viewId}${Api.ECacheKey.Id}${bookmarkId}`;\n }\n \n /**\n * Returns cache identifier for a list of bookmarks.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetListCacheKey(\"abc\");\n * api.Cache.Remove(key);\n * }\n * @param viewId\n * @returns\n */\n export function GetListCacheKey(viewId: string): string {\n return `${Api.ECacheKey.ProjectViewBookmark}${Api.ECacheKey.Id}${viewId}`;\n }\n}","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { ObjectUtils } from \"../util/object-utils\";\nimport { UTC } from \"../common/utc\";\nimport { MenuItem } from \"./menu-item\";\nimport { ProjectViewTile } from \"./project-view-tile\";\nimport { ProjectViewBookmark } from \"./project-view-bookmark\";\nimport { ENVIRONMENT } from \"../environment\";\nimport { ProjectViewSelection } from \"./project-view-selection\";\n\n/**\n * Describes the \"Project View\" concept within Nextspace.\n * A project view is a collection of settings for a visualization application we support.\n * It will describe what panels to show and how, it will also describe all possible ways data can be displayed.\n */\nexport namespace ProjectView {\n // This is the expected default version for the DataVersion value.\n // This value should NOT be changed without looking at our API and seeing what the default value is.\n export const DEFAULT_DATA_VERSION = 2;\n // Our Cesium web navigator.\n export const TYPE_WEB_3D_NAVIGATOR = \"WEB_3D_NAVIGATOR\";\n // Our (currently WIP) 2D web navigator. Also known as our graph viewer.\n export const TYPE_WEB_2D_NAVIGATOR = \"WEB_2D_NAVIGATOR\";\n // Defaulting to 3D navigator for backwards compatibility.\n export const DEFAULT_TYPE = TYPE_WEB_3D_NAVIGATOR;\n\n /**\n * Describes a project view record.\n */\n export interface IView {\n // ID of the project view.\n ID?: string;\n // Human readable name of the project view.\n Name: string;\n // Human readable description of the project view.\n Description?: string;\n // (20) Indicates the type of Project View this is.\n // This is used to determine the expected settings and application. Eg: 3D vs 2D Navigator.\n Type?: typeof TYPE_WEB_3D_NAVIGATOR | typeof TYPE_WEB_2D_NAVIGATOR | string;\n // ID of the user that created the project view.\n \"CreatedByUser.ID\"?: string;\n // Date/time the project view was created.\n CreatedTime?: UTC.IUTC;\n // ID of the default bookmark to load.\n DefaultUISlideID?: string;\n // Version of the UI that created this project view.\n // Set to -1 if unknown.\n CreatedByUIVersion?: string;\n // Version to help parse the data.\n DataVersion: number;\n // Admin only property for what email should be the project view's support line.\n SupportEmail?: string;\n // Settings for the project view.\n Settings?: Settings;\n // If true, this view is considered the default for the account.\n // Operator may use this project view to load default settings.\n IsDefault?: boolean;\n // TODO: document.\n Feature?: string[];\n }\n\n export type Settings = ISettings | IWeb3dSettings | IWeb2dSettings;\n\n /**\n * Base Project View settings.\n */\n export interface ISettings {\n // Describes settings for entity selection for a project view record.\n selection?: ProjectViewSelection.ISelection;\n // If true, anonymous users won't be able to access the view.\n IsLoginRequired?: boolean;\n // If true, users must have the permission \"Permission.EPermPrefix.ACCESS_PROJECT_VIEW + view.ID\" to access the view.\n IsRestricted?: boolean;\n // Per project view branding to compliment the account branding.\n branding?: IBranding;\n // Describes how to present contact information to the users.\n // The contact email is set in \"view.SupportEmail\". Only an admin can read or write this value.\n contact?: IContact;\n plugins?: IPlugins;\n // Default is yellow at 0.5 opacity.\n selectionColor?: string;\n // Default is blue with 0.5 opacity.\n highlightColor?: string;\n // Presentation mode settings.\n present?: IPresent;\n }\n\n /**\n * These are the base settings expected in any 3D project view.\n * The only exception is data-version = 1 which is our deprecated legacy format.\n */\n export interface IWeb3dSettings extends ISettings {\n // Menu item structure that defines how and what to load in the scene.\n menuItems?: MenuItem.IItem[];\n // Imagery and terrains that non-admin users can select from.\n // Sources used in bookmarks will automatically be added to this list.\n imageries?: ProjectViewTile.IViewImagery[];\n terrains?: ProjectViewTile.IViewTerrain[];\n // Defaults are values to apply for bookmarks when either the bookmark-\n // is missing or the value is missing in the bookmark settings.\n defaults?: {\n camera?: ProjectViewBookmark.Web3d.ICamera;\n settings?: ProjectViewBookmark.IWeb3dSettings;\n };\n }\n\n /**\n * These are the base settings expected in any 2D project view.\n * This is our WIP graph viewer.\n */\n export interface IWeb2dSettings extends ISettings {\n\n }\n \n /**\n * Per project view branding to compliment the account branding.\n */\n export interface IBranding {\n // Client file id for the project view's banner.\n // In Navigator this is found within the Navigator's dashboard.\n bannerFileId?: string;\n }\n\n /**\n * Presentation mode settings.\n */\n export interface IPresent {\n // Time in milliseconds to hold bookmarks before moving to the next bookmark.\n // This is a default time and can be overridden by the bookmark's duration.\n bookmarkDuration?: number;\n }\n\n /**\n * Describes how to present contact information to the users.\n */\n export interface IContact {\n // Default = false.\n // Indicates if the user should be able to reach support.\n enabled: boolean;\n // Description to display in the support dialog.\n // Null = application's default text.\n description?: string;\n // FontAwesome icon to use for the support dialog button.\n // Null = application's default icon.\n icon?: string;\n }\n\n /**\n * Describes the plugins enabled for a project view.\n */\n export interface IPlugins {\n // Enabled plugin ids.\n enabledIds: string[];\n }\n\n /**\n * Gets a project view record.\n * @param params \n * @returns \n */\n export async function Get(params: {\n api?: BruceApi.Api,\n // ID of the project view to get.\n viewId: string,\n req?: Api.IReqParams\n }): Promise<{\n // Project view record.\n view: IView\n }> {\n let { api, viewId, req: reqParams } = params;\n if (!viewId) {\n throw(\"View ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const key = GetCacheKey(viewId);\n const cache = await api.GetCacheItem(key, reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(`ui.view/${viewId}`, Api.PrepReqParams(reqParams));\n res({\n view: data\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key,\n value: prom,\n req: reqParams\n });\n return prom;\n }\n\n /**\n * Gets a list of project views.\n * @param params \n * @returns \n */\n export async function GetList(params: {\n api?: BruceApi.Api,\n // Optional filter for the type of project view.\n type?: typeof TYPE_WEB_3D_NAVIGATOR | typeof TYPE_WEB_2D_NAVIGATOR | string,\n req?: Api.IReqParams\n }): Promise<{\n // List of project views.\n views: IView[]\n }> {\n let { api, req: reqParams, type } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const cache = await api.GetCacheItem(GetListCacheKey(type), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(\"ui.view/list\", Api.PrepReqParams(reqParams));\n res({\n views: data.Items\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key: GetListCacheKey(type),\n value: prom,\n req: reqParams\n });\n return prom;\n }\n\n /**\n * Deletes a project view.\n * @param params \n */\n export async function Delete(params: {\n api?: BruceApi.Api,\n // ID of the project view to delete.\n viewId: string,\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, viewId, req: reqParams } = params;\n if (!viewId) {\n throw(\"View ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n await api.DELETE(`ui.view/${viewId}`, Api.PrepReqParams(reqParams));\n api.Cache.Remove(GetCacheKey(viewId));\n api.Cache.RemoveByStartsWith(GetListCacheKey());\n }\n\n /**\n * Creates or updates a project view.\n * @param params \n * @returns \n */\n export async function Update(params: {\n api?: BruceApi.Api,\n // Project view record to create or update.\n view: IView,\n req?: Api.IReqParams\n }): Promise<{\n // Project view record.\n view: IView\n }> {\n let { api, view: data, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n if (!data) {\n data = <any>{};\n }\n const isNew = !data.ID;\n if (!data.ID) {\n // Short ID to keep the URL short.\n // 8 length = 4,294,967,296 combinations.\n data.ID = ObjectUtils.UId(8);\n }\n if (!data.Name) {\n data.Name = data.ID;\n }\n if (!data.CreatedByUIVersion) {\n data.CreatedByUIVersion = \"-1\";\n }\n if (isNew) {\n data = await api.POST(`ui.view/${data.ID}`, data, Api.PrepReqParams(reqParams));\n }\n else {\n data = await api.PUT(`ui.view/${data.ID}`, data, Api.PrepReqParams(reqParams));\n }\n api.Cache.Remove(GetCacheKey(<string>data.ID));\n api.Cache.RemoveByStartsWith(GetListCacheKey());\n return {\n view: data\n };\n }\n\n /**\n * Returns cache identifier for a project view.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetCacheKey(\"abc\");\n * api.Cache.Remove(key);\n * }\n * @param viewId\n * @returns \n */\n export function GetCacheKey(viewId: string): string {\n return `${Api.ECacheKey.ProjectView}${Api.ECacheKey.Id}${viewId}`;\n }\n \n /**\n * Returns cache identifier for a list of project views.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetListCacheKey();\n * api.Cache.Remove(key);\n * }\n * @param type optional filter for the type of project view.\n * @returns\n */\n export function GetListCacheKey(type?: string): string {\n if (type) {\n return `${Api.ECacheKey.ProjectView}${Api.ECacheKey.ListId}${type}`;\n }\n return `${Api.ECacheKey.ProjectView}${Api.ECacheKey.ListId}`;\n }\n}","import { BruceApi } from \"../api/bruce-api\";\nimport { Api } from \"../api/api\";\nimport { ProjectView } from \"./project-view\";\nimport { ENVIRONMENT } from \"../environment\";\nimport { ProjectViewLegacy } from \"./project-view-legacy\";\n\nasync function getTemplateSettings(apiGetter: BruceApi.IGetter, reqParams?: Api.IReqParams): Promise<ProjectViewLegacy.ISettings> {\n const {view} = await ProjectView.Get({\n api: apiGetter.getApi(Api.TEMPLATE_ACCOUNT_ID), \n viewId: \"default\", \n req: reqParams\n });\n return (view.Settings as ProjectViewLegacy.ISettings) ?? <ProjectViewLegacy.ISettings>{};\n}\n\nfunction checkSourceToTemplate(items: ProjectViewLegacyTile.ISource[], templateItem: ProjectViewLegacyTile.ISource, addIfMissing: boolean): void {\n const index = items.findIndex(x => x.Name === templateItem.Name);\n if (index > -1) {\n templateItem.IsDefault = true;\n templateItem.IsEnabled = items[index].IsEnabled;\n items[index] = templateItem;\n }\n else if (addIfMissing) {\n templateItem.IsDefault = true;\n items.push(templateItem);\n }\n}\n\n/**\n * Describes a terrain or map source that are found in project view records.\n * This is a concept we want to trash as we're moving towards storing tileset ids instead.\n * This will help at least understand and manage this dying concept.\n */\nexport namespace ProjectViewLegacyTile {\n export interface ISource {\n SourceUrl?: string;\n IsEnabled?: boolean;\n IsDefault?: boolean;\n Name: string;\n Tooltip?: string;\n IconUrl?: string;\n }\n\n export interface IMapSource extends ISource {\n SourceUrl?: string;\n IonAssetID?: number,\n MapBoxID?: string;\n MapBoxUsername?: string;\n ProgramKey?: string;\n FileExtension?: string,\n Minimum?: number;\n Maximum?: number;\n Type?: string;\n }\n\n export interface ITerrainSource extends ISource {\n RequestWaterMask?: boolean;\n RequestVertexNormals?: boolean;\n }\n\n export async function MergeMapTemplateData(params: {\n getter?: BruceApi.IGetter, \n sources: IMapSource[], \n addIfMissing: boolean, \n req?: Api.IReqParams\n }): Promise<{\n sources: IMapSource[]\n }> {\n let { getter, sources: items, addIfMissing, req: reqParams } = params;\n if (!getter) {\n getter = ENVIRONMENT.Api().GetBruceGetter();\n }\n\n const settings = await getTemplateSettings(getter, reqParams);\n const maps = settings.CesiumMapSources ?? [];\n for (let i = 0; i < maps.length; i++) {\n const mapSource = maps[i];\n checkSourceToTemplate(items, mapSource, addIfMissing);\n }\n return {\n sources: items\n };\n }\n\n export async function MergeTerrainTemplateData(params: {\n getter?: BruceApi.IGetter, \n sources: ITerrainSource[], \n addIfMissing: boolean, \n req?: Api.IReqParams\n }): Promise<{\n sources: ITerrainSource[]\n }> {\n let { getter, sources: items, addIfMissing, req: reqParams } = params;\n if (!getter) {\n getter = ENVIRONMENT.Api().GetBruceGetter();\n }\n\n const settings = await getTemplateSettings(getter, reqParams);\n const terrains = settings.CesiumTerrainSources ?? [];\n for (let i = 0; i < terrains.length; i++) {\n const terrainSource = terrains[i];\n checkSourceToTemplate(items, terrainSource, addIfMissing);\n }\n return {\n sources: items\n };\n }\n}","\n/**\n * A tile is an imagery or terrain tileset definition.\n */\nexport namespace ProjectViewTile {\n export type MapTileId = string | EDefaultImagery;\n export type TerrainTileId = string | EDefaultTerrain;\n\n /**\n * Base information for loading an imagery or terrain tileset record.\n */\n export interface ITileMeta {\n // Null = using a default tile.\n // (Not the same as a template account one. Default means we don't have a database record of it.).\n accountId?: string;\n tilesetId: string;\n }\n\n /**\n * Definition for a project view terrain.\n */\n export interface IViewTerrain extends ITileMeta {\n tilesetId: TerrainTileId;\n }\n\n /**\n * Definition for a project view imagery.\n */\n export interface IViewImagery extends ITileMeta {\n tilesetId: MapTileId;\n }\n\n /**\n * Definition for a bookmark imagery.\n */\n export interface IBookmarkImagery extends IViewImagery {\n // 0 - 1, 1 = 100% opacity.\n // Default = 1.\n alpha?: number;\n // Default = 1.\n brightness?: number;\n // Default = 1.\n saturation?: number;\n // Default = 1.\n contrast?: number;\n // Default = 1.\n gamma?: number;\n // Default = 0.\n hue?: number;\n }\n\n /**\n * Definition for a bookmark terrain.\n */\n export interface IBookmarkTerrain extends IViewTerrain {\n\n }\n\n /**\n * Available imagery defaults.\n */\n export enum EDefaultImagery {\n BingMapsAerial = \"bingmapsaerial\",\n BingMapsAerialWithLabels = \"bingmapsaerialwithlabels\",\n BingMapsRoads = \"bingmapsroads\",\n MapboxSatellite = \"mapboxsatellite\",\n MapBoxStreets = \"mapboxstreets\",\n MapBoxStreetsClassic = \"mapboxstreetsclassic\",\n EsriWorldImagery = \"esriworldimagery\",\n EsriWorldStreetMap = \"esriworldstreetmap\",\n EsriNationalGeographic = \"esrinationalgeographic\",\n OpenStreetMap = \"openstreetmap\",\n LINZ = \"linz\",\n StamenWaterColor = \"stamenwatercolor\",\n StamenToner = \"stamentoner\",\n Grid = \"grid\",\n ThunderforestCycle = \"thunderforestcycle\",\n ThunderforestTransport = \"thunderforesttransport\",\n ThunderforestLandscape = \"thunderforestlandscape\",\n }\n\n /**\n * Definition for a default imagery.\n */\n export interface IDefaultImagery {\n id: EDefaultImagery;\n name: string;\n iconUrl?: string;\n }\n\n /**\n * Prepared array for UI.\n * TODO: Im not happy with icon urls sitting in the code. I'd prefer we ship these icons in the library as files.\n */\n export const DefaultImagery: IDefaultImagery[] = [\n {\n id: EDefaultImagery.BingMapsAerial,\n name: \"Bing Maps Aerial\",\n iconUrl: \"https://template.ui.nextspace.host/Default/media/Cesium/ImageryProviders/bingAerial.png\"\n },\n {\n id: EDefaultImagery.BingMapsAerialWithLabels,\n name: \"Bing Maps Aerial with Labels\",\n iconUrl: \"https://template.ui.nextspace.host/Default/media/Cesium/ImageryProviders/bingAerialLabels.png\"\n },\n {\n id: EDefaultImagery.BingMapsRoads,\n name: \"Bing Maps Roads\",\n iconUrl: \"https://template.ui.nextspace.host/Default/media/Cesium/ImageryProviders/bingRoads.png\"\n },\n {\n id: EDefaultImagery.MapboxSatellite,\n name: \"Mapbox Satellite\",\n iconUrl: \"https://template.ui.nextspace.host/Default/media/Cesium/ImageryProviders/mapboxSatellite.png\"\n },\n {\n id: EDefaultImagery.MapBoxStreets,\n name: \"Mapbox Streets\",\n iconUrl: \"https://template.ui.nextspace.host/Default/media/Cesium/ImageryProviders/mapboxTerrain.png\"\n },\n {\n id: EDefaultImagery.MapBoxStreetsClassic,\n name: \"Mapbox Streets Classic\",\n iconUrl: \"https://template.ui.nextspace.host/Default/media/Cesium/ImageryProviders/mapboxStreets.png\"\n },\n {\n id: EDefaultImagery.EsriWorldImagery,\n name: \"Esri World Imagery\",\n iconUrl: \"https://template.ui.nextspace.host/Default/media/Cesium/ImageryProviders/esriWorldImagery.png\"\n },\n {\n id: EDefaultImagery.EsriWorldStreetMap,\n name: \"Esri World Street Map\",\n iconUrl: \"https://template.ui.nextspace.host/Default/media/Cesium/ImageryProviders/esriWorldStreetMap.png\"\n },\n {\n id: EDefaultImagery.EsriNationalGeographic,\n name: \"Esri National Geographic\",\n iconUrl: \"https://template.ui.nextspace.host/Default/media/Cesium/ImageryProviders/esriNationalGeographic.png\"\n },\n {\n id: EDefaultImagery.OpenStreetMap,\n name: \"Open Street Map\",\n iconUrl: \"https://template.ui.nextspace.host/Default/media/Cesium/ImageryProviders/openStreetMap.png\"\n },\n {\n id: EDefaultImagery.LINZ,\n name: \"LINZ\",\n iconUrl: \"https://template.ui.nextspace.host/media/linz.jpg\"\n },\n {\n id: EDefaultImagery.StamenWaterColor,\n name: \"Stamen Water Color\",\n iconUrl: \"https://template.ui.nextspace.host/Default/media/Cesium/ImageryProviders/stamenWatercolor.png\"\n },\n {\n id: EDefaultImagery.StamenToner,\n name: \"Stamen Toner\",\n iconUrl: \"https://template.ui.nextspace.host/Default/media/Cesium/ImageryProviders/stamenToner.png\"\n },\n {\n id: EDefaultImagery.ThunderforestCycle,\n name: \"Thunderforest Cycle\"\n },\n {\n id: EDefaultImagery.ThunderforestTransport,\n name: \"Thunderforest Transport\"\n },\n {\n id: EDefaultImagery.ThunderforestLandscape,\n name: \"Thunderforest Landscape\"\n },\n {\n id: EDefaultImagery.Grid,\n name: \"Grid\",\n iconUrl: \"https://template.api.nextspace-uat.net/file/2885d8df-028b-4f5c-80b3-2634f7e7cf69.png\"\n }\n ];\n\n /**\n * Available terrain defaults.\n */\n export enum EDefaultTerrain {\n CesiumWorldTerrain = \"cesiumworldterrain\",\n FlatTerrain = \"flatterrain\",\n LINZ = \"linz\"\n }\n\n /**\n * Definition for a default terrain.\n */\n export interface IDefaultTerrain {\n id: EDefaultTerrain;\n name: string;\n iconUrl?: string;\n }\n\n /**\n * Prepared array for UI.\n * TODO: Im not happy with icon urls sitting in the code. I'd prefer we ship these icons in the library as files.\n */\n export const DefaultTerrains: IDefaultTerrain[] = [\n {\n id: EDefaultTerrain.CesiumWorldTerrain,\n name: \"Cesium World Terrain\",\n iconUrl: \"https://template.ui.nextspace.host/Default/media/Cesium/TerrainProviders/CesiumWorldTerrain.png\"\n },\n {\n id: EDefaultTerrain.LINZ,\n name: \"LINZ\",\n iconUrl: \"https://template.ui.nextspace.host/media/linz.jpg\"\n },\n {\n id: EDefaultTerrain.FlatTerrain,\n name: \"Flat Terrain\",\n }\n ]\n}","import { MenuItem } from \"./menu-item\";\nimport { ProjectView as PV } from \"./project-view\";\nimport { ProjectViewLegacyTile } from \"./project-view-legacy-tile\";\n\n/**\n * Deprecated Project View record.\n * This was used in the legacy web Navigator.\n */\nexport namespace ProjectViewLegacy {\n export const DATA_VERSION = 1;\n\n export interface IShadowSettings {\n IsShadowEnabled?: boolean;\n IsShadowSoft?: boolean;\n ShadowSampleSize?: number;\n }\n\n export interface ISettings extends PV.IWeb3dSettings {\n BookmarkTransitionSpeed?: number;\n Camera?: any;\n CameraFrustum?: number;\n CesiumMapSources?: ProjectViewLegacyTile.IMapSource[];\n CesiumTerrainSources?: ProjectViewLegacyTile.ITerrainSource[];\n ControlsSettings?: any;\n DefaultMapTiles?: string;\n DefaultTerrain?: string;\n DisplayTimeline?: boolean;\n GroundOcclusion?: boolean;\n Extensions?: any;\n GlobeColor?: string;\n SelectionHighlightColor?: string;\n LayersMenu?: MenuItem.IItem[];\n OASettings?: any;\n LogoImage?: any;\n LegendImage?: any;\n TilesetBackfaceCulling?: boolean;\n TopPanelComponents?: string[];\n LeftPanelComponents?: string[];\n PostProcessFXAA?: boolean;\n Shadows?: boolean;\n CustomFormSettings?: any;\n PreloadEntityTypes?: boolean;\n ClickActions?: any;\n Shadow?: {\n StaticCamera?: IShadowSettings;\n MovingCamera?: IShadowSettings;\n }\n }\n\n export interface IView extends PV.IView {\n Settings: ISettings;\n }\n}","import { Camera } from \"../common/camera\";\nimport { UTC } from \"../common/utc\";\nimport { Markup } from \"../markup/markup\";\n\n/**\n * Deprecated Project View Bookmark record.\n * This was used in the legacy web Navigator.\n */\nexport namespace ProjectViewLegacyBookmark {\n export const DATA_VERSION = 1;\n\n export interface IBookmark {\n ID?: string;\n Title?: string;\n Camera?: ICamera;\n Settings?: ISettings;\n \"Screenshot.ClientFile.ID\"?: string;\n \"UI.View.ID\"?: string;\n \"Created.ByUser.ID\"?: string;\n \"Created.Date\"?: UTC.IUTC;\n DataVersion: number;\n DisplayOrder?: number;\n }\n\n export interface IBookmarkImagery {\n title: string;\n contrast: number;\n hue: number;\n saturation: number;\n gamma: number;\n brightness: number;\n alpha: number;\n }\n\n export interface ISettings {\n selectedItemIds?: string[];\n order?: number;\n hiddenEntityIds?: string[];\n drawnRelationEntityIDs?: string[];\n imagery?: IBookmarkImagery[];\n terrain?: string;\n globeColor?: string;\n shadows?: boolean;\n groundOcclusion?: boolean;\n ambientOcclusion?: boolean;\n markup?: Markup.IMarkup;\n cameraFrustum?: Camera.EFrustum;\n displayTimeline?: boolean;\n timelineSettings?: any;\n }\n\n /**\n * Lat,lon is in degrees.\n * Altitude is meters relative to ground.\n * Heading, pitch, roll are in radians.\n */\n export interface ICamera {\n position: {\n latitude: number;\n longitude: number;\n height: number;\n };\n heading: number;\n pitch: number;\n roll: number;\n }\n}","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { UTC } from \"../common/utc\";\nimport { ENVIRONMENT } from \"../environment\";\n\n/**\n * Describes the \"Pending Action\" concept within Nextspace.\n * A pending action is a record of a server-side background process.\n * This record is used to monitor its progress and completion state.\n */\nexport namespace PendingAction {\n /**\n * Describes a pending action record.\n */\n export interface IAction {\n // ID of the pending action record.\n ID: number;\n // ID of the application that created the pending action.\n \"CreatedBy.Application\": string;\n // Date/time the pending action was created.\n \"Created.Time\": UTC.IUTC;\n // ID of the user that created the pending action.\n \"CreatedByUser.ID\": string;\n // Result string is a stringified JSON object.\n // This is not always the case so please check the data before parsing it.\n Result: string;\n // Progress % of the pending action.\n Progress: number;\n // Date/time the pending action was marked as done.\n \"Completed.Time\": UTC.IUTC;\n // Description on why the pending action was started.\n Description: string;\n // Status of the pending action.\n Status: EStatus;\n // Date/time the pending action was last updated.\n lastUpdated: UTC.IUTC;\n }\n\n /**\n * Available pending action statuses.\n */\n export enum EStatus {\n InProgress = \"IN_PROGRESS\",\n Cancelled = \"CANCELLED\",\n Complete = \"COMPLETE\",\n Failed = \"FAILED\"\n }\n\n /**\n * Describes a pending action message record.\n */\n export interface IMessage {\n // ID of the pending action record.\n \"PendingAction.ID\": number;\n // ID of the message record.\n ID: number;\n // ID of the application that created the message.\n \"CreatedBy.Application\": string;\n // Date/time the message was created.\n \"Created.Time\": UTC.IUTC;\n // Message type. Certain types can be hidden from end-users as they are only used for debugging.\n \"Message.Type\": EMessageType | string;\n // Message text.\n Message: string;\n }\n\n /**\n * Available message types.\n */\n export enum EMessageType {\n Warn = \"WARNING\",\n Error = \"ERROR\",\n Status = \"STATUS\",\n Info = \"INFO\"\n }\n\n /**\n * Returns a pending action record.\n * @param params \n * @returns \n */\n export async function Get(params: {\n api?: BruceApi.Api,\n // ID of the pending action record.\n actionId: number,\n req?: Api.IReqParams\n }): Promise<{\n // The pending action record.\n action: IAction\n }> {\n let { api, actionId, req: reqParams } = params;\n if (!actionId) {\n throw(\"Action ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const data = await api.GET(`pendingAction/${actionId}`, Api.PrepReqParams(reqParams));\n return {\n action: data\n }\n }\n\n /**\n * Returns a list of pending action records.\n * @param params \n * @returns \n */\n export async function GetRelevantList(params: {\n api?: BruceApi.Api,\n // Reduces the list to only very recent actions.\n // It is recommended to first get the list with stricter=false, then get the list with stricter=true,\n // if you're monitoring the running actions.\n stricter?: boolean,\n reqParams?: Api.IReqParams\n }): Promise<{\n // The list of pending action records.\n actions: IAction[]\n }> {\n let { api, stricter, reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const data = await api.GET(`pendingActions/important?Update=${Boolean(stricter)}`, Api.PrepReqParams(reqParams));\n return {\n actions: data.Items\n };\n }\n\n /**\n * Returns a list of pending action record messages.\n * @param params \n * @returns \n */\n export async function GetMessages(params: {\n api?: BruceApi.Api,\n // ID of the pending action record.\n actionId: number,\n // Sort order of the messages.\n // Default is Asc.\n order?: Api.ESortOrder,\n // Index of the first message to return.\n // Default is 0.\n startIndex?: number,\n // Amount of messages to return.\n // Default is 500.\n amount?: number,\n // Types of messages to return.\n types?: EMessageType[],\n req?: Api.IReqParams\n }): Promise<{\n // The list of pending action record messages.\n messages: IMessage[]\n }> {\n let { api, actionId, order, startIndex, amount, req: reqParams, types } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n if (amount == null) {\n amount = 500;\n }\n if (startIndex == null) {\n startIndex = 0;\n }\n if (order == null) {\n order = Api.ESortOrder.Asc;\n }\n let args = `?SortOrder=${order == Api.ESortOrder.Desc ? \"DESC\" : \"ASC\"}&PageSize=${amount}&PageIndex=${startIndex}`;\n if (types?.length) {\n for (let i = 0; i < types.length; i++) {\n args += `&Type=${types[i]}`;\n }\n }\n const data = await api.GET(`pendingAction/${actionId}/progressMessages` + args, Api.PrepReqParams(reqParams));\n return {\n messages: data.Items\n };\n }\n\n /**\n * Requests to cancel a pending action.\n * @param params \n */\n export async function Cancel(params: {\n api?: BruceApi.Api,\n // ID of the pending action record.\n actionId: number,\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, actionId, req: reqParams } = params;\n if (!actionId) {\n throw(\"Action ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n await api.DELETE(`pendingAction/${actionId}`, Api.PrepReqParams(reqParams));\n }\n}","import { Api } from \"../api/api\";\r\nimport { BruceApi } from \"../api/bruce-api\";\r\nimport { GuardianApi } from \"../api/guardian-api\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\nimport { AccountSettings } from \"./account-settings\";\r\n\r\n// Some dead accounts that we don't want to show in the UI.\r\n// Some accounts may not be \"dead\" but instead purposely don't have a NextspaceAPI database so we'll avoid them too.\r\nconst ACCOUNT_EXCLUSIONS = [\"hyperportal\", \"hypeportal\", \"bviewer\"];\r\n\r\n/**\r\n * Describes the \"Client Account\" concept within Nextspace.\r\n * A client account is a database instance that holds one or many users.\r\n */\r\nexport namespace Account {\r\n /**\r\n * Describes a Nextspace client account record.\r\n */\r\n export interface IAccount {\r\n ID?: string;\r\n Type?: string;\r\n // Subdomain of the account.\r\n // This is used within URL paths to identify the account.\r\n // Eg: the subdomain=\"test\" will resolve through the URL \"https://test.api.nextspace.host\".\r\n Subdomain?: string;\r\n // Name of the account.\r\n Name?: string;\r\n // Associated managing client.\r\n // This is used to identify client accounts managed by a specific client.\r\n \"Client.ID\"?: string;\r\n // The user ID of the account owner.\r\n // This is typically the user who created the account.\r\n \"OwnerUser.ID\"?: string;\r\n // Hosting location key. Links to settings related to host server.\r\n \"HostingLocation.Key\"?: string;\r\n // This will depend on what \"appSettingsId\" you request for.\r\n \"Application.ID\"?: string;\r\n \"Application.Settings\"?: AccountSettings.Settings;\r\n // Calculated endpoints for the account.\r\n \"URL\"?: {\r\n // BruceApi base url.\r\n // Eg: \"https://template.api.nextspace.host/\".\r\n \"Base\": string;\r\n // CDN base url.\r\n // Url param will need to be accounted for when constructing endpoints using this.\r\n // Eg: \"https://some-domain.com/?accountId=template\".\r\n \"CDNBase\"?: string;\r\n // CDN url specific to the '/entities' request.\r\n // This will be phased out in favour of 'CDNBase'.\r\n \"CDNEntities\"?: string;\r\n // CDN url specific to the '/tileset' request.\r\n // This will be phased out in favour of 'CDNBase'.\r\n \"CDNTileset\"?: string;\r\n // CDN url specific to legacy tileset requests.\r\n // This will be phased out in favour of 'CDNBase'.\r\n \"CDNLegacyTileset\"?: string;\r\n },\r\n\r\n // TODO: Check if these are still needed.\r\n \"ClientAccount.ID\"?: string;\r\n \"BruceAPI\"?: string;\r\n \"Settings\"?: any;\r\n \"AccountSettings\"?: any;\r\n }\r\n\r\n /**\r\n * Known Nextspace applications we store settings for.\r\n */\r\n export enum EAppId {\r\n BruceApi = \"BruceAPI\",\r\n Navigator = \"Navigator\",\r\n Operator = \"BruceClientAdmin\"\r\n }\r\n export type AppId = EAppId | string;\r\n\r\n /**\r\n * Possible starter content options.\r\n * When creating a new account you can populate it with certain default data.\r\n */\r\n export enum EStarterContent {\r\n Default = \"default\",\r\n None = \"none\"\r\n }\r\n\r\n /**\r\n * Gets a client account record by ID.\r\n * @param params \r\n * @returns \r\n */\r\n export async function Get(params: {\r\n api?: GuardianApi.Api,\r\n // The ID of the account to get.\r\n accountId: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n account: IAccount\r\n }> {\r\n let { api, accountId: id, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n const cache = await api.GetCacheItem(GetCacheKey(id), reqParams);\r\n if (cache?.found) {\r\n return cache.data;\r\n }\r\n const prom: Promise<any> = new Promise(async (res, rej) => {\r\n try {\r\n const data: Account.IAccount = await api.GET(`accountbyid/${id}`, reqParams);\r\n // Update the cache by subdomain as well in case it's different to the ID.\r\n if (data?.ID && reqParams?.noCache != false) {\r\n await api.SetCacheItem({\r\n key: data.Subdomain,\r\n value: prom,\r\n req: reqParams\r\n });\r\n }\r\n res({\r\n account: data\r\n });\r\n }\r\n catch (e) {\r\n rej(e);\r\n }\r\n });\r\n await api.SetCacheItem({\r\n key: GetCacheKey(id),\r\n value: prom,\r\n req: reqParams\r\n });\r\n return prom;\r\n }\r\n\r\n /**\r\n * Returns a client account record by subdomain or ID.\r\n * @param params \r\n * @returns \r\n */\r\n export async function GetBySubdomain(params: {\r\n api?: GuardianApi.Api,\r\n // Subdomain or ID of the account.\r\n subdomain: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n account: IAccount\r\n }> {\r\n let { api, subdomain, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n \r\n const cache = await api.GetCacheItem(GetCacheKey(subdomain), reqParams);\r\n if (cache?.found) {\r\n return cache.data;\r\n }\r\n const prom: Promise<any> = new Promise(async (res, rej) => {\r\n try {\r\n const data: Account.IAccount = await api.GET(`account/${subdomain}`, reqParams);\r\n // Update the cache by ID as well in case it's different to the subdomain.\r\n if (data?.ID && reqParams?.noCache != false) {\r\n await api.SetCacheItem({\r\n key: data.ID,\r\n value: prom,\r\n req: reqParams\r\n });\r\n }\r\n res({\r\n account: data\r\n });\r\n }\r\n catch (e) {\r\n rej(e);\r\n }\r\n });\r\n await api.SetCacheItem({\r\n key: GetCacheKey(subdomain),\r\n value: prom,\r\n req: reqParams\r\n });\r\n return prom;\r\n }\r\n\r\n /**\r\n * Gets a list of client accounts related to the current session user.\r\n * @param params \r\n * @returns \r\n */\r\n export async function GetRelatedList(params: {\r\n api?: GuardianApi.Api,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // List of accounts related to the current session user.\r\n accounts: IAccount[]\r\n }> {\r\n let { api, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n const cache = await api.GetCacheItem(GetListCacheKey(api.GetSessionId()), reqParams);\r\n if (cache?.found) {\r\n return cache.data;\r\n }\r\n const req = api.GET(\"user/relatedClientAccounts\", reqParams);\r\n const prom: Promise<{ accounts: IAccount[] }> = new Promise(async (res, rej) => {\r\n try {\r\n const data = await req;\r\n const items = data.Items.filter((x: IAccount) => !ACCOUNT_EXCLUSIONS.includes(<string>x.ID))\r\n res({\r\n accounts: items\r\n });\r\n }\r\n catch (e) {\r\n rej(<any>e);\r\n }\r\n });\r\n\r\n await api.SetCacheItem({\r\n key: GetListCacheKey(api.GetSessionId()),\r\n value: prom,\r\n req: reqParams\r\n });\r\n return prom;\r\n }\r\n\r\n /**\r\n * Gets application settings for a specific client account.\r\n * @param params \r\n * @returns \r\n */\r\n export async function GetAppSettings(params: {\r\n api?: GuardianApi.Api,\r\n // The ID of the related account.\r\n accountId: string,\r\n // The ID of the application to get settings for.\r\n appId: AppId,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // Application settings.\r\n settings: AccountSettings.Settings\r\n }> {\r\n let { api, accountId: id, appId, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n const cache = await api.GetCacheItem(GetCacheKey(id, appId), reqParams);\r\n if (cache?.found) {\r\n return cache.data;\r\n }\r\n const req = await api.GET(`account/${id}?ApplicationID=${appId}`, reqParams);\r\n const prom: Promise<any> = new Promise(async (res, rej) => {\r\n try {\r\n const data = await req;\r\n const settings = data?.[ \"Application.Settings\" ] ?? {};\r\n res({\r\n settings: settings\r\n });\r\n }\r\n catch (e) {\r\n rej(e);\r\n }\r\n });\r\n await api.SetCacheItem({\r\n key: GetCacheKey(id, appId),\r\n value: prom,\r\n req: reqParams\r\n });\r\n return prom;\r\n }\r\n\r\n /**\r\n * Updates application settings for a specific client account + application.\r\n * WARNING: Do not update API settings without knowing what you're doing.\r\n * @param params\r\n * @returns\r\n */\r\n export async function UpdateAppSettings(params: {\r\n api?: GuardianApi.Api,\r\n // The ID of the related account.\r\n accountId: string,\r\n // The ID of the application to update settings for.\r\n appId: string,\r\n // Application settings to update.\r\n settings: AccountSettings.Settings,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // Updated application settings.\r\n settings: AccountSettings.Settings\r\n }> {\r\n let { api, accountId: id, appId, settings: data, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n const res = await api.POST(`account/${id}/applicationSettings/${appId}`, data, reqParams);\r\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Account + Api.ECacheKey.Id + id);\r\n return {\r\n settings: res\r\n };\r\n }\r\n\r\n /**\r\n * Creates a new Nextspace account using given details.\r\n * @param params\r\n * @returns\r\n */\r\n export async function Create(params: {\r\n api?: BruceApi.Api,\r\n // The ID of the account to create.\r\n accountId: string,\r\n // The name of the account to create.\r\n name: string,\r\n // The hosting location key to create the account in.\r\n // This is the region that will dictate where the API and database are hosted.\r\n hostingLocationKey: string,\r\n // Starter content to populate the account with.\r\n starterContent?: EStarterContent,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // The newly created account record.\r\n account: IAccount\r\n }> {\r\n let { api, accountId: id, name, hostingLocationKey, starterContent, req: reqParams } = params;\r\n if (!id || !name || !hostingLocationKey) {\r\n throw new Error(\"Id, Name and hostingLocationKey are required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n if (!starterContent) {\r\n starterContent = EStarterContent.None;\r\n }\r\n \r\n const reqData = {\r\n \"Name\": name,\r\n \"HostingLocation.Key\": hostingLocationKey,\r\n \"StarterContent\": starterContent\r\n }\r\n const res = await api.POST(`clientAccount/${id}`, reqData, Api.PrepReqParams(reqParams));\r\n const resData = {\r\n account: res\r\n };\r\n api.Cache.Remove(GetListCacheKey(api.GetSessionId()));\r\n return resData;\r\n }\r\n\r\n /**\r\n * Returns cache identifier for an account by ID.\r\n * Example: {\r\n * const api: BruceApi.Api = ...;\r\n * const key = GetCacheKey(1);\r\n * api.Cache.Remove(key);\r\n * }\r\n * @param accountId \r\n * @param appSettingsId \r\n * @returns \r\n */\r\n export function GetCacheKey(accountId: string, appSettingsId?: string): string {\r\n if (appSettingsId) {\r\n return Api.ECacheKey.Account + Api.ECacheKey.Id + accountId + Api.ECacheKey + appSettingsId;\r\n }\r\n return Api.ECacheKey.Account + Api.ECacheKey.Id + accountId;\r\n }\r\n\r\n /**\r\n * Returns cache identifier for a list of accounts by session ID.\r\n * Example: {\r\n * const api: BruceApi.Api = ...;\r\n * const key = GetListCacheKey(api.GetSessionId());\r\n * api.Cache.Remove(key);\r\n * }\r\n * @param ssid \r\n * @returns \r\n */\r\n export function GetListCacheKey(ssid: string): string {\r\n return Api.ECacheKey.Account + Api.ECacheKey.Session + Api.ECacheKey.Id + ssid;\r\n }\r\n\r\n /**\r\n * Returns cache identifier for a list of database regions.\r\n * Example: {\r\n * const api: BruceApi.Api = ...;\r\n * const key = GetDbRegionListCacheKey();\r\n * api.Cache.Remove(key);\r\n * }\r\n * @returns \r\n */\r\n export function GetDbRegionListCacheKey() {\r\n return Api.ECacheKey.DatabaseRegion;\r\n }\r\n}","import { Account } from \"../account/account\";\nimport { AccountSettings } from \"../account/account-settings\";\nimport { Api } from \"../api/api\";\nimport { GuardianApi } from \"../api/guardian-api\";\nimport { ENVIRONMENT } from \"../environment\";\n\n/**\n * A hosting location is a record for a possible bruce-api server configuration.\n * A hosting location will have one or many database servers as well, this is an additional setting.\n */\nexport namespace HostingLocation {\n /**\n * Describes a hosting location record.\n */\n export interface ILocation {\n // Internal ID.\n ID: number;\n // External ID.\n Key: string;\n // Indicates if creation of a new bruce account is allowed in this region.\n // This should dictate if the record is visible in UI dropdowns as well for non-super-admins.\n IsEnabledForNewAccounts: boolean;\n DisplayName?: string;\n Description?: string;\n // Eg: \"us-west-1\".\n AWSRegion?: string;\n // Eg: \"Singapore\".\n Country?: string;\n // Eg: \"Vultr\".\n Hoster?: string;\n // Eg: \"San Francisco\".\n City?: string;\n // URL template to the corresponding API instance.\n // Eg: \"https://<ACCOUNTID>.api.nextspace-us.host/\".\n BruceAPIURL?: string;\n // Comma separated list of Api.EEnv.\n Environment?: string;\n // Arbitrary settings for the particular location.\n // For example this may include CDN template URLs.\n Settings?: any;\n }\n\n /**\n * Returns a list of hosting locations.\n * @Warning: This will not return the Settings property.\n * @param params\n * @returns\n */\n export async function GetList(params: {\n api?: GuardianApi.Api,\n req?: Api.IReqParams\n }): Promise<{\n // List of hosting locations.\n locations: ILocation[]\n }> {\n let { api, req } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n\n const res = await api.GET(\"hostinglocations\", Api.PrepReqParams(req));\n return {\n locations: res.Items\n };\n }\n\n /**\n * Returns a hosting location record by ID.\n * @param params \n * @returns \n */\n export async function GetById(params: {\n // ID of the hosting location record.\n id: number,\n api?: GuardianApi.Api,\n req?: Api.IReqParams\n }): Promise<{\n // The hosting location record.\n location: ILocation\n }> {\n let { id, api, req } = params;\n if (!id) {\n throw(\"Invalid id\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n\n const res = await api.GET(`hostinglocation/id/${id}`, Api.PrepReqParams(req));\n return {\n location: res\n };\n }\n\n /**\n * Returns a hosting location record by key.\n * @param params \n * @returns \n */\n export async function GetByKey(params: {\n // Key of the hosting location record.\n key: string,\n api?: GuardianApi.Api,\n req?: Api.IReqParams\n }): Promise<{\n location: ILocation\n }> {\n let { key, api, req } = params;\n if (!key) {\n throw(\"Invalid key\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n\n const res = await api.GET(`hostinglocation/key/${key}`, Api.PrepReqParams(req));\n return {\n location: res\n };\n }\n\n /**\n * Returns hostingLocationKey from given db url.\n * Some older accounts don't have this set, so we need to guess it.\n * @param params\n * @returns\n */\n export function GuessKey(params: {\n // Database connection string.\n DBServer?: string\n }) {\n const { DBServer: databaseUrl } = params;\n if (databaseUrl.includes(\"hyperfarm-prod-instance-1\")) {\n return \"HYPERFARM\";\n }\n if (databaseUrl.includes(\"prod-syd1.nextspace.host\")) {\n return \"AU-VULTR-FIRST\";\n }\n else if (databaseUrl.includes(\"prod-nyc1.nextspace.host\")) {\n return \"US-VULTR-FIRST\";\n }\n else if (databaseUrl.includes(\"prod-ams1.nextspace.host\")) {\n return \"EU-VULTR-FIRST\";\n }\n else if (databaseUrl.includes(\"prod-sing1.nextspace.host\")) {\n return \"SE-VULTR-FIRST\";\n }\n else if (databaseUrl.includes(\"dev-first\")) {\n return \"DEV-FIRST\";\n }\n else if (databaseUrl.includes(\".ap-southeast-1.\")) {\n return \"SE\";\n }\n else if (databaseUrl.includes(\".us-west-1.\")) {\n return \"US\";\n }\n else if (databaseUrl.includes(\".eu-west-3.\")) {\n return \"EU\";\n }\n else if (databaseUrl.includes(\"bruce-prod-au\")) {\n return \"AU\";\n }\n else if (databaseUrl.includes(\"bruce-dev\")) {\n return \"DEV\";\n }\n return null;\n }\n\n /**\n * Returns a hosting location key by account ID.\n * @param params \n * @returns \n */\n export async function GetKeyByAccountId(params: {\n // It is recommended to pass accountId and supplement it with account and apiSettings.\n accountId?: string,\n // Optional account record to save getting it.\n account?: Account.IAccount,\n // API settings for the client account.\n apiSettings?: AccountSettings.IBruceApi,\n api?: GuardianApi.Api,\n req?: Api.IReqParams\n }): Promise<{\n // Hosting location key.\n key: string,\n // Indicates if the key was inferred by legacy data.\n isLegacy?: boolean\n }> {\n let { accountId, apiSettings, api, account, req } = params;\n if (!accountId && !apiSettings) {\n throw(\"Invalid accountId or apiSettings\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n\n // We'll prioritize account record if provided.\n if (accountId && !account) {\n account = (await Account.Get({\n accountId,\n api,\n req\n })).account;\n }\n if (account?.[\"HostingLocation.Key\"]) {\n return {\n key: account[\"HostingLocation.Key\"],\n isLegacy: false\n };\n }\n\n // Fallback to settings JSON for older records.\n const settings = apiSettings ? apiSettings : (await Account.GetAppSettings({\n api,\n accountId,\n appId: Account.EAppId.BruceApi\n })).settings as AccountSettings.IBruceApi;\n\n let hostingKey = settings[\"HostingLocation.Key\"];\n let isLegacy = false;\n if (!hostingKey) {\n hostingKey = settings.DBLocation;\n isLegacy = true;\n }\n if (!hostingKey) {\n hostingKey = GuessKey({\n DBServer: settings.DBServer\n });\n isLegacy = true;\n }\n return {\n key: hostingKey,\n isLegacy\n };\n }\n\n /**\n * Returns a hosting location record by account ID.\n * @param params \n * @returns \n */\n export async function GetByAccountId(params: {\n // It is recommended to pass accountId and supplement it with account and apiSettings.\n accountId?: string,\n // Optional account record to save getting it.\n account?: Account.IAccount,\n // API settings for the client account.\n apiSettings?: AccountSettings.IBruceApi,\n api?: GuardianApi.Api,\n req?: Api.IReqParams\n }): Promise<{\n // Hosting location record.\n location: ILocation\n }> {\n let { accountId, apiSettings, api, req, account } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n\n const data = await GetKeyByAccountId({\n accountId,\n account,\n apiSettings,\n api,\n req\n });\n if (!data?.key) {\n return null;\n }\n const key = await GetByKey({\n key: data.key,\n api,\n req\n });\n return key;\n }\n}","/**\n * Permissions in Nextspace are arbitrary strings with meaning in specific contexts.\n * This is a list of known permissions.\n */\nexport namespace Permission {\n export type Perm = EPerm | string;\n\n /**\n * Standalone permissions.\n */\n export enum EPerm {\n // Provides full access to a specific client account.\n ADMIN = \"ADMIN\",\n // Exactly like ADMIN except with no user and organization management.\n POWER = \"POWER\",\n // Provides read-only access to a specific client account.\n ADMIN_VIEW = \"ADMIN_VIEW\",\n // Provides login access to a specific client account.\n // Login and read-only differ in that certain data is restricted to administrator users or users with specific permissions.\n LOGIN = \"LOGIN\",\n // Access to deleting arbitrary entity types.\n DELETE_ENTITY_TYPE = \"DELETE_ENTITY_TYPE\",\n // Access to creating and updating arbitrary entity types.\n CREATE_ENTITY_TYPE = \"CREATE_ENTITY_TYPE\",\n UPDATE_ENTITY_TYPE = \"UPDATE_ENTITY_TYPE\"\n }\n\n /**\n * Permissions that are suffixed with another value.\n * Eg: \"UIVIEW_\" will get the view's ID appended to it and be used as a permission to access the view.\n */\n export enum EPermPrefix {\n // Access to a specific view.\n ACCESS_PROJECT_VIEW = \"UIVIEW_\",\n // Editing capability for a specific view's bookmarks.\n MANAGE_PROJECT_VIEW_BOOKMARKS = \"UIVIEW_MANAGE_BOOKMARKS_\",\n // Access to a specific tileset.\n ACCESS_TILESET = \"TILESET_\"\n }\n}","import { Api } from \"../api/api\";\nimport { GuardianApi } from \"../api/guardian-api\";\nimport { UTC } from \"../common/utc\";\nimport { ENVIRONMENT } from \"../environment\";\nimport { Permission } from \"./permission\";\nimport { User } from \"./user\";\nimport { UserGroup } from \"./user-group\";\n\n/**\n * Describes the \"Session\" concept within Nextspace.\n * A session is a set of settings produced from a user or access token login.\n * The session describes what the access should be allowed to do.\n */\nexport namespace Session {\n /**\n * Describes a session record.\n */\n export interface ISession {\n // Loaded account-level permissions.\n AccessPermissions: IAccountPermissions;\n // Loaded super-level permissions.\n HypeportalAccessPermisssions?: ISuperPermissions;\n // The account ID that was logged in.\n \"ClientAccount.ID\": string;\n // The session ID.\n ID: string;\n // The session's logged in IP.\n IP: string;\n // The session's last access time.\n LastAccessTime: UTC.IUTC;\n // The session's logged in user.\n User: User.IUser;\n }\n\n /**\n * Describes a set of permissions for an account.\n */\n export interface IAccountPermissions {\n // The account ID that these permissions are for.\n \"ClientAccount.ID\"?: string;\n // Array of permissions that are enabled.\n \"EnabledFeatures\"?: Permission.Perm[];\n // Array of group records of names of them.\n // Result depends on the session's permissions.\n \"UserGroups\"?: UserGroup.IGroup[] | string[];\n }\n\n /**\n * Describes a set of permissions for a super user.\n */\n export interface ISuperPermissions {\n // Array of permissions that are enabled.\n EnabledFeatures?: Permission.Perm[];\n // Array of user groups that the user belongs to.\n UserGroups?: string[];\n }\n\n /**\n * Gets a session record.\n * @param params \n * @returns \n */\n export async function Get(params: {\n api?: GuardianApi.Api,\n // If none is specified it'll return an anonymous session.\n sessionId?: string,\n // Optional param to specify the account ID to get permissions for.\n // If not specified, the session's original logged in account will be used.\n accountId?: string,\n req?: Api.IReqParams\n }): Promise<{\n // The session record.\n session: ISession\n }> {\n let { api, sessionId, req: reqParams, accountId } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n\n const key = GetCacheKey(sessionId);\n const cache = await api.GetCacheItem(key, reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(`session/${sessionId}${accountId ? `?account=${accountId}`: \"\"}`, reqParams);\n res({\n session: data\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key,\n value: prom,\n req: reqParams,\n duration: 5000\n });\n return prom;\n }\n\n /**\n * Request to login or to swap existing session to a different account.\n * If api is already logged in, pass account param to swap the session.\n * @param params \n * @returns \n */\n export async function Login(params: {\n api?: GuardianApi.Api,\n // The username to login with.\n username?: string,\n // The password to login with.\n password?: string,\n // The account ID to login into.\n accountId?: string,\n req?: Api.IReqParams\n }): Promise<{\n // Session record.\n session: ISession\n }> {\n let { api, username, password, accountId, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n\n const data: any = await api.POST(\"login\", {\n account: accountId ? accountId : \"\",\n login: username,\n password: password\n }, reqParams);\n const session: ISession = data?.Session;\n const ssid = session?.ID;\n\n api.SetSessionId(ssid);\n api.Cache.Remove(GetCacheKey(ssid));\n\n return {\n session: session\n };\n }\n\n /**\n * Request to logout and void a session.\n * This will use the sessionId set within the provided api instance.\n * @param params \n */\n export async function Logout(params: {\n api?: GuardianApi.Api,\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n\n const ssid = api.GetSessionId();\n if (ssid) {\n await api.POST(\"logout\", null, reqParams);\n api.SetSessionId(<any>null);\n api.Cache.Remove(GetCacheKey(ssid));\n }\n }\n\n /**\n * Returns if a permission is enabled for a session.\n * This check is case-insensitive.\n * Please use 'IsAccountAdmin', 'IsSuperAdmin', and 'IsPowerUser' when needed as they cover all account-level perms.\n * @param params \n * @returns \n */\n export function IsPermEnabled(params: {\n // The session to check.\n session: ISession,\n // The client account ID to check.\n accountId: string,\n // The permission to check.\n perm: string\n }): boolean {\n let { session, accountId, perm } = params;\n if (!perm) {\n throw(\"Perm is required.\");\n }\n\n perm = perm.toLocaleUpperCase();\n accountId = accountId.toLowerCase();\n\n // First we'll scan the user object for the account ID.\n if (session?.User?.AccessPermissions?.length) {\n for (let i = 0; i < session.User.AccessPermissions.length; i++) {\n const aPerms = session.User.AccessPermissions[i];\n const permsAccountId = String(aPerms[\"ClientAccount.ID\"]).toLowerCase();\n // Found account, woo.\n if (permsAccountId == accountId) {\n // Check against the loaded perm array.\n // In newer version this always exists, but in some legacy versions it MIGHT not,\n //therefor we also do a group check after..\n if (aPerms.EnabledFeatures?.length) {\n return aPerms.EnabledFeatures.findIndex(x => x.toLocaleUpperCase() == perm) > -1;\n }\n // Fallback to group check.\n if (aPerms.UserGroups?.length && typeof aPerms.UserGroups[0] != \"string\") {\n for (let j = 0; j < aPerms.UserGroups.length; j++) {\n const group = aPerms.UserGroups[j] as UserGroup.IGroup;\n if (group?.Features?.length) {\n const gPerms = group.Features;\n if (gPerms && gPerms.findIndex(x => x.toLocaleUpperCase() == perm) > -1) {\n return true;\n }\n }\n }\n }\n }\n }\n }\n\n // Fallback to the session perm info.\n // This is deprecated and old as it's only for one account.\n const perms = session?.AccessPermissions;\n if (!perms) {\n return false;\n }\n const pAccountId = String(perms[\"ClientAccount.ID\"]).toLowerCase();\n if (pAccountId != accountId) {\n return false;\n }\n if (perms.EnabledFeatures?.length) {\n return perms.EnabledFeatures.findIndex(x => x.toLocaleUpperCase() == perm) > -1;\n }\n\n return false;\n }\n\n /**\n * Returns if a super permission is enabled for a session.\n * This check is case-insensitive.\n * Please use 'IsSuperAdmin' when needed as it covers all perms.\n * @param params \n * @returns \n */\n export function IsSuperPermEnabled(params: {\n session: ISession,\n perm: string\n }): boolean {\n let { session, perm } = params;\n if (!perm) {\n throw(\"Perm is required.\");\n }\n if (!session) {\n return false;\n }\n\n perm = perm.toLocaleUpperCase();\n\n // First we'll scan the included super perms.\n const superPerms = session.HypeportalAccessPermisssions;\n if (superPerms?.EnabledFeatures?.length) {\n return superPerms.EnabledFeatures.findIndex(x => x.toLocaleUpperCase() == perm) > -1;\n }\n\n // Now we'll fallback to digging through group to find the super group.\n if (session?.User?.AccessPermissions?.length) {\n for (let i = 0; i < session.User.AccessPermissions.length; i++) {\n const perms = session.User.AccessPermissions[i];\n\n // Newer API versions always specify accountId in the collections.\n // If it's set we can do a super account check early.\n if (perms[\"ClientAccount.ID\"] != null) {\n const pAccountId = String(perms[\"ClientAccount.ID\"]).toLowerCase();\n if (pAccountId != Api.SUPER_ACCOUNT_ID) {\n continue;\n }\n }\n\n if (perms?.UserGroups?.length) {\n for (let j = 0; j < perms.UserGroups.length; j++) {\n const group = perms.UserGroups[j];\n if (typeof group != \"string\") {\n const gAccountId = String(group[\"ClientAccount.ID\"]).toLowerCase();\n if (gAccountId != Api.SUPER_ACCOUNT_ID) {\n continue;\n }\n\n const features = group.Features;\n if (features && features.findIndex(x => x.toLocaleUpperCase() == perm) > -1) {\n return true;\n }\n }\n }\n }\n }\n }\n\n return false;\n }\n\n /**\n * Returns if a session is an account admin.\n * Please use 'IsSuperAdmin' when needed as it covers all perms.\n * @param params \n * @returns \n */\n export function IsAccountAdmin(params: {\n // The session to check.\n session: ISession,\n // The client account ID to check.\n accountId: string\n }): boolean {\n return IsPermEnabled({\n perm: Permission.EPerm.ADMIN,\n accountId: params.accountId,\n session: params.session\n });\n }\n\n /**\n * Returns if a session is a power user.\n * Power users are account admins without the ability to manage users and organizations.\n * Please use 'IsSuperAdmin' when needed as it covers all perms.\n * @param params \n * @returns \n */\n export function IsPowerUser(params: {\n // The session to check.\n session: ISession,\n // The client account ID to check.\n accountId: string\n }): boolean {\n return IsPermEnabled({\n perm: Permission.EPerm.POWER,\n accountId: params.accountId,\n session: params.session,\n });\n }\n\n /**\n * Returns if a session is a super admin.\n * @param params \n * @returns \n */\n export function IsSuperAdmin(params: {\n // The session to check.\n session: ISession\n }): boolean {\n return IsSuperPermEnabled({\n session: params.session,\n perm: Permission.EPerm.ADMIN\n });\n }\n\n /**\n * Returns cache identifier for a session.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetCacheKey(\"abc\");\n * api.Cache.Remove(key);\n * }\n * @param sessionId\n * @returns \n */\n function GetCacheKey(sessionId: string): string {\n return `${Api.ECacheKey.Session}${Api.ECacheKey.Id}${sessionId}`;\n }\n}","import { Api } from \"../api/api\";\nimport { GuardianApi } from \"../api/guardian-api\";\nimport { ENVIRONMENT } from \"../environment\";\nimport { Permission } from \"./permission\";\nimport { User } from \"./user\";\n\n/**\n * Describes the \"User Group\" concept within Nextspace.\n * A user group is a collection of permissions (\"Features\") and what users should be in the group.\n */\nexport namespace UserGroup {\n /**\n * Describes a user group record.\n */\n export interface IGroup {\n // The account ID that this group is for.\n \"ClientAccount.ID\"?: string;\n // Array of permissions that are enabled when being in this group.\n \"Features\": Permission.Perm[];\n // The group ID.\n \"ID\": string;\n // Human readable name for the group.\n \"Name\"?: string;\n }\n\n /**\n * Returns a user group by its name.\n * @param params \n * @returns \n */\n export async function GetByName(params: {\n api?: GuardianApi.Api, \n // The account ID that this group is for.\n accountId: string, \n // Name to search for.\n name: string, \n req?: Api.IReqParams\n }): Promise<{\n // The user group record.\n group: IGroup\n }> {\n let { api, accountId, name, req: reqParams } = params;\n if (!name || !accountId) {\n throw(\"Name and AccountID are required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n\n const data = await api.GET(`account/${accountId}/userGroupByName/${name}`, reqParams);\n return {\n group: data\n };\n }\n\n /**\n * Returns all users in a user group.\n * @param params \n * @returns \n */\n export async function GetUsers(params: {\n api?: GuardianApi.Api, \n // The account ID that this group is for.\n accountId: string, \n // The group ID.\n groupId: string, \n req?: Api.IReqParams\n }): Promise<{\n // The users in the group.\n users: User.IUser[]\n }> {\n let { api, accountId, groupId: id, req: reqParams } = params;\n if (!accountId || !id) {\n throw(\"AccountID and ID are required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n\n const data = await api.GET(`userGroup/${accountId}/${id}/users`, reqParams);\n return {\n users: data.Items\n };\n }\n\n /**\n * Returns list of user groups that have a specific permission enabled.\n * @param params \n * @returns \n */\n export async function GetListByPerm(params: {\n api?: GuardianApi.Api,\n // The account ID that this group is for.\n accountId: string, \n // The permission to search for.\n perm: Permission.Perm,\n req?: Api.IReqParams\n }): Promise<{\n // The user groups that have the permission enabled.\n groups: IGroup[]\n }> {\n let { api, accountId, perm, req: reqParams } = params;\n if (!accountId || !perm) {\n throw(\"AccountID and Perm are required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n\n const data = await api.GET(`userGroupsByFeature/${accountId}/${perm}`, reqParams);\n return {\n groups: data.Items\n };\n }\n\n /**\n * Returns all user groups for an account.\n * @param params \n * @returns \n */\n export async function GetList(params: {\n api?: GuardianApi.Api,\n // The account ID that this group is for.\n accountId: string, \n req?: Api.IReqParams\n }): Promise<{\n // The user groups for the account.\n groups: IGroup[]\n }> {\n let { api, accountId, req: reqParams } = params;\n if (!accountId) {\n throw(\"AccountID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n\n const data = await api.GET(`userGroups/${accountId}`, reqParams);\n return {\n groups: data.Items\n };\n }\n\n /**\n * Deletes a user group.\n * @param params \n * @returns \n */\n export async function Delete(params: {\n api?: GuardianApi.Api, \n // The account ID that this group is for.\n accountId: string, \n // The group ID.\n groupId: string, \n req?: Api.IReqParams\n }): Promise<void> {\n let { api, accountId, groupId: id, req: reqParams } = params;\n if (!accountId || !id) {\n throw(\"AccountID and ID are required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n\n return api.DELETE(`account/${accountId}/userGroupID/${id}`, reqParams);\n }\n\n /**\n * Creates or updates a user group.\n * @param params \n * @returns \n */\n export async function Update(params: {\n api?: GuardianApi.Api, \n // The user group to create or update.\n group: IGroup, \n reqParams?: Api.IReqParams\n }): Promise<{\n // The user group record.\n group: IGroup\n }> {\n let { api, group: data, reqParams } = params;\n if (!data.Name || !data[\"ClientAccount.ID\"]) {\n throw(\"User group name and client account ID are required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n\n const res = await api.POST(`userGroup${data.ID ? (\"/\" + data.ID) : \"\"}`, data, reqParams);\n return {\n group: res\n };\n }\n}","import { Api } from \"../api/api\";\nimport { GuardianApi } from \"../api/guardian-api\";\nimport { ENVIRONMENT } from \"../environment\";\nimport { UserGroup } from \"./user-group\";\n\n/**\n * Describes the \"User\" concept within Nextspace.\n * A user is either a login-user or an access-token.\n *\n * You cannot login using an access-token, but both concepts are-\n * treated the same way in terms of permissions and user groups.\n */\nexport namespace User {\n /**\n * Describes a user record.\n */\n export interface IUser {\n // Enabled access permissions.\n AccessPermissions?: IAccessPermission[];\n // User's email address.\n Email?: string;\n // User's username.\n Login?: string;\n // User's full name.\n FullName?: string;\n // User's ID.\n ID?: string;\n // Indicates if the user is activated.\n // This is deprecated and is being replaced by a flags for email and mobile verification statuses.\n IsActivated?: boolean;\n // Indicates if the user is disabled.\n IsDisabled?: boolean;\n // Indicates if the user's password needs to be changed.\n IsPasswordChangeRequired?: boolean;\n // User's mobile number.\n Mobile?: string;\n // User's password.\n // Is not available when reading the record.\n // Set to change the password.\n Password?: string;\n // User's type. Eg: access token instead of a login user.\n Type?: EType;\n }\n\n /**\n * Available user types.\n */\n export enum EType {\n // Typical user. Login to gain access to a session.\n User = \"LOGIN_USER\",\n // Access token. Used to gain access to related permissions.\n AccessToken = \"ACCESS_TOKEN\"\n }\n\n /**\n * Describes a set of permissions for an account.\n */\n export interface IAccessPermission {\n // The account ID that these permissions are for.\n \"ClientAccount.ID\": string;\n // Array of group records of names of them.\n // Result depends on the session's permissions.\n \"UserGroups\"?: UserGroup.IGroup[] | string[];\n // Array of permissions that are enabled.\n \"EnabledFeatures\"?: string[];\n\n // Array of associated user group IDs.\n // @warning: This is only part of the update request, not the response.\n \"UserGroup.ID\"?: string[];\n }\n\n /**\n * Gets a user record.\n * @param params \n * @returns \n */\n export async function Get(params: {\n api?: GuardianApi.Api,\n // The user ID.\n userId: string,\n // The account ID that this user is for.\n accountId?: string,\n req?: Api.IReqParams\n }): Promise<{\n // The user record.\n user: IUser\n }> {\n let { api, userId: id, accountId, req: reqParams } = params;\n if (!id) {\n throw(\"ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n\n const cache = await api.GetCacheItem(GetCacheKey(id, <string>accountId), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(`user/${id}${accountId ? `?clientAccountID=${accountId}` : \"\"}`, reqParams)\n res({\n user: data\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key: GetCacheKey(id, <string>accountId),\n value: prom,\n req: reqParams\n });\n return prom;\n }\n\n /**\n * Updates a user record.\n * @param params \n * @returns \n */\n export async function Update(params: {\n api?: GuardianApi.Api,\n // The user to update.\n user: IUser,\n req?: Api.IReqParams\n }): Promise<{\n // The updated user record.\n user: IUser\n }> {\n let { api, user: data, req: reqParams } = params;\n if (!data?.ID || !data?.Type) {\n throw(\"ID and Type are required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n\n // When getting a user it is structured slightly different to when we update it.\n // We can make up the difference here.\n if (data.AccessPermissions?.length) {\n for (let i = 0; i < data.AccessPermissions.length; i++) {\n const perm = data.AccessPermissions[i];\n if (!perm[\"UserGroup.ID\"] && perm.UserGroups && typeof perm.UserGroups != \"string\") {\n perm[\"UserGroup.ID\"] = [];\n for (let j = 0; j < perm.UserGroups.length; j++) {\n perm[\"UserGroup.ID\"].push((perm.UserGroups as UserGroup.IGroup[])[j].ID);\n }\n }\n }\n }\n const res = await api.POST(`user/${data.ID}`, data, reqParams);\n api.Cache.RemoveByContains(Api.ECacheKey.User + Api.ECacheKey.Id + data.ID);\n if (data.Type == EType.AccessToken) {\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.AccessToken + Api.ECacheKey.Account);\n }\n else if (data.Type == EType.User) {\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.User + Api.ECacheKey.Account);\n }\n return {\n user: res\n };\n }\n\n /**\n * Loads settings for a given user + app.\n * The session's account id is used to separate settings between accounts.\n * @param params\n */\n export async function GetSettings(params: {\n api?: GuardianApi.Api,\n // The user ID.\n userId: string,\n // The app ID.\n appId: string,\n req?: Api.IReqParams\n }): Promise<{\n // The settings record.\n settings: any\n }> {\n let { api, userId, appId, req } = params;\n if (!userId || !appId) {\n throw(\"UserId and appId are required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n\n const cache = await api.GetCacheItem(GetSettingsCacheKey(userId, appId), req);\n if (cache?.found) {\n return cache.data;\n }\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(`user/${userId}/application/${appId}/settings`);\n const settings = data?.Settings ? data.Settings : {};\n res({\n settings: settings\n });\n }\n catch (e) {\n // It will complain if an app id hasn't been used yet.\n // We need to suppress that error.\n if (e && typeof e == \"object\") {\n if (e.ERROR && typeof e.ERROR == \"object\" && e.ERROR.Type == \"NotFound\") {\n res({\n settings: {}\n });\n return;\n }\n }\n rej(e);\n }\n });\n await api.SetCacheItem({\n key: GetSettingsCacheKey(userId, appId),\n value: prom,\n req: req\n });\n return prom;\n }\n\n /**\n * Updates settings for a given accId + user + app.\n * The settings update will replace the existing record, please ensure to merge with existing settings.\n * AccountId is optional and will use a globally shared record if not provided.\n * @param params\n */\n export async function UpdateSettings(params: {\n api?: GuardianApi.Api,\n // The client account's ID.\n accId?: string,\n // The user ID.\n userId: string,\n // The app ID.\n appId: string,\n // The settings to update.\n settings: any,\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, accId, userId, appId, settings, req } = params;\n if (!userId || !appId) {\n throw(\"UserId and appId are required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n\n const postBody = {\n Settings: settings == null ? {} : settings,\n Application: appId,\n ClientAccountID: accId,\n UserID: userId\n };\n const prom = api.POST(`user/${userId}/application/${appId}/settings`, postBody, req);\n api.Cache.Remove(GetSettingsCacheKey(userId, appId));\n return prom;\n }\n\n /**\n * Returns if a username is available.\n * @param params \n * @returns \n */\n export async function GetUsernameAvailable(params: {\n api?: GuardianApi.Api,\n // The username to check.\n username: string,\n // The user ID to exclude from the check.\n // This is useful when updating a user's username.\n excludeUserId?: string,\n req?: Api.IReqParams\n }): Promise<{\n // Indicates if the username is available.\n isAvailable: boolean\n }> {\n let { api, username, excludeUserId, req: reqParams } = params;\n if (!username) {\n throw(\"Username is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n\n const req = api.GET(`user/loginavailable/${username}${excludeUserId ? \"?excludeUserId=\" + excludeUserId : \"\"}`, reqParams);\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await req;\n res({\n isAvailable: data.IsAvailable\n });\n }\n catch (e) {\n rej(<any>e);\n }\n });\n return prom;\n }\n\n export namespace LoginUser {\n /**\n * Returns cache identifier for a list of users.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetListCacheKey(\"abc\");\n * api.Cache.Remove(key);\n * }\n * @param accountId \n * @returns \n */\n export function GetListCacheKey(accountId: string): string {\n return Api.ECacheKey.User + Api.ECacheKey.Account + Api.ECacheKey.Id + accountId;\n }\n\n /**\n * Returns a user by their email address.\n * @param params \n * @returns \n */\n export async function GetByEmail(params: {\n api?: GuardianApi.Api,\n // The email address to search for.\n email: string,\n // An account ID to filter against.\n accountId?: string,\n req?: Api.IReqParams\n }): Promise<{\n // The user record.\n user: IUser\n }> {\n let { api, email, accountId, req: reqParams } = params;\n if (!email) {\n throw(\"Email is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n\n const cache = await api.GetCacheItem(GetEmailCacheKey(email, <string>accountId), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(`userByEmail/${email}${accountId ? `?clientAccountID=${accountId}` : \"\"}`, reqParams);\n res({\n user: data\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key: GetEmailCacheKey(email, <string>accountId),\n value: prom,\n req: reqParams\n });\n return prom;\n }\n\n /**\n * Returns a list of users for an account.\n * @param params \n * @returns \n */\n export async function GetList(params: {\n api?: GuardianApi.Api,\n // The account ID to get users for.\n accountId: string,\n // Indicates if the list should exclude the client account's users.\n exclusive?: boolean,\n req?: Api.IReqParams\n }): Promise<{\n // The list of users.\n users: IUser[]\n }> {\n let { api, accountId, exclusive, req: reqParams } = params;\n if (!accountId) {\n throw(\"Client account ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n if (!exclusive) {\n exclusive = false;\n }\n\n const cache = exclusive ? null : await api.GetCacheItem(GetListCacheKey(accountId), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const req: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(`users?clientAccountID=${accountId}${exclusive ? \"&allExcludingClientAccount=true\" : \"\" }`, reqParams);\n res({\n users: data.Items\n });\n }\n catch (e) {\n rej(e);\n }\n });\n req.then(async (data) => {\n const users = data.users;\n for (let i = 0; i < users.length; i++) {\n await api.SetCacheItem({\n key: GetCacheKey(<string>users[i].ID, accountId),\n value: {\n user: users[i]\n },\n req: reqParams\n });\n }\n });\n if (!exclusive) {\n await api.SetCacheItem({\n key: GetListCacheKey(accountId),\n value: req,\n req: reqParams\n });\n }\n return req;\n }\n\n /**\n * Sends a signup email to the specified email address.\n * @param params\n * @returns\n */\n export async function Signup(params: {\n api?: GuardianApi.Api,\n // The email address to send the signup email to.\n email: string,\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, email, req: reqParams } = params;\n if (!email) {\n throw(\"Email is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n\n return api.POST(\"clientaccount/signup\", {\n Email: email\n }, reqParams);\n }\n\n /**\n * Sends a new signup email using a previous one's expired code.\n * @param params\n * @returns\n */\n export async function SignupResend(params: {\n api?: GuardianApi.Api,\n // The expired activation code.\n expiredCode: string,\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, expiredCode, req: reqParams } = params;\n if (!expiredCode) {\n throw(\"Expired activation code is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n\n return api.POST(`clientaccount/signup/resend?activationKey=${Api.Encode(expiredCode)}`, null, reqParams);\n }\n\n /**\n * Completes signup using user data and a signup code.\n * @param params\n * @returns\n */\n export async function SignupComplete(params: {\n api?: GuardianApi.Api,\n // The signup code.\n code: string,\n // The user data to complete the signup with.\n user: IUser,\n // The account ID to complete the signup for.\n accountId?: string,\n req?: Api.IReqParams\n }): Promise<{\n // The user record.\n user: IUser\n }> {\n let { api, code, user: data, accountId, req: reqParams } = params;\n if (!code || !data?.Login || !data?.Password) {\n throw(\"Login, password, and activation code are required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n\n data = JSON.parse(JSON.stringify(data));\n data.IsActivated = true;\n data.IsDisabled = false;\n (<any>data).key = code;\n const res: IUser = await api.POST(`UserActivate/${accountId ? accountId : \"\"}`, data, reqParams);\n api.Cache.RemoveByContains(Api.ECacheKey.User + Api.ECacheKey.Id + res.ID);\n if (data.Email) {\n api.Cache.RemoveByContains(Api.ECacheKey.User + Api.ECacheKey.UserEmail + data.Email);\n }\n return {\n user: res\n };\n }\n\n /**\n * Sends a password reset email to the specified email address.\n * @param params\n * @returns user id associated with provided email.\n */\n export async function ForgotPassword(params: {\n api?: GuardianApi.Api,\n // AccountId the user is associated with.\n // This dictates the email template to use.\n accountId: string,\n // The email address to send the password reset email to.\n email: string,\n req?: Api.IReqParams\n }): Promise<{\n // The user ID associated with the provided email.\n userId: string\n }> {\n let { api, accountId, email, req: reqParams } = params;\n if (!accountId || !email) {\n throw(\"Account ID and email are required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n\n const req = api.POST(`UserForgotPassword/${accountId}`, {\n Email: email\n }, reqParams);\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await req;\n res({\n userId: data.ID\n });\n }\n catch (e) {\n rej(e);\n }\n });\n return prom;\n }\n\n /**\n * Completes password reset using a password reset code and new password.\n * @param params\n * @returns\n */\n export async function ForgotPasswordComplete(params: {\n api?: GuardianApi.Api,\n // The password reset code.\n code: string,\n // The associated user ID.\n userId: string,\n // The new password.\n password: string,\n req?: Api.IReqParams\n }): Promise<{\n // The related user record.\n user: IUser\n }> {\n let { api, code, userId, password, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n\n const {user} = await Get({\n api: api,\n userId: userId,\n accountId: \"\",\n req: reqParams\n });\n const res = await api.POST(\"UserSetNameAndPassword\", {\n ID: userId,\n Email: user.Email,\n ActivationCode: code,\n Password: password,\n FullName: user.FullName\n }, reqParams);\n return {\n user: res\n };\n }\n }\n\n export namespace AccessToken {\n /**\n * Returns cache identifier for a list of users.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetListCacheKey(\"abc\");\n * api.Cache.Remove(key);\n * }\n * @param accountId \n * @returns \n */\n export function GetListCacheKey(accountId: string): string {\n return Api.ECacheKey.AccessToken + Api.ECacheKey.Account + Api.ECacheKey.Id + accountId;\n }\n\n /**\n * Returns a list of access tokens for an account.\n * @param params \n * @returns \n */\n export async function GetList(params: {\n api?: GuardianApi.Api,\n // The account ID to get access tokens for.\n accountId: string,\n req?: Api.IReqParams\n }): Promise<{\n // The list of access tokens.\n users: IUser[]\n }> {\n let { api, accountId, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n\n const cache = await api.GetCacheItem(GetListCacheKey(accountId), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const req: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(\"usersByClientAccount/accessTokens\", reqParams);\n res({\n users: data.Items\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key: GetListCacheKey(accountId),\n value: req,\n req: reqParams\n });\n return req;\n }\n\n /**\n * Deletes an access token.\n * @param params \n */\n export async function Delete(params: {\n api?: GuardianApi.Api,\n // The access token ID.\n tokenId: string,\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, tokenId: id, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n\n await api.DELETE(`accessToken/${id}`, reqParams);\n api.Cache.RemoveByContains(Api.ECacheKey.User + Api.ECacheKey.Id + id);\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.AccessToken + Api.ECacheKey.Account);\n }\n\n /**\n * Creates a new access token.\n * @param params \n * @returns \n */\n export async function Create(params: {\n api?: GuardianApi.Api,\n // The access token to create.\n token: IUser,\n req?: Api.IReqParams\n }): Promise<{\n // The created access token.\n user: IUser\n }> {\n let { api, token: data, req: reqParams } = params;\n if (!data) {\n data = {};\n }\n if (data.Type == EType.User) {\n throw(\"User type is not allowed.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n if (!data.Type) {\n data.Type = EType.AccessToken;\n }\n\n data = await api.POST(\"accessToken\", data, reqParams);\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.AccessToken + Api.ECacheKey.Account);\n return {\n user: data\n };\n }\n }\n\n /**\n * Returns cache identifier for a user.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetCacheKey(\"abc\", \"def\");\n * api.Cache.Remove(key);\n * }\n * @param userId\n * @param accountId\n * @returns \n */\n export function GetCacheKey(userId: string, accountId?: string): string {\n if (!accountId) {\n accountId = \"\";\n }\n return Api.ECacheKey.User + Api.ECacheKey.Id + userId + Api.ECacheKey.Id + accountId;\n }\n\n /**\n * Returns cache identifier for a user.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetCacheKey(\"abc\", \"def\");\n * api.Cache.Remove(key);\n * }\n * @param email\n * @param accountId\n * @returns \n */\n export function GetEmailCacheKey(email: string, accountId?: string): string {\n if (!accountId) {\n accountId = \"\";\n }\n return Api.ECacheKey.User + Api.ECacheKey.UserEmail + email + Api.ECacheKey.Id + accountId;\n }\n\n /**\n * Returns cache identifier for a user's settings.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetCacheKey(\"abc\", \"def\");\n * api.Cache.Remove(key);\n * }\n * @param userId\n * @param appId\n * @returns \n */\n export function GetSettingsCacheKey(userId: string, appId: string): string {\n return Api.ECacheKey.User + Api.ECacheKey.UserSettings + userId + Api.ECacheKey.Id + appId;\n }\n}","\nimport { Api } from \"../api/api\";\nimport { GuardianApi } from \"../api/guardian-api\";\nimport { UTC } from \"../common/utc\";\nimport { ENVIRONMENT } from \"../environment\";\nimport { User } from \"../user/user\";\n\n/**\n * An account-invite is an invitation to a user to join a client account.\n * New users to Nextspace will setup their user account within the invitation process.\n */\nexport namespace AccountInvite {\n /**\n * Describes an account-invite record.\n */\n export interface IInvite {\n ID: number;\n // Client account the invite is for.\n \"Account.ID\": string;\n // User the invite is for.\n \"Invited.User.ID\": string;\n // User that created the invite.\n \"InvitedBy.User.ID\": string;\n // Date/time the invite was created.\n CreatedDate: UTC.IUTC;\n // How the user was invited. Eg: Email, SMS, Manual.\n InviteMethod: EInviteMethod;\n // Indicates if the invite has expired.\n IsExpired: boolean;\n // Status of the invite. Eg: Sent, Accepted, Denied, Cancelled.\n Status: EStatus;\n }\n\n /**\n * Possible invite statuses.\n */\n export enum EStatus {\n Denied = \"Denied\",\n Cancelled = \"Cancelled\",\n Sent = \"Sent\",\n NotSent = \"NotSent\",\n Accepted = \"Accepted\"\n }\n\n /**\n * Possible invite methods.\n */\n export enum EInviteMethod {\n // Email invites are sent to a user's email address.\n // An email invite will validate the user's email address.\n Email = \"Email\",\n // Manual invites are links that are manually passed to a user.\n // A manual invite will not validate the user's email address or mobile number.\n Manual = \"Manual\",\n // TODO: Implement SMS invites.\n SMS = \"SMS\"\n }\n\n /**\n * Returns an invite matching a provided invite code.\n * @param params \n * @returns \n */\n export async function GetByCode(params: {\n api?: GuardianApi.Api,\n code: string,\n req?: Api.IReqParams\n }): Promise<{\n invite: IInvite\n }> {\n let { api, code, req } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n\n const res = await api.GET(`invite/code?inviteCode=${code}`, Api.PrepReqParams(req));\n return res;\n }\n\n /**\n * Returns a list of invites matching provided criteria.\n * For example you can get a list of invites for a specific account or user (or both).\n * @param params \n * @returns \n */\n export async function GetList(params: {\n api?: GuardianApi.Api,\n // Client account ID to get invites for.\n accountId?: string,\n // User ID to get invites for.\n userId?: string,\n req?: Api.IReqParams\n }): Promise<{\n invites: IInvite[],\n warnings?: string[]\n }> {\n let { api, accountId, userId, req } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n\n const urlParams = new URLSearchParams();\n if (accountId) {\n urlParams.append(\"accountId\", accountId);\n }\n if (userId) {\n urlParams.append(\"userId\", userId);\n }\n const res = await api.GET(\"invites?\" + urlParams.toString(), Api.PrepReqParams(req));\n return res;\n }\n\n /**\n * Updates an invite's status.\n * Once an invite is accepted or denied it cannot be changed.\n * @param params \n * @returns \n */\n export async function Update(params: {\n api?: GuardianApi.Api,\n code: string,\n status: string,\n user?: User.IUser,\n req?: Api.IReqParams\n }) {\n let { api, code, status, user, req } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n\n const res = await api.POST(\"invite/update\", {\n InviteCode: code,\n Status: status,\n User: user\n }, Api.PrepReqParams(req));\n return res;\n }\n\n /**\n * Creates a new invite.\n * Please validate the response invitation records to ensure the desired contact method was used and worked.\n * Eg: It will tell you if the email was sent successfully.\n * @param params \n * @returns \n */\n export async function Create(params: {\n api?: GuardianApi.Api,\n // Client account ID to create the invite for.\n accountId: string,\n // Provide if you want to match against an existing user record using their login (username).\n // User must exist.\n login?: string,\n // Provide if you want to match against an existing user record using their ID.\n // User must exist.\n userId?: string,\n // Provide if you want to match against an existing user record using their email address.\n // If not found then a new user is made.\n email?: string,\n // Provide if you want to match against an existing user record using their mobile number.\n // If not found then a new user is made.\n mobile?: string,\n // Optional email template key to use. If not provided then the default template will be used.\n emailTemplateKey?: string,\n // Array of user groups that the user should be added to.\n // At least one must be specified.\n groupIds: string[],\n // Optional invite method to use.\n // If not provided then the invite method will be determined automatically based on the provided contact details.\n inviteMethod?: EInviteMethod,\n req?: Api.IReqParams\n }): Promise<{\n // Array of warnings that may have occurred during the invite process.\n warnings?: string[],\n // The user record for the user that was invited.\n user: User.IUser,\n // The invite record for the contact method used.\n invite: IInvite,\n // If SMS or Email are used, an additional invite record is generated for the manual invite.\n manualInvite?: IInvite\n manualInviteCode?: string\n }> {\n let { api, accountId, login, userId, email, mobile, emailTemplateKey, groupIds, req, inviteMethod } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n if (!groupIds?.length) {\n throw new Error(\"At least one User Group ID must be provided.\");\n }\n\n const res = await api.POST(\"invite/new\", {\n accountId,\n login,\n email,\n mobile,\n userId,\n groupIds,\n emailTemplateKey,\n inviteMethod\n }, Api.PrepReqParams(req));\n return res;\n }\n}","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../bruce-models\";\nimport { ENVIRONMENT } from \"../environment\";\n\n/**\n * Account Features are a set of flags that can be enabled or disabled for an account.\n * These flags usually represent how data is stored and managed.\n */\nexport namespace AccountFeatures {\n export enum EFeature {\n // Flag to enable data to be stored in the JSON column type.\n // This will enable conversion of the data, and will also enable searches to use that instead.\n EntityJsonData = \"Feature_Entity_JSONData\",\n // Flag to enable a text search against JSON data values.\n // 'EntityJsonData' must also be enabled.\n // @WARNING: Please re-index all Entities first before enabling this feature.\n // Without this the raw 2D geometry will be indexed which will make it much slower, and may cause the update of the flag to fail.\n EntityLexicalSearch = \"Feature_Entity_Lexical_Search\",\n }\n\n /**\n * Gets account features corresponding to the API instance's account.\n * @param params \n * @returns \n */\n export async function Get(params: {\n api?: BruceApi.Api,\n req?: Api.IReqParams\n }): Promise<{\n features: {\n [key: string]: number\n }\n }> {\n let { api, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const accountId = api.AccountId;\n const cache = await api.GetCacheItem(GetCacheKey(accountId), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(\"features\", reqParams);\n const features = data?.Features;\n res({\n features: features ? features : {}\n });\n }\n catch (e) {\n rej(e);\n }\n });\n api.SetCacheItem({\n key: GetCacheKey(accountId),\n value: prom,\n req: reqParams\n });\n return prom;\n }\n\n export async function Update(params: {\n api?: BruceApi.Api,\n // The features to update.\n features: {\n [key: string]: number\n },\n req?: Api.IReqParams\n }): Promise<{\n features: {\n [key: string]: number\n }\n }> {\n let { api, features, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const accountId = api.AccountId;\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.POST(\"features\", {\n Features: features\n }, reqParams);\n const updated = data?.Features;\n res({\n features: updated ? updated : {}\n });\n }\n catch (e) {\n rej(e);\n }\n });\n api.Cache.Remove(GetCacheKey(accountId));\n return prom;\n }\n\n /**\n * Returns cache identifier for an account by ID.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetCacheKey(\"my-account-id\");\n * api.Cache.Remove(key);\n * }\n * @param accountId \n * @returns \n */\n export function GetCacheKey(accountId: string): string {\n return Api.ECacheKey.AccountFeatures + Api.ECacheKey.Id + accountId;\n }\n}","import { Api, ApiGetters, ENVIRONMENT, GuardianApi, IDictionary, MathUtils, PendingAction, ProjectView } from \"../bruce-models\";\n\nexport namespace AccountLimits {\n export enum ELimit {\n MaxProjectViewCount = \"MaxProjectViewCount\",\n MaxStorageUseGigabytes = \"MaxStorageUseGigabytes\",\n MaxEntitiesCount = \"MaxEntitiesCount\",\n MaxFileImportSizeGigabytes = \"MaxFileImportSizeGigabytes\",\n OperatorAccessAllowed = \"OperatorAccessAllowed\",\n DenyPublicAccess = \"DenyPublicAccess\",\n EnableSSOLogin = \"EnableSSOLogin\",\n EnableSSOLoginAutoRedirect = \"EnableSSOLoginAutoRedirect\"\n }\n export type Limit = ELimit | string;\n\n /**\n * Represents a limit for an account.\n * The value type of interest is determined by the limit key.\n */\n export interface ILimit {\n \"Numeric\": number,\n \"String\": string,\n \"Boolean\": boolean\n }\n\n /**\n * Returns a dictionary of limits for the given account.\n * @param params \n * @returns \n */\n export async function GetLimits(params: {\n accountId: string,\n api?: GuardianApi.Api,\n req?: Api.IReqParams\n }): Promise<{\n limits: IDictionary<ILimit>\n }> {\n let { accountId, api, req } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n req = Api.PrepReqParams(req);\n\n const cacheData = api.GetCacheItem(GetLimitsCacheKey(accountId));\n if (cacheData?.found) {\n return cacheData.data;\n }\n const prom: any = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(`account/${accountId}?WithLimits=true`);\n const limits = data.Limits ? data.Limits : {};\n res({\n limits: limits\n });\n }\n catch (e) {\n rej(e);\n }\n });\n api.SetCacheItem({\n key: GetLimitsCacheKey(accountId),\n value: prom,\n req: req\n });\n return prom;\n }\n\n /**\n * Returns a numeric limit for the given account.\n * @param params \n */\n export async function GetNumericLimit(params: {\n // The limit to load.\n key: Limit,\n // The account to load the limit for.\n accountId: string,\n api?: GuardianApi.Api,\n req?: Api.IReqParams,\n // The value to return when there is a server error.\n onErrorValue: any,\n // The value to return when the limit is not set.\n onEmptyValue: number,\n }): Promise<number> { \n const { key, api, req, onErrorValue, onEmptyValue, accountId } = params;\n try {\n const { limits } = await GetLimits({\n accountId: accountId,\n api: api,\n req: req\n });\n const limit = limits[key];\n if (limit == null || limit.Numeric == null) {\n return onEmptyValue;\n }\n return Number(limit.Numeric);\n }\n catch (e) {\n return onErrorValue;\n }\n }\n\n /**\n * Returns a boolean limit for the given account.\n * @param params \n */\n export async function GetBooleanLimit(params: {\n key: Limit,\n accountId: string,\n api?: GuardianApi.Api,\n req?: Api.IReqParams,\n onErrorValue: any,\n onEmptyValue: boolean\n }): Promise<boolean> {\n const { key, api, req, onErrorValue, onEmptyValue, accountId } = params;\n try {\n const { limits } = await GetLimits({\n accountId: accountId,\n api: api,\n req: req\n });\n const limit = limits[key];\n if (limit == null || limit.Boolean == null) {\n return onEmptyValue;\n }\n return Boolean(limit.Boolean);\n }\n catch (e) {\n return onErrorValue;\n }\n }\n\n /**\n * Returns a string limit for the given account.\n * @param params \n */\n export async function GetStringLimit(params: {\n key: Limit,\n accountId: string,\n api?: GuardianApi.Api,\n req?: Api.IReqParams,\n onErrorValue: any,\n onEmptyValue: string\n }): Promise<string> {\n const { key, api, req, onErrorValue, onEmptyValue, accountId } = params;\n try {\n const { limits } = await GetLimits({\n accountId: accountId,\n api: api,\n req: req\n });\n const limit = limits[key];\n if (limit == null || limit.String == null) {\n return onEmptyValue;\n }\n return limit.String;\n }\n catch (e) {\n return onErrorValue;\n }\n }\n\n /**\n * Functions for validating if a user can do things sit here.\n */\n export namespace Assert {\n /**\n * Returns if project view creation is allowed for the account.\n */\n export async function GetCanCreateProjectView(params: {\n accountId?: string,\n getters?: ApiGetters\n }): Promise<{\n allowed: boolean,\n errorText?: string\n }> {\n if (!params.getters) {\n params.getters = ENVIRONMENT.Api();\n }\n if (!params.accountId) {\n params.accountId = params.getters.GetAccountId();\n }\n\n let current = -1;\n let max = await GetNumericLimit({\n accountId: params.accountId,\n key: ELimit.MaxProjectViewCount,\n onEmptyValue: 0,\n onErrorValue: null,\n api: params.getters.GetGuardianApi()\n });\n\n if (max != null) {\n // Should use proper statistic API as this will exclude project views the user cannot access.\n try {\n const {views} = await ProjectView.GetList({\n api: params.getters.GetBruceApi({\n accountId: params.accountId\n })\n });\n current = views.length;\n }\n catch (e) {\n console.error(e);\n max = null;\n }\n }\n\n if (max == null) {\n return {\n allowed: false,\n errorText: \"We apologize but Project View creation is currently unavailable.\"\n };\n }\n else if (max == -1) {\n return {\n allowed: true\n };\n }\n else if (current == -1) {\n return {\n allowed: false,\n errorText: \"We apologize but Project View creation is currently unavailable.\"\n };\n }\n else if (current >= max) {\n return {\n allowed: false,\n errorText: `You have reached the maximum number of Project Views allowed for your account. Your limit is ${max} Project ${max == 1 ? \"View\" : \"Views\"} and you have ${current}.`\n };\n }\n return {\n allowed: true\n };\n }\n\n /**\n * Returns the project view limit for an account.\n * If -1 is returned then it is unlimited.\n * @param params \n * @returns \n */\n export async function GetProjectViewLimit(params: {\n accountId?: string,\n api?: GuardianApi.Api\n }) {\n if (!params.api) {\n params.api = ENVIRONMENT.Api().GetGuardianApi();\n }\n if (!params.accountId) {\n params.accountId = ENVIRONMENT.Api().GetAccountId();\n }\n\n const max = await GetNumericLimit({\n accountId: params.accountId,\n key: ELimit.MaxProjectViewCount,\n onEmptyValue: 0,\n onErrorValue: null,\n api: params.api\n });\n // Our error so we'll just allow unlimited for the time being.\n if (max == null) {\n return -1;\n }\n return max;\n }\n\n /**\n * Returns if file uploads are allowed for the account.\n */\n export async function GetCanUploadFile(params: {\n accountId?: string,\n getters?: ApiGetters,\n // If provided we'll add a provided file size in bytes to the current storage amount for the check.\n fileSize?: number,\n // We'll check more files if this is true.\n // This is false by default.\n // When doing an import we'll check more, but for random things like uploading a picture to an entity we won't.\n thoroughCheck?: boolean\n }): Promise<{\n allowed: boolean,\n errorText?: string\n }> {\n if (!params.getters) {\n params.getters = ENVIRONMENT.Api();\n }\n if (!params.accountId) {\n params.accountId = params.getters.GetAccountId();\n }\n\n let current = -1;\n let max = await GetNumericLimit({\n accountId: params.accountId,\n key: ELimit.MaxStorageUseGigabytes,\n onEmptyValue: 0,\n onErrorValue: null,\n api: params.getters.GetGuardianApi()\n });\n\n if (max != null && max > 0) {\n try {\n const api = params.getters.GetBruceApi({\n accountId: params.accountId\n });\n const stats = await api.GET(\"account/summary-stats\") as PendingAction.IAction;\n if (stats?.ID) {\n const result = stats?.Result;\n try {\n const resJson = JSON.parse(result);\n const fileBytes = resJson.TotalStorageUseBytes;\n const fileGB = fileBytes != null && !isNaN(fileBytes) && fileBytes != -1 ? MathUtils.Round(fileBytes / 1024 / 1024 / 1024, 2) : null;\n\n // Still counting so we'll give unlimited for the time being.\n // This count can take ages so we won't make the user wait.\n if (fileGB == null || isNaN(fileGB)) {\n max = -1;\n }\n else {\n current = fileGB;\n }\n }\n // We won't count this as a fatal error because who knows how stable this is.\n catch (e) {\n console.error(e);\n }\n }\n // Unknown so we'll just give unlimited for the time being.\n else {\n max = -1;\n }\n }\n catch (e) {\n console.error(e);\n max = null;\n }\n }\n\n // Optional param for a file size to add to the current storage amount.\n // Eg: user is uploading a 3gb file, is that allowed right now?\n if (current != -1 && !isNaN(params.fileSize) && params.fileSize) {\n current += MathUtils.Round(params.fileSize / 1024 / 1024 / 1024, 3);\n }\n\n if (max == null) {\n return {\n allowed: false,\n errorText: \"We apologize but file uploads are currently unavailable.\"\n };\n }\n else if (max == -1) {\n return {\n allowed: true\n };\n }\n else if (current == -1) {\n return {\n allowed: false,\n errorText: \"We apologize but file uploads are currently unavailable.\"\n };\n }\n else if (current >= max) {\n return {\n allowed: false,\n errorText: `You have reached the maximum amount of storage allowed for your account. You are limited to ${max.toLocaleString()} ${max == 1 ? \"GB\" : \"GBs\"} of storage.`\n };\n }\n return {\n allowed: true\n };\n }\n\n /**\n * Returns the file limit for an account.\n * If -1 is returned then it is unlimited.\n * @param params \n * @returns \n */\n export async function GetFileGBLimit(params: {\n accountId?: string,\n api?: GuardianApi.Api\n }): Promise<number> {\n if (!params.api) {\n params.api = ENVIRONMENT.Api().GetGuardianApi();\n }\n if (!params.accountId) {\n params.accountId = ENVIRONMENT.Api().GetAccountId();\n }\n\n const max = await GetNumericLimit({\n accountId: params.accountId,\n key: ELimit.MaxStorageUseGigabytes,\n onEmptyValue: 0,\n onErrorValue: null,\n api: params.api\n });\n // Our error so we'll just allow unlimited for the time being.\n if (max == null) {\n return -1;\n }\n return max;\n }\n\n /**\n * Returns the maximum file import size for an account.\n * If -1 is returned then it is unlimited.\n * @param params \n * @returns \n */\n export async function GetMaxImportSizeGB(params: {\n accountId?: string,\n api?: GuardianApi.Api\n }) {\n if (!params.api) {\n params.api = ENVIRONMENT.Api().GetGuardianApi();\n }\n if (!params.accountId) {\n params.accountId = ENVIRONMENT.Api().GetAccountId();\n }\n\n const max = await GetNumericLimit({\n accountId: params.accountId,\n key: ELimit.MaxFileImportSizeGigabytes,\n onEmptyValue: 0,\n onErrorValue: null,\n api: params.api\n });\n // Our error so we'll just allow unlimited for the time being.\n if (max == null) {\n return -1;\n }\n return max;\n }\n\n /**\n * Returns if entity creation is allowed for the account.\n */\n export async function GetCanCreateEntity(params: {\n accountId?: string,\n getters?: ApiGetters,\n // If provided we'll add a provided entity count to the current entity amount for the check.\n count?: number\n }): Promise<{\n allowed: boolean,\n errorText?: string\n }> {\n if (!params.getters) {\n params.getters = ENVIRONMENT.Api();\n }\n if (!params.accountId) {\n params.accountId = params.getters.GetAccountId();\n }\n\n let current = -1;\n let max = await GetNumericLimit({\n accountId: params.accountId,\n key: ELimit.MaxEntitiesCount,\n onEmptyValue: 0,\n onErrorValue: null,\n api: params.getters.GetGuardianApi()\n });\n\n if (max != null && max > 0) {\n try {\n const api = params.getters.GetBruceApi({\n accountId: params.accountId\n });\n const stats = await api.GET(\"account/summary-stats\") as PendingAction.IAction;\n if (stats?.ID) {\n const result = stats?.Result;\n try {\n const resJson = JSON.parse(result);\n const eCount = resJson.EntitiesCount;\n\n // Still counting so we'll give unlimited for the time being.\n // This count can take ages so we won't make the user wait.\n if (eCount == null || isNaN(eCount)) {\n max = -1;\n }\n else {\n current = eCount;\n }\n }\n // We won't count this as a fatal error because who knows how stable this is.\n catch (e) {\n console.error(e);\n }\n }\n // Unknown so we'll just give unlimited for the time being.\n else {\n max = -1;\n }\n }\n catch (e) {\n console.error(e);\n max = null;\n }\n }\n\n // Optional param for an entity count to add to the current entity amount.\n // Eg: user is creating 3 entities, is that allowed right now?\n if (current != -1 && !isNaN(params.count) && params.count) {\n current += params.count;\n // Remove one since we do an inclusive check later in the code.\n current -= 1;\n }\n\n if (max == null) {\n return {\n allowed: false,\n errorText: \"We apologize but Entity creation is currently unavailable.\"\n };\n }\n else if (max == -1) {\n return {\n allowed: true\n };\n }\n else if (current == -1) {\n return {\n allowed: false,\n errorText: \"We apologize but Entity creation is currently unavailable.\"\n };\n }\n else if (current >= max) {\n return {\n allowed: false,\n errorText: `You have reached the maximum number of Entities allowed for your account. You are limited to ${max.toLocaleString()} ${max == 1 ? \"Entity\" : \"Entities\"}.`\n };\n }\n return {\n allowed: true\n };\n }\n\n /**\n * Returns the entity limit for an account.\n * If -1 is returned then it is unlimited.\n */\n export async function GetEntityLimit(params: {\n accountId?: string,\n api?: GuardianApi.Api\n }): Promise<number> {\n if (!params.api) {\n params.api = ENVIRONMENT.Api().GetGuardianApi();\n }\n if (!params.accountId) {\n params.accountId = ENVIRONMENT.Api().GetAccountId();\n }\n\n const max = await GetNumericLimit({\n accountId: params.accountId,\n key: ELimit.MaxEntitiesCount,\n onEmptyValue: 0,\n onErrorValue: null,\n api: params.api\n });\n // Our error so we'll just allow unlimited for the time being.\n if (max == null) {\n return -1;\n }\n return max;\n }\n\n /**\n * Returns if Operator access is allowed for the account.\n * @param params\n * @returns\n */\n export async function GetCanOpenOperator(params: {\n accountId?: string,\n api?: GuardianApi.Api,\n }): Promise<{\n allowed: boolean,\n errorText?: string\n }> {\n if (!params.api) {\n params.api = ENVIRONMENT.Api().GetGuardianApi();\n }\n if (!params.accountId) {\n params.accountId = ENVIRONMENT.Api().GetAccountId();\n }\n\n const allowed = await GetBooleanLimit({\n accountId: params.accountId,\n key: ELimit.OperatorAccessAllowed,\n onEmptyValue: false,\n onErrorValue: null,\n api: params.api\n });\n\n if (allowed == null) {\n return {\n allowed: false,\n errorText: \"We apologize but Operator access is currently unavailable.\"\n };\n }\n else if (allowed) {\n return {\n allowed: true\n };\n }\n else {\n return {\n allowed: false,\n errorText: \"You do not have access to Operator.\"\n };\n }\n }\n\n /**\n * Returns SSO login settings for the account.\n * @param params \n * @returns \n */\n export async function GetSSOLoginSettings(params: {\n accountId?: string,\n api?: GuardianApi.Api,\n }): Promise<{\n enabled: boolean,\n autoRedirect: boolean,\n errorText?: string\n }> {\n if (!params.api) {\n params.api = ENVIRONMENT.Api().GetGuardianApi();\n }\n if (!params.accountId) {\n params.accountId = ENVIRONMENT.Api().GetAccountId();\n }\n\n const enabled = await GetBooleanLimit({\n accountId: params.accountId,\n key: ELimit.EnableSSOLogin,\n onEmptyValue: false,\n onErrorValue: null,\n api: params.api\n });\n const autoRedirect = await GetBooleanLimit({\n accountId: params.accountId,\n key: ELimit.EnableSSOLoginAutoRedirect,\n onEmptyValue: false,\n onErrorValue: null,\n api: params.api\n });\n\n if (enabled == null || autoRedirect == null) {\n return {\n enabled: false,\n autoRedirect: false,\n errorText: \"We apologize but SSO login is currently unavailable.\"\n };\n }\n return {\n enabled: enabled,\n autoRedirect: autoRedirect\n };\n }\n\n /**\n * Returns if public access is denied to this account.\n * @param params \n * @returns \n */\n export async function GetDenyPublicAccess(params: {\n accountId?: string,\n api?: GuardianApi.Api,\n }): Promise<boolean> {\n if (!params.api) {\n params.api = ENVIRONMENT.Api().GetGuardianApi();\n }\n if (!params.accountId) {\n params.accountId = ENVIRONMENT.Api().GetAccountId();\n }\n const enabled = await GetBooleanLimit({\n accountId: params.accountId,\n key: ELimit.DenyPublicAccess,\n // If empty then we'll assume we are not denying public access.\n onEmptyValue: false,\n // If we crash we are denying public access.\n onErrorValue: true,\n api: params.api\n });\n return enabled;\n }\n }\n\n /**\n * Cache key for requesting account limits for a specific account.\n * @param accountId \n */\n export function GetLimitsCacheKey(accountId: string) {\n return Api.ECacheKey.AccountLimits + Api.ECacheKey.Id + accountId;\n }\n}","export namespace EncryptUtils {\n // https://stackoverflow.com/questions/7616461/generate-a-hash-from-string-in-javascript\n export function Cyrb53Hash(str: string, seed: number = 0): number {\n let h1 = 0xdeadbeef ^ seed, h2 = 0x41c6ce57 ^ seed;\n for (let i = 0, ch; i < str.length; i++) {\n ch = str.charCodeAt(i);\n h1 = Math.imul(h1 ^ ch, 2654435761);\n h2 = Math.imul(h2 ^ ch, 1597334677);\n }\n h1 = Math.imul(h1 ^ (h1>>>16), 2246822507) ^ Math.imul(h2 ^ (h2>>>13), 3266489909);\n h2 = Math.imul(h2 ^ (h2>>>16), 2246822507) ^ Math.imul(h1 ^ (h1>>>13), 3266489909);\n return (4294967296 * (2097151 & h2) + (h1>>>0));\n }\n}","export namespace UrlUtils {\n /**\n * Returns a url-safe string that is human readable.\n * Eg: 'My Project View!' into 'My-Project-View'.\n * @param str \n * @returns \n */\n export function ToHumanReadable(str: string) {\n str = str.replace(/[^a-zA-Z0-9]/gi, \"-\");\n // Dedupe underscores.\n str = str.replace(/-+/g, \"-\");\n // Trim underscores.\n str = str.replace(/^-+|-+$/g, \"\");\n return str;\n }\n\n /**\n * Adds a query parameter to a url.\n * Eg: AddQueryParam('http://example.com', 'key', 'value') => 'http://example.com?key=value'\n * @param url \n * @param key \n * @param value \n * @returns \n */\n export function AddQueryParam(url: string, key: string, value: string) {\n const urlObj = new URL(url);\n urlObj.searchParams.append(key, value);\n return urlObj.toString();\n }\n}","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { ENVIRONMENT } from \"../environment\";\nimport { Entity as E } from \"../entity/entity\";\n\n/**\n * Describes the \"Data Lab\" concept within Nextspace.\n * Data lab is a query tool that allows users to search for entities.\n * Data lab queries can be saved for reuse.\n */\nexport namespace DataLab {\n // WIP.\n export interface IQuery {\n [EReqKey.Primary]: {\n OrderBy?: string;\n SortOrder?: Api.ESortOrderStr;\n Items: any[]\n },\n [EReqKey.Secondary]?: any,\n Action?: string,\n PrimaryEntityTypeID?: string;\n PrimaryEntityID?: string;\n }\n\n export enum EReqKey {\n Primary = \"PrimarySelection\",\n Secondary = \"SecondarySelection\"\n }\n\n /**\n * Runs a DataLab query.\n * @param params \n * @returns \n */\n export async function Run(params: {\n api?: BruceApi.Api,\n // The query to run.\n query: IQuery, \n // Key to identify if this is a primary or secondary selection.\n // A secondary selection builds upon or references a primary selection.\n // Default is Primary.\n key?: EReqKey, \n // The number of entities to skip.\n // Default is 0.\n skip?: number, \n // The number of entities to load.\n // Default is 50.\n load?: number,\n migrated?: boolean,\n analysis?: boolean,\n req?: Api.IReqParams\n }): Promise<{\n // The list of entities matching the query.\n // Returned if analysis=false.\n entities?: E.IEntity[]\n // Returned if analysis=true.\n totalCount?: number;\n }> \n {\n let { api, query, key, skip, load, req: reqParams, migrated, analysis } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n if (!key) {\n key = EReqKey.Primary;\n }\n if (!skip) {\n skip = 0;\n }\n if (!load) {\n load = 50;\n }\n\n let url = null;\n if (analysis) {\n url = \"entities/datalab/getMatchesCount/PrimarySelection\";\n }\n else {\n url = `entities/datalab/getMatchingEntities/${key}?skip=${skip}&load=${load}&hasMigrated=${Boolean(migrated)}`;\n }\n\n const req = api.POST(url, \n query, \n Api.PrepReqParams(reqParams)\n );\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await req;\n res({\n entities: data.Items,\n totalCount: data.MatchesCount\n });\n }\n catch (e) {\n rej(e);\n }\n });\n return prom;\n }\n}","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { ENVIRONMENT } from \"../environment\";\n\n/**\n * TODO: The analysis result is currently a mix of multiple layers of legacy.\n * We will first decide what we want it to do and then describe just the needed portions of the existing implementation.\n */\nexport namespace ImportCad {\n export interface IAnalyzeParams {\n \"TempFile.ID\": string;\n \"OriginalIFCFile.Name\": string;\n }\n\n export interface IAnalyzeRes {\n PendingActionID: number;\n }\n\n export interface IImportParams {\n \"BRZFilePath\"?: string;\n \"TempFile.ID\": string;\n \"OriginalIFCFile.Name\": string;\n \"IFCSettings\": {\n \"ClassificationRules\": {\n \"NewIFCStandard.Name\": string;\n \"IFCStandard\": string;\n \"IsExtendingAllowed\": boolean;\n \"AllowAddingNewEntityTypes\": boolean;\n \"AllowAddingNewAttributes\": boolean;\n \"EntityTypesDerivedFromAttribute\": string;\n }\n }\n }\n\n export interface IImportRes {\n PendingActionID: number;\n }\n\n export async function Analyze(params: {\n api?: BruceApi.Api, \n fileAnalyze: IAnalyzeParams, \n req?: Api.IReqParams\n }): Promise<IAnalyzeRes> {\n let { api, fileAnalyze, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n return api.POST(\"entities/PrepareIFCForImport\", fileAnalyze, Api.PrepReqParams(reqParams));\n }\n\n export async function ImportEntities(params: {\n api?: BruceApi.Api, \n fileImport: IImportParams, \n req?: Api.IReqParams\n }): Promise<IImportRes> {\n let { api, fileImport, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n return api.POST(\"entities/importIFCWithProgress\", fileImport, Api.PrepReqParams(reqParams));\n }\n\n /**\n * Parses the completed pending action result from running \"ImportEntities\".\n * This will return the root entity's id if any is present.\n * @param paResult \n */\n export function ParseRootId(paResult: string | Object): string {\n try {\n const obj = typeof paResult == \"string\" ? JSON.parse(paResult) : paResult;\n if (obj?.result?.length) {\n return obj.result[0];\n }\n }\n catch {\n // Failed to parse json.\n }\n return <any>null;\n }\n}","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { ENVIRONMENT } from \"../environment\";\n\nexport namespace ImportCsv {\n export interface IImportParams {\n \"TempFile.ID\": string;\n \"CSVSettings\": {\n \"IsTitleRow\": boolean;\n \"Delimiter\": string;\n \"IsRecordQuoted\": boolean;\n \"Columns\": string[];\n },\n \"OriginalCSVFile.Name\": string;\n \"ImportMode\": string;\n \"EntityType.ID\": string;\n \"TargetDataSchema\": any;\n \"DataMapping\": any;\n \"Layers\": number[];\n \"SkipUnresolvedRows\": boolean;\n \"DeleteNonupdatedEntities\": boolean;\n \"Async\": boolean;\n \"SkipFailedEntities\": boolean;\n }\n\n export interface IImportRes {\n PendingActionID: number;\n }\n\n export async function ImportEntities(params: {\n api?: BruceApi.Api, \n fileImport: IImportParams, \n req?: Api.IReqParams\n }): Promise<IImportRes> {\n let { api, fileImport, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n return api.POST(\"entities/importCSVWithProgress2\", fileImport, Api.PrepReqParams(reqParams));\n }\n}","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { ENVIRONMENT } from \"../environment\";\nimport { EntityTag } from \"../entity/entity-tag\";\n\nexport namespace ImportJson {\n export interface ITagExt extends EntityTag.ITag {\n IsSelected: boolean;\n }\n\n export interface IImportParams {\n \"TempFile.ID\": string;\n \"TempFile.Ext\": string;\n \"OriginalJsonFile.Name\": string;\n ImportMode: string;\n \"EntityType.ID\": string;\n DataMappingSchema: any;\n TargetDataSchema: any;\n Layers: ITagExt[];\n }\n\n export interface IImportRes {\n PendingActionID: number;\n }\n\n export async function ImportEntities(params: {\n api?: BruceApi.Api, \n fileImport: IImportParams, \n req?: Api.IReqParams\n }): Promise<IImportRes> {\n let { api, fileImport, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n return api.POST(\"entities/importJsonWithProgress\", fileImport, Api.PrepReqParams(reqParams));\n }\n}","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { ENVIRONMENT } from \"../environment\";\n\nexport namespace ImportKml {\n export interface IImportParams {\n \"TempFile.ID\": string;\n \"OriginalKMLFile.Name\": string;\n KMLFolders: any[];\n ImportMode: string;\n TotalCount: number;\n }\n\n export interface IImportRes {\n PendingActionID: number;\n }\n\n export async function ImportEntities(params: {\n api?: BruceApi.Api, \n fileImport: IImportParams, \n req?: Api.IReqParams\n }): Promise<IImportRes> {\n let { api, fileImport, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n return api.POST(\"entities/importKMLWithProgress2\", fileImport, Api.PrepReqParams(reqParams));\n }\n}","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { ClientFile } from \"../client-file/client-file\";\nimport { ENVIRONMENT } from \"../environment\";\n\n/**\n * Imported file records are created when a file is imported into Nextspace.\n * The associated file may be attached to the record.\n */\nexport namespace ImportedFile {\n /**\n * Returns cache identifier for a imported file record.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetCacheKey(1);\n * api.Cache.Remove(key);\n * }\n * @param fileId \n * @returns \n */\n export function GetCacheKey(fileId: number): string {\n return Api.ECacheKey.ImportedFile + Api.ECacheKey.Id + fileId;\n }\n\n /**\n * Returns cache identifier for a imported file record.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetCacheKey(\"abc\");\n * api.Cache.Remove(key);\n * }\n * @param rootId \n * @returns \n */\n export function GetCacheKeyByRootId(rootId: string): string {\n return Api.ECacheKey.ImportedFile + Api.ECacheKey.Id + rootId;\n }\n\n /**\n * Returns cache identifier for a list of imported files.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetListCacheKey(\"CAD\", 0);\n * api.Cache.Remove(key);\n * }\n * @param type\n * @param pageIndex\n * @returns\n */\n export function GetListCacheKey(type: EFileType, pageIndex: number): string {\n return Api.ECacheKey.ImportedFile + type + pageIndex;\n }\n\n /**\n * Describes an imported file record.\n */\n export interface IFile {\n // ID of the imported file record.\n ID: number;\n // ID of the user that imported the file.\n \"ImportedBy.User.ID\": string;\n // Date and time the file was imported.\n \"Imported.DateTime\": any;\n // Entity type ID if relevant.\n \"EntityType.ID\"?: string;\n // Root entity ID if relevant.\n \"RootEntity.ID\"?: string;\n // Data source ID if relevant.\n \"Source.ID\"?: number;\n // Pending action ID if available.\n \"PendingAction.ID\"?: number;\n // Count of new entities created.\n NewEntitiesCount?: number;\n // Count of updated entities.\n UpdatedEntitiesCount?: number;\n // ID of the client file record. May not exist.\n \"ClientFile.ID\"?: string;\n // Client file record for the imported file.\n ClientFile?: ClientFile.IFile;\n }\n\n /**\n * Known file types we can filter against.\n */\n export enum EFileType {\n CAD = \"CAD\",\n All = \"All\"\n }\n\n /**\n * Returns a list of imported files.\n * @param params \n * @returns \n */\n export async function GetList(params: {\n api?: BruceApi.Api,\n // The type of file to filter against.\n fileType?: EFileType,\n // The page index to return.\n pageIndex?: number,\n req?: Api.IReqParams\n }): Promise<{\n // The list of imported files.\n importedFiles: IFile[]\n }> {\n let { api, fileType: type, pageIndex, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n if (!type) {\n type = EFileType.All;\n }\n if (!pageIndex) {\n pageIndex = 0;\n }\n const cache = await api.GetCacheItem(GetListCacheKey(type, pageIndex), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n\n let first = true;\n let url = \"entityImportFiles\";\n if (type != EFileType.All) {\n url += \"?FileType=\" + type;\n first = false;\n }\n if (pageIndex > 0) {\n url += (first ? \"?\" : \"&\") + \"pageIndex=\" + pageIndex;\n }\n const req = api.GET(url, Api.PrepReqParams(reqParams));\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await req;\n res({\n importedFiles: data.Items\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key: GetListCacheKey(type, pageIndex),\n value: prom,\n req: reqParams\n });\n return prom;\n }\n\n /**\n * Returns a list of imported files for a root entity.\n * @param params \n * @returns \n */\n export async function GetListByRootId(params: {\n api?: BruceApi.Api,\n // The root entity ID to filter against.\n rootId: string,\n req?: Api.IReqParams\n }): Promise<{\n // The list of imported files.\n importedFiles: IFile[]\n }> {\n let { api, rootId, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const cache = await api.GetCacheItem(GetCacheKeyByRootId(rootId), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(`entityImportFiles?Entity.ID=${rootId}`, Api.PrepReqParams(reqParams));\n res({\n importedFiles: data.Items\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key: GetCacheKeyByRootId(rootId),\n value: prom,\n req: reqParams\n });\n return prom;\n }\n\n /**\n * Returns an imported file record.\n * @param params \n * @returns \n */\n export async function Get(params: {\n api?: BruceApi.Api,\n // The ID of the imported file record.\n importedFileId: number,\n req?: Api.IReqParams\n }): Promise<{\n // The imported file record.\n importedFile: IFile\n }> {\n let { api, importedFileId: fileId, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const cache = await api.GetCacheItem(GetCacheKey(fileId), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(`entityImportFile/${fileId}`, Api.PrepReqParams(reqParams));\n res({\n importedFile: data\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key: GetCacheKey(fileId),\n value: prom,\n req: reqParams\n });\n return prom;\n }\n}","import { Cartes, EntityAttachmentType } from \"../bruce-models\";\n\n/**\n * Description of a \"Markup\" which is stored in bookmark records.\n */\nexport namespace Markup {\n /**\n * Describes a markup that is embedded in a bookmark.\n */\n export interface IMarkup {\n // Array of HTML divs to render.\n // These are used for text boxes, and shapes.\n divs?: Div.IDiv[];\n // Array of lines to render.\n // These can be used for callout lines, lines that connect between divs, etc.\n vectors?: (Line.ILine | FreePaint.IPaint)[];\n // Array of cesium entities to render.\n cesiumObjects?: (Polygon.IPolygon | Polyline.IPolyline | Circle.ICircle | Walkscore.IWalkscore)[];\n // Width/height of the markup in pixels.\n // This is used to scale against the viewer's screen size.\n width?: number;\n height?: number;\n // @Deprecated.\n defaultCameraPos?: any;\n // Default = true.\n visible?: boolean;\n }\n\n /**\n * Base of all markup elements.\n */\n export interface IElement {\n // Unique id of the element within the markup.\n // Warning: IAnchor elements are not elements and do not have an id.\n // Anchors only exist as sub elements to other items.\n id: string;\n // Human readable name for the element.\n // This is presented in editing screens to help differentiate elements.\n name?: string;\n // Default = true.\n visible?: boolean;\n // The screen position of the original drawn element.\n // Used to determine if anything needs to change based on viewer's screen size.\n screenWidth?: number;\n screenHeight?: number;\n }\n\n export namespace Div {\n // Types of div that can be created.\n export enum EType {\n // Default, no special handling.\n Default = \"default\",\n // Callout, assumes it will be positioned in 3d space.\n // Assumes existence of line that is used to anchor it.\n Callout = \"callout\"\n }\n\n export enum EAnchorDivSide {\n // “absolute” is now deprecated and a legacy value for TopLeft\n TopLeft = \"TopLeft\",\n BottomLeft = \"BottomLeft\",\n BottomRight = \"BottomRight\",\n TopRight = \"TopRight\"\n }\n\n export interface IDiv extends IElement {\n // Type of div. Determines how it is rendered / positioned.\n type?: EType;\n // The div's content.\n contentRows: IRow[];\n // Css box shadow.\n boxShadow?: IBoxShadow;\n // Css border radius.\n borderRadius?: number;\n // If the border radius should be in pixels or percent.\n borderUsingPercent?: boolean;\n // Css border color.\n borderColor?: string;\n // Css border width.\n borderWidth?: number;\n // Screen x/y position in pixels.\n // @deprecated. Use left/top/right/bottom instead depending on position.\n x?: number;\n y?: number;\n // Left/top/right/bottom in pixels.\n left?: number;\n top?: number;\n right?: number;\n bottom?: number;\n // Width/height in pixels.\n width: number;\n height: number;\n // Default is absolute. When fixed the UI panels won't shift the div.\n position?: EAnchorDivSide | \"fixed\" | \"absolute\";\n backgroundColor?: string;\n fontColor?: string;\n fontSize?: number;\n }\n\n // Describes css box shadow.\n export interface IBoxShadow {\n horizontal: number;\n vertical: number;\n blur: number;\n spread: number;\n color: string;\n }\n\n // Describes a content row.\n export interface IRow {\n items: IRowItem[];\n height: number;\n }\n\n // Describes expected content of a row cell.\n export enum EItemType {\n // Default, no special handling.\n Default = \"DEFAULT\",\n // Embed, assume content is html.\n // Make it take over the whole cell instead of padding it and such.\n Embed = \"EMBED\",\n // Content is expected to be an SVG or font-awesome icon.\n Icon = \"ICON\",\n // Content is expected to be an image.\n Image = \"IMAGE\",\n // No content. Only a shape.\n None = \"NONE\"\n }\n\n export interface IRowItem {\n // Text or HTML to display.\n text?: string;\n // Embedded HTML to render when item type is \"EMBED\".\n // Different to text as text will be auto-cleaned.\n embedRaw?: string;\n // Embedded ICON to render when item type is \"ICON\".\n // Icon is expected to be a font-awesome icon.\n icon?: string;\n // Action ot perform when this cell is clicked.\n action?: ItemAction.IItemAction;\n // Background image to use.\n bgImage?: IRowItemImage;\n // Css background color.\n backgroundColor?: string;\n // Css font color.\n fontColor?: string;\n // Css font size.\n fontSize?: number;\n // Css horizontal text alignment.\n textAlign?: string;\n // Css vertical text alignment.\n verticalAlign?: string;\n // Padding in pixels to apply to all 4 sides.\n // @deprecated, use innerPadding instead.\n padding?: number;\n // Css padding to apply.\n innerPadding?: string;\n // Css text shadow.\n textShadow?: ITextShadow;\n // Expected content type. Dictates if special handling is needed.\n contentType?: EItemType;\n // Width of the cell in percent of total row width.\n width?: number;\n }\n\n // Describes a cell's background image.\n export interface IRowItemImage {\n // Client file id of the image.\n FileID?: string;\n // If the markup's entity's default image should be used.\n UseEntityDefault?: boolean;\n }\n\n // Describes css text shadow.\n export interface ITextShadow {\n horizontal: number;\n vertical: number;\n blur: number;\n color: string;\n }\n\n export namespace ItemAction {\n export interface IActionLinkParams {\n // URL to open.\n // URL may be a path to the markup's entity's attribute data.\n // If \"${\" and \"}\" exist in the URL, then it has entity attribute data.\n URL?: string;\n // If the URL should be opened in a new tab.\n openInNewTab?: boolean;\n // If the markup should be closed when the link is opened.\n closeMarkupOnOpen?: boolean;\n }\n \n export interface IActionBookmarkParams {\n // Id of the bookmark to enable.\n // Assumes view id matches currently rendering view.\n bookmarkID?: string;\n }\n\n export interface IActionInfoViewParams {\n\n }\n\n export interface IActionRelationParams {\n\n }\n\n export interface IActionGalleryParams {\n documentType?: EntityAttachmentType.EType | string;\n }\n\n export interface IItemAction {\n type: ItemAction.EType;\n params: IActionLinkParams | IActionInfoViewParams | IActionRelationParams | IActionGalleryParams;\n }\n\n // Types of actions that can be performed when a cell is clicked.\n // Null = \"NONE\".\n export enum EType {\n None = \"NONE\",\n // Open a link specified in params.\n OpenLink = \"LINK\",\n // Open the markup's entity's details panel.\n OpenInfoView = \"INFOVIEW\",\n // Open the markup's entity's gallery popup.\n OpenEntityGallery = \"GALLERY\",\n // Toggle visibility of the markup's entity's relationships.\n ToggleRelationships = \"RELATIONSHIPS\",\n // Dictates this cell can be used to drag the div around.\n Draggable = \"DRAGABBLE\",\n // Closes the markup.\n Close = \"CLOSE\",\n // Opens a bookmark specified in params.\n OpenBookmark = \"BOOKMARK\"\n }\n }\n\n export const DEFAULT: IDiv = {\n contentRows: [\n {\n height: 100,\n items: [\n {\n contentType: EItemType.Default,\n text: \"Type here...\",\n width: 100,\n backgroundColor: \"white\",\n fontColor: \"black\",\n textAlign: \"center\",\n verticalAlign: \"center\",\n fontSize: 15\n }\n ]\n }\n ],\n height: null,\n width: null,\n id: null,\n left: null,\n top: null,\n right: null,\n bottom: null,\n borderColor: \"black\",\n borderWidth: 1,\n borderUsingPercent: false,\n borderRadius: 8,\n type: EType.Default\n };\n }\n\n export namespace Line {\n // Describes a line end's head.\n export enum ELineHead {\n None = \"NONE\",\n Circle = \"CIRCLE\",\n Arrow = \"ARROW\"\n }\n\n export interface ILine extends IElement {\n pathType: \"LINE\";\n // SVG path string.\n path: string;\n // SVG transform string.\n transform: string;\n // Snaps determine where the ends of the line snap to.\n // This can be 3d positions, screen positions or links to markup DIVs.\n // Calculated positions of the snaps will then alter the path of the line.\n snaps: IAnchor[];\n // Css color of the line.\n brushColor?: string;\n // Css stroke width of the line.\n brushSize?: number;\n // Determines if the line should angle towards its destination instead of being straight.\n angled?: boolean;\n // Backwards compatibility.\n // Use brushHead on anchors instead when available.\n brushHead?: ELineHead;\n // Css color of the brush head.\n outlineColor?: string;\n }\n\n // Dictates where on a DIV an anchor should snap to.\n export enum EAnchorDivSide {\n TopLeft = 0,\n TopRight = 1,\n BottomLeft = 2,\n BottomRight = 3,\n Center = 4,\n CenterLeft = 5,\n CenterRight = 6,\n CenterTop = 7,\n CenterBottom = 8\n }\n\n // Dictates what end of the line an anchor should render on.\n export enum EAnchorLineSide {\n Start = 0,\n End = 1,\n }\n\n export interface IAnchor {\n // Id of markup DIV that this anchor is attached to.\n id?: string;\n // Side of the markup DIV we are attached to.\n snapPosition?: EAnchorDivSide;\n // Side of the line we are attached to.\n side?: EAnchorLineSide;\n // How the anchor should be drawn in the context of a line.\n brushHead?: ELineHead;\n // Css fill color.\n fill?: string;\n // Determines size of anchor's \"ARROW\" head.\n size?: number;\n // Multiplied by \"size\" to determine size of anchor \"CIRCLE\" head.\n outlineFactor?: number;\n // Css stroke color.\n stroke?: string;\n // 3d world position.\n cartesian?: Cartes.ICartes3;\n // 2d screen position.\n screenPos?: Cartes.ICartes2;\n // If the anchor's position should be relative to the markup's entity.\n positionFromEntity?: boolean;\n }\n\n export const DEFAULT: ILine = {\n brushColor: \"rgba(255, 255, 255, 1)\",\n brushSize: 4,\n path: null,\n pathType: \"LINE\",\n transform: null,\n snaps: null,\n id: null\n };\n }\n\n export namespace FreePaint {\n // Describes a free-paint end's head.\n export enum EPaintHead {\n None = \"NONE\",\n Circle = \"CIRCLE\",\n Arrow = \"ARROW\"\n }\n\n export interface IPaint extends IElement {\n pathType: \"PLAIN\";\n // SVG path string.\n path: string;\n // SVG transform string.\n transform: string;\n // Css color of the line.\n brushColor?: string;\n // Css stroke width of the line.\n brushSize?: number;\n // Style of the ends of the free-paint.\n brushHead?: EPaintHead;\n // Css color of the brush head if one is used.\n // Eg arrow or circle heads.\n outlineColor?: string;\n }\n\n export const DEFAULT: IPaint = {\n brushColor: \"rgba(255, 255, 255, 1)\",\n brushSize: 4,\n path: null,\n pathType: \"PLAIN\",\n transform: null,\n id: null\n };\n }\n\n export namespace Polygon {\n // Determines if terrain and 3d models should be overlapped or not.\n export enum EClassificationType {\n // 3d models and terrain are overlapped.\n Both = \"BOTH\",\n // Only terrain is overlapped.\n Terrain = \"TERRAIN\"\n }\n\n export interface IPolygon extends IElement {\n type: \"POLYGON\";\n // 3d positions of the polygon.\n positions: Cartes.ICartes3[];\n // Css color of the polygon.\n color?: string;\n // Css color of the polygon's outline.\n outlineColor?: string;\n // Width of the polygon's outline in pixels.\n outlineWidth?: number;\n // Height of the polygon in meters.\n extrudedHeight?: number;\n // Determines if terrain and 3d models should be overlapped or not.\n classificationType?: EClassificationType;\n // Determines how many times to run Chaikin's algorithm on the polygon.\n // Null or 0 means no smoothing.\n smoothen?: number;\n }\n\n export const DEFAULT: IPolygon = {\n type: \"POLYGON\",\n id: null,\n positions: null,\n color: \"rgba(254, 234, 57, 0.54)\",\n outlineColor: \"rgba(215, 215, 215, 0)\",\n outlineWidth: 2,\n extrudedHeight: 0,\n classificationType: EClassificationType.Both,\n smoothen: 0\n };\n }\n\n export namespace Polyline {\n export interface IPolyline extends IElement {\n type: \"POLYLINE\";\n // 3d positions of the polyline.\n positions: Cartes.ICartes3[];\n // Css color of the polyline.\n color?: string;\n // Width of the polyline in pixels.\n outlineWidth?: number;\n // Determines how many times to run Chaikin's algorithm on the polygon.\n // Null or 0 means no smoothing.\n smoothen?: number;\n }\n\n export const DEFAULT: IPolyline = {\n type: \"POLYLINE\",\n id: null,\n positions: null,\n color: \"rgba(254, 234, 57, 0.54)\",\n outlineWidth: 4,\n smoothen: 0\n };\n }\n\n export namespace Circle {\n export interface ICircle extends IElement {\n type: \"CIRCLE\",\n // 3d position of the circle.\n position: Cartes.ICartes3;\n // Radius of the circle in meters.\n radius: number;\n // Css color of the circle.\n color?: string;\n // Width of the outline in meters.\n outlineWidth?: number;\n // Height of the circle in meters.\n extrudedHeight?: number;\n // Height of the circle's outline in meters.\n outlineExtrusion?: number;\n // Css color of the circle's outline.\n outlineColor?: string;\n }\n\n export const DEFAULT: ICircle = {\n type: \"CIRCLE\",\n id: null,\n position: null,\n radius: 50,\n color: \"rgba(254, 234, 57, 0.54)\"\n };\n }\n\n export namespace Walkscore {\n export interface IWalkscore extends IElement {\n type: \"WALKSCORE\";\n // 3d position of the walkscore.\n cartesian: Cartes.ICartes3;\n // Walkscore value out of 100.\n details: number;\n }\n }\n}","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { UTC } from \"../common/utc\";\nimport { ENVIRONMENT } from \"../environment\";\nimport { Uploader } from \"../internal/uploader\";\nimport { ObjectUtils } from \"../util/object-utils\";\n\nexport namespace Plugin {\n /**\n * Describes a plugin record.\n */\n export interface IPlugin {\n // ID of the plugin.\n ID: string,\n // Human readable name of the plugin.\n Name: string,\n // Description of the plugin.\n Description?: string,\n // Version of the plugin. This is bumped when you upload a new code bundle.\n Version?: number,\n // Icon to display for the plugin.\n // This is either a font-awesome icon or a client file ID.\n Icon?: string,\n // Dictates how the icon should be interpreted.\n IconSource?: \"FONT_AWESOME\" | \"CLIENT_FILE\",\n // Location where the plugin can be used.\n // This is specific to various applications.\n Location: string,\n // If access to the plugin should be restricted.\n // When a plugin is restricted a user must have the \"Plugin_<pluginId>\" permission.\n IsAccessRestricted?: boolean,\n // If the plugin requires a user to be logged in to use it.\n IsLoginRequired?: boolean,\n // Last date/time the plugin was updated.\n \"LastUpdated.Date\"?: UTC.IUTC,\n // Date/time the plugin was created.\n \"Created.Date\"?: UTC.IUTC\n }\n\n /**\n * Returns a plugin record.\n * @param params \n * @returns \n */\n export async function Get(params: {\n api?: BruceApi.Api,\n // ID of the plugin to get.\n pluginId: string,\n req?: Api.IReqParams\n }): Promise<{\n // Plugin record.\n plugin: IPlugin\n }> {\n let { api, pluginId, req } = params;\n if (!pluginId) {\n throw (\"Plugin ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const cache = await api.GetCacheItem(GetCacheKey(pluginId), req);\n if (cache?.found) {\n return cache.data;\n }\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(`ui.plugin/${pluginId}`, Api.PrepReqParams(req));\n res({\n plugin: data\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key: GetCacheKey(pluginId),\n value: prom,\n req: req\n });\n return prom;\n }\n\n /**\n * Returns a list of plugins.\n * @param params \n * @returns \n */\n export async function GetList(params: {\n api?: BruceApi.Api,\n req?: Api.IReqParams\n }): Promise<{\n // List of plugins.\n plugins: IPlugin[]\n }> {\n let { api, req } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const cache = await api.GetCacheItem(GetListCacheKey(), req);\n if (cache?.found) {\n return cache.data;\n }\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(\"ui.plugins\", Api.PrepReqParams(req));\n res({\n plugins: data.Items\n })\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key: GetListCacheKey(),\n value: prom,\n req: req\n });\n return prom;\n }\n\n /**\n * Returns a URL to load a plugin.\n * @param params \n * @returns \n */\n export function GetLoadUrl(params: {\n api?: BruceApi.Api,\n // ID of the plugin to load.\n pluginId: string,\n // Version of the plugin to load.\n cacheKey?: number | string\n }): {\n // URL to load the plugin.\n indexFileUrl: string\n } {\n let { api, pluginId, cacheKey } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n if (!cacheKey) {\n cacheKey = 0;\n }\n return {\n indexFileUrl: api.ConstructUrl({\n url: `ui.plugin/${pluginId}/file/index.jsc`,\n urlParams: {\n \"version\": String(cacheKey)\n }\n })\n }\n }\n\n /**\n * Creates or updates a plugin.\n * @param params \n */\n export async function Update(params: {\n // Plugin to create or update.\n plugin: IPlugin,\n api?: BruceApi.Api,\n req?: Api.IReqParams\n }): Promise<void> {\n let { plugin, api, req } = params;\n if (!plugin.Name) {\n throw(\"Plugin name is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n if (!plugin.ID) {\n plugin.ID = ObjectUtils.UId();\n }\n await api.POST(`ui.plugin/${plugin.ID}`, plugin, Api.PrepReqParams(req));\n api.Cache.Remove(GetCacheKey(plugin.ID));\n api.Cache.Remove(GetListCacheKey());\n api.Cache.RemoveByStartsWith(GetIndexFileCacheKey(plugin.ID, \"\"));\n }\n\n /**\n * Deletes a plugin.\n * @param params \n */\n export async function Delete(params: {\n // ID of the plugin to delete.\n pluginId: string,\n api?: BruceApi.Api,\n req?: Api.IReqParams\n }): Promise<void> {\n let { pluginId, api, req } = params;\n if (!pluginId) {\n throw(\"Plugin ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n await api.DELETE(`ui.plugin/${pluginId}`, Api.PrepReqParams(req));\n api.Cache.Remove(GetCacheKey(pluginId));\n api.Cache.Remove(GetListCacheKey());\n api.Cache.RemoveByStartsWith(GetIndexFileCacheKey(pluginId, \"\"));\n }\n\n /**\n * Warning: This will replace the contents of your plugin.\n * Upload only ZIP files.\n * @param params \n */\n export async function Upload(params: {\n pluginId: string,\n api?: BruceApi.Api,\n file: File,\n onProgress?: (progress: Uploader.IProgress) => void,\n req?: Api.IUploadReqParams\n }): Promise<void> {\n let { pluginId, api, file, onProgress, req } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n if (!pluginId || !file) {\n throw(\"Plugin ID and file are required.\");\n }\n req = Api.PrepReqParams(req) as Api.IUploadReqParams;\n req.onProgress = (progress: ProgressEvent) => {\n const percent = Math.round ((progress.loaded / file.size) * 100);\n onProgress?.({\n percent: percent,\n uploaded: false\n });\n };\n await api.UPLOAD(`ui.plugin/${pluginId}/file`, file, req);\n api.Cache.Remove(GetCacheKey(pluginId));\n api.Cache.Remove(GetListCacheKey());\n api.Cache.RemoveByStartsWith(GetIndexFileCacheKey(pluginId, \"\"));\n }\n\n /**\n * Returns a run function to call that'll load a plugin within your provided container element.\n * The run function will return a dispose function to call to remove the plugin.\n * @param params \n * @returns \n */\n export async function GetRunFunction(params: {\n // If container does not have an HTML ID, one will be assigned to it.\n containerId?: string;\n container?: HTMLElement;\n\n // Arbitrary params to pass into the plugin.\n pluginParams?: any;\n \n // Params required to get the plugin load file.\n api?: BruceApi.Api,\n // Either plugin or plugin ID must be supplied.\n pluginId?: string,\n plugin?: Plugin.IPlugin,\n\n req?: Api.IReqParams\n }): Promise<{\n // Function to run to initialize the plugin.\n // This function will run eval on a generated script within your container.\n // It will return a dispose function to call.\n run: () => () => void\n }> {\n let { containerId, container, pluginParams, pluginId, plugin, api, req } = params;\n if (!containerId && container) {\n containerId = container.id;\n if (!containerId) {\n containerId = ObjectUtils.UId();\n container.id = containerId;\n }\n }\n if (!plugin && pluginId) {\n plugin = (await Plugin.Get({\n pluginId,\n api\n })).plugin;\n }\n if (plugin && !pluginId) {\n pluginId = plugin.ID;\n }\n const { indexFileUrl } = GetLoadUrl({\n api,\n pluginId,\n cacheKey: plugin.Version\n });\n\n req = Api.PrepReqParams(req) as Api.IUploadReqParams;\n const cacheData = api.GetCacheItem(GetIndexFileCacheKey(pluginId, indexFileUrl), req)\n\n let fileContentProm = null;\n if (cacheData?.found) {\n fileContentProm = cacheData.data;\n }\n else {\n fileContentProm = fetch(indexFileUrl).then((res) => res.text());\n api.SetCacheItem({\n key: GetIndexFileCacheKey(pluginId, indexFileUrl),\n value: fileContentProm,\n req: req \n });\n }\n\n // We changed the expected plugin code without changing the API response so we need to read and reformat the file content.\n // TODO: Create a v3 request that gives us the plugin code in a more usable format.\n\n let fileContent = await fileContentProm;\n const start = fileContent.indexOf(\"{\");\n const end = fileContent.lastIndexOf(\"}\");\n fileContent = fileContent.substring(start + 1, end);\n\n const paramsId = ObjectUtils.UId();\n window[paramsId] = pluginParams ? pluginParams : {};\n const disposeId = ObjectUtils.UId();\n const elementId = ObjectUtils.UId();\n\n let script = `\n function run() {\n ${fileContent}\n\n const paramsId = \"${paramsId}\";\n const containerId = \"${containerId}\";\n let container;\n if (containerId) {\n container = document.getElementById(\"${containerId}\");\n }\n\n let pluginHTML = null;\n if (container) {\n pluginHTML = document.createElement(\"div\");\n pluginHTML.id = \"${elementId}\";\n container.appendChild(pluginHTML);\n }\n\n {TEMPLATE_CODE}\n const params = window[\"${paramsId}\"];\n\n window[\"${disposeId}\"] = Run({\n element: pluginHTML,\n container: container,\n pluginParams: params,\n pluginId: \"${pluginId}\"\n });\n }\n run();\n `;\n if (script.includes(\"var template\")) {\n script = script.replace(\"{TEMPLATE_CODE}\", `\n if (pluginHTML && template) {\n pluginHTML.innerHTML = template;\n }\n `);\n }\n else {\n script = script.replace(\"{TEMPLATE_CODE}\", \"\");\n }\n\n return {\n run: () => {\n // 'eval2 = eval' stops the linter from complaining about using eval.\n const eval2 = eval;\n eval2(script);\n\n // Ensure a function is returned, even if the plugin is not configured properly to return one.\n if (!window[disposeId] || typeof window[disposeId] !== \"function\") {\n window[disposeId] = () => {\n console.warn(\"Plugin called to be disposed but no dispose function was found.\");\n };\n }\n const callDispose = window[disposeId];\n return () => {\n if (elementId) {\n const element = (window as any).document.getElementById(elementId);\n if (element && element.parentElement) {\n element.parentElement.removeChild(element);\n }\n }\n callDispose();\n };\n }\n }\n }\n\n /**\n * Returns cache identifier for a plugin.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetCacheKey(\"abc\");\n * api.Cache.Remove(key);\n * }\n * @param pluginId\n * @returns \n */\n export function GetCacheKey(pluginId: string): string {\n return `${Api.ECacheKey.Plugin}${Api.ECacheKey.Id}${pluginId}`;\n }\n \n /**\n * Returns cache identifier for a list of plugins.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetListCacheKey();\n * api.Cache.Remove(key);\n * }\n * @returns\n */\n export function GetListCacheKey(): string {\n return Api.ECacheKey.Plugin;\n }\n\n /**\n * Returns cache identifier for a plugin index file.\n * @param pluginId\n * @param indexFileUrl \n * @returns \n */\n export function GetIndexFileCacheKey(pluginId: string, indexFileUrl: string): string {\n return `${Api.ECacheKey.PluginIndexFile}${Api.ECacheKey.Id}${pluginId}${Api.ECacheKey.Id}${indexFileUrl}`;\n }\n}","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { EntityAttribute } from \"../entity/entity-attribute\";\nimport { ENVIRONMENT } from \"../environment\";\n\nexport namespace DataSource {\n /**\n * Describes a data source record.\n */\n export interface ISource {\n // Not set for new records.\n ID?: number;\n // Human readable data source name.\n Name: string;\n // The data source baseurl.\n URL?: string;\n // The kind of data source this is.\n // This helps guide the Nextspace API and UI on how to use this data source.\n Type?: Type;\n // Data boundaries in degrees if known.\n MinLatitude?: number;\n MaxLatitude?: number;\n MinLongitude?: number;\n MaxLongitude?: number;\n // Data schema for the external source.\n DataSchema?: EntityAttribute.IAttribute;\n // Settings for the external source.\n Parameters?: object;\n }\n\n // Known data source types.\n export enum EType {\n // A data source that is simply a mapping between external IDs and internal IDs.\n // This is used by the Cesium OSM source for example.\n IDMapping = \"IDMapping\"\n }\n export type Type = EType | string;\n\n /**\n * Creates or updates a data source.\n * @param params \n * @returns \n */\n export async function Update(params: {\n // The data source to create or update.\n source: ISource,\n api?: BruceApi.Api,\n req?: Api.IReqParams\n }) {\n let { source: data, api, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const url = `source` + (data.ID == null ? \"\" : \"/\" + data.ID);\n const res = await api.POST(url, data, Api.PrepReqParams(reqParams));\n await api.Cache.Remove(GetCacheKey(<number>data.ID));\n await api.Cache.Remove(GetListCacheKey());\n\n return {\n source: res\n };\n }\n\n /**\n * Deletes a data source.\n * @param params \n */\n export async function Delete(params: {\n // The ID of the data source to delete.\n id: number,\n api?: BruceApi.Api,\n req?: Api.IReqParams\n }) {\n let { id, api, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n await api.DELETE(`source/${id}`, Api.PrepReqParams(reqParams));\n await api.Cache.Remove(GetCacheKey(id));\n await api.Cache.Remove(GetListCacheKey());\n }\n\n /**\n * Gets a data source by ID.\n * @param params \n * @returns \n */\n export async function Get(params: {\n // The ID of the data source to get.\n id: number,\n api?: BruceApi.Api,\n req?: Api.IReqParams\n }) {\n let { id, api, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n reqParams = Api.PrepReqParams(reqParams);\n const cacheData = await api.GetCacheItem(GetCacheKey(id), reqParams);\n if (cacheData?.found) {\n return cacheData.data;\n }\n\n const prom = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(`source/${id}`, Api.PrepReqParams(reqParams));\n res({\n source: data\n });\n }\n catch (e) {\n rej(e);\n }\n });\n api.SetCacheItem({\n key: GetCacheKey(id),\n value: prom,\n req: reqParams\n });\n return prom;\n }\n\n /**\n * Gets a list of data sources.\n * @param params \n * @returns \n */\n export async function GetList(params: {\n api?: BruceApi.Api,\n req?: Api.IReqParams\n }) {\n let { api, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n reqParams = Api.PrepReqParams(reqParams);\n const cacheData = await api.GetCacheItem(GetListCacheKey(), reqParams);\n if (cacheData?.found) {\n return cacheData.data;\n }\n \n const prom = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(\"sources\", Api.PrepReqParams(reqParams))\n res({\n sources: data?.Items\n });\n }\n catch (e) {\n rej(e);\n }\n });\n api.SetCacheItem({\n key: GetListCacheKey(),\n value: prom,\n req: reqParams\n });\n return prom;\n }\n\n /**\n * Returns cache identifier for a data source by ID.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetCacheKey(1);\n * api.Cache.Remove(key);\n * }\n * @param id \n * @returns \n */\n export function GetCacheKey(id: number): string {\n return Api.ECacheKey.DataSource + Api.ECacheKey.Id + id;\n }\n \n /**\n * Returns cache identifier for a list of data sources.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetListCacheKey();\n * api.Cache.Remove(key);\n * }\n * @returns\n */\n export function GetListCacheKey(): string {\n return Api.ECacheKey.DataSource;\n }\n}","export * from \"./ann-document/ann-document\";\n\nexport * from \"./custom-form/custom-form\";\nexport * from \"./custom-form/custom-form-content\";\n\nexport * from \"./api/abstract-api\";\nexport * from \"./api/api\";\nexport * from \"./api/bruce-api\";\nexport * from \"./api/global-api\";\nexport * from \"./api/guardian-api\";\nexport * from \"./api/api-getters\";\n\nexport * from \"./calculator/calculator\";\n\nexport * from \"./common/bounds\";\nexport * from \"./common/bruce-event\";\nexport * from \"./common/cache\";\nexport * from \"./common/camera\";\nexport * from \"./common/cartes\";\nexport * from \"./common/carto\";\nexport * from \"./common/color\";\nexport * from \"./common/delay-queue\";\nexport * from \"./common/dictionary\";\nexport * from \"./common/geometry\";\nexport * from \"./common/transform\";\nexport * from \"./common/utc\";\nexport * from \"./common/bruce-variable\";\nexport * from \"./common/lru-cache\";\nexport * from \"./common/section\";\n\nexport * from \"./entity/entity-attachment-type\";\nexport * from \"./entity/entity-attachment\";\nexport * from \"./entity/entity-comment\";\nexport * from \"./entity/entity-link\";\nexport * from \"./entity/entity-lod\";\nexport * from \"./entity/entity-lod-category\";\nexport * from \"./entity/entity-relation-type\";\nexport * from \"./entity/entity-relation\";\nexport * from \"./entity/entity-source\";\nexport * from \"./entity/entity-tag\";\nexport * from \"./entity/entity-type\";\nexport * from \"./entity/entity\";\nexport * from \"./entity/entity-coords\";\nexport * from \"./entity/entity-type-visual-settings\";\nexport * from \"./entity/entity-attribute\";\nexport * from \"./entity/entity-historic-data\";\nexport * from \"./entity/entity-table-view\";\n\nexport * from \"./entity-type-model/comment\";\n\nexport * from \"./client-file/client-file\";\n\nexport * from \"./program-key/program-key\";\n\nexport * from \"./project/zoom-control\";\nexport * from \"./project/menu-item\";\nexport * from \"./project/project-view-bookmark\";\nexport * from \"./project/project-view\";\nexport * from \"./project/project-view-legacy-tile\";\nexport * from \"./project/project-view-tile\";\nexport * from \"./project/project-view-selection\";\nexport * from \"./project/project-view-legacy\";\nexport * from \"./project/project-view-legacy-bookmark\";\n\nexport * from \"./server/pending-action\";\nexport * from \"./server/message-broker\";\nexport * from \"./server/hosting-location\";\n\nexport * from \"./style/style\";\n\nexport * from \"./tileset/tileset\";\n\nexport * from \"./user/permission\";\nexport * from \"./user/session\";\nexport * from \"./user/user-group\";\nexport * from \"./user/user\";\n\nexport * from \"./account/account\";\nexport * from \"./account/account-settings\";\nexport * from \"./account/account-invite\";\nexport * from \"./account/account-features\";\nexport * from \"./account/account-limits\";\n\nexport * from \"./util/encrypt-utils\";\nexport * from \"./util/math-utils\";\nexport * from \"./util/object-utils\";\nexport * from \"./util/path-utils\";\nexport * from \"./util/url-utils\";\n\nexport * from \"./data-lab/data-lab\";\n\nexport * from \"./import/import-cad\";\nexport * from \"./import/import-csv\";\nexport * from \"./import/import-json\";\nexport * from \"./import/import-kml\";\nexport * from \"./import/imported-file\";\n\nexport * from \"./markup/markup\";\nexport * from \"./internal/uploader\";\nexport * from \"./plugin/plugin\";\nexport * from \"./environment\";\nexport * from \"./data-source/data-source\";\n\n// This is updated with the package.json version on build.\nexport const VERSION = \"4.6.1\";"],"names":["Api","MessageBroker","A","GuardianApi","Account","BruceApi","GlobalApi","ENVIRONMENT","AnnDocument","CustomForm","Color","Geometry","ObjectUtils","EntityAttribute","EntityType","PathUtils","ZoomControl","Entity","EntityHistoricData","BruceVariable","Calculator","Bounds","Camera","Cartes","Carto","UTC","EntityAttachmentType","EntityAttachment","EntityComment","EntityLink","EntityLod","EntityLodCategory","EntityRelationType","EntityRelation","EntitySource","EntityTag","MathUtils","EntityCoords","EntityTypeVisualSettings","EntityTableView","Style","Comment","Uploader","ClientFile","ProgramKey","Tileset","MenuItem","ProjectViewBookmark","ProjectView","ProjectViewLegacyTile","ProjectViewTile","ProjectViewLegacy","ProjectViewLegacyBookmark","PendingAction","HostingLocation","Permission","Session","UserGroup","User","AccountInvite","AccountFeatures","AccountLimits","EncryptUtils","UrlUtils","DataLab","ImportCad","ImportCsv","ImportJson","ImportKml","ImportedFile","Markup","Plugin","DataSource"],"mappings":"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"}
1
+ {"version":3,"file":"bruce-models.umd.js","sources":["../src/api/api.ts","../src/common/cache.ts","../src/api/abstract-api.ts","../src/server/message-broker.ts","../src/api/guardian-api.ts","../src/api/bruce-api.ts","../src/api/global-api.ts","../src/api/api-getters.ts","../src/environment.ts","../src/ann-document/ann-document.ts","../src/custom-form/custom-form.ts","../src/common/color-css-defaults.ts","../src/common/color.ts","../src/common/geometry.ts","../src/util/object-utils.ts","../src/entity/entity-attribute.ts","../src/entity/entity-type.ts","../src/util/path-utils.ts","../src/project/zoom-control.ts","../src/entity/entity-historic-data.ts","../src/entity/entity.ts","../src/common/bruce-variable.ts","../src/calculator/calculator.ts","../src/common/bounds.ts","../src/common/bruce-event.ts","../src/common/camera.ts","../src/common/cartes.ts","../src/common/carto.ts","../src/common/delay-queue.ts","../src/common/utc.ts","../src/common/lru-cache.ts","../src/entity/entity-attachment-type.ts","../src/entity/entity-attachment.ts","../src/entity/entity-comment.ts","../src/entity/entity-link.ts","../src/entity/entity-lod.ts","../src/entity/entity-lod-category.ts","../src/entity/entity-relation-type.ts","../src/entity/entity-relation.ts","../src/entity/entity-source.ts","../src/entity/entity-tag.ts","../src/util/math-utils.ts","../src/entity/entity-coords.ts","../src/entity/entity-type-visual-settings.ts","../src/entity/entity-table-view.ts","../src/style/style.ts","../src/entity-type-model/comment.ts","../src/internal/uploader.ts","../src/client-file/client-file.ts","../src/program-key/program-key.ts","../src/tileset/tileset.ts","../src/project/menu-item.ts","../src/project/project-view-bookmark.ts","../src/project/project-view.ts","../src/project/project-view-legacy-tile.ts","../src/project/project-view-tile.ts","../src/project/project-view-legacy.ts","../src/project/project-view-legacy-bookmark.ts","../src/server/pending-action.ts","../src/account/account.ts","../src/server/hosting-location.ts","../src/user/permission.ts","../src/user/session.ts","../src/user/user-group.ts","../src/user/user.ts","../src/account/account-invite.ts","../src/account/account-features.ts","../src/account/account-limits.ts","../src/util/encrypt-utils.ts","../src/util/url-utils.ts","../src/data-lab/data-lab.ts","../src/import/import-cad.ts","../src/import/import-csv.ts","../src/import/import-json.ts","../src/import/import-kml.ts","../src/import/imported-file.ts","../src/markup/markup.ts","../src/plugin/plugin.ts","../src/data-source/data-source.ts","../src/bruce-models.ts"],"sourcesContent":["import { IDictionary } from \"../common/dictionary\";\n\n/**\n * Contains generic descriptions used for Nextspace requests.\n */\nexport namespace Api {\n /**\n * Cache keys utilized by methods within this library.\n * These help construct keys to store and retrieve data from the local cache.\n */\n export enum ECacheKey {\n Id = \":\",\n ListId = \"::\",\n Entity = \"entity\",\n EntityType = \"entitytype\",\n ProjectView = \"projectview\",\n ProjectViewBookmark = \"pvbookmark\",\n Tileset = \"tileset\",\n ClientFile = \"clientfile\",\n ClientFileCountsPurpose = \"clientfilecountspurpose\",\n ClientFileCountsExtension = \"clientfilecountsextensions\",\n ClientFileCountsMIMEType = \"clientfilecountsmimetypes\",\n ClientFileCountsUser = \"clientfilecountsusers\",\n Session = \"session\",\n PendingAction = \"pendingaction\",\n EntitySource = \"entitysource\",\n DataSource = \"datasource\",\n ProgramKey = \"programkey\",\n EntityCoords = \"entitycoords\",\n Tag = \"tag\",\n Attachment = \"attachment\",\n Comment = \"comment\",\n Link = \"link\",\n AnnDocument = \"anndocument\",\n AttachmentType = \"attachmenttype\",\n Relation = \"relation\",\n RelationType = \"relationtype\",\n Lod = \"lod\",\n LodCategory = \"lodcategory\",\n Style = \"style\",\n PublishTileset = \"publishtileset\",\n TilesetAccess = \"tilesetaccess\",\n User = \"user\",\n UserSettings = \"usersettings\",\n UserEmail = \"useremail\",\n AccessToken = \"accesstoken\",\n UserGroup = \"usergroup\",\n Account = \"account\",\n AccountFeatures = \"accountfeatures\",\n DatabaseRegion = \"databaseregion\",\n CustomForm = \"customform\",\n ImportedFile = \"importedfile\",\n Plugin = \"plugin\",\n PluginIndexFile = \"pluginindexfile\",\n EntityHistoricData = \"entityhistoricdata\",\n EntityHistoricDataRec = \"entityhistoricdatarec\",\n EntityHistoricDataStats = \"entityhistoricdatastats\",\n AccountLimits = \"accountlimits\"\n }\n\n // 1 minute.\n export const DEFAULT_CACHE_DURATION = 60 * 1000;\n // The template client account is a container for default settings to reference.\n export const TEMPLATE_ACCOUNT_ID = \"template\";\n export const SUPER_ACCOUNT_ID = \"hypeportal\";\n // Default session token header.\n export const ACCESS_TOKEN_HEADER = \"X-Access-Token\";\n\n /**\n * Possible environments we host Bruce apps on.\n * When these are matched, they should be case-insensitive.\n */\n export enum EEnv {\n // DEV environment that is separate to production data.\n DEV = \"DEV\",\n // Currently out of use.\n // DEV environment that is separate to production data.\n STG = \"STG\",\n // Production data with a beta API.\n UAT = \"UAT\",\n // Production data with a stable API.\n PROD = \"PROD\"\n }\n export type Env = EEnv | string;\n // False = cache is enabled by default for req-params.\n export let DEFAULT_NO_CACHE = false;\n\n /**\n * Prepares a string to be included in a url.\n * @param str\n * @returns\n */\n export function Encode(str: string): string {\n return encodeURIComponent(str.replace(/\\+/g, \"%2B\").replace(/\\./g, \"%2E\"));\n }\n\n /**\n * Standard list response from Nextspace APIs.\n * Newer APIs will typically use a different format. Eg: \"entities\" for an entity list.\n */\n export interface IList<T> {\n Items: T[];\n TotalCount?: number;\n }\n\n export enum ESortOrder {\n None = 0,\n Asc = 1,\n Desc = -1\n }\n\n export enum ESortOrderStr {\n Asc = \"ASC\",\n Desc = \"DESC\"\n }\n\n /**\n * Known response encodings from Nextspace APIs.\n */\n export enum EEncoding {\n // Default.\n UTF8 = \"UTF-8\",\n // Deprecated. Shouldn't be found anywhere anymore.\n UTF16 = \"UTF-16BE\"\n }\n\n /**\n * Describes request params for any HTTP request performed through this library.\n */\n export interface IReqParams {\n // Default is Api.DEFAULT_CACHE_STATE.\n // If true then local cache check will be skipped.\n noCache?: boolean;\n // Request headers.\n headers?: IDictionary<string>;\n }\n\n /**\n * Prepares default settings for a request to Bruce Api.\n * (Currently none).\n * @param base\n * @returns\n */\n export function PrepReqParams(base?: Api.IReqParams | IUploadReqParams): IReqParams | IUploadReqParams {\n base = {\n ...base\n };\n return base;\n }\n\n /**\n * Describes upload request params.\n */\n export interface IUploadReqParams extends IReqParams {\n // (Optional) Upload progress callback.\n onProgress?: (e: ProgressEvent) => void;\n // The form data to upload.\n formData?: IDictionary<string> | FormData;\n }\n}","type Key = string | number;\n\n// 1 minute.\nconst DEFAULT_DURATION = 60 * 1000;\n\ninterface IRecord {\n // The id of the item.\n id: string;\n // The data of the item.\n data: any;\n // The time when the item was added to the cache.\n expires: number;\n}\n\nexport class CacheControl<T> {\n private memory: Map<Key, IRecord> = new Map<Key, IRecord>();\n public Disabled: boolean = false;\n\n constructor(id: string) {\n if (!id) {\n id = \"default\";\n }\n }\n\n /**\n * Sets item to cache.\n * @param id\n * @param data\n * @param duration\n */\n public Set(params: {\n id: string,\n data: any,\n // Optional, default is 1 minute.\n // Value is in milliseconds and if it's set to 0 or lower then it'll be set to 1 minute.\n duration?: number\n }): void {\n if (this.Disabled) {\n return;\n }\n let { id, data, duration } = params;\n if (!duration || duration < 0) {\n duration = DEFAULT_DURATION;\n }\n id = String(id);\n\n const expires = Date.now() + duration;\n const record: IRecord = {\n id,\n data,\n expires\n };\n this.memory.set(id, record);\n }\n\n /**\n * Returns the item with the given id.\n * @param id\n * @returns\n */\n public Get(id: Key): {\n data: T,\n found: boolean\n } {\n if (this.Disabled) {\n return null;\n }\n id = String(id);\n\n let record = this.memory.get(id);\n if (!record) {\n return {\n data: null,\n found: false\n };\n }\n if (record.expires < Date.now()) {\n this.memory.delete(id);\n return {\n data: null,\n found: false\n };\n }\n return {\n data: record.data,\n found: true\n };\n }\n\n /**\n * Removes all items from the cache.\n */\n public Clear(): void {\n this.memory.clear();\n }\n\n /**\n * Removes the item with the given id.\n * @param id\n */\n public Remove(id: Key): void {\n id = String(id);\n this.memory.delete(id);\n }\n\n /**\n * Removes all items that match the callback.\n * If callback returns true then the item is removed.\n * @param callback\n */\n public RemoveBy(callback: (key: Key) => boolean): void {\n const memoryKeys = Array.from(this.memory.keys());\n for (const key of memoryKeys) {\n if (callback(key)) {\n this.memory.delete(key);\n }\n }\n }\n\n /**\n * Removes all items that start with the given text.\n * @param text\n */\n public RemoveByStartsWith(text: Key): void {\n this.RemoveBy(key => String(key).startsWith(String(text)));\n }\n\n /**\n * Removes all items that contain the given text.\n * @param text\n */\n public RemoveByContains(text: Key): void {\n this.RemoveBy(key => String(key).includes(String(text)));\n }\n\n /**\n * Removes items based on a callback's response.\n * @param callback \n */\n public RemoveByCallback(callback: (key: Key) => boolean): void {\n this.RemoveBy(callback);\n }\n}","import { CacheControl } from \"../common/cache\";\nimport { Api } from \"./api\";\n\nasync function parseResult(data: Response): Promise<string | Blob | any> {\n if (data.status >= 400 || data.status < 200) {\n const error = await data.json();\n throw(error);\n }\n\n let type = data.headers.get(\"Content-Type\")?.trim().toLowerCase();\n let encoding = type?.split(\";\").find((x) => x.startsWith(\"charset=\"))?.split(\"=\")[1].toLowerCase();\n if (encoding === \"utf-16\") {\n encoding = Api.EEncoding.UTF16;\n }\n // We can parse this the same way as UTF-8.\n else if (encoding === \"iso-8859-1\") {\n encoding = \"utf-8\";\n }\n\n if (type == \"application/octet-stream\" || type == \"model/gltf-binary\") {\n if (encoding !== \"utf-8\") {\n console.warn(\"Binary data is being returned with an unexpected encoding:\", encoding);\n }\n return data.blob();\n }\n\n let text = await (encoding && encoding !== \"utf-8\" \n ? new TextDecoder(encoding).decode(await data.arrayBuffer()) \n : data.text());\n\n if (!text?.trim()) {\n return null;\n }\n\n if (!type) {\n type = \"\";\n }\n if (type.includes(\"text/csv\")) {\n return text;\n }\n if (text && typeof text == \"string\") {\n text = text.trim();\n }\n if (text) {\n if (\n (text.startsWith(\"{\") && text.endsWith(\"}\")) ||\n (text.startsWith(\"[\") && text.endsWith(\"]\"))\n ) {\n return JSON.parse(text);\n }\n }\n return text;\n}\n\n/**\n * This is a base class for communication with an arbitrary Nextspace API.\n */\nexport class AbstractApi {\n // HTTP header to use for session ID.\n private ssidHeader: string;\n // Session ID.\n private ssid: string = \"\";\n // Base URL for API.\n protected baseUrl: string = \"\";\n // Cache control utility.\n public Cache: CacheControl<any>;\n\n constructor(params: {\n ssidHeader?: string,\n cacheId?: string\n }) {\n this.ssidHeader = params?.ssidHeader;\n this.Cache = new CacheControl<any>(params?.cacheId);\n }\n\n /**\n * Returns the base URL for the API.\n * @returns \n */\n public GetBaseUrl(): string {\n return this.baseUrl;\n }\n\n /**\n * Sets the base URL for the API.\n * @param url \n */\n public SetBaseUrl(url: string): void {\n this.baseUrl = url;\n if (!this.baseUrl.endsWith(\"/\")) {\n this.baseUrl += \"/\";\n }\n }\n\n /**\n * Returns a cache item matching the provided key.\n * If the reqParams specify that caching is disabled, null is returned.\n * @param key \n * @param reqParams \n * @returns \n */\n public GetCacheItem(key: string, reqParams?: Api.IReqParams) {\n let noCache = reqParams?.noCache;\n if (noCache == null) {\n noCache = Api.DEFAULT_NO_CACHE;\n }\n if (noCache) {\n return null;\n }\n return this.Cache.Get(key);\n }\n\n /**\n * Sets a cache item matching the provided key.\n * If the reqParams specify that caching is disabled, then no action is taken.\n * @param params \n * @returns \n */\n public SetCacheItem(params: {\n key: string,\n value: any,\n duration?: number,\n req?: Api.IReqParams\n }) {\n let {key, value, duration, req} = params;\n let noCache = req?.noCache;\n if (noCache == null) {\n noCache = Api.DEFAULT_NO_CACHE;\n }\n if (noCache) {\n return;\n }\n if (isNaN(duration)) {\n duration = Api.DEFAULT_CACHE_DURATION;\n }\n this.Cache.Set({\n id: key,\n data: value,\n duration\n });\n }\n\n /**\n * Returns the session ID.\n * @returns \n */\n public GetSessionId(): string {\n return this.ssid;\n }\n\n /**\n * Sets the session ID.\n * @param value \n */\n public SetSessionId(value: string): void {\n this.ssid = value;\n }\n\n /**\n * Returns the session header.\n * @returns \n */\n public GetSessionHeader(): string {\n return this.ssidHeader;\n }\n\n /**\n * Sets the session header.\n * @param value \n */\n public SetSessionHeader(value: string): void {\n this.ssidHeader = value;\n }\n\n /**\n * Performs a GET request.\n * This will NOT prepend the base URL to the provided URL.\n * @param url \n * @param params \n * @returns \n */\n public async get(url: string, params?: Api.IReqParams): Promise<any> {\n if (!params) {\n params = {};\n }\n params.headers = params.headers || {};\n params.headers = {\n \"Content-Type\": \"application/json;\",\n ...params.headers\n };\n if (this.ssidHeader && this.ssid) {\n params.headers[this.ssidHeader] = this.ssid;\n }\n const res = await fetch(url, {\n headers: params.headers\n });\n return parseResult(res);\n }\n\n /**\n * Performs a DELETE request.\n * This will NOT prepend the base URL to the provided URL.\n * @param url \n * @param params \n * @returns \n */\n public async delete(url: string, params?: Api.IReqParams): Promise<any> {\n if (!params) {\n params = {};\n }\n params.headers = params.headers || {};\n params.headers = {\n \"Content-Type\": \"application/json;\",\n ...params.headers\n };\n if (this.ssidHeader && this.ssid) {\n params.headers[this.ssidHeader] = this.ssid;\n }\n const res = await fetch(url, {\n headers: params.headers,\n method: \"DELETE\"\n });\n return parseResult(res);\n }\n\n /**\n * Performs a POST request.\n * This will NOT prepend the base URL to the provided URL.\n * @param url \n * @param data \n * @param params \n * @returns \n */\n public async post(url: string, data: any, params?: Api.IReqParams): Promise<any> {\n if (!params) {\n params = {};\n }\n params.headers = params.headers || {};\n params.headers = {\n \"Content-Type\": \"application/json;\",\n ...params.headers\n };\n if (this.ssidHeader && this.ssid) {\n params.headers[this.ssidHeader] = this.ssid;\n }\n if (!data) {\n data = {};\n }\n if (typeof data != \"string\") {\n data = JSON.stringify(data);\n }\n const res = await fetch(url, {\n headers: params.headers,\n method: \"POST\",\n body: data\n });\n return parseResult(res);\n }\n\n /**\n * Performs a PUT request.\n * This will NOT prepend the base URL to the provided URL.\n * @param url \n * @param data \n * @param params \n * @returns \n */\n public async put(url: string, data: any, params?: Api.IReqParams): Promise<any> {\n if (!params) {\n params = {};\n }\n params.headers = params.headers || {};\n params.headers = {\n \"Content-Type\": \"application/json;\",\n ...params.headers\n };\n if (this.ssidHeader && this.ssid) {\n params.headers[this.ssidHeader] = this.ssid;\n }\n if (!data) {\n data = {};\n }\n if (typeof data != \"string\") {\n data = JSON.stringify(data);\n }\n const res = await fetch(url, {\n headers: params.headers,\n method: \"PUT\",\n body: data\n });\n return parseResult(res);\n }\n\n /**\n * Performs a file upload (POST) request.\n * This will NOT prepend the base URL to the provided URL.\n * @param url \n * @param blob \n * @param params \n * @returns \n */\n public async upload(url: string, blob: Blob, params?: Api.IUploadReqParams): Promise<any> {\n return new Promise((res, rej) => {\n try {\n let xhr = new XMLHttpRequest();\n const headers = <any>params?.headers;\n if (headers) {\n const headerKeys = Object.keys(headers);\n for (let i = 0; i < headerKeys.length; i++) {\n const key = headerKeys[i];\n const value = headers[key];\n xhr.setRequestHeader(key, value);\n }\n }\n if (params?.onProgress) {\n if (xhr.upload) {\n xhr.upload.onprogress = params?.onProgress;\n }\n else {\n xhr.addEventListener(\"progress\", params?.onProgress);\n }\n }\n xhr.onreadystatechange = (e) => {\n if (xhr.readyState == 4) {\n if (xhr.status >= 400 || xhr.status < 200) {\n rej(e);\n }\n else {\n try {\n res(JSON.parse(xhr.responseText));\n }\n catch (e) {\n console.error(e, xhr.responseText);\n res(xhr.responseText);\n }\n }\n }\n };\n xhr.open(\"POST\", url, true);\n if (this.ssidHeader && this.ssid) {\n xhr.setRequestHeader(this.ssidHeader, this.ssid);\n }\n let formData: any;\n if (params?.formData instanceof FormData) {\n formData = params?.formData;\n }\n else {\n formData = new FormData();\n if (params?.formData) {\n for (const key in params.formData) {\n formData.append(key, params.formData[key]);\n }\n }\n }\n formData.append(\"file\", blob);\n xhr.send(formData);\n }\n catch (e) {\n rej(e);\n }\n });\n }\n}","import { Api } from \"../api/api\";\n\n/**\n * TODO: rewrite.\n */\nexport namespace MessageBroker {\n export enum EAction {\n // Subscribes a client to topic messages on a server side.\n SUBSCRIBE = \"subscribe\",\n // Subscribes a client to a topic without notifying other clients.\n SUBSCRIBE_SHADOW = \"subscribeShadow\",\n // Unsubscribes clients from topic messages on a server side\n UNSUBSCRIBE = \"unsubscribe\",\n // Sends a message to all topic subscribers.\n BROADCAST = \"broadcast\",\n // Requests topic subscribers without subscribing.\n GET_TOPIC_SUBSCRIBERS = \"getTopicSubscribers\"\n }\n\n export type SubscribeType = EAction.SUBSCRIBE | EAction.SUBSCRIBE_SHADOW;\n\n export interface IMessageBase {\n topic: string;\n event?: string;\n data?: any;\n }\n\n export interface IMessage extends IMessageBase {\n // Timestamp of message.\n time?: number;\n // User id of message sender.\n user?: string;\n action: EAction;\n }\n\n export interface IBroker {\n /**\n * Add a subscriber to a topic.\n * @param topic \n * @param callback \n * @param action \n */\n Subscribe: (topic: string, callback: (msg: IMessage) => void, type?: SubscribeType) => void,\n /**\n * Remove a subscriber from a topic.\n * @param topic \n * @param callback \n */\n Unsubscribe: (topic: string, callback: (msg: IMessage) => void) => void,\n /**\n * Send message to server.\n * @param base \n * @returns \n */\n SendMessage: (base: IMessageBase | IMessage) => void;\n SetUserId: (userId: string) => void;\n IsConnected: boolean;\n }\n\n /**\n * Communicates with a server message broker.\n */\n export class WebSocketBroker implements IBroker {\n private subscriptions = new Map<string, ((msg: IMessage) => void)[]>();\n private ws: WebSocket;\n private reconnects: number = 0;\n private maxReconnects: number = 5;\n private userId: string;\n private uri: string;\n private env: Api.Env;\n\n public constructor(uri: string, env?: Api.Env) {\n this.uri = uri;\n this.env = env ? env : Api.EEnv.PROD;\n this.connect();\n }\n\n public get IsConnected(): boolean {\n return this.ws.readyState === WebSocket.OPEN;\n }\n\n public SetUserId(userId: string): void {\n this.userId = this.userId ? this.userId : userId;\n }\n\n private connect() {\n try {\n if (!WebSocket) {\n throw new Error(\"WebSocket is not supported by this browser\");\n }\n this.ws = new WebSocket(this.formatApiUri(this.uri));\n this.ws.onopen = this.onOpen.bind(this);\n this.ws.onmessage = this.onMessage.bind(this);\n this.ws.onerror = this.onError.bind(this);\n this.ws.onclose = this.onClose.bind(this);\n } \n catch (e) {\n console.error(e);\n }\n }\n\n private formatApiUri(uri: string): string {\n const wsProtocol = (window as any).document.location.protocol === \"https:\" ? \"wss\" : \"ws\";\n const currentUrl = new URL(uri);\n \n let full = wsProtocol + \"://\" + currentUrl.host + currentUrl.pathname + \"websocket\";\n \n // Check if we have a queryParam for accountId.\n const accountId = currentUrl.searchParams.get(\"accountId\");\n if (accountId) {\n if (full.includes(\"?\")) {\n full += \"&\";\n }\n else {\n full += \"?\";\n }\n full += \"accountId=\" + accountId;\n }\n \n return full;\n }\n\n private onOpen(ev: any): void {\n if (this.env === Api.EEnv.DEV) {\n console.log(\"MessageBroker connection opened: \", ev);\n }\n }\n\n private onClose(ev: any): void {\n if (this.env === Api.EEnv.DEV) {\n console.log(\"MessageBroker connection closed, trying to reconnect: \", ev);\n }\n if (this.reconnects < this.maxReconnects) {\n this.reconnects += 1;\n setTimeout(() => this.connect(), 5000 * this.reconnects);\n }\n }\n\n private onMessage(ev: any): void {\n const data: IMessage = JSON.parse(ev.data);\n this.subscriptions.get(data.topic)?.forEach(cb => cb(data));\n }\n\n private onError(ev: any): void {\n console.error(\"MessageBroker connection error: \", ev);\n }\n\n private addSubscriber(topic: string, callback: (msg: IMessage) => void): void {\n const subscribers = this.subscriptions.get(topic) || [];\n if (subscribers.includes(callback)) {\n return;\n }\n subscribers.push(callback);\n this.subscriptions.set(topic, subscribers);\n }\n\n /**\n * Send message to server.\n * @param base \n * @returns \n */\n public SendMessage(base: IMessageBase | IMessage): void {\n if (this.ws.readyState !== WebSocket.OPEN) {\n return;\n }\n try {\n const msg = base as IMessage;\n if (!msg.event) {\n msg.event = EAction.BROADCAST;\n }\n let message = base.data ? base.data : {};\n if (typeof message == \"object\") {\n message = JSON.stringify(message);\n }\n msg.data = message;\n\n const outgoingMessage: IMessage = { ...msg, user: this.userId, time: Date.now() };\n this.ws.send(JSON.stringify(outgoingMessage));\n } \n catch (e) {\n console.warn(e);\n }\n }\n\n /**\n * Add a subscriber to a topic.\n * @param topic \n * @param callback \n * @param action \n */\n public Subscribe(topic: string, callback: (msg: IMessage) => void, action?: SubscribeType): void {\n if (!action) {\n action = EAction.SUBSCRIBE;\n }\n this.addSubscriber(topic, callback);\n this.SendMessage({ topic, action });\n }\n\n /**\n * Remove a subscriber from a topic.\n * @param topic \n * @param callback \n */\n public Unsubscribe(topic: string, callback: (msg: IMessage) => void): void {\n const subscribers = this.subscriptions.get(topic) || [];\n this.subscriptions.set(topic, subscribers.filter(fn => fn != callback));\n this.SendMessage({ topic, action: EAction.UNSUBSCRIBE });\n }\n\n public RequestTopicUsers(topic: string, callback: (msg: IMessage) => void): void {\n this.addSubscriber(topic, callback);\n this.SendMessage({ topic, event: EAction.GET_TOPIC_SUBSCRIBERS });\n }\n }\n}","import { AbstractApi } from \"./abstract-api\";\nimport { Api as A } from \"./api\";\n\n/**\n * This is the request handler for Cam/Idm Api,\n * This API is in charge of user session management.\n */\nexport namespace GuardianApi {\n export class Api extends AbstractApi {\n // The environment this api is running on.\n private env: A.Env;\n\n constructor(params: {\n // Optional environment to use. If unspecified, the default environment will be used.\n // Default is A.EEnv.PROD.\n env?: A.Env\n }) {\n super({\n ssidHeader: \"x-sessionid\",\n cacheId: `GUARDIAN_API_${params?.env}_`\n });\n this.env = params?.env ? params.env : A.EEnv.PROD;\n this.setBaseUrl();\n }\n\n /**\n * Sets the base url for this api.\n */\n private setBaseUrl(): void {\n let url = \"https://guardian.nextspace\";\n const env = this.env.toUpperCase();\n switch (env) {\n case A.EEnv.DEV:\n url += \"-dev.net/\";\n break;\n case A.EEnv.STG:\n url += \"-stg.net/\";\n break;\n case A.EEnv.UAT:\n url += \"-uat.net/\";\n break;\n case A.EEnv.PROD:\n url += \".host/\";\n break;\n default:\n throw(\"Specified Environment is not valid. SuppliedEnv=\" + env);\n }\n this.baseUrl = url;\n }\n\n /**\n * Gets the base url for this api.\n * @returns \n */\n public GetBaseUrl(): string {\n return this.baseUrl;\n }\n\n /**\n * Sets the base url for this api.\n * @param url \n */\n public SetBaseUrl(url: string): void {\n this.baseUrl = url;\n if (!this.baseUrl.endsWith(\"/\")) {\n this.baseUrl += \"/\";\n }\n }\n\n /**\n * Performs an HTTP GET request.\n * This will prepend the base url to the url.\n * @param url \n * @param params \n * @returns \n */\n public async GET(url: string, params?: A.IReqParams): Promise<any> {\n return this.get(this.baseUrl + url, params);\n }\n\n /**\n * Performs an HTTP DELETE request.\n * This will prepend the base url to the url.\n * @param url \n * @param params \n * @returns \n */\n public async DELETE(url: string, params?: A.IReqParams): Promise<any> {\n return this.delete(this.baseUrl + url, params);\n }\n\n /**\n * Performs an HTTP POST request.\n * This will prepend the base url to the url.\n * @param url \n * @param data \n * @param params \n * @returns \n */\n public async POST(url: string, data: any, params?: A.IReqParams): Promise<any> {\n return this.post(this.baseUrl + url, data, params);\n }\n\n /**\n * Performs a file upload request (HTTP POST).\n * This will prepend the base url to the url.\n * @param url \n * @param blob \n * @param params \n * @returns \n */\n public async UPLOAD(url: string, blob: Blob, params?: A.IUploadReqParams): Promise<any> {\n return this.upload(this.baseUrl + url, blob, params);\n }\n }\n}","import { AbstractApi } from \"./abstract-api\";\nimport { Api as A } from \"./api\";\nimport { MessageBroker } from \"../server/message-broker\";\nimport { GuardianApi } from \"./guardian-api\";\nimport { Account, IDictionary } from \"../bruce-models\";\n\n/**\n * The primary API for communication with Nextspace.\n * This API is used to manage your data.\n */\nexport namespace BruceApi {\n /**\n * This is the interface for the Bruce Api getter.\n * A getter helps manage requests to multiple client accounts.\n */\n export interface IGetter {\n accountId: string;\n // Default settings the getter's app is running on.\n env?: A.EEnv;\n // Should return using app defaults if no params are specified.\n getApi: (accountId?: string, env?: A.EEnv) => BruceApi.Api;\n }\n\n /**\n * This is the request handler for Bruce Api,\n * it should be passed to any method that wants to communicate with this particular api.\n */\n export class Api extends AbstractApi {\n // The account id this api is connected to.\n private accountId: string;\n public get AccountId(): string {\n return this.accountId;\n }\n // The environment this api is connected to.\n private env: A.Env;\n // Load cancelled indicates the user set a custom base url.\n // This will stop the regional url from being set if it's still loading.\n private loadCancelled: boolean = false;\n // The websocket message broker instance.\n // If null then the message broker is not loaded.\n private messageBroker: MessageBroker.IBroker;\n public get MessageBroker(): MessageBroker.IBroker {\n return this.messageBroker;\n }\n // Indicates if loading the regional configuration was already called.\n private configLoadAttempted: boolean = false;\n public get ConfigLoadAttempted(): boolean {\n return this.configLoadAttempted;\n }\n // The regional base url for the account.\n // When using the CDN base url you MUST include a query param for accountId.\n // Eg: \"https://d3pb232f6pp9if.cloudfront.net/entity/myEntityId?accountId=myAccountId\"\n private cdnBaseUrl: string;\n\n // Used for entity GET list-by-filter requests.\n // When set and viaCdn = true when performing an entity request, this will be used in place for base-url.\n // Eg: \"https://d3pb232f6pp9if.cloudfront.net/entitiesListForCDN/alex\"\n // @deprecated, use cdnBaseUrl.\n public EntityCdnUrl: string;\n // Works only for static/dynamic tilesets.\n // When set and viaCdn = true when getting a legacy tileset file, this will be used in place for base-url.\n // Eg: \"https://d15gsaz0jz5ika.cloudfront.net/alex/<TILESETID>/file/<FILEPATH>\"\n // @deprecated, use cdnBaseUrl.\n public LegacyTilesetCdnUrl: string;\n // Works for all tilesets including older ones.\n // Eg: \"https://blah.cloudfront.net/tilesets/<TILESETID>/files/<FILEPATH>?accountId=<ACCOUNT>\"\n // @deprecated, use cdnBaseUrl.\n public TilesetCdnUrl: string;\n\n // The API's version.\n // Will be available when the Loading promise resolves.\n private version: string | \"UNKNOWN\";\n public get Version(): string | \"UNKNOWN\" {\n return this.version;\n }\n\n // Indicates if the init process has finished loading.\n // While this is not resolved requests will be in a pending state.\n private loadProm: Promise<void>;\n public get Loading(): Promise<void> {\n return this.loadProm;\n }\n\n constructor(params: {\n // Required client account to connect to.\n accountId: string,\n // Default is PROD.\n env?: A.Env,\n // @Deprecated, use loadConfig instead.\n loadRegionalBaseUrl?: boolean\n // True to load settings for regional base url and CDN.\n /// Default = false.\n loadConfig?: boolean\n // True to load message broker.\n // Default = true.\n loadWebSocket?: boolean,\n // Guardian instance used for regional url loading.\n // If not provided then a new instance of the API is made.\n guardian?: GuardianApi.Api,\n // Indicator to load nothing. Simply sets a dummy loading promise.\n // Used for testing purposes.\n dummy?: boolean\n }) {\n super({\n ssidHeader: \"x-sessionid\",\n cacheId: `BRUCE_API_${params?.env}_${params?.accountId}_`\n });\n let {accountId, env, guardian, loadRegionalBaseUrl, loadConfig, loadWebSocket, dummy} = params;\n this.accountId = accountId;\n this.env = env ?? A.EEnv.PROD;\n\n if (!dummy) {\n // Backwards compatibility.\n if (loadRegionalBaseUrl) {\n loadConfig = true;\n }\n \n if (loadConfig) {\n // Mark it as attempted right away because we don't want any external calls while it gets to that async point.\n this.configLoadAttempted = true;\n }\n\n this.loadProm = this.init(guardian, loadConfig, loadWebSocket);\n }\n }\n\n /**\n * Loads regional base url and sets up message broker.\n * @param guardian Required for loading regional base url.\n * @param loadConfig\n * @returns\n */\n private async init(\n guardian?: GuardianApi.Api,\n loadConfig?: boolean,\n loadWebSocket?: boolean\n ): Promise<void> {\n if (!this.accountId) {\n throw(\"accountId is required.\");\n }\n\n // Set using a stable default.\n const domain = this.getDomain();\n this.baseUrl = `https://${this.accountId}.api.${domain}/`;\n\n // Attempt to load regional configuration.\n if (loadConfig) {\n await this.LoadConfig({\n guardian: guardian,\n // We marked it as attempted to load outside this method to fight any external calls.\n // So we'll force load it now.\n forceLoad: true\n });\n }\n \n // Get the version.\n if (this.baseUrl) {\n const full = this.ConstructUrl({ \n url: \"version\" \n });\n const data = await this.get(full);\n if (data?.[\"Bruce-API\"]) {\n this.version = data[\"Bruce-API\"];\n }\n else {\n this.version = \"UNKNOWN\";\n }\n }\n\n // Start web socket connection.\n if (loadWebSocket == true) {\n try {\n const full = this.ConstructUrl();\n this.messageBroker = new MessageBroker.WebSocketBroker(full, this.env);\n }\n catch (e) {\n console.warn(\"BruceApi: Failed to create message broker.\", e);\n }\n }\n }\n\n private getDomain(): string {\n const env = this.env.toUpperCase();\n let domain = \"nextspace.host\";\n switch (env) {\n case A.EEnv.DEV:\n domain = \"nextspace-dev.net\";\n break;\n case A.EEnv.STG:\n domain = \"nextspace-stg.net\";\n break;\n case A.EEnv.UAT:\n domain = \"nextspace-uat.net\";\n break;\n case A.EEnv.PROD:\n domain = \"nextspace.host\";\n break;\n default:\n console.error(\"Specified Environment is not valid. SuppliedEnv=\" + env);\n }\n return domain;\n }\n\n /**\n * Loads the regional configuration for the account.\n * If the config is already loaded then this will do nothing.\n */\n public async LoadConfig(params?: {\n guardian?: GuardianApi.Api,\n // Bypass the check to see if the config was already loaded.\n forceLoad?: boolean\n }): Promise<void> {\n let {guardian, forceLoad} = (params ?? {});\n if (this.configLoadAttempted && forceLoad != true) {\n return;\n }\n this.configLoadAttempted = true;\n try {\n if (!guardian) {\n guardian = new GuardianApi.Api({\n env: this.env\n });\n }\n\n const {account} = await Account.GetBySubdomain({\n subdomain: this.accountId,\n api: guardian\n });\n\n if (!this.loadCancelled) {\n // Set the calculated base url.\n // If this is not available then this is considered a critical failure.\n // However I am not crashing here because I want to monitor this in production.\n if (account.URL) {\n const urls = account.URL;\n if (urls?.Base) {\n this.baseUrl = urls.Base;\n }\n if (urls?.CDNEntities) {\n this.EntityCdnUrl = urls.CDNEntities;\n }\n if (urls?.CDNTileset) {\n this.TilesetCdnUrl = urls.CDNTileset;\n }\n if (urls?.CDNLegacyTileset) {\n this.LegacyTilesetCdnUrl = urls.CDNLegacyTileset;\n }\n if (urls?.CDNBase) {\n this.cdnBaseUrl = urls.CDNBase;\n }\n }\n else {\n console.error(\"BruceApi: Failed to load regional configuration for account.\", this.accountId);\n }\n }\n }\n catch (e) {\n console.error(e);\n }\n }\n\n /**\n * Creates a message broker instance and returns it.\n * If an instance is already created, it will return that one.\n * @warning This will await the loading promise to avoid using data that isn't ready.\n */\n public async ConnectWebsocket(): Promise<MessageBroker.IBroker> {\n await this.loadProm;\n if (this.messageBroker) {\n return this.messageBroker;\n }\n const full = this.ConstructUrl();\n this.messageBroker = new MessageBroker.WebSocketBroker(full, this.env);\n return this.messageBroker;\n }\n\n /**\n * Warning: This method does not wait for init to finish loading.\n * This means the url could be changed once fully initialized.\n * The url will be valid either way, but the loaded one may be faster as it is region specific.\n * Await the \"Loading\" promise if you care about this.\n * @warning use ConstructUrl instead as the baseUrl may have a query param for the account.\n * @returns\n */\n public GetBaseUrl(): string {\n return this.baseUrl;\n }\n\n /**\n * Warning: Wait the \"Loading\" promise before using this url.\n * @warning use ConstructUrl instead as the baseUrl may have a query param for the account.\n * @returns \n */\n public GetCdnBaseUrl(): string {\n return this.cdnBaseUrl;\n }\n\n /**\n * Returns a url with the provided url appended to the loaded base url.\n * If the base url is not loaded yet, this will return null.\n * @param params \n */\n public ConstructUrl(params?: {\n // URL to append to the base url.\n url?: string,\n // URL params to append to the url.\n urlParams?: URLSearchParams | IDictionary<string>,\n // If true this will check if a CDN url is available and use that instead.\n // If one is not available then the typical base url is used.\n cdn?: boolean\n }) {\n if (params?.cdn && this.cdnBaseUrl) {\n return this.ConstructCdnUrl(params.url, params.urlParams);\n }\n\n const tmp = new URL(this.baseUrl);\n \n if (params?.urlParams) {\n if (params.urlParams instanceof URLSearchParams) {\n params.urlParams.forEach((value, key) => {\n tmp.searchParams.append(key, value);\n });\n }\n else {\n for (const key in params.urlParams) {\n tmp.searchParams.append(key, params.urlParams[key]);\n }\n }\n }\n\n // Ensure the url ends with a slash.\n if (!tmp.pathname.endsWith(\"/\")) {\n tmp.pathname += \"/\";\n }\n\n let split: string[];\n if (params?.url) {\n // Ensure we're only adding the path.\n // The baseUrl could have included query params so have this extra logic.\n split = params.url.split(\"?\");\n\n // Ensure the url does not start with a slash.\n // This is because the base url already has a slash at the end.\n let path = split[0];\n if (path.startsWith(\"/\")) {\n path = path.substring(1);\n }\n tmp.pathname += path;\n }\n\n let full = tmp.toString();\n\n // Append the query string if any exist.\n if (split && split.length > 1) {\n const query = split[1].split(\"&\");\n for (let q of query) {\n if (full.includes(\"?\")) {\n full += \"&\";\n }\n else {\n full += \"?\";\n }\n full += q;\n }\n }\n\n return full;\n }\n\n /**\n * Returns a url routed through the API's CDN.\n * If the CDN is not enabled for the account, this will return null.\n * @param url suffix to append to the base url.\n * @param urlParams \n * @returns \n */\n public ConstructCdnUrl(url: string, urlParams?: URLSearchParams | IDictionary<string>): string {\n if (!this.cdnBaseUrl) {\n return null;\n }\n \n const tmp = new URL(this.cdnBaseUrl);\n if (urlParams) {\n if (urlParams instanceof URLSearchParams) {\n urlParams.forEach((value, key) => {\n tmp.searchParams.append(key, value);\n });\n }\n else {\n for (const key in urlParams) {\n tmp.searchParams.append(key, urlParams[key]);\n }\n }\n }\n\n // Ensure the url ends with a slash.\n if (!tmp.pathname.endsWith(\"/\")) {\n tmp.pathname += \"/\";\n }\n \n let split: string[];\n if (url) {\n // Ensure we're only adding the path.\n // The baseUrl could have included query params so have this extra logic.\n split = url.split(\"?\");\n\n // Ensure the url does not start with a slash.\n // This is because the base url already has a slash at the end.\n let path = split[0];\n if (path.startsWith(\"/\")) {\n path = url.substring(1);\n }\n tmp.pathname += path;\n }\n\n let full = tmp.toString();\n\n // Append the query string if any exist.\n if (split && split.length > 1) {\n const query = split[1].split(\"&\");\n for (let q of query) {\n if (full.includes(\"?\")) {\n full += \"&\";\n }\n else {\n full += \"?\";\n }\n full += q;\n }\n }\n\n return full;\n }\n\n /**\n * Warning: This will cancel the init process.\n * The init process loads a region specific endpoint.\n * Setting a base url will stop that process from completing.\n * @param url\n */\n public SetBaseUrl(url: string): void {\n this.baseUrl = url;\n // If we're setting a valid URL then we'll ensure it ends with a slash.\n if (this.baseUrl && (this.baseUrl.startsWith(\"http://\") || this.baseUrl.startsWith(\"https://\"))) {\n // Parsing into URL object to avoid adding a \"/\" after query params.\n const full = new URL(this.baseUrl);\n if (!full.pathname.endsWith(\"/\")) {\n full.pathname += \"/\";\n }\n this.baseUrl = full.toString();\n }\n this.loadCancelled = true;\n }\n\n /**\n * Performs an HTTP GET request.\n * This will prepend the base url to the url.\n * @param url \n * @param params \n * @returns \n */\n public async GET(url: string, params?: A.IReqParams): Promise<any> {\n return new Promise((res, rej) => {\n this.loadProm.then(() => {\n const full = this.ConstructUrl({ \n url: url \n });\n this.get(full, params).then(res).catch(rej);\n }).catch(rej);\n });\n }\n\n /**\n * Performs an HTTP DELETE request.\n * This will prepend the base url to the url.\n * @param url \n * @param params \n * @returns \n */\n public async DELETE(url: string, params?: A.IReqParams): Promise<any> {\n return new Promise((res, rej) => {\n this.loadProm.then(() => {\n const full = this.ConstructUrl({\n url: url\n });\n this.delete(full, params).then(res).catch(rej);\n }).catch(rej);\n });\n }\n\n /**\n * Performs an HTTP POST request.\n * This will prepend the base url to the url.\n * @param url \n * @param data \n * @param params \n * @returns \n */\n public async POST(url: string, data: any, params?: A.IReqParams): Promise<any> {\n return new Promise((res, rej) => {\n this.loadProm.then(() => {\n const full = this.ConstructUrl({\n url: url\n });\n this.post(full, data, params).then(res).catch(rej);\n }).catch(rej);\n });\n }\n\n /**\n * Performs an HTTP PUT request.\n * This will prepend the base url to the url.\n * @param url \n * @param data \n * @param params \n * @returns \n */\n public async PUT(url: string, data: any, params?: A.IReqParams): Promise<any> {\n return new Promise((res, rej) => {\n this.loadProm.then(() => {\n const full = this.ConstructUrl({\n url: url\n });\n this.put(full, data, params).then(res).catch(rej);\n }).catch(rej);\n });\n }\n\n /**\n * Performs a file upload request (HTTP POST).\n * This will prepend the base url to the url.\n * @param url \n * @param blob \n * @param params \n * @returns \n */\n public async UPLOAD(url: string, blob: Blob, params?: A.IUploadReqParams): Promise<any> {\n return new Promise((res, rej) => {\n this.loadProm.then(() => {\n const full = this.ConstructUrl({\n url: url\n });\n this.upload(full, blob, params).then(res).catch(rej);\n }).catch(rej);\n });\n }\n }\n}","import { AbstractApi } from \"./abstract-api\";\nimport { Api as A } from \"./api\";\n\n/**\n * This is the request handler for Global Api,\n * The global api is used to store information that is higher level than client accounts.\n * For example it will store usage records, client account group settings, data sharing settings, etc.\n */\nexport namespace GlobalApi {\n export class Api extends AbstractApi {\n // The environment this api is running on.\n private env: A.Env;\n\n constructor(params: {\n // Optional environment to use. If unspecified, the default environment will be used.\n // Default is A.EEnv.PROD.\n env?: A.Env\n }) {\n super({\n ssidHeader: \"x-sessionid\",\n cacheId: `GLOBAL_API_${params?.env}_`\n });\n this.env = params?.env ? params.env : A.EEnv.PROD;\n this.setBaseUrl();\n }\n\n /**\n * Sets the base url for this api.\n */\n private setBaseUrl(): void {\n let url: string;\n const env = this.env.toUpperCase();\n switch (env) {\n case A.EEnv.DEV:\n url = \"https://bruceglobal.nextspace-dev.net/\";\n break;\n case A.EEnv.STG:\n url = \"https://bruceglobal.nextspace-stg.net/\";\n break;\n case A.EEnv.UAT:\n url = \"https://bruceglobal.api.nextspace-uat.net/\";\n break;\n case A.EEnv.PROD:\n url = \"https://bruceglobal.api.nextspace.host/\";\n break;\n default:\n throw(\"Specified Environment is not valid. SuppliedEnv=\" + env);\n }\n this.baseUrl = url;\n }\n\n /**\n * Gets the base url for this api.\n * @returns \n */\n public GetBaseUrl(): string {\n return this.baseUrl;\n }\n\n /**\n * Sets the base url for this api.\n * @param url \n */\n public SetBaseUrl(url: string): void {\n this.baseUrl = url;\n if (!this.baseUrl.endsWith(\"/\")) {\n this.baseUrl += \"/\";\n }\n }\n\n /**\n * Performs an HTTP GET request.\n * This will prepend the base url to the url.\n * @param url \n * @param params \n * @returns \n */\n public async GET(url: string, params?: A.IReqParams): Promise<any> {\n return this.get(this.baseUrl + url, params);\n }\n\n /**\n * Performs an HTTP DELETE request.\n * This will prepend the base url to the url.\n * @param url \n * @param params \n * @returns \n */\n public async DELETE(url: string, params?: A.IReqParams): Promise<any> {\n return this.delete(this.baseUrl + url, params);\n }\n\n /**\n * Performs an HTTP POST request.\n * This will prepend the base url to the url.\n * @param url \n * @param data \n * @param params \n * @returns \n */\n public async POST(url: string, data: any, params?: A.IReqParams): Promise<any> {\n return this.post(this.baseUrl + url, data, params);\n }\n\n /**\n * Performs a file upload request (HTTP POST).\n * This will prepend the base url to the url.\n * @param url \n * @param blob \n * @param params \n * @returns \n */\n public async UPLOAD(url: string, blob: Blob, params?: A.IUploadReqParams): Promise<any> {\n return this.upload(this.baseUrl + url, blob, params);\n }\n }\n}","import { IDictionary } from \"../common/dictionary\";\nimport { Api } from \"./api\";\nimport { BruceApi } from \"./bruce-api\";\nimport { GlobalApi } from \"./global-api\";\nimport { GuardianApi } from \"./guardian-api\";\n\n/**\n * Utility for managing multiple API instances.\n * Example: {\n * const api = new ApiGetters({\n * accountId: \"123\",\n * env: Api.EEnv.PROD\n * });\n * \n * // Returns default API instance specified in constructor.\n * const bruce1 = api.GetBruceApi();\n * // Returns API instance for account 456.\n * const bruce2 = api.GetBruceApi({\n * accountId: \"456\"\n * });\n * \n * const global = api.GetGlobalApi();\n * const guardian = api.GetGuardianApi();\n * }\n */\nexport class ApiGetters {\n private bruce: IDictionary<BruceApi.Api> = {};\n private guardian: IDictionary<GuardianApi.Api> = {};\n private global: IDictionary<GlobalApi.Api> = {};\n // Default account ID to use when one is unspecified.\n private accountId: string;\n // Default environment to use when one is unspecified.\n private env: Api.EEnv;\n // Session ID to use for all API instances.\n private sessionId: string;\n\n constructor(params: {\n // Optional account ID to use. If unspecified, the default account ID will be used.\n accountId: string,\n // Optional environment to use. If unspecified, the default environment will be used.\n // Default is PROD.\n env?: Api.EEnv,\n // Session ID to use for all API instances.\n sessionId?: string\n }) {\n this.accountId = params?.accountId;\n this.env = params?.env ? params.env : Api.EEnv.PROD;\n this.sessionId = params?.sessionId;\n }\n\n /**\n * Clears all cache items in all API instances.\n */\n public ClearCache() {\n for (const key in this.bruce) {\n this.bruce[key]?.Cache?.Clear();\n }\n for (const key in this.guardian) {\n this.guardian[key]?.Cache?.Clear();\n }\n for (const key in this.global) {\n this.global[key]?.Cache?.Clear();\n }\n }\n\n /**\n * Sets the default account ID to use when one is unspecified.\n * @param accountId \n */\n public SetAccountId(accountId: string) {\n this.accountId = accountId;\n\n // Queue load of regional config in case an instance was made earlier without it.\n // We want the default account to always go through the fastest regional endpoint.\n const api = this.GetBruceApi({\n accountId: accountId,\n loadConfig: true\n });\n api.LoadConfig({\n guardian: this.GetGuardianApi({\n env: this.env\n })\n });\n }\n\n /**\n * Returns the default account ID to use when one is unspecified.\n * @returns \n */\n public GetAccountId(): string {\n return this.accountId;\n }\n\n /**\n * Sets the default environment to use when one is unspecified.\n * @param env \n */\n public SetEnv(env: Api.EEnv) {\n this.env = env;\n }\n\n /**\n * Returns the default environment to use when one is unspecified.\n * @returns \n */\n public GetEnv(): Api.EEnv {\n return this.env;\n }\n\n /**\n * Updates the session ID for all API instances.\n * This will auto-clear all cache items.\n * @param sessionId \n */\n public SetSessionId(sessionId: string) {\n this.sessionId = sessionId;\n for (const key in this.bruce) {\n this.bruce[key].SetSessionId(sessionId);\n }\n for (const key in this.guardian) {\n this.guardian[key].SetSessionId(sessionId);\n }\n for (const key in this.global) {\n this.global[key].SetSessionId(sessionId);\n }\n this.ClearCache();\n }\n\n /**\n * Returns the session ID.\n * @returns \n */\n public GetSessionId(): string {\n return this.sessionId;\n }\n\n /**\n * Returns a BruceApi instance.\n * @param params \n * @returns \n */\n public GetBruceApi(params?: {\n // Optional accountId to use. If unspecified, the default account ID will be used.\n accountId?: string,\n // Optional environment to use. If unspecified, the default environment will be used.\n env?: Api.EEnv,\n // If true, the regional base URL will be loaded.\n // This is only read if the API instance is not already created.\n loadConfig?: boolean,\n // If true, the websocket will be connected.\n // This is only read if the API instance is not already created.\n loadWebSocket?: boolean\n }): BruceApi.Api {\n if (!params) {\n params = {};\n }\n let {accountId, env, loadConfig, loadWebSocket} = params;\n accountId = accountId ? accountId : this.accountId;\n env = env ? env : this.env;\n const key = `${accountId}-${env}`;\n if (!this.bruce[key]) {\n this.bruce[key] = new BruceApi.Api({\n accountId,\n env,\n loadConfig: loadConfig != null ? true : loadConfig,\n loadWebSocket: loadWebSocket,\n guardian: this.GetGuardianApi({\n env\n }),\n });\n this.bruce[key].SetSessionId(this.sessionId);\n }\n return this.bruce[key];\n }\n\n /**\n * Returns a BruceApi getter instance.\n * This is a micro-utility that is used to request the bruce-api specifically for various client accounts.\n * @deprecated: use the full api-getters instance instead.\n * @returns \n */\n public GetBruceGetter(): BruceApi.IGetter {\n return {\n accountId: this.accountId,\n env: this.env,\n getApi: (accountId?: string, env?: Api.EEnv) => {\n return this.GetBruceApi({\n accountId, \n env\n });\n }\n }\n }\n\n /**\n * Returns a GlobalApi instance.\n * @param params \n * @returns \n */\n public GetGlobalApi(params?: {\n // Optional environment to use. If unspecified, the default environment will be used.\n env?: Api.EEnv\n }): GlobalApi.Api {\n if (!params) {\n params = {};\n }\n let {env} = params;\n env = env ? env : this.env;\n const key = `${env}`;\n if (!this.global[key]) {\n this.global[key] = new GlobalApi.Api({\n env\n });\n this.global[key].SetSessionId(this.sessionId);\n }\n return this.global[key];\n }\n\n /**\n * Returns a GuardianApi instance.\n * @param params \n * @returns \n */\n public GetGuardianApi(params?: {\n // Optional environment to use. If unspecified, the default environment will be used.\n env?: Api.EEnv\n }): GuardianApi.Api {\n if (!params) {\n params = {};\n }\n let {env} = params;\n env = env ? env : this.env;\n const key = `${env}`;\n if (!this.guardian[key]) {\n this.guardian[key] = new GuardianApi.Api({\n env\n });\n this.guardian[key].SetSessionId(this.sessionId);\n }\n return this.guardian[key];\n }\n}","import { Api as A } from \"./api/api\";\nimport { ApiGetters } from \"./api/api-getters\";\n\ninterface IParams {\n isSelfManaged?: boolean;\n accountId?: string;\n env?: A.EEnv;\n sessionId?: string;\n apiGetters?: ApiGetters;\n}\n\n// Global instance for smaller use-cases where you don't want to manage the getters yourself.\nlet _getters: ApiGetters;\n\nexport namespace ENVIRONMENT {\n // If true, then defaults are not touched and it's assumed this is being managed.\n export let IS_SELF_MANAGED = false;\n // Unused if IS_SELF_MANAGED is false.\n export let PARAMS: IParams = {\n // Default client account ID.\n accountId: \"\",\n // Default environment.\n env: A.EEnv.UAT,\n // Default session ID.\n sessionId: \"\"\n };\n\n /**\n * Returns the ApiGetters instance.\n * This is used to communicate with any Nextspace API instance.\n * @returns \n */\n export function Api() {\n if (IS_SELF_MANAGED) {\n throw(\"Self managed mode ON. You are getting this error because you didn't pass an Api instance to a function.\");\n }\n if (!_getters) {\n _getters = new ApiGetters({\n accountId: PARAMS.accountId,\n env: PARAMS.env ? PARAMS.env : A.EEnv.UAT,\n sessionId: PARAMS.sessionId\n });\n }\n return _getters;\n }\n\n /**\n * Resets the environment to the specified params.\n * @param params \n */\n export function Reset(params?: IParams) {\n if (IS_SELF_MANAGED) {\n throw(\"Self managed mode ON. You are getting this error because you didn't pass an Api instance to a function.\");\n }\n if (_getters) {\n _getters.ClearCache();\n if (params.accountId) {\n _getters.SetAccountId(params.accountId);\n }\n if (params.sessionId) {\n _getters.SetSessionId(params.sessionId);\n }\n if (params.env) {\n _getters.SetEnv(params.env);\n }\n }\n PARAMS = {\n ...PARAMS,\n ...params\n };\n }\n}","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { ENVIRONMENT } from \"../environment\";\n\ntype Type = AnnDocument.EType | string;\n\n/**\n * Describes communication with the \"Annotated Document\" concept in Bruce.\n * Annotated documents are files with hotspots that can link to Entity records.\n */\nexport namespace AnnDocument {\n /**\n * Describes an annotated document record.\n */\n export interface IDocument {\n ID?: number;\n Type: Type;\n Name: string;\n \"ClientFile.ID\": string;\n Settings?: ISettings;\n }\n\n /**\n * The types of supported annotated documents.\n */\n export enum EType {\n SVG = \"SVG\"\n }\n\n /**\n * Describes settings for an annotated document.\n */\n export interface ISettings {\n Hotspots?: IHotspot[];\n DrawingScaleFactorX?: number;\n DrawingScaleFactorY?: number;\n }\n\n /**\n * Describes a hotspot on an annotated document.\n * Hotspots are areas of interest on the document that can be linked to Entity records.\n */\n export interface IHotspot {\n X: number;\n Y: number;\n Key: string;\n Description?: string;\n LinkedEntity?: {\n \"Entity.ID\": string;\n };\n }\n\n /**\n * Returns an annotated document by ID.\n * @param params \n * @returns \n */\n export async function Get(params: {\n api?: BruceApi.Api,\n docId: number,\n req?: Api.IReqParams\n }): Promise<{\n document: IDocument\n }> {\n let { api, docId, req: reqParams } = params;\n if (!docId) {\n throw(\"Doc ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const key = GetCacheKey(docId);\n const cache = await api.GetCacheItem(key, reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(`documentView/${docId}`, Api.PrepReqParams(reqParams));\n res({\n document: data\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key,\n value: prom,\n req: reqParams\n });\n return prom;\n }\n\n /**\n * Returns a list of annotated documents by type.\n * @param params \n * @returns \n */\n export async function GetList(params: {\n api?: BruceApi.Api,\n // If not specified, all types are returned.\n docType?: Type,\n // If true, the settings for each document are expanded.\n // By default they are removed to reduce payload size.\n expandSettings?: boolean,\n // Filters list to documents that have hotspots related to this ID.\n entityId?: string,\n req?: Api.IReqParams\n }): Promise<{\n documents: IDocument[]\n }> {\n let { api, docType: type, req: reqParams, entityId, expandSettings } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n if (!type) {\n type = \"\";\n }\n \n const cache = await api.GetCacheItem(GetListCacheKey(type, entityId, expandSettings), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const req: Promise<any> = new Promise(async (res, rej) => {\n try {\n const urlParams = new URLSearchParams();\n if (type) {\n urlParams.append(\"type\", type);\n }\n if (entityId) {\n urlParams.append(\"entityId\", entityId);\n }\n if (expandSettings) {\n urlParams.append(\"expandSettings\", \"true\");\n }\n\n const url = \"documentViews\" + `?${urlParams.toString()}`;\n const data = await api.GET(url, Api.PrepReqParams(reqParams));\n res({\n documents: data.Items\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key: GetListCacheKey(type, entityId, expandSettings),\n value: req,\n req: reqParams\n });\n return req;\n }\n\n /**\n * Returns cache identifier for an annotated document by ID.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetCacheKey(1);\n * api.Cache.Remove(key);\n * }\n * @param id \n * @returns \n */\n export function GetCacheKey(id: number) {\n return `${Api.ECacheKey.AnnDocument}${Api.ECacheKey.Id}${id}`;\n }\n\n /**\n * Returns cache identifier for a list of annotated documents by type.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetListCacheKey(\"SVG\");\n * api.Cache.Remove(key);\n * }\n * @param type \n * @param entityId\n * @param expandSettings\n * @returns \n */\n export function GetListCacheKey(type: Type, entityId?: string, expandSettings?: boolean) {\n if (!expandSettings) {\n expandSettings = false;\n }\n if (!entityId) {\n entityId = \"\";\n }\n return Api.ECacheKey.AnnDocument + type + entityId + expandSettings;\n }\n}","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { ENVIRONMENT } from \"../environment\";\nimport { CustomFormContent } from \"./custom-form-content\";\n\n/**\n * Describes the \"Custom Form\" concept within Nextspace.\n * Custom forms are dynamic dialogs that get populated with Entity data.\n */\nexport namespace CustomForm {\n /**\n * Describes a custom form record.\n */\n export interface IForm {\n ID?: number;\n // This is the entity type ID that this custom form is associated with.\n \"EntityType.ID\"?: string;\n // Human readable custom form name.\n Name?: string;\n // Custom form content.\n Settings?: CustomFormContent.IContent | any;\n // Custom form type. This helps identify how to parse the settings.\n Type?: EType;\n }\n\n /**\n * Types of custom forms available.\n */\n export enum EType {\n // Deprecated types.\n Form = \"GENERIC\",\n Markup = \"MARKUP\",\n // Supported types.\n ComponentStack = \"COMPONENT_STACK\"\n }\n\n /**\n * Gets a custom form by ID.\n * @param params \n * @returns \n */\n export async function Get(params: {\n api?: BruceApi.Api,\n // The ID of the custom form to get.\n formId: number,\n req?: Api.IReqParams\n }): Promise<{\n // The custom form record associated with the ID.\n form: IForm\n }> {\n let { api, formId: id, req: reqParams } = params;\n if (!id) {\n throw(\"Id is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n \n const cache = await api.GetCacheItem(GetCacheKey(id), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(`customForm/${id}`, Api.PrepReqParams(reqParams));\n res({\n form: data\n });\n } catch (err) {\n rej(err);\n }\n });\n await api.SetCacheItem({\n key: GetCacheKey(id),\n value: prom,\n req: reqParams\n });\n return prom;\n }\n\n /**\n * Deletes a custom form by ID.\n * @param params \n */\n export async function Delete(params: {\n api?: BruceApi.Api,\n // The ID of the custom form to delete.\n formId: number,\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, formId: id, req: reqParams } = params;\n if (!id) {\n return Promise.resolve();\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n await api.DELETE(`customForm/${id}`, Api.PrepReqParams(reqParams))\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.CustomForm);\n }\n\n /**\n * Gets a list of custom forms by entity type ID.\n * @param params \n * @returns \n */\n export async function GetList(params: {\n api?: BruceApi.Api,\n // The ID of the entity type to get custom forms for.\n entityTypeId: string,\n req?: Api.IReqParams\n }): Promise<{\n // The list of custom forms associated with the entity type ID.\n forms: IForm[]\n }> {\n let { api, entityTypeId: typeId, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const url = typeId ? `entityType/${typeId}/customForms` : \"customForms\";\n const cache = await api.GetCacheItem(GetListCacheKey(typeId), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const req = api.GET(url, Api.PrepReqParams(reqParams));\n const prom = req.then((data) => {\n return {\n forms: data.Items\n };\n });\n await api.SetCacheItem({\n key: GetListCacheKey(typeId),\n value: prom,\n req: reqParams\n });\n return prom;\n }\n\n /**\n * Creates or updates a custom form record.\n * @param params \n * @returns \n */\n export async function Update(params: {\n api?: BruceApi.Api,\n // The custom form record to create or update.\n // To create a record don't set the ID property.\n form: IForm,\n reqParams?: Api.IReqParams\n }): Promise<{\n // The custom form record that was created or updated.\n form: IForm\n }> {\n let { api, form: data, reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n if (!data.ID) {\n data.ID = 0;\n }\n const res = await api.POST(`customForm/${data.ID}`, data, Api.PrepReqParams(reqParams));\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.CustomForm);\n return {\n form: res\n };\n }\n\n /**\n * Returns cache identifier for a Custom Form by ID.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetCacheKey(1);\n * api.Cache.Remove(key);\n * }\n * @param id \n * @returns \n */\n export function GetCacheKey(id: number): string {\n return Api.ECacheKey.CustomForm + Api.ECacheKey.Id + id;\n }\n \n /**\n * Returns cache identifier for a list of Custom Forms by Entity Type ID.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetListCacheKey(\"123\");\n * api.Cache.Remove(key);\n * }\n * @param typeId \n * @returns \n */\n export function GetListCacheKey(typeId: string): string {\n if (typeId) {\n return Api.ECacheKey.CustomForm + Api.ECacheKey.EntityType + Api.ECacheKey.Id + typeId;\n }\n return Api.ECacheKey.CustomForm;\n }\n}","/**\n * Dictionary of CSS color names and their hex values.\n */\nexport const COLOR_CSS_DEFAULTS = {\n \"aliceblue\": \"#F0F8FF\",\n \"antiquewhite\": \"#FAEBD7\",\n \"aqua\": \"#00FFFF\",\n \"aquamarine\": \"#7FFFD4\",\n \"azure\": \"#F0FFFF\",\n \"beige\": \"#F5F5DC\",\n \"bisque\": \"#FFE4C4\",\n \"black\": \"#000000\",\n \"blanchedalmond\": \"#FFEBCD\",\n \"blue\": \"#0000FF\",\n \"blueviolet\": \"#8A2BE2\",\n \"brown\": \"#A52A2A\",\n \"burlywood\": \"#DEB887\",\n \"cadetblue\": \"#5F9EA0\",\n \"chartreuse\": \"#7FFF00\",\n \"chocolate\": \"#D2691E\",\n \"coral\": \"#FF7F50\",\n \"cornflowerblue\": \"#6495ED\",\n \"cornsilk\": \"#FFF8DC\",\n \"crimson\": \"#DC143C\",\n \"cyan\": \"#00FFFF\",\n \"darkblue\": \"#00008B\",\n \"darkcyan\": \"#008B8B\",\n \"darkgoldenrod\": \"#B8860B\",\n \"darkgray\": \"#A9A9A9\",\n \"darkgreen\": \"#006400\",\n \"darkgrey\": \"#A9A9A9\",\n \"darkkhaki\": \"#BDB76B\",\n \"darkmagenta\": \"#8B008B\",\n \"darkolivegreen\": \"#556B2F\",\n \"darkorange\": \"#FF8C00\",\n \"darkorchid\": \"#9932CC\",\n \"darkred\": \"#8B0000\",\n \"darksalmon\": \"#E9967A\",\n \"darkseagreen\": \"#8FBC8F\",\n \"darkslateblue\": \"#483D8B\",\n \"darkslategray\": \"#2F4F4F\",\n \"darkslategrey\": \"#2F4F4F\",\n \"darkturquoise\": \"#00CED1\",\n \"darkviolet\": \"#9400D3\",\n \"deeppink\": \"#FF1493\",\n \"deepskyblue\": \"#00BFFF\",\n \"dimgray\": \"#696969\",\n \"dimgrey\": \"#696969\",\n \"dodgerblue\": \"#1E90FF\",\n \"firebrick\": \"#B22222\",\n \"floralwhite\": \"#FFFAF0\",\n \"forestgreen\": \"#228B22\",\n \"fuchsia\": \"#FF00FF\",\n \"gainsboro\": \"#DCDCDC\",\n \"ghostwhite\": \"#F8F8FF\",\n \"gold\": \"#FFD700\",\n \"goldenrod\": \"#DAA520\",\n \"gray\": \"#808080\",\n \"green\": \"#008000\",\n \"greenyellow\": \"#ADFF2F\",\n \"grey\": \"#808080\",\n \"honeydew\": \"#F0FFF0\",\n \"hotpink\": \"#FF69B4\",\n \"indianred\": \"#CD5C5C\",\n \"indigo\": \"#4B0082\",\n \"ivory\": \"#FFFFF0\",\n \"khaki\": \"#F0E68C\",\n \"lavender\": \"#E6E6FA\",\n \"lavenderblush\": \"#FFF0F5\",\n \"lawngreen\": \"#7CFC00\",\n \"lemonchiffon\": \"#FFFACD\",\n \"lightblue\": \"#ADD8E6\",\n \"lightcoral\": \"#F08080\",\n \"lightcyan\": \"#E0FFFF\",\n \"lightgoldenrodyellow\": \"#FAFAD2\",\n \"lightgray\": \"#D3D3D3\",\n \"lightgreen\": \"#90EE90\",\n \"lightgrey\": \"#D3D3D3\",\n \"lightpink\": \"#FFB6C1\",\n \"lightsalmon\": \"#FFA07A\",\n \"lightseagreen\": \"#20B2AA\",\n \"lightskyblue\": \"#87CEFA\",\n \"lightslategray\": \"#778899\",\n \"lightslategrey\": \"#778899\",\n \"lightsteelblue\": \"#B0C4DE\",\n \"lightyellow\": \"#FFFFE0\",\n \"lime\": \"#00FF00\",\n \"limegreen\": \"#32CD32\",\n \"linen\": \"#FAF0E6\",\n \"magenta\": \"#FF00FF\",\n \"maroon\": \"#800000\",\n \"mediumaquamarine\": \"#66CDAA\",\n \"mediumblue\": \"#0000CD\",\n \"mediumorchid\": \"#BA55D3\",\n \"mediumpurple\": \"#9370DB\",\n \"mediumseagreen\": \"#3CB371\",\n \"mediumslateblue\": \"#7B68EE\",\n \"mediumspringgreen\": \"#00FA9A\",\n \"mediumturquoise\": \"#48D1CC\",\n \"mediumvioletred\": \"#C71585\",\n \"midnightblue\": \"#191970\",\n \"mintcream\": \"#F5FFFA\",\n \"mistyrose\": \"#FFE4E1\",\n \"moccasin\": \"#FFE4B5\",\n \"navajowhite\": \"#FFDEAD\",\n \"navy\": \"#000080\",\n \"oldlace\": \"#FDF5E6\",\n \"olive\": \"#808000\",\n \"olivedrab\": \"#6B8E23\",\n \"orange\": \"#FFA500\",\n \"orangered\": \"#FF4500\",\n \"orchid\": \"#DA70D6\",\n \"palegoldenrod\": \"#EEE8AA\",\n \"palegreen\": \"#98FB98\",\n \"paleturquoise\": \"#AFEEEE\",\n \"palevioletred\": \"#DB7093\",\n \"papayawhip\": \"#FFEFD5\",\n \"peachpuff\": \"#FFDAB9\",\n \"peru\": \"#CD853F\",\n \"pink\": \"#FFC0CB\",\n \"plum\": \"#DDA0DD\",\n \"powderblue\": \"#B0E0E6\",\n \"purple\": \"#800080\",\n \"rebeccapurple\": \"#663399\",\n \"red\": \"#FF0000\",\n \"rosybrown\": \"#BC8F8F\",\n \"royalblue\": \"#4169E1\",\n \"saddlebrown\": \"#8B4513\",\n \"salmon\": \"#FA8072\",\n \"sandybrown\": \"#F4A460\",\n \"seagreen\": \"#2E8B57\",\n \"seashell\": \"#FFF5EE\",\n \"sienna\": \"#A0522D\",\n \"silver\": \"#C0C0C0\",\n \"skyblue\": \"#87CEEB\",\n \"slateblue\": \"#6A5ACD\",\n \"slategray\": \"#708090\",\n \"slategrey\": \"#708090\",\n \"snow\": \"#FFFAFA\",\n \"springgreen\": \"#00FF7F\",\n \"steelblue\": \"#4682B4\",\n \"tan\": \"#D2B48C\",\n \"teal\": \"#008080\",\n \"thistle\": \"#D8BFD8\",\n \"tomato\": \"#FF6347\",\n \"turquoise\": \"#40E0D0\",\n \"violet\": \"#EE82EE\",\n \"wheat\": \"#F5DEB3\",\n \"white\": \"#FFFFFF\",\n \"whitesmoke\": \"#F5F5F5\",\n \"yellow\": \"#FFFF00\",\n \"yellowgreen\": \"#9ACD32\"\n};","import { COLOR_CSS_DEFAULTS } from \"./color-css-defaults\";\n\nexport namespace Color {\n export interface IColor {\n // Max: 255, Min: 0.\n red: number;\n green: number;\n blue: number;\n // Max: 1, Min: 0.\n alpha: number ;\n }\n\n /**\n * Setting for how a colour should be applied in certain contexts.\n * For example should a 3D model's colour be replaced or blended with?\n */\n export enum EBlendMode {\n HIGHLIGHT,\n REPLACE,\n MIX\n }\n\n export interface IBlendSettings {\n blendMode?: EBlendMode;\n // 1 = 100% new color. 0 = original color.\n blendPercent?: number;\n }\n\n export function RandomColor(): IColor {\n // https://stackoverflow.com/a/7352887\n const brightness = 4;\n const rgb = [Math.random() * 256, Math.random() * 256, Math.random() * 256];\n const mix = [brightness * 51, brightness * 51, brightness * 51];\n const mixedrgb = [rgb[0] + mix[0], rgb[1] + mix[1], rgb[2] + mix[2]].map(function(x){\n return Math.round(x / 2.0);\n });\n const str = \"rgba(\" + mixedrgb.join(\",\") + \",0.9\" + \")\";\n return ColorFromStr(str);\n }\n\n /**\n * Attempts to parse a given css-color.\n * On failure null is returned.\n * @param str \n * @returns \n */\n export function ColorFromStr(str: string): IColor {\n if (!str || typeof str != \"string\") {\n return <any>null;\n }\n\n // Check for known CSS keywords.\n const knownHex = COLOR_CSS_DEFAULTS[str.toLowerCase()];\n if (knownHex) {\n str = knownHex;\n }\n \n if (str.charAt(0) == \"#\") {\n str = str.substring(1);\n }\n let r: number, g: number, b: number, a: number;\n const rgba = /^rgba?\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*([^\\)]+)\\s*)?\\)$/.exec(str);\n if (rgba) {\n r = parseInt(rgba[1]);\n g = parseInt(rgba[2]);\n b = parseInt(rgba[3]);\n a = rgba[4] != null ? parseFloat(rgba[4]) : 1;\n return {\n red: r,\n green: g,\n blue: b,\n alpha: a\n }\n }\n if (str.length == 6) {\n // rgb.\n const parsed = /^(.{2})(.{2})(.{2})/.exec(str);\n if (!parsed) {\n return <any>null;\n }\n r = parseInt(parsed[1], 16);\n g = parseInt(parsed[2], 16);\n b = parseInt(parsed[3], 16);\n a = 1;\n }\n else if (str.length == 8) {\n // rgba.\n const parsed = /^(.{2})(.{2})(.{2})(.{2})/.exec(str);\n if (!parsed) {\n return <any>null;\n }\n r = parseInt(parsed[1], 16);\n g = parseInt(parsed[2], 16);\n b = parseInt(parsed[3], 16);\n a = parseInt(parsed[4], 16);\n if (a != 0) {\n a = a/255;\n }\n }\n else {\n return <any>null;\n }\n if (a == null) {\n a = 1;\n }\n return {\n red: r,\n blue: b,\n green: g,\n alpha: a\n }\n }\n}","import { Carto } from \"./carto\";\n\n/**\n * Describes vector geometry that Bruce uses.\n */\nexport namespace Geometry {\n export interface IGeometry {\n // Polygon array is an array of rings.\n // There should be 1 outer ring and 0 or more inner rings.\n Polygon?: IPolygonRing[];\n MultiGeometry?: IGeometry[];\n Point?: string;\n LineString?: string;\n MultiSurface?: string;\n }\n\n export interface IPolygonRing {\n LinearRing: string;\n Facing: EPolygonRingType;\n Height?: number;\n }\n\n export enum EPolygonRingType {\n Boundaries = \"out\",\n Hole = \"in\"\n }\n\n /**\n * Turns an array of points into string vector geometry that Bruce can use.\n * This is used for saving polyline and polygon data.\n * @param points \n * @returns \n */\n export function LineStrFromPoints(points: Carto.ICarto[]): string {\n if (!points.length) {\n throw(\"points is empty.\");\n }\n let carto: Carto.ICarto = points[0];\n let lineString = `${carto.longitude},${carto.latitude}` + (carto.altitude != null ? `,${carto.altitude}` : \"\");\n for (let i = 1; i < points.length; i++) {\n carto = points[i];\n lineString += ` ${carto.longitude},${carto.latitude}` + (carto.altitude != null ? `,${carto.altitude}` : \"\");\n }\n return lineString;\n }\n\n /**\n * Removes same points that occur in a row.\n * This will not modify the original array.\n * @param positions \n * @returns \n */\n export function RemoveRepeatPoints(positions: Carto.ICarto[]): Carto.ICarto[] {\n const filteredList = [];\n for (let i = 0; i < positions.length; i++) {\n const pos = positions[i];\n const lastPos = filteredList.length > 0 ? filteredList[filteredList.length - 1] : null;\n if (!lastPos || (pos.latitude != lastPos.latitude || pos.longitude != lastPos.longitude || pos.altitude != lastPos.altitude)) {\n filteredList.push(pos); \n }\n }\n return filteredList;\n }\n\n /**\n * Parses a string of points into an array of points.\n * @param pointsStr \n * @returns \n */\n export function ParsePoints(pointsStr: string): Carto.ICarto[] {\n pointsStr = pointsStr.replace(/[^\\d.,-\\s]/g, \"\");\n\n let splitterCoordinates = \" \";\n let splitterAxis = \",\";\n const commaIndex = pointsStr.indexOf(\",\");\n const spaceIndex = pointsStr.indexOf(\" \");\n if ((spaceIndex > -1 && commaIndex > spaceIndex) || commaIndex <= -1) {\n splitterCoordinates = \",\";\n splitterAxis = \" \";\n }\n\n let points = pointsStr.trim().split(splitterCoordinates);\n points = points.filter(a => a != \"\");\n\n const result: Carto.ICarto[] = [];\n for (let i = 0; i < points.length; i++) {\n const pointData = points[i];\n const coords = pointData.trim().split(splitterAxis);\n if (coords.length == 2 || coords.length == 3) {\n const longitude = Number(coords[0]);\n const latitude = Number(coords[1]);\n const altitude = Number(coords.length >= 3 ? coords[2] : 0);\n if (longitude != null && latitude != null) {\n result.push({\n altitude: altitude,\n latitude: latitude,\n longitude: longitude\n });\n }\n else {\n console.warn(\"Invalid point data detected.\", pointData);\n }\n }\n }\n return result;\n }\n\n /**\n * Parses both string and object Bruce geometry.\n * String geometry is legacy Bruce data.\n * @param geometry \n * @returns \n */\n export function ParseGeometry(geometry: any): IGeometry {\n if (typeof geometry == \"string\") {\n let positions: Carto.ICarto[] = [];\n const geometryParsed: string[] = (geometry || \"\").split(\";\");\n for (let i = 0; i < geometryParsed.length; i++) {\n const data = geometryParsed[i];\n const points = ParsePoints(data);\n if (points && points.length > 0) {\n positions = positions.concat(points);\n }\n }\n positions = RemoveRepeatPoints(positions);\n const newGeometry: IGeometry = {};\n if (positions.length > 0) {\n const topPoint = positions[0];\n newGeometry.Point = `${topPoint.latitude},${topPoint.longitude}` + (topPoint.altitude != null ? `,${topPoint.altitude}` : \"\");\n if (positions.length > 1) {\n newGeometry.Polygon = [{ Facing: EPolygonRingType.Boundaries, LinearRing: LineStrFromPoints(positions) }];\n }\n if (positions.length > 2) {\n newGeometry.LineString = LineStrFromPoints(positions);\n }\n }\n return newGeometry;\n }\n return geometry;\n }\n}","export namespace ObjectUtils {\n const DEFAULT_LENGTH = 36;\n\n /**\n * Generates a Nextspace compatible UID.\n * @returns \n */\n export function UId(length: number = DEFAULT_LENGTH): string {\n if (!length) {\n length = DEFAULT_LENGTH;\n }\n if (length <= 0) {\n return \"\";\n }\n\n // Our default spec.\n if (length === DEFAULT_LENGTH) {\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, function(c) {\n const r = Math.random() * 16 | 0, v = c === \"x\" ? r : (r & 0x3 | 0x8);\n return v.toString(16);\n });\n }\n // Arbitrary random hex string.\n else {\n let result = \"\";\n for (let i = 0; i < length; i++) {\n const randomHex = Math.random() * 16 | 0;\n result += randomHex.toString(16);\n }\n return result;\n }\n }\n}","/**\n * Describes an entity type schema attribute.\n */\nexport namespace EntityAttribute {\n /**\n * Describes an entity attribute.\n * This sits within an entity type schema.\n */\n export interface IAttribute {\n // The attribute JSON key.\n Key: string;\n // The attribute human readable name.\n Name?: string;\n // The attribute human readable description.\n Description?: string;\n // The attribute type.\n Type?: EType;\n // If this attribute is indexed or not.\n // Indexed attributes can be searched on.\n IsIndexed?: boolean;\n // If this attribute is important or not.\n // This indicates it should be displayed in tables and lists.\n IsImportant?: boolean;\n // If this attribute is an array or not.\n // @warning, low support.\n IsArray?: boolean;\n // If this attribute is a structure, this is the structure definition.\n Structure?: IAttribute[];\n // (Optional) The max-size of a string attribute.\n // @warning, this will limit the column size.\n // @deprecated, use metadata.\n Size?: number;\n // Metadata for displaying the attributes.\n Metadata?: IMetadata;\n // Family attributes are shared across all entities of a type instead of having a per-entity definition.\n // @warning, low support.\n IsFamilyAttribute?: boolean;\n // If this attribute has a default value.\n // This will pre-populate for new entities on entity creation.\n // @warning, low support.\n IsFamilyAttributeDefault?: boolean;\n // TODO: document.\n Sources?: string[];\n }\n\n export enum EType {\n // Arbitrary text attribute.\n String = \"String\",\n // Floating point number attribute.\n Double = \"Double\",\n // Whole number attribute.\n Integer = \"Integer\",\n // iso8601 date time string.\n Datetime = \"Datetime\",\n // Group of attributes.\n Structure = \"Structure\",\n // Nextspace vector geometry.\n Geometry = \"Geometry\",\n // True/false attribute.\n Boolean = \"Boolean\"\n }\n\n /**\n * Describes additional metadata for an attribute.\n */\n export interface IMetadata {\n // Dictionary will let the user select from a set of attribute values.\n dictionary?: IDictionary;\n // Default is infinite.\n // Only applies to string attributes.\n maxLength?: number;\n // Number min/max.\n // Only applies to number attributes.\n min?: number;\n max?: number;\n // Units to display alongside the value.\n // Only applies to number attributes.\n unit?: string;\n }\n \n /**\n * Describes a dictionary of values for an attribute.\n */\n export interface IDictionary {\n // Default is false.\n enabled?: boolean;\n // The source entity type for retrieving the dictionary values.\n entityTypeId?: string;\n // The attribute path to retrieve the dictionary values from.\n attrPath?: string;\n }\n\n /**\n * Returns an attribute from a provided hierarchy of attributes.\n * Eg: Use the path: [\"Bruce\", \"ID\"] to find the \"ID\" attribute.\n * @param items \n * @param path \n * @returns \n */\n export function GetAttribute(items: IAttribute[], path: string[]): IAttribute {\n if (!items || !path || !path.length) {\n return null;\n }\n const key = path[0];\n const item = items.find((i) => i.Key === key);\n if (!item || !item.Structure || !path.length) {\n return item;\n }\n return GetAttribute(item.Structure, path.slice(1));\n }\n\n /**\n * Removes an attribute from a provided hierarchy of attributes.\n * Eg: Use the path: [\"Bruce\", \"ID\"] to remove the \"ID\" attribute.\n * This will mutate the items array.\n * @param items \n * @param path \n */\n export function RemoveAttribute(items: IAttribute[], path: string[]): void {\n if (!items || !path?.length) {\n return;\n }\n const key = path[0];\n if (path.length === 1) {\n // If we're at the last key in the path, remove the item from the items array.\n const index = items.findIndex((i) => i.Key === key);\n if (index !== -1) {\n items.splice(index, 1);\n }\n return;\n }\n // If we're not at the end of the path, dig further.\n const item = items.find((i) => i.Key === key);\n if (item && item.Structure) {\n RemoveAttribute(item.Structure, path.slice(1));\n }\n }\n\n /**\n * Adds an attribute to a provided hierarchy of attributes.\n * Eg: Use the path: [\"Bruce\", \"ID\"] to add the \"ID\" attribute.\n * This will mutate the items array.\n * This requires the path to be valid and for a parent attribute to exist.\n * @param items \n * @param path \n * @param attribute \n */\n export function AddAttribute(items: IAttribute[], path: string[], attribute: IAttribute): void {\n if (!items || !path?.length) {\n return;\n }\n const key = path[0];\n if (path.length === 1) {\n // If we're at the last key in the path, add the attribute to the items array.\n const index = items.findIndex((i) => i.Key === key);\n if (index !== -1) {\n // Overwrite existing attribute if it already exists.\n items[index] = attribute;\n } \n else {\n // Add new attribute if it doesn't exist.\n items.push(attribute);\n }\n return;\n }\n // If we're not at the end of the path, dig further.\n let item = items.find((i) => i.Key === key);\n if (!item) {\n item = { Key: key, Structure: [] };\n items.push(item);\n }\n if (!item.Structure) {\n item.Structure = [];\n }\n AddAttribute(item.Structure, path.slice(1), attribute);\n }\n}","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { PendingAction } from \"../bruce-models\";\nimport { UTC } from \"../common/utc\";\nimport { ENVIRONMENT } from \"../environment\";\nimport { ObjectUtils } from \"../util/object-utils\";\nimport { Entity } from \"./entity\";\nimport { EntityAttribute } from \"./entity-attribute\";\nimport { EntityTypeVisualSettings } from \"./entity-type-visual-settings\";\n\n/**\n * Describes the \"Entity Type\" concept within Nextspace.\n * An entity type is an \"expectation\" of what data \"should\" look like in a particular entity record.\n * The schema is stencils onto entity data to filter out what we should display or search against.\n */\nexport namespace EntityType {\n /**\n * Describes an entity type record.\n */\n export interface IType {\n // ID of the entity type.\n ID?: string;\n // Whether or not the entity type is deleted.\n // Unlikely to ever surface to client.\n IsDeleted?: boolean;\n // Human readable name of the entity type.\n Name: string;\n // Description of the entity type.\n Description?: string;\n // An entity record used for default values.\n Data?: Entity.IEntity;\n // If entity type access (and entity access) should be restricted.\n // When an entity type is restricted a user must have the \"EntityType_<typeId>\" permission.\n IsAccessRestricted?: boolean;\n // The data schema defining expected attributes for entities to have.\n DataSchema?: {\n Key: \"root\",\n Name?: \"Root\",\n Structure: EntityAttribute.IAttribute[],\n Type: EntityAttribute.EType.Structure\n };\n // Split by comma then use \"BrucePathUtils.ParsePath(..) on each item\".\n // This is an array of attribute paths to use for display name.\n // The default will be the entity's ID.\n DisplayNameAttributePath?: string;\n // If this schema is \"strict\". If entities in an entity type are different enough between each-other then the schema is not strict.\n // This will dictate how UI will display the attributes.\n IsStrictSchema?: boolean;\n // Default style for the corresponding entities.\n \"DisplaySetting.ID\"?: number;\n // Last updated date/time.\n \"LastUpdate.Time\"?: UTC.IUTC;\n // ID of the parent entity type.\n // This is used for organization. When a parent type is deleted, the child types are also deleted.\n \"Parent.EntityType.ID\"?: string;\n // This acts as a barrier from deleting an entity type.\n // Set to true to block any deletion attempts for the entity type records.\n // Default is false.\n IsDeleteDisabled?: boolean;\n // Beta. Temporal/historical data settings.\n HistoricDataSettings?: any;\n // @deprecated.\n VisualSettings?: EntityTypeVisualSettings.ISettings;\n // @deprecated.\n AuthoringSettings?: {\n enabledTools: string[];\n defaultTool: string;\n };\n }\n\n /**\n * Gets an entity type record.\n * @param params \n * @returns \n */\n export async function Get(params: {\n api?: BruceApi.Api,\n // ID of the entity type.\n entityTypeId: string,\n req?: Api.IReqParams\n }): Promise<{\n // Entity type record.\n entityType: IType\n }> {\n let { api, entityTypeId: typeId, req: reqParams } = params;\n if (!typeId) {\n throw(\"Type ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const key = GetCacheKey(typeId);\n const cache = await api.GetCacheItem(key, reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(`entitytype/${typeId}`, Api.PrepReqParams(reqParams));\n appendInternalAttrSchema(data);\n res({\n entityType: data\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key,\n value: prom,\n req: reqParams\n });\n return prom;\n }\n\n /**\n * Deletes an entity type record and all corresponding entities.\n * @param params \n */\n export async function Delete(params: {\n api?: BruceApi.Api,\n // ID of the entity type.\n entityTypeId: string,\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, entityTypeId: typeId, req: reqParams } = params;\n if (!typeId) {\n throw(\"Type ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n await api.DELETE(`entitytype/${typeId}`, Api.PrepReqParams(reqParams));\n api.Cache.Remove(GetCacheKey(typeId));\n api.Cache.RemoveByStartsWith(GetListCacheKey());\n }\n\n /**\n * Gets a list of entity types.\n * @param params \n * @returns \n */\n export async function GetList(params: {\n // Optionally restrict to child entity types of a specified parent type.\n parentTypeId?: string;\n // Optionally query for specific entity types.\n entityTypeIds?: string[],\n api?: BruceApi.Api,\n req?: Api.IReqParams\n }): Promise<{\n // List of entity types.\n entityTypes: IType[]\n }> {\n let { entityTypeIds, api, req: reqParams, parentTypeId } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const cache = parentTypeId ? null : await api.GetCacheItem(GetListCacheKey(entityTypeIds), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const req: Promise<any> = new Promise(async (res, rej) => {\n try {\n // If we have an array of typeIds then we'll request in batches to avoid overflowing the URL.\n const BATCH_SIZE = 20;\n const reqs: Promise<any>[] = [];\n\n if (entityTypeIds) {\n for (let i = 0; i < entityTypeIds.length; i += BATCH_SIZE) {\n const batch = entityTypeIds.slice(i, i + BATCH_SIZE);\n const urlParams = new URLSearchParams();\n for (const id of batch) {\n urlParams.append(\"typeId\", id);\n }\n if (parentTypeId) {\n urlParams.append(\"parentEntityTypeID\", parentTypeId);\n }\n reqs.push(api.GET(\"entitytypes?\" + urlParams.toString(), Api.PrepReqParams(reqParams)));\n }\n }\n else {\n const urlParams = new URLSearchParams();\n if (parentTypeId) {\n urlParams.append(\"parentEntityTypeID\", parentTypeId);\n }\n reqs.push(api.GET(\"entitytypes?\" + urlParams.toString(), Api.PrepReqParams(reqParams)));\n }\n\n const data = await Promise.all(reqs);\n\n // Populate array, while checking for already added types.\n const types: EntityType.IType[] = [];\n for (const item of data) {\n for (const type of item.Items) {\n appendInternalAttrSchema(type);\n if (!types.find(x => x.ID == type.ID)) {\n types.push(type);\n }\n }\n }\n\n res({\n entityTypes: types\n });\n }\n catch (e) {\n rej(e);\n }\n });\n\n if (!parentTypeId) {\n await api.SetCacheItem({\n key: GetListCacheKey(entityTypeIds),\n value: req,\n req: reqParams,\n duration: 60 * 5 // 5 minutes.\n });\n }\n\n return req;\n }\n\n /**\n * Updates or creates an entity type record.\n * @param params \n * @returns \n */\n export async function Update(params: {\n api?: BruceApi.Api,\n // Entity type record.\n entityType: IType,\n req?: Api.IReqParams\n }): Promise<{\n // Entity type record.\n entityType: IType\n }> {\n let { api, entityType: data, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n if (!data) {\n data = <any>{};\n }\n if (!data.ID) {\n data.ID = ObjectUtils.UId();\n }\n if (!data.Name) {\n data.Name = data.ID;\n }\n appendInternalAttrSchema(data);\n const res = await api.POST(`entitytype/${data.ID}`, data, Api.PrepReqParams(reqParams));\n api.Cache.Remove(GetCacheKey(<string>data.ID));\n api.Cache.RemoveByStartsWith(GetListCacheKey());\n return {\n entityType: res\n };\n }\n\n /**\n * Starts a re-index background action on a specified Entity Type.\n * This will ensure searchable data follows the current schema version.\n * This will also perform certain data cleanup so that the data is consistent.\n * @param params \n * @returns \n */\n export async function ReIndex(params: {\n api?: BruceApi.Api,\n entityTypeId: string,\n // Optional ID of the data transformation to apply.\n dataTransformId?: number,\n req?: Api.IReqParams\n }): Promise<PendingAction.IAction> {\n let { api, entityTypeId: typeId, req } = params;\n if (!typeId) {\n throw(\"Type ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const urlParams = new URLSearchParams();\n if (params.dataTransformId) {\n urlParams.append(\"dataTransformID\", String(params.dataTransformId));\n }\n const url = `entitytype/${typeId}/reindex?${urlParams.toString()}`;\n\n req = Api.PrepReqParams(req);\n const pa: PendingAction.IAction = await api.POST(url, {}, req);\n return pa;\n }\n\n /**\n * Counts the total number of Entities in an Entity Type.\n * @param params \n * @returns \n */\n export async function Count(params: {\n entityTypeId: string,\n api?: BruceApi.Api,\n req?: Api.IReqParams\n }): Promise<number> {\n let { entityTypeId, api, req } = params;\n if (!entityTypeId) {\n throw(\"Type ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n const url = `entityType/${entityTypeId}/entitiesCount`;\n const {TotalEntities} = await api.GET(url, Api.PrepReqParams(req));\n return TotalEntities;\n }\n\n /**\n * Returns cache identifier for an entity type.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetCacheKey(\"abc\");\n * api.Cache.Remove(key);\n * }\n * @param typeId\n * @returns \n */\n export function GetCacheKey(typeId: string): string {\n return `${Api.ECacheKey.EntityType}${Api.ECacheKey.Id}${typeId}`;\n }\n\n /**\n * Returns cache identifier for a list of entity types.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetListCacheKey();\n * api.Cache.Remove(key);\n * }\n * @param typeIds\n * @returns \n */\n export function GetListCacheKey(typeIds?: string[]): string {\n if (!typeIds) {\n typeIds = [];\n }\n return Api.ECacheKey.EntityType + (typeIds.length ? Api.ECacheKey.Id : \"\") + typeIds.join(\",\");\n }\n}\n\n/**\n * Adds expected internal structure items even if they aren't there.\n * Our API should be including them but this is a safety net.\n * @param type \n */\nfunction appendInternalAttrSchema(type: EntityType.IType) {\n // Schema not loaded. We'll ignore.\n if (type == null || type.DataSchema == null) {\n return;\n }\n\n // Append internal attributes.\n if (!type.DataSchema.Structure) {\n type.DataSchema.Structure = [];\n }\n let bruce = type.DataSchema.Structure.find(a => a.Key == \"Bruce\");\n if (!bruce) {\n bruce = {\n Key: \"Bruce\",\n Name: \"Bruce\",\n Description: \"Nextspace internal attributes.\",\n Type: EntityAttribute.EType.Structure,\n Structure: [],\n IsIndexed: true,\n IsImportant: false\n };\n type.DataSchema.Structure.push(bruce);\n }\n if (!bruce.Structure) {\n bruce.Structure = [];\n }\n\n // Append any missing internal attributes.\n if (!bruce.Structure.find(x => x.Key == \"Location\")) {\n bruce.Structure.push({\n Key: \"Location\",\n Name: \"Location\",\n Description: \"Location data.\",\n Type: EntityAttribute.EType.Structure,\n Structure: [\n {\n Key: \"latitude\",\n Name: \"Latitude\",\n Type: EntityAttribute.EType.Double,\n IsIndexed: true,\n IsImportant: false\n },\n {\n Key: \"longitude\",\n Name: \"Longitude\",\n Type: EntityAttribute.EType.Double,\n IsIndexed: true,\n IsImportant: false\n },\n {\n Key: \"altitude\",\n Name: \"Altitude\",\n Type: EntityAttribute.EType.Double,\n IsIndexed: true,\n IsImportant: false\n }\n ]\n });\n }\n if (!bruce.Structure.find(x => x.Key == \"Boundaries\")) {\n bruce.Structure.push({\n Key: \"Boundaries\",\n Name: \"Boundaries\",\n Description: \"Boundaries data.\",\n Type: EntityAttribute.EType.Structure,\n Structure: [\n {\n Key: \"minLongitude\",\n Name: \"Min Longitude\",\n Type: EntityAttribute.EType.Double,\n IsIndexed: true,\n IsImportant: false\n },\n {\n Key: \"maxLongitude\",\n Name: \"Max Longitude\",\n Type: EntityAttribute.EType.Double,\n IsIndexed: true,\n IsImportant: false\n },\n {\n Key: \"minLatitude\",\n Name: \"Min Latitude\",\n Type: EntityAttribute.EType.Double,\n IsIndexed: true,\n IsImportant: false\n },\n {\n Key: \"maxLatitude\",\n Name: \"Max Latitude\",\n Type: EntityAttribute.EType.Double,\n IsIndexed: true,\n IsImportant: false\n },\n {\n Key: \"minAltitude\",\n Name: \"Min Altitude\",\n Type: EntityAttribute.EType.Double,\n IsIndexed: true,\n IsImportant: false\n },\n {\n Key: \"maxAltitude\",\n Name: \"Max Altitude\",\n Type: EntityAttribute.EType.Double,\n IsIndexed: true,\n IsImportant: false\n }\n ]\n });\n }\n if (!bruce.Structure.find(x => x.Key == \"Transform\")) {\n bruce.Structure.push({\n Key: \"Transform\",\n Name: \"Transform\",\n Description: \"Transform data.\",\n IsIndexed: true,\n IsImportant: false,\n Type: EntityAttribute.EType.Structure,\n Structure: [\n {\n Key: \"heading\",\n Name: \"Heading\",\n IsIndexed: true,\n IsImportant: false,\n Type: EntityAttribute.EType.Double\n },\n {\n Key: \"pitch\",\n Name: \"Pitch\",\n IsIndexed: true,\n IsImportant: false,\n Type: EntityAttribute.EType.Double\n },\n {\n Key: \"roll\",\n Name: \"Roll\",\n IsIndexed: true,\n IsImportant: false,\n Type: EntityAttribute.EType.Double\n },\n {\n Key: \"scale\",\n Name: \"Scale\",\n IsIndexed: true,\n IsImportant: false,\n Type: EntityAttribute.EType.Double\n }\n ]\n });\n }\n if (!bruce.Structure.find(x => x.Key == \"VectorGeometry\")) {\n bruce.Structure.push({\n Key: \"VectorGeometry\",\n Name: \"Geometry\",\n Description: \"Geometry data.\",\n Type: EntityAttribute.EType.Geometry,\n IsIndexed: true,\n IsImportant: false\n });\n }\n\n // Filter out migrated/outdated ones.\n // Removed from root and the internal structure.\n const OUTDATED_INTERNAL = [\"position\", \"geometry\", \"location\", \"boundaries\", \"transform\"];\n bruce.Structure = bruce.Structure.filter(a => !OUTDATED_INTERNAL.includes(a.Key));\n type.DataSchema.Structure = type.DataSchema.Structure.filter(a => !OUTDATED_INTERNAL.includes(a.Key));\n}","/**\n * Utility to help with parsing and wrapping Nextspace paths.\n */\nexport namespace PathUtils {\n /**\n * Parses a Bruce string path into an array of strings.\n * Example of path: \"\\\"location\\\"/\\\"latitude\\\"\" or \"location/latitude\".\n * @param str \n * @returns \n */\n export function Parse(str: string): string[] {\n if (!str?.length) {\n return [];\n }\n const broken: string[] = str.split(\"/\");\n // Remove quotes from the first and last chars.\n for (let i = 0; i < broken.length; i++) {\n let piece = broken[i];\n if (piece.startsWith(\"\\\"\")) {\n piece = piece.substring(1);\n }\n if (piece.endsWith(\"\\\"\")) {\n piece = piece.substring(0, piece.length - 1);\n }\n broken[i] = piece;\n }\n return broken;\n }\n\n /**\n * Wraps an array of strings into a Nextspace string path.\n * @param path \n * @returns \n */\n export function Wrap(path: string[]): string {\n if (!path?.length) {\n return \"\";\n }\n let tmp: string = \"\\\"\";\n for (let i = 0; i < path.length; i++) {\n let section = path[i];\n tmp += section;\n if (i < path.length - 1) {\n tmp += \"\\\"/\\\"\";\n }\n }\n tmp += \"\\\"\";\n return tmp;\n }\n\n /**\n * Parses a Nextspace legacy string path into an array of strings.\n * @param str \n * @returns \n */\n export function ParseLegacy(str: string): string[] {\n if (!str?.length) {\n return [];\n }\n const broken: string[] = str.split(\".\");\n for (let i = 0; i < broken.length; i++) {\n let piece = broken[0];\n if (piece.charAt(0) == \"\\\"\") {\n piece = broken[0] = piece.substring(1);\n }\n if (piece.charAt(piece.length - 1) == \"\\\"\") {\n broken[0] = piece.substring(0, piece.length - 1);\n }\n }\n return broken;\n }\n}","import { Style } from \"../bruce-models\";\n\n/**\n * Describes an expectation on what should be rendered for a menu item-\n * between a min-max distance of an entity to the camera.\n */\nexport namespace ZoomControl {\n /**\n * Describes a menu item's zoom control row.\n * Typically there is an array of these for a menu item.\n */\n export interface IItem {\n // The minimum distance in meters from the camera to enable this item.\n MinZoom?: number,\n // The maximum distance in meters from the camera to enable this item.\n MaxZoom?: number,\n // The display type to use for this item.\n DisplayType?: EDisplayType,\n // The style to use for this item.\n StyleID?: number,\n Style?: Style.IEntitySettings;\n // The LOD category to use for this item.\n LODCategoryID?: string,\n // The LOD level to use for this item.\n LODLevel?: number | string;\n }\n\n /**\n * Available display types for a menu item.\n */\n export enum EDisplayType {\n // Hidden means it will not be rendered.\n Hidden = \"hidden\",\n // Point will try render a point based on any available Entity data.\n Point = \"point\",\n // Geometry means it will try render multi-geometry, polygon, polyline, or point in order of priority.\n Geometry = \"geometry\",\n // 3D means it will try render 3D model, multi-geometry, polygon, polyline, or point in order of priority.\n Model3D = \"3d\"\n }\n}","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { IDictionary } from \"../common/dictionary\";\nimport { ENVIRONMENT } from \"../environment\";\nimport { PathUtils } from \"../util/path-utils\";\nimport { Entity } from \"./entity\";\n\nexport namespace EntityHistoricData {\n export interface IData {\n // Path to the date-time attribute. Eg: '\"my_properties\"\\\"creation_date\"'.\n // Use PathUtils.Parse() to convert into array.\n attrKey: string;\n // ISO-8601 date-time string.\n dateTime: string;\n // Related Entity ID. This is only included in certain requests such as 'Update'.\n entityId?: string;\n // Historic data itself.\n // This excludes internal fields found inside the \"Bruce\" attribute.\n data: any;\n }\n\n export interface IStats {\n // Path to the date-time attribute. Eg: '\"my_properties\"\\\"creation_date\"'.\n // Use PathUtils.Parse() to convert into array.\n attrKey: string;\n // ISO-8601 date-time string.\n dateTimeMax: string;\n // ISO-8601 date-time string.\n dateTimeMin: string;\n // Number of historic records.\n count: number;\n }\n\n /**\n * Returns historic data for an array of Entity IDs.\n * A maximum number of records will be returned per Entity ID, this information is returned in the response.\n * @param params \n * @returns \n */\n export async function GetList(params: {\n entityIds: string[];\n // Path to the date-time attribute.\n // Eg: [\"my_properties\", \"creation_date\"].\n attrKey: string | string[];\n // ISO-8601 date-time string.\n dateTimeFrom: string;\n // ISO-8601 date-time string.\n dateTimeTo: string;\n api?: BruceApi.Api,\n req?: Api.IReqParams\n }): Promise<{\n recordsByIds: IDictionary<IData[]>;\n limitPerEntity: number;\n }> {\n let { entityIds, attrKey, dateTimeFrom, dateTimeTo, api, req } = params;\n\n // Save time and just return a none response if no entity IDs are provided.\n if (!entityIds?.length) {\n return {\n limitPerEntity: 0,\n recordsByIds: {}\n }\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n if (typeof attrKey != \"string\") {\n attrKey = PathUtils.Wrap(attrKey);\n }\n\n const cacheKey = GetListCacheKey(entityIds, attrKey, dateTimeFrom, dateTimeTo);\n const cached = api.GetCacheItem(cacheKey, req);\n if (cached?.found) {\n return cached.data;\n }\n\n const urlParams = new URLSearchParams();\n for (const entityId of entityIds) {\n urlParams.append(\"entityId\", entityId);\n }\n urlParams.append(\"attrKey\", attrKey);\n urlParams.append(\"dateTimeFrom\", dateTimeFrom);\n urlParams.append(\"dateTimeTo\", dateTimeTo);\n\n const prom = api.GET(`v1/entity/historicData?${urlParams.toString()}`, Api.PrepReqParams(req));\n api.SetCacheItem({\n key: cacheKey,\n value: prom,\n req: req,\n // Short cache. 30 seconds.\n duration: 30000\n });\n return prom;\n }\n\n /**\n * Returns historic data statistics for an array of Entity IDs.\n * @param params \n * @returns \n */\n export async function GetStats(params: {\n entityIds: string[];\n api?: BruceApi.Api,\n req?: Api.IReqParams\n }): Promise<{\n stats: IStats[];\n }> {\n let { entityIds, api, req } = params;\n\n // Save time and just return a none response if no entity IDs are provided.\n if (!entityIds?.length) {\n return {\n stats: []\n }\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n req = Api.PrepReqParams(req);\n\n const cacheKey = GetStatsCacheKey(entityIds);\n const cached = api.GetCacheItem(cacheKey, req);\n if (cached?.found) {\n return cached.data;\n }\n\n const prom = await api.POST(\"v1/entity/historicData/stats\", {\n entityIds: entityIds\n }, req);\n api.SetCacheItem({\n key: cacheKey,\n value: prom,\n req: req,\n // Short cache. 60 seconds.\n duration: 60000\n })\n return prom;\n }\n\n /**\n * Creates or updates historic data records.\n * Please note that the expected input/output does not include internal fields found inside the \"Bruce\" attribute. \n * @param params \n * @returns \n */\n export async function Update(params: {\n records: IData[];\n api?: BruceApi.Api,\n req?: Api.IReqParams\n }): Promise<{\n records: IData[];\n // Includes any errors that occurred during the update.\n // For example it may say that 3 records were not updated because of invalid data.\n errors?: string[];\n }> {\n let { records, api, req } = params;\n\n // Save time and just return a none response if no records are provided.\n if (!records?.length) {\n return {\n records: []\n }\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const res = await api.POST(\"v1/entity/historicData\", {\n records: records\n }, Api.PrepReqParams(req));\n\n // Kill cache for every unique attrKey.\n let attrKeys = records.map(r => r.attrKey);\n attrKeys = attrKeys.filter((v, i) => attrKeys.indexOf(v) === i);\n for (const attrKey of attrKeys) {\n api.Cache.RemoveByContains(Entity.GetHistoricContainsKey(attrKey));\n }\n\n // Kill any stats cache that includes any of the Entity IDs.\n if (res.records?.length) {\n const entityIds: string[] = res.records.map(r => r.entityId).filter((v, i) => v && res.records.indexOf(v) === i);\n ClearCacheByEntityIds(api, entityIds);\n }\n\n return res;\n }\n\n /**\n * Deletes historic data records for an array of Entity IDs.\n * This deletes all records within a provided key + range.\n * @param params \n * @returns \n */\n export async function Delete(params: {\n entityIds: string[];\n // Path to the date-time attribute.\n // Eg: [\"my_properties\", \"creation_date\"].\n attrKey: string | string[];\n // ISO-8601 date-time string.\n dateTimeFrom: string;\n // ISO-8601 date-time string.\n dateTimeTo: string;\n api?: BruceApi.Api,\n req?: Api.IReqParams\n }): Promise<void> {\n let { entityIds, attrKey, dateTimeFrom, dateTimeTo, api, req } = params;\n if (!entityIds?.length) {\n return;\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n if (!attrKey || !dateTimeFrom || !dateTimeTo) {\n throw new Error(\"Invalid parameters provided.\");\n }\n\n if (typeof attrKey != \"string\") {\n attrKey = PathUtils.Wrap(attrKey);\n }\n\n const urlParams = new URLSearchParams();\n for (const entityId of entityIds) {\n urlParams.append(\"entityId\", entityId);\n }\n urlParams.append(\"attrKey\", attrKey);\n urlParams.append(\"dateTimeFrom\", dateTimeFrom);\n urlParams.append(\"dateTimeTo\", dateTimeTo);\n\n await api.DELETE(`v1/entity/historicData?${urlParams.toString()}`, Api.PrepReqParams(req));\n\n // Kill cache for all Entity cached Entity records related to the attrKey.\n api.Cache.RemoveByContains(Entity.GetHistoricContainsKey(attrKey));\n // Kill any stats cache that includes any of the Entity IDs.\n ClearCacheByEntityIds(api, entityIds);\n }\n\n export function GetListCacheKey(entityIds: string[], attrKey: string, dateTimeFrom: string, dateTimeTo: string): string {\n return Api.ECacheKey.EntityHistoricDataRec + Api.ECacheKey.Id + entityIds.join(\",\") + Api.ECacheKey.Id + attrKey + Api.ECacheKey.Id + dateTimeFrom + Api.ECacheKey.Id + dateTimeTo;\n }\n\n export function GetStatsCacheKey(entityIds: string[]): string {\n return Api.ECacheKey.EntityHistoricDataStats + Api.ECacheKey.Id + entityIds.join(\",\");\n }\n\n export function ClearCacheByEntityIds(api: BruceApi.Api, entityIds: string[]) {\n if (!api || !entityIds?.length) {\n return;\n }\n\n const REC_KEY_PREFIX = Api.ECacheKey.EntityHistoricDataRec + Api.ECacheKey.Id;\n const STATS_KEY_PREFIX = Api.ECacheKey.EntityHistoricDataStats + Api.ECacheKey.Id;\n\n api.Cache.RemoveByCallback((key) => {\n let keyStr = String(key);\n if (!keyStr.startsWith(STATS_KEY_PREFIX) && !keyStr.startsWith(REC_KEY_PREFIX)) {\n return false;\n }\n // Shorten to speed up the next step.\n keyStr = keyStr.replace(STATS_KEY_PREFIX, \"\").replace(REC_KEY_PREFIX, \"\");\n // Look for any matching Entity IDs.\n for (let i = 0; i < entityIds.length; i++) {\n const entityId = entityIds[i];\n if (keyStr.includes(entityId)) {\n return true;\n }\n }\n return false;\n });\n }\n}","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { Bounds } from \"../common/bounds\";\nimport { Geometry } from \"../common/geometry\";\nimport { ObjectUtils } from \"../util/object-utils\";\nimport { Transform } from \"../common/transform\";\nimport { UTC } from \"../common/utc\";\nimport { EntityType } from \"./entity-type\";\nimport { PathUtils } from \"../util/path-utils\";\nimport { IDictionary } from \"../common/dictionary\";\nimport { ENVIRONMENT } from \"../environment\";\nimport { ZoomControl } from \"../project/zoom-control\";\nimport { Carto } from \"../common/carto\";\nimport { EntityHistoricData } from \"./entity-historic-data\";\nimport { EntityCoords } from \"./entity-coords\";\n\ntype _any = any;\n\n// Interface describing the 2D vector data we're migrating into the internal data.\n// This helps reduce doubling up within the interface definitions.\ninterface ILegacyEntityVectorData {\n // Entity location.\n location?: Carto.ICarto;\n // Entity boundaries.\n boundaries?: Bounds.IBounds;\n // Entity transformation.\n transform?: Transform.ITransform;\n // Entity vector geometry.\n geometry?: Geometry.IGeometry;\n}\n\ninterface ILegacyEntityExpandedLocation {\n // Related tileset ids if any.\n // Available if expandLocation is true.\n tilesetID?: string[];\n // Relative offset to parent node.\n // Available if expandLocation is true.\n worldPosition?: number[][];\n worldPivot?: number[];\n // Radius in meters for the related 3D model.\n // Available if expandLocation is true.\n geometryRadius?: number;\n geometryPivot?: number[];\n}\n\n// Added attributes when an Entity is requested with $expand=location.\ninterface IEntityExpandedLocation {\n // Array of associated Tileset IDs (if any).\n \"TilesetIDs\"?: string[];\n // Relative offset to the root node of the assembly.\n // This is a combined matrix for the full hierarchy to this node.\n \"AssemblyWorldPosition\"?: number[][];\n // Prepared version of the GeometryPivot to be multiplied as a transform against the world position.\n // (HPR of the UCS + GeometryWorldPivot) * AssemblyWorldPosition = WorldPosition.\n \"GeometryWorldPivot\"?: number[];\n // Offset of the Entity's LOD.\n // This is for when the graphics don't sit at the exact center if their \"0,0,0\".\n // This is from the GLB/GLTF model if any exists.\n \"GeometryPivot\"?: number[];\n // Radius in meters from the center of the Entity's LOD.\n // This is from the GLB/GLTF model if any eixsts.\n \"GeometryRadius\"?: number;\n}\n\n// Added attributes when an Entity is requested with $expand=import.\ninterface IEntityExpandedImport {\n // Array of associated import IDs (if any).\n \"ImportIDs\"?: number[];\n}\n\ninterface IEntityExpandedRelations {\n // Array of all immediate downstream relationships for this entity.\n // This is a read-only calculated property.\n \"Relations\"?: Entity.IRelationData[];\n}\n\n/**\n * Describes the \"Entity\" concept within Nextspace.\n * An entity is a JSON blob containing both internal data and user-defined data.\n * Entity records have many thinks linked to them through their UIDs such as links, files and relationships.\n */\nexport namespace Entity {\n /**\n * Describes the internal data of an entity.\n * As we're migrating 2D vector data into the internal portion you will find some overlap.\n */\n export interface IInternalData extends IEntityExpandedLocation, IEntityExpandedImport, IEntityExpandedRelations {\n // ID of the entity.\n // If unset an ID will be generated during the Update request.\n \"ID\"?: string;\n // Nextspace internal ID.\n // Readonly and created on Entity creation.\n \"InternalID\"?: number;\n\n // Entity type ID.\n \"EntityType.ID\": string;\n\n // ID of the user who created the entity.\n // Will be set automatically on creation.\n \"CreatedBy.User.ID\"?: string;\n // Created date/time of the entity.\n // Will be set automatically on creation.\n \"CreatedTime\"?: UTC.IUTC;\n // Array of associated tags (Used to be called layers).\n // Update to change what tags are associated. Exclude from data to keep it the same.\n \"Layer.ID\"?: number[];\n\n // If we're retrieving historic records, then these values are populated,\n // to indicate the historic data key and date-time.\n \"HistoricAttrKey\"?: string;\n \"HistoricDateTime\"?: string;\n\n // Marker that indicates the entity is a calculated alternative schema.\n // This is used to indicate that the entity is read-only and should not be saved.\n \"SchemaID\"?: string;\n\n // Entity relative position to parent within an assembly.\n \"AssemblyPosition\"?: number[][];\n\n // Entity location in degrees/meters.\n // This is typically relative to the active scene's terrain.\n // However what its relative to is dictated by the Entity Style during rendering.\n // This dictates where 3D models are placed, in the absence of VectorGeometry-\n //this is used to place vector points as well.\n \"Location\"?: EntityCoords.ILocation;\n\n // These are applied only to the Entity's LOD and not the VectorGeometry.\n \"Transform\"?: Transform.ITransform;\n\n // Entity boundaries in degrees/meters.\n \"Boundaries\"?: Bounds.IBounds;\n // Entity vector geometry. Eg: a point, polyline, or polygon to draw.\n \"VectorGeometry\"?: Geometry.IGeometry;\n }\n\n /**\n * Describes an entity record.\n * \n * @warning: Vector data is being migrated into the internal data.\n * It will exist in both locations until migration is complete where it'll only exist in the internal data.\n * It is recommended to check both locations if new code is written until further notice.\n * \n * @example\n * {\n * \"Bruce\": {\n * \"ID\": \"my_entity_id\",\n * \"EntityType.ID\": \"my_entity_type\"\n * }\n * }\n */\n export interface IEntity extends ILegacyEntityVectorData, ILegacyEntityExpandedLocation, _any {\n // Nextspace internal data.\n \"Bruce\": IInternalData;\n // User-defined data..\n // Eg: \"MyAttribute\": \"MyValue\"\n }\n\n /**\n * Available if expandRelations=true.\n * Describes a downstream relationship between the entity and another.\n * This is a read-only calculated property.\n */\n export interface IRelationData {\n // ID of the related child entity.\n \"Other.Entity.ID\": string;\n // ID of the relationship type.\n \"RelationType.ID\": string;\n }\n\n /**\n * Returns an entity record for the given entity id.\n * @param params \n * @returns \n */\n export async function Get(params: {\n api?: BruceApi.Api,\n // ID of the entity.\n entityId: string,\n // Acknowledges that internal attributes have been migrated.\n // Does not return them in both locations and instead only in the new one.\n // Default is false but will eventually be true by default on API side.\n migrated?: boolean;\n // (Optional) Entity type ID to load specific schema.\n entityTypeId?: string;\n // (Optional) Specific schema to load under the related Entity Type.\n // @warning this will be considered read-only data. It should not be shipped to API for saving.\n schemaId?: string;\n // (Optional) If true, will calculate the location of a relative entity and include tilesetIds.\n expandLocation?: boolean,\n // (Optional) If true, will include all immediate downstream relationships for this entity.\n expandRelations?: boolean,\n // (Optional) Historic data key and date range to scan for historic records.\n // The first found record will replace the Entity current Entity contents.\n // If none are found then the current record is returned.\n historicKey?: string,\n historicFrom?: string,\n historicTo?: string,\n historicPoint?: string\n req?: Api.IReqParams\n }): Promise<{\n // Entity record.\n entity: IEntity\n }> {\n let { api, entityId, migrated, schemaId, req: reqParams, expandLocation, expandRelations, entityTypeId, historicFrom, historicKey, historicTo, historicPoint } = params;\n if (!entityId) {\n throw(\"Entity ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const key = GetCacheKey({\n entityId,\n entityTypeId,\n expandLocation,\n expandRelations,\n historicFrom,\n historicKey,\n historicTo,\n historicPoint,\n schemaId\n });\n const cache = api.GetCacheItem(key, reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n const urlParams = new URLSearchParams();\n let expand: string;\n if (expandLocation) {\n expand = \"location\";\n }\n if (expandRelations) {\n if (expand) {\n expand += \",\"; \n }\n expand += \"relation\";\n }\n if (expand) {\n urlParams.append(\"$expand\", expand);\n }\n if (entityTypeId) {\n urlParams.append(\"BruceEntityType\", entityTypeId);\n }\n if (historicKey) {\n urlParams.set(\"historicKey\", historicKey);\n }\n if (historicFrom) {\n urlParams.set(\"historicFrom\", historicFrom);\n }\n if (historicTo) {\n urlParams.set(\"historicTo\", historicTo);\n }\n if (historicPoint) {\n urlParams.set(\"historicPoint\", historicPoint);\n }\n if (schemaId) {\n urlParams.set(\"schema\", schemaId);\n }\n urlParams.set(\"hasMigrated\", String(Boolean(migrated)));\n const data = await api.GET(\n `entity/${entityId}?${urlParams.toString()}`,\n Api.PrepReqParams(reqParams)\n );\n res({\n entity: data\n });\n }\n catch (e) {\n rej(e);\n }\n });\n api.SetCacheItem({\n key,\n value: prom,\n req: reqParams\n });\n return prom;\n }\n\n /**\n * Returns a list of entity records for the given entity ids.\n * @param params \n * @returns \n */\n export async function GetListByIds(params: {\n api?: BruceApi.Api,\n // Array of entity IDs.\n entityIds: string[],\n // Acknowledges that internal attributes have been migrated.\n // Does not return them in both locations and instead only in the new one.\n // Default is false but will eventually be true by default on API side.\n migrated?: boolean;\n // (Optional) schema to map the loaded data into.\n // This will turn the real records into read-only calculated ones.\n schemaId?: string,\n // (Optional) If true, will calculate the location of a relative entity and include tilesetIds.\n // Does not support expanding location and relations at the same time.\n expandLocation?: boolean,\n // (Optional) If true, will include all immediate downstream relationships for this entity.\n // Does not support expanding location and relations at the same time.\n expandRelations?: boolean,\n // (Optional) If true, will includes external sources in the entity data.\n // This can significantly decrease performance.\n expandSources?: boolean,\n // (Optional) Historic data key and date range to scan for historic records.\n // The first found record will replace the Entity current Entity contents.\n // If none are found then the current record is returned.\n historicKey?: string,\n historicFrom?: string,\n historicTo?: string,\n historicPoint?: string,\n req?: Api.IReqParams\n }): Promise<{\n // Array of entity records.\n entities: IEntity[]\n }> {\n let { api, entityIds, migrated, schemaId, req: reqParams, expandRelations, expandLocation, historicFrom, historicKey, historicTo, historicPoint, expandSources } = params;\n if (!entityIds.length) {\n throw(\"Entity IDs are required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const crashRiskReqs: Promise<{ entity: IEntity }>[] = [];\n const reqIds: string[] = [];\n for (let i = 0; i < entityIds.length; i++) {\n const entityId = entityIds[i];\n const key = GetCacheKey({ entityId, expandRelations, expandLocation });\n const cache = api.GetCacheItem(key, reqParams);\n if (cache?.found) {\n crashRiskReqs.push(cache.data);\n }\n else {\n reqIds.push(entityId);\n }\n }\n const reqData = {\n Filter: {\n ID: {\n in: reqIds\n }\n },\n PageSize: reqIds.length\n };\n if (expandRelations) {\n reqData[\"Expand\"] = \"relation\";\n }\n if (expandLocation) {\n if (reqData[\"Expand\"]) {\n reqData[\"Expand\"] += \",location\";\n }\n else {\n reqData[\"Expand\"] = \"location\";\n }\n }\n if (expandSources) {\n reqData[\"ExpandSources\"] = true;\n }\n if (historicKey) {\n reqData[\"historicKey\"] = historicKey;\n }\n if (historicFrom) {\n reqData[\"historicFrom\"] = historicFrom;\n }\n if (historicTo) {\n reqData[\"historicTo\"] = historicTo;\n }\n if (historicPoint) {\n reqData[\"historicPoint\"] = historicPoint;\n }\n const urlParams = new URLSearchParams();\n if (schemaId) {\n urlParams.set(\"schema\", schemaId);\n }\n urlParams.set(\"hasMigrated\", String(Boolean(migrated)));\n const url = `entities?${urlParams.toString()}`;\n\n const reqs: Promise<{ entity: IEntity }>[] = [];\n if (reqIds.length > 0) {\n const req: Promise<Api.IList<Entity.IEntity>> = api.POST(url, reqData, Api.PrepReqParams(reqParams));\n for (let i = 0; i < reqIds.length; i++) {\n const entityId = reqIds[i];\n const key = GetCacheKey({ \n entityId, \n expandLocation, \n expandRelations,\n expandSources,\n entityTypeId: null,\n historicFrom: historicFrom,\n historicKey: historicKey,\n historicTo: historicTo,\n historicPoint: historicPoint,\n schemaId: schemaId\n });\n const prom: Promise<{ entity: IEntity }> = new Promise(async (res) => {\n try {\n const data = await req;\n const item = data.Items.find(x => x.Bruce.ID == entityId);\n res({\n entity: item\n });\n }\n catch (e) {\n // No showing error as we don't want to see it 2000 times.\n }\n res(<any>null);\n });\n api.SetCacheItem({\n key,\n value: prom,\n req: reqParams\n });\n reqs.push(prom);\n }\n }\n\n const entities = (await Promise.all(reqs)).map(x => x?.entity).filter(x => !!x);\n\n // We'll try/catch the crash-risk ones and append the results.\n for (let i = 0; i < crashRiskReqs.length; i++) {\n const req = crashRiskReqs[i];\n try {\n const data = await req;\n if (data?.entity) {\n entities.push(data.entity);\n }\n }\n catch (e) {\n // No showing error as we don't want to see it 2000 times.\n }\n }\n\n return {\n entities: entities\n };\n }\n\n /**\n * Deletes an entity record.\n * @param params \n */\n export async function Delete(params: {\n api?: BruceApi.Api,\n // ID of the entity.\n entityId: string,\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, entityId, req: reqParams } = params;\n if (!entityId) {\n throw(\"Entity ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n await api.DELETE(`entity/${entityId}`, Api.PrepReqParams(reqParams));\n api.Cache.RemoveByContains(GetContainsKey(entityId));\n EntityHistoricData.ClearCacheByEntityIds(api, [entityId]);\n }\n\n /**\n * Deletes a list of entity records.\n * @param params \n */\n export async function DeleteList(params: {\n api?: BruceApi.Api,\n // Array of entity IDs.\n entityIds: string[],\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, entityIds, req: reqParams } = params;\n if (!entityIds?.length) {\n throw(\"Entity IDs are required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n await api.POST(\"deleteEntities\", {\n Items: entityIds\n }, Api.PrepReqParams(reqParams));\n for (let i = 0; i < entityIds.length; i++) {\n const entityId = entityIds[i];\n api.Cache.RemoveByContains(GetContainsKey(entityId));\n }\n EntityHistoricData.ClearCacheByEntityIds(api, entityIds);\n }\n\n /**\n * Creates or updates an entity record.\n * @param params \n * @returns \n */\n export async function Update(params: {\n api?: BruceApi.Api,\n // Entity record.\n entity: IEntity,\n // Acknowledges that internal attributes have been migrated.\n // Does not return them in both locations and instead only in the new one.\n // Default is false but will eventually be true by default on API side.\n migrated?: boolean;\n // If true, will override any existing data.\n // If false, only supplied attributes will be updated.\n // Ensure your data-schema matches the data well otherwise sub-attributes will be overridden regardless!\n override: boolean,\n req?: Api.IReqParams\n }): Promise<{\n // Entity record.\n entity: IEntity\n }> {\n let { api, entity: data, override, req: reqParams, migrated } = params;\n if (!data?.Bruce?.[\"EntityType.ID\"]) {\n throw(\"Entity Type ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n if (!data?.Bruce?.ID) {\n data.Bruce = {\n ...data.Bruce,\n ID: ObjectUtils.UId()\n };\n }\n let reqUrl = `entity/${data.Bruce.ID}/?dataoverride=${override}&BruceEntityType=${data.Bruce[\"EntityType.ID\"]}`;\n if (migrated) {\n reqUrl += \"&hasMigrated=true\";\n }\n const res = await api.POST(reqUrl, data, Api.PrepReqParams(reqParams));\n api.Cache.RemoveByContains(GetContainsKey(<string>data.Bruce.ID));\n EntityHistoricData.ClearCacheByEntityIds(api, [data.Bruce.ID]);\n return {\n entity: res\n };\n }\n\n /**\n * Util to remove a tag from an entity.\n * @warning This does not save the entity record.\n * @param params \n */\n export function RemoveTag(params: {\n // Entity record.\n entity: IEntity,\n // ID of the tag to remove.\n tagId: number\n }): void {\n const { entity: data, tagId } = params;\n const tags = data.Bruce[\"Layer.ID\"] ?? [];\n const index = tags.indexOf(tagId);\n if (index >= 0) {\n tags.splice(index, 1);\n data.Bruce[\"Layer.ID\"] = tags;\n }\n }\n\n /**\n * Util to add a tag to an entity.\n * @warning This does not save the entity record.\n * @param params \n */\n export function AddTag(params: {\n // Entity record.\n entity: IEntity,\n // ID of the tag to add.\n tagId: number\n }): void {\n const { entity: data, tagId } = params;\n const tags = data.Bruce[\"Layer.ID\"] ?? [];\n if (!tags.includes(tagId)) {\n tags.push(tagId);\n data.Bruce[\"Layer.ID\"] = tags;\n }\n }\n\n /**\n * Util to set a value on an entity.\n * @warning This does not save the entity record.\n * @param params \n */\n export function SetValue(params: {\n // Entity record.\n entity: IEntity,\n // Path to the value to set.\n path: string[] | string,\n // Value to set.\n value: any\n }): void {\n let { entity: data, path, value } = params;\n if (!path || !path.length) {\n return;\n }\n if (typeof path == \"string\") {\n path = PathUtils.Parse(path);\n }\n\n let curData = data;\n for (let i = 0; i < path.length; i++) {\n const step = path[i];\n if (!curData[step] || typeof curData[step] != \"object\") {\n curData[step] = {};\n }\n if (i >= path.length - 1) {\n curData[step] = value;\n break;\n }\n curData = curData[step];\n }\n }\n\n /**\n * Util to get a value from an entity.\n * @param params \n * @returns \n */\n export function GetValue(params: {\n // Entity record.\n entity: IEntity,\n // Path to the value to get.\n path: string[] | string,\n // If legacy checks are enabled or we should take the data as is.\n // An example is we used to store ID inside the top level rather than inside Bruce.\n // If enabled, we'll check both paths for the value.\n // This is enabled by default.\n handleLegacy?: boolean\n }): any {\n let { entity: data, path, handleLegacy: checkAgainstLegacy } = params;\n if (checkAgainstLegacy == null) {\n checkAgainstLegacy = true;\n }\n if (!path || !path.length) {\n return null;\n }\n if (typeof path == \"string\") {\n path = PathUtils.Parse(path);\n }\n \n // Backwards compatibility for incredibly old data.\n if (checkAgainstLegacy && path.length == 1 && path[0] == \"ID\") {\n return data.Bruce?.ID;\n }\n\n const checkForValue = (path: string[]) => {\n let curData = data;\n for (let i = 0; i < path.length; i++) {\n const step = path[i];\n if (!curData[step]) {\n return null;\n }\n if (i >= path.length - 1) {\n return curData[step];\n }\n curData = curData[step];\n }\n return null;\n };\n\n // Check using the path provided.\n let value = checkForValue(path);\n\n // Check for the same path but in both top-level and internal data.\n // This is done for specific paths we're migrating.\n \n if (value == null && checkAgainstLegacy) {\n // We're migrating 2D vector data into the internal data.\n // So we'll check against both locations until migration is complete.\n\n // First we'll check against properties that could be found inside the internal section.\n if (path[0] == \"location\") {\n value = checkForValue([\"Bruce\", \"Location\"].concat(path.slice(1)));\n }\n else if (path[0] == \"transform\") {\n value = checkForValue([\"Bruce\", \"Transform\"].concat(path.slice(1)));\n }\n else if (path[0] == \"geometry\") {\n value = checkForValue([\"Bruce\", \"VectorGeometry\"].concat(path.slice(1)));\n }\n else if (path[0] == \"boundaries\") {\n value = checkForValue([\"Bruce\", \"Boundaries\"].concat(path.slice(1)));\n }\n else if (path[0] == \"geometryPivot\") {\n value = checkForValue([\"Bruce\", \"GeometryPivot\"].concat(path.slice(1)));\n }\n else if (path[0] == \"worldPivot\") {\n value = checkForValue([\"Bruce\", \"GeometryWorldPivot\"].concat(path.slice(1)));\n }\n else if (path[0] == \"worldPosition\") {\n value = checkForValue([\"Bruce\", \"AssemblyWorldPosition\"].concat(path.slice(1)));\n }\n else if (path[0] == \"tilesetID\") {\n value = checkForValue([\"Bruce\", \"TilesetIDs\"].concat(path.slice(1)));\n }\n else if (path[0] == \"geometryRadius\") {\n value = checkForValue([\"Bruce\", \"GeometryRadius\"].concat(path.slice(1)));\n }\n // Now we'll check against properties that could still be in the top-level and haven't been migrated yet.\n if (path[0] == \"Bruce\" && path.length > 1) {\n if (path[1] == \"Location\") {\n value = checkForValue([\"location\"].concat(path.slice(2)));\n }\n else if (path[1] == \"Transform\") {\n value = checkForValue([\"transform\"].concat(path.slice(2)));\n }\n else if (path[1] == \"VectorGeometry\") {\n value = checkForValue([\"geometry\"].concat(path.slice(2)));\n }\n else if (path[1] == \"Boundaries\") {\n value = checkForValue([\"boundaries\"].concat(path.slice(2)));\n }\n else if (path[1] == \"GeometryPivot\") {\n value = checkForValue([\"geometryPivot\"].concat(path.slice(2)));\n }\n else if (path[1] == \"GeometryWorldPivot\") {\n value = checkForValue([\"worldPivot\"].concat(path.slice(2)));\n }\n else if (path[1] == \"AssemblyWorldPosition\") {\n value = checkForValue([\"worldPosition\"].concat(path.slice(2)));\n }\n else if (path[1] == \"TilesetIDs\") {\n value = checkForValue([\"tilesetID\"].concat(path.slice(2)));\n }\n else if (path[1] == \"GeometryRadius\") {\n value = checkForValue([\"geometryRadius\"].concat(path.slice(2)));\n }\n else if (path[1] == \"relations\") {\n value = checkForValue([\"Bruce\", \"Relations\"].concat(path.slice(2)));\n }\n else if (path[1] == \"Relations\") {\n value = checkForValue([\"Bruce\", \"relations\"].concat(path.slice(2)));\n }\n }\n }\n\n return value;\n }\n\n /**\n * Removes a value from an entity.\n * This will mutate the entity record and run \"delete\" on the object property.\n * @warning This does not save the entity record.\n * @param params \n */\n export function RemoveValue(params: {\n // Entity record.\n entity: IEntity,\n // Path to the value to delete.\n path: string[] | string\n }) {\n let { entity: data, path } = params;\n if (!path || !path.length) {\n return;\n }\n if (typeof path == \"string\") {\n path = PathUtils.Parse(path);\n }\n\n let curData = data;\n for (let i = 0; i < path.length; i++) {\n const step = path[i];\n if (typeof curData != \"object\" || curData == null) {\n return;\n }\n if (i >= path.length - 1) {\n delete curData[step];\n return;\n }\n curData = curData[step];\n }\n }\n\n /**\n * Calculates an entity's name based on attribute priority set in the type.\n * @param params\n * @returns\n */\n export function CalculateName(params: {\n entity: IEntity,\n type: EntityType.IType,\n // If true, will return the entity ID if no name can be calculated.\n defaultToId?: boolean\n }): string {\n const { entity, type, defaultToId = true } = params;\n const attrStr = type.DisplayNameAttributePath;\n if (attrStr) {\n const attrPaths = attrStr.split(\",\");\n for (let i = 0; i < attrPaths.length; i++) {\n const pathStr = attrPaths[i];\n const path = PathUtils.Parse(pathStr);\n const name = Entity.GetValue({\n entity: entity,\n path\n });\n if (name && typeof name != \"object\") {\n return name;\n }\n }\n }\n return defaultToId ? entity.Bruce.ID : null;\n }\n\n /**\n * Calculates an entity name.\n * This will request data if entity or type is not provided.\n * @param params \n * @returns \n */\n export async function CalculateNameAsync(params: {\n api?: BruceApi.Api,\n // Either entityId or entity is required.\n entityId?: string;\n entity?: IEntity;\n // Type and typeId are optional.\n // They will be sampled from the entity if not provided.\n typeId?: string;\n type?: EntityType.IType;\n // If true, will return the entity ID if no name can be calculated.\n defaultToId?: boolean;\n }) {\n let { api, entityId, entity, typeId, type, defaultToId } = params;\n if (entityId && !entity) {\n const { entity: data } = await Get({\n api,\n entityId,\n entityTypeId: typeId,\n migrated: true\n });\n entity = data;\n }\n if (!entity) {\n return null;\n }\n if (!typeId) {\n typeId = entity.Bruce?.[\"EntityType.ID\"];\n }\n if (typeId && !type) {\n const { entityType: data } = await EntityType.Get({\n api,\n entityTypeId: typeId\n });\n type = data;\n }\n if (!type) {\n return null;\n }\n return CalculateName({\n entity,\n type,\n defaultToId\n });\n }\n\n /**\n * Describes a filter for entity records.\n */\n export interface IFilter {\n // (Optional) Order by attribute.\n orderBy?: any;\n // (Optional) Entity type ID.\n entityTypeId?: string;\n // (Optional) Array of tag IDs to restrict against.\n layerIds?: number[];\n // @Deprecated version of layerIds.\n layerId?: number;\n // Default is \"equals\" for backwards compatibility.\n layerIdsOperator?: \"equals\" | \"in\";\n // (Optional) Graphical bounds to restrict against.\n bounds?: Bounds.IReqBounds;\n // (Optional) Page size.\n pageSize?: number;\n // (Optional) Page index. Default is 0.\n pageIndex?: number;\n // (Optional) LOD category ID.\n lodCategoryId?: string;\n // (Optional) Sort order.\n sortOrder?: Api.ESortOrder;\n // (Optional) Entity type conditions.\n // This is a filter against the entity attributes.\n // Ensure attributes are indexed for best results.\n entityTypeConditions?: IDictionary<any>;\n }\n\n /**\n * Returns a list of entity records for the given filter.\n * @param params \n * @returns \n */\n export async function GetList(params: {\n api?: BruceApi.Api,\n // Filter to apply.\n filter: IFilter,\n // Acknowledges that internal attributes have been migrated.\n // Does not return them in both locations and instead only in the new one.\n // Default is false but will eventually be true by default on API side.\n migrated?: boolean;\n // (Optional) schema to map the loaded data into.\n // This will turn the real records into read-only calculated ones.\n schemaId?: string,\n // (Optional) If true, will calculate the location of a relative entity and include tilesetIds.\n // Does not support expanding location and relations at the same time.\n expandLocation?: boolean,\n // (Optional) If true, will include all immediate downstream relationships for each entity.\n expandRelations?: boolean,\n // (Optional) If true, will includes external sources in the entity data.\n // This can significantly decrease performance.\n expandSources?: boolean,\n // Default = false. If false then only analysis data is returned instead of the entities.\n // TODO: Requires a provided entityTypeId. This is out of date in API.\n analysis?: boolean,\n // Default = false.\n viaCdn?: boolean;\n // (Optional) Cache killing token to append to the request url.\n viaCdnCacheToken?: number | string;\n // (Optional) Historic data key and date range to scan for historic records.\n // The first found record will replace the Entity current Entity contents.\n // If none are found then the current record is returned.\n historicKey?: string,\n historicFrom?: string,\n historicTo?: string\n historicPoint?: string;\n req?: Api.IReqParams\n }): Promise<{\n // Returned if analysis=false.\n entities?: IEntity[];\n // Returned if analysis=true.\n totalCount?: number;\n }> {\n let { api, filter, migrated, schemaId, req: reqParams, viaCdn, viaCdnCacheToken, analysis, expandRelations, historicFrom, historicKey, historicTo, historicPoint, expandLocation, expandSources } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n let requestFilter: any = {};\n if (filter.entityTypeConditions) {\n requestFilter = {\n ...filter.entityTypeConditions\n };\n }\n if (filter.layerIds != null && filter.layerIds.length > 0) {\n const operator = filter.layerIdsOperator ?? \"equals\";\n requestFilter[\"Bruce.Layer.ID\"] = {\n [operator]: filter.layerIds\n };\n }\n else if (filter.layerId != null) {\n requestFilter[\"Bruce.Layer.ID\"] = {\n equals: filter.layerId\n }\n }\n if (filter.bounds) {\n requestFilter[\"geometry\"] = {\n \"intersects\": [\n filter.bounds.south,\n filter.bounds.north,\n filter.bounds.west,\n filter.bounds.east\n ]\n };\n }\n\n const body = {\n SortOrder: filter.sortOrder == Api.ESortOrder.Asc ? \"ASC\" : \"DESC\",\n OrderBy: filter.orderBy,\n Filter: requestFilter,\n LODType: filter.lodCategoryId,\n BruceEntityType: filter.entityTypeId,\n PageIndex: filter.pageIndex,\n PageSize: filter.pageSize,\n historicKey: historicKey,\n historicFrom: historicFrom,\n historicTo: historicTo,\n historicPoint: historicPoint,\n ExpandSources: expandSources\n };\n if (expandLocation || expandRelations) {\n let expand = \"\";\n if (expandLocation) {\n expand += \"location\";\n }\n if (expandRelations) {\n if (expand) {\n expand += \",\"; \n }\n expand += \"relation\";\n }\n if (expand) {\n body[\"Expand\"] = expand;\n }\n }\n\n let totalCount: number;\n let entities = [];\n if (analysis || expandRelations || (viaCdn && api.GetCdnBaseUrl())) {\n const urlParams = new URLSearchParams();\n urlParams.set(\"cacheToken\", String(viaCdnCacheToken ? viaCdnCacheToken : 0));\n if (body.SortOrder) {\n urlParams.set(\"SortOrder\", body.SortOrder);\n }\n if (body.OrderBy) {\n urlParams.set(\"OrderBy\", body.OrderBy);\n }\n if (body.Filter) {\n urlParams.set(\"Filter\", JSON.stringify(body.Filter));\n }\n if (body.LODType) {\n urlParams.set(\"LODType\", body.LODType);\n }\n if (body.BruceEntityType) {\n urlParams.set(\"BruceEntityType\", body.BruceEntityType);\n }\n if (body.PageIndex) {\n urlParams.set(\"PageIndex\", String(body.PageIndex));\n }\n if (body.PageSize) {\n urlParams.set(\"PageSize\", String(body.PageSize));\n }\n if (expandRelations) {\n urlParams.append(\"$expand\", \"relation\");\n }\n if (expandLocation) {\n urlParams.append(\"$expand\", \"location\");\n }\n if (expandSources) {\n urlParams.append(\"ExpandSources\", \"true\");\n }\n if (historicKey) {\n urlParams.set(\"historicKey\", historicKey);\n }\n if (historicFrom) {\n urlParams.set(\"historicFrom\", historicFrom);\n }\n if (historicTo) {\n urlParams.set(\"historicTo\", historicTo);\n }\n if (historicPoint) {\n urlParams.set(\"historicPoint\", historicPoint);\n }\n if (schemaId) {\n urlParams.set(\"schema\", schemaId);\n }\n urlParams.set(\"hasMigrated\", String(Boolean(migrated)));\n\n let url = analysis ? \"entities/summary\" : \"entities\";\n // Adding url params here because this will avoid making them encoded.\n // Our API isn't decoding them properly so $expand is not being recognized.\n url += \"?\" + urlParams.toString();\n\n const urlStr = api.ConstructUrl({\n cdn: !analysis && viaCdn,\n url: url\n });\n \n const data = await api.get(urlStr, Api.PrepReqParams(reqParams));\n if (!analysis) {\n entities = data.Items;\n }\n totalCount = data.TotalCount;\n }\n else {\n const urlParams = new URLSearchParams();\n if (expandRelations) {\n urlParams.append(\"$expand\", \"relation\");\n }\n if (expandLocation) {\n urlParams.append(\"$expand\", \"location\");\n }\n if (schemaId) {\n urlParams.set(\"schema\", schemaId);\n }\n urlParams.set(\"hasMigrated\", String(Boolean(migrated)));\n\n let url = analysis ? \"entities/summary\" : \"entities\";\n // Adding url params here because this will avoid making them encoded.\n // Our API isn't decoding them properly so $expand is not being recognized.\n url += \"?\" + urlParams.toString();\n\n const urlStr = api.ConstructUrl({\n cdn: false,\n url: url\n })\n\n const data = await api.post(urlStr, body, Api.PrepReqParams(reqParams));\n if (!analysis) {\n entities = data.Items;\n // Only caching when non-CDN.\n for (let i = 0; i < entities.length; i++) {\n const entity = entities[i];\n const id = entity.Bruce.ID;\n api.SetCacheItem({\n key: GetCacheKey({\n entityId: id,\n expandRelations,\n expandLocation,\n expandSources,\n entityTypeId: filter.entityTypeId,\n historicFrom: historicFrom,\n historicKey: historicKey,\n historicTo: historicTo,\n schemaId: schemaId\n }),\n value: {\n entity: entity\n },\n req: reqParams\n });\n }\n }\n totalCount = data.TotalCount;\n }\n return {\n entities,\n totalCount\n };\n }\n\n /**\n * Helper method that returns an Entity object.\n * This will ensure the basics exist (\"Bruce\" structure).\n * @param params\n */\n export function Assert(params?: {\n // Base Entity to extend.\n // If provided, will extend the base Entity with the new ID and EntityType.\n baseEntity?: IEntity;\n // ID of the Entity.\n // If not provided, the base Entity will be referenced for an ID.\n // If the base Entity does not have an ID, a new one will be generated.\n entityId?: string;\n // ID of the EntityType.\n // If not provided, the base Entity will be referenced for an EntityType.\n // If the base Entity does not have an EntityType, it will be null.\n entityTypeId?: string;\n }): IEntity {\n let { entityId, entityTypeId, baseEntity } = params ? params : {} as any;\n\n if (!entityId) {\n entityId = baseEntity?.[\"Bruce\"]?.[\"ID\"];\n }\n if (!entityId) {\n entityId = ObjectUtils.UId();\n }\n if (!entityTypeId) {\n entityTypeId = baseEntity?.[\"Bruce\"]?.[\"EntityType.ID\"];\n }\n\n let bruce: Entity.IInternalData = baseEntity?.[\"Bruce\"];\n if (!bruce) {\n bruce = {\n \"EntityType.ID\": null\n };\n }\n bruce[\"ID\"] = entityId;\n bruce[\"EntityType.ID\"] = entityTypeId;\n\n return {\n ...baseEntity,\n \"Bruce\": bruce\n };\n }\n\n /**\n * Helper method that returns a geojson object for a given set of Entities.\n * @param params \n * @returns \n */\n export function ToGeoJson(params: {\n entities: Entity.IEntity[];\n // Default = false.\n // If true, will exclude altitude values from the GeoJSON.\n excludeAltitude?: boolean;\n // Overrides altitude of all points if provided.\n altitude?: number;\n // Default = true.\n // This will include the full user data in the GeoJSON properties.\n // When false only Nextspace internal data will be included.\n includeUserData?: boolean;\n // If null then all types are allowed.\n // Default = null.\n // Geometry = polygon and polyline. Point = point.\n allowedDisplayTypes?: ZoomControl.EDisplayType[];\n }): any {\n const { entities, excludeAltitude, altitude, includeUserData, allowedDisplayTypes } = params;\n const features: any[] = [];\n const allowPoint = allowedDisplayTypes == null || allowedDisplayTypes.includes(ZoomControl.EDisplayType.Point);\n const allowGeometry = allowedDisplayTypes == null || allowedDisplayTypes.includes(ZoomControl.EDisplayType.Geometry);\n\n const cloneObj = (obj: any) => {\n return JSON.parse(JSON.stringify(obj));\n };\n\n const areCoordinatesEqual = (coord1, coord2) => {\n return coord1[0] === coord2[0] && coord1[1] === coord2[1] && (coord1[2] === coord2[2] || (coord1.length < 3 && coord2.length < 3));\n };\n\n const removeConsecutiveDuplicates = (coordinates) => {\n return coordinates.filter((coord, index, array) => {\n return index === 0 || !areCoordinatesEqual(coord, array[index - 1]);\n });\n }; \n\n const closePolygonCoordinates = (coordinates) => {\n if (coordinates.length > 0 && !areCoordinatesEqual(coordinates[0], coordinates[coordinates.length - 1])) {\n const firstPointCopy = [...coordinates[0]];\n coordinates.push(firstPointCopy);\n }\n return coordinates;\n };\n \n const populateProperties = (feature: any, entity: Entity.IEntity) => {\n let properties = null;\n // All properties.\n if (includeUserData != false) {\n properties = cloneObj(entity);\n // We exclude geometry since the geojson is supposed to represent that attribute.\n delete properties.geometry;\n }\n // Only specific internal properties.\n else {\n properties = {\n Bruce: entity.Bruce ? cloneObj(entity.Bruce) : null,\n location: entity.location ? cloneObj(entity.location) : null,\n transform: entity.transform ? cloneObj(entity.transform) : null,\n boundaries: entity.boundaries ? cloneObj(entity.boundaries) : null,\n };\n }\n feature.properties = properties;\n };\n \n const processGeometry = (geometry: Geometry.IGeometry, entity: Entity.IEntity) => {\n const feature: any = {\n type: \"Feature\",\n properties: {},\n geometry: null\n };\n \n populateProperties(feature, entity);\n \n if (geometry.MultiGeometry?.length && allowGeometry) {\n geometry.MultiGeometry.forEach(geo => processGeometry(geo, entity));\n return;\n }\n else if (geometry.Polygon?.length && allowGeometry) {\n const sortedPolygons = geometry.Polygon.sort((a, b) =>\n a.Facing === Geometry.EPolygonRingType.Boundaries ? -1 : 1\n );\n \n const coordinates = sortedPolygons.map(polygonRing =>\n closePolygonCoordinates(\n removeConsecutiveDuplicates(\n polygonRing.LinearRing.split(' ').map(coord => {\n const [lon, lat, alt] = coord.split(',').map(Number);\n return excludeAltitude ? [lon, lat] : [lon, lat, altitude !== undefined ? altitude : (alt !== undefined ? alt : [])];\n })\n )\n )\n );\n \n // Check if the polygon has at least 4 points.\n const isValidPolygon = coordinates.every(polygon => polygon.length >= 4);\n if (!isValidPolygon) {\n // Perhaps try other geometry instead of returning?\n return;\n }\n \n feature.geometry = {\n type: \"Polygon\",\n coordinates: coordinates,\n };\n }\n else if (geometry.LineString && (allowedDisplayTypes == null || allowedDisplayTypes.includes(ZoomControl.EDisplayType.Geometry))) {\n const coordinates = removeConsecutiveDuplicates(geometry.LineString.split(' ').map(coord => {\n const [lon, lat, alt] = coord.split(',').map(Number);\n return excludeAltitude ? [lon, lat] : [lon, lat, altitude !== undefined ? altitude : (alt !== undefined ? alt : [])];\n }));\n\n // Check if the polyline has at least 2 points.\n if (coordinates.length < 2) {\n // Perhaps try other geometry instead of returning?\n return;\n }\n\n feature.geometry = {\n type: \"LineString\",\n coordinates,\n };\n }\n else if (geometry.Point && allowPoint) {\n const [lon, lat, alt] = geometry.Point.split(',').map(Number);\n const coordinates = excludeAltitude ? [lon, lat] : [lon, lat, altitude !== undefined ? altitude : (alt !== undefined ? alt : [])];\n feature.geometry = {\n type: \"Point\",\n coordinates,\n };\n }\n \n if (feature.geometry) {\n features.push(feature);\n }\n };\n \n entities.forEach(entity => {\n if (!entity?.Bruce?.ID) {\n return;\n }\n let geometry = entity.geometry;\n if (!geometry && (entity.location?.longitude && entity.location?.latitude)) {\n geometry = {\n Point: `${entity.location.longitude},${entity.location.latitude}` + (entity.location.altitude != null ? `,${entity.location.altitude}` : \"\"),\n };\n }\n if (geometry) {\n processGeometry(geometry, entity);\n }\n });\n \n return {\n type: \"FeatureCollection\",\n features,\n };\n }\n\n /**\n * Returns cache identifier for an entity record.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetCacheKey({...});\n * api.Cache.Remove(key);\n * }\n * @param params \n * @returns \n */\n export function GetCacheKey(params: {\n entityId: string,\n entityTypeId?: string,\n expandLocation?: boolean,\n expandRelations?: boolean,\n expandSources?: boolean,\n historicKey?: string,\n historicFrom?: string,\n historicTo?: string,\n historicPoint?: string,\n schemaId?: string\n }): string {\n let { entityId, entityTypeId, schemaId, expandLocation, expandRelations, expandSources, historicFrom, historicKey, historicTo, historicPoint } = params;\n if (!entityTypeId) {\n entityTypeId = \"\";\n }\n if (!historicKey) {\n historicKey = \"\";\n }\n if (!historicFrom) {\n historicFrom = \"\";\n }\n if (!historicTo) {\n historicTo = \"\";\n }\n if (!historicPoint) {\n historicPoint = \"\";\n }\n if (!schemaId) {\n schemaId = \"\";\n }\n\n let key = `${Api.ECacheKey.Entity}${Api.ECacheKey.Id}${entityId}${String(entityTypeId)}${schemaId}`;\n key += `${String(Boolean(expandLocation))}${String(Boolean(expandRelations))}${String(Boolean(expandSources))}`;\n key += `${Api.ECacheKey.EntityHistoricData}${Api.ECacheKey.Id}${historicKey}-${historicFrom}-${historicTo}-${historicPoint}`;\n return key;\n }\n \n /**\n * Returns cache identifier for an entity record.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetCacheKey(\"abc\");\n * api.Cache.Remove(key);\n * }\n * @param entityId \n * @returns \n */\n export function GetContainsKey(entityId: string) {\n return `${Api.ECacheKey.Entity}${Api.ECacheKey.Id}${entityId}`;\n }\n\n /**\n * Returns cache identifier for entity records that have historic data.\n * @param attrKey \n * @returns \n */\n export function GetHistoricContainsKey(attrKey: string) {\n if (!attrKey) {\n attrKey = \"\";\n }\n return `${Api.ECacheKey.EntityHistoricData}${Api.ECacheKey.Id}${attrKey}`;\n }\n}","import { Entity } from \"../entity/entity\";\nimport { PathUtils } from \"../util/path-utils\";\n\n/**\n * Gets the first Bruce variable in a string.\n * @param str \n * @returns \n */\nfunction getVariable(str: string): { text: string, path: string } {\n const start = str.indexOf(\"${\");\n if (start > -1) {\n const end = str.indexOf(\"}\");\n if (end > -1) {\n if (start < end) {\n const path = str.substring(start + 2, end);\n const txt = str.substring(start, end + 1);\n return { path: path, text: txt };\n }\n }\n }\n return <any>null;\n}\n\n/**\n * Utilities for parsing \"Bruce variables\", typically within strings.\n *\n * A Bruce variable is a string that starts with \"${\" and ends with \"}\".\n * Within those brackets is a path to an attribute in an entity.\n */\nexport namespace BruceVariable {\n /**\n * Replaces all Bruce variables in a string with the value of the attribute.\n * @param str\n * @param data\n * @param legacyParse\n * @returns\n */\n export function SwapValues(params: {\n str: string,\n entity: Entity.IEntity,\n legacyParse?: boolean\n }): string {\n let { str, entity: data, legacyParse } = params;\n if (!legacyParse) {\n legacyParse = false;\n }\n while (true) {\n const variable = getVariable(str);\n if (variable) {\n const path = legacyParse ? PathUtils.ParseLegacy(variable.path) : PathUtils.Parse(variable.path);\n let value = \"\";\n if (path.length > 0) {\n value = Entity.GetValue({\n entity: data,\n path: path\n });\n }\n str = str.replace(variable.text, value);\n }\n else {\n break;\n }\n }\n return str;\n }\n}","import { Color } from \"../common/color\";\nimport { Entity } from \"../entity/entity\";\nimport { BruceVariable } from \"../common/bruce-variable\";\nimport { PathUtils } from \"../util/path-utils\";\n\n/**\n * Example: ${Test.Test1}\n * Needs to become [\"Test\", \"Test1\"].\n * We need to cull this in admin-ui.\n * @param path\n * @returns Possible paths this legacy one could mean.\n */\nfunction parseLegacyPath(path: string): string[][] {\n if (!path) {\n return [];\n }\n let paths = [];\n if (path.startsWith(\"${\") && path.endsWith(\"}\")) {\n path = path.replace(\"${\", \"\");\n path = path.replace(\"}\", \"\");\n }\n // Split by dots.\n paths.push(PathUtils.ParseLegacy(path));\n // Take string as is.\n paths.push([path]);\n // Split by backslashes.\n paths.push(PathUtils.Parse(path));\n // Remove duplicates.\n const tmpPaths = [];\n for (let i = 0; i < paths.length; i++) {\n const path = paths[i];\n let found = false;\n for (let j = 0; j < tmpPaths.length; j++) {\n const tmpPath = tmpPaths[j];\n if (tmpPath.length == path.length) {\n let match = true;\n for (let k = 0; k < tmpPath.length; k++) {\n const tmpPathPart = tmpPath[k];\n const pathPart = path[k];\n if (tmpPathPart != pathPart) {\n match = false;\n break;\n }\n }\n if (match) {\n found = true;\n break;\n }\n }\n }\n if (!found) {\n tmpPaths.push(path);\n }\n }\n paths = tmpPaths;\n return paths;\n}\n\n/**\n * Utility for calculating values from Nextspace fields.\n * These fields are typically found in entity styles.\n */\nexport namespace Calculator {\n /**\n * Possible types of values that can be calculated.\n * This will determine how to calculate the values, and if extra levels of validation for specific value types are done.\n */\n export enum EValueType {\n Color,\n Input,\n Gradient,\n Mapping,\n TagColor,\n RandomColor\n }\n\n /**\n * A mapping option for a mapping value.\n */\n export interface IMappingOption {\n // Value to compare the attribute value against.\n fieldValue: string;\n // Value to return if the attribute value matches the field value.\n appliedValue: string;\n }\n\n /**\n * A mapping value.\n * This is a comparison between an attribute value to a set of available values.\n * If the attribute value matches a field value, then the applied value is returned.\n */\n export interface IMappingValue {\n // The attribute to compare against.\n // This is a string path. Check 'PathUtils.Wrap([...])'.\n field: string;\n // The available values to compare against.\n values: IMappingOption[];\n }\n\n /**\n * A gradient point.\n */\n export interface IGradientPoint {\n // The value we're comparing the attribute value against.\n position: number;\n // The color to return if the attribute value matches the position or falls between two positions.\n color: string;\n }\n\n export interface IGradientValue {\n // The attribute to compare against.\n field: string;\n // The available values to compare against.\n points: IGradientPoint[];\n // Deprecated.\n // It will be calculated from the provided points.\n min?: number;\n max?: number;\n }\n\n /**\n * A field option.\n * This is a value that can be calculated based on outlined settings.\n */\n export interface IField {\n // Settings that outline how to calculate the value based on the provided 'type'.\n value: IGradientValue | IMappingValue | string | number;\n // The type of calculation to perform.\n type: EValueType;\n }\n\n /**\n * Calculates the value of arbitrary field options.\n * The context calling this should validate results and parse stuff if needed.\n * @deprecated use specific calls: eg GetColor or GetNumber.\n * @param fields\n * @param entity\n * @param tags\n * @returns\n */\n export function GetValue(fields: IField[], entity: Entity.IEntity, tags: any[]): string | number | Color.IColor {\n if (!fields?.length) {\n return null;\n }\n if (!tags) {\n tags = [];\n }\n if (!entity) {\n entity = <any>{};\n }\n for (let i = 0; i < fields.length; i++) {\n const field = fields[i];\n let value: any;\n switch (field.type) {\n case EValueType.Color:\n value = <string>field.value;\n if (value) {\n value = Color.ColorFromStr(value);\n }\n break;\n case EValueType.Gradient:\n value = GetGradientValue(<IGradientValue>field.value, entity);\n break;\n case EValueType.Input:\n value = GetInputValue(<string>field.value, entity);\n break;\n case EValueType.Mapping:\n value = GetMappingValue(<IMappingValue>field.value, entity);\n break;\n case EValueType.RandomColor:\n value = Color.RandomColor();\n break;\n case EValueType.TagColor:\n for (let i = 0; i < tags.length; i++) {\n const tag = tags[i];\n if (tag.Color) {\n value = Color.ColorFromStr(tag.Color);\n break;\n }\n }\n break;\n }\n if (value || value == 0) {\n return value;\n }\n }\n return <any>null;\n }\n\n /**\n * Calculates the value of arbitrary field options with assumption that desired result is a color.\n * Will return null if a color is not found.\n * @param fields\n * @param entity\n * @param tags\n */\n export function GetColor(fields: IField[], entity: Entity.IEntity, tags: any[]): Color.IColor {\n if (!fields?.length) {\n return null;\n }\n if (!tags) {\n tags = [];\n }\n if (!entity) {\n entity = <any>{};\n }\n for (let i = 0; i < fields.length; i++) {\n const field = fields[i];\n let value: any;\n switch (field.type) {\n case EValueType.Color:\n value = <string>field.value;\n break;\n case EValueType.Gradient:\n value = GetGradientValue(<IGradientValue>field.value, entity);\n break;\n case EValueType.Input:\n value = GetInputValue(<string>field.value, entity);\n break;\n case EValueType.Mapping:\n value = GetMappingValue(<IMappingValue>field.value, entity);\n break;\n case EValueType.RandomColor:\n value = Color.RandomColor();\n break;\n case EValueType.TagColor:\n for (let i = 0; i < tags.length; i++) {\n const tag = tags[i];\n if (tag.Color) {\n value = Color.ColorFromStr(tag.Color);\n break;\n }\n }\n break;\n }\n if (typeof value === \"string\") {\n value = Color.ColorFromStr(value);\n }\n if (value && typeof value === \"object\" && (value.red || value.red == 0)) {\n return value;\n }\n }\n return <any>null;\n }\n\n /**\n * Calculates the value of arbitrary field options with assumption that desired result is a number.\n * Will return null if a number is not found.\n * @param fields \n * @param entity \n * @param tags \n * @returns \n */\n export function GetNumber(fields: IField[], entity: Entity.IEntity, tags: any[]): number {\n if (!fields?.length) {\n return null;\n }\n if (!tags) {\n tags = [];\n }\n if (!entity) {\n entity = <any>{};\n }\n for (let i = 0; i < fields.length; i++) {\n const field = fields[i];\n let value: any;\n switch (field.type) {\n case EValueType.Gradient:\n value = GetGradientValue(<IGradientValue>field.value, entity);\n break;\n case EValueType.Color:\n case EValueType.Input:\n value = GetInputValue(<string>field.value, entity);\n break;\n case EValueType.Mapping:\n value = GetMappingValue(<IMappingValue>field.value, entity);\n break;\n }\n if (value != \"\" && value != null && value != undefined) {\n value = Number(value);\n }\n if (value || value == 0) {\n return value;\n }\n }\n return <any>null;\n }\n\n /**\n * Calculates the value of arbitrary field options with assumption that desired result is a string.\n * Will return null if a string is not found.\n * @param fields \n * @param entity \n * @param tags \n * @returns \n */\n export function GetString(fields: IField[], entity: Entity.IEntity, tags: any[]): string {\n if (!fields?.length) {\n return null;\n }\n if (!tags) {\n tags = [];\n }\n if (!entity) {\n entity = <any>{};\n }\n\n for (let i = 0; i < fields.length; i++) {\n const field = fields[i];\n let value: any;\n switch (field.type) {\n case EValueType.Gradient:\n {\n const tmp = GetGradientValue(<IGradientValue>field.value, entity);\n // This avoids null turning into \"null\".\n if (tmp) {\n value = String(tmp);\n }\n }\n break;\n case EValueType.Color:\n case EValueType.Input:\n {\n const tmp = GetInputValue(<string>field.value, entity);\n // This avoids null turning into \"null\".\n if (tmp) {\n value = String(tmp);\n }\n }\n break;\n case EValueType.Mapping:\n {\n const tmp = GetMappingValue(<IMappingValue>field.value, entity);\n // This avoids null turning into \"null\".\n if (tmp) {\n value = String(tmp);\n }\n }\n break;\n case EValueType.RandomColor:\n // Would be nice to randomize based on an attribute or entity ID instead of pure random.\n var color = Color.RandomColor();\n value = `rgba(${color.red},${color.green},${color.blue},${color.alpha})`;\n break;\n case EValueType.TagColor:\n for (let i = 0; i < tags.length; i++) {\n const tag = tags[i];\n if (tag.Color) {\n value = tag.Color;\n break;\n }\n }\n break;\n }\n if (value) {\n return value;\n }\n }\n return <any>null;\n }\n\n /**\n * Calculates a mapping value. This can return any value type.\n * It is intended to be parsed and validated within a value-type context. Eg: GetColor, GetNumber, GetString.\n * @param value \n * @param entity \n * @returns \n */\n export function GetMappingValue(value: IMappingValue, entity: Entity.IEntity): string | number {\n const attrPaths: string[][] = parseLegacyPath(value.field);\n for (let i = 0; i < attrPaths.length; i++) {\n const attrPath = attrPaths[i];\n let eValue: any = Entity.GetValue({\n entity: entity,\n path: attrPath\n });\n const isValueNum = !isNaN(+eValue);\n\n for (let i = 0; i < value.values.length; i++) {\n const option = value.values[i];\n const mapValue = option.fieldValue;\n const isMapValueNum = !isNaN(+mapValue);\n\n if (isValueNum && (isMapValueNum || mapValue.includes(\"-\"))) {\n if (+mapValue == +eValue) {\n return option.appliedValue;\n }\n const mapSplit = mapValue.split(\"-\");\n if (mapSplit.length == 2) {\n const min = mapSplit[0];\n const max = mapSplit[1];\n if (min != \"\") {\n if (+eValue < +min) {\n continue;\n }\n }\n if (max != \"\") {\n if (+eValue > +max) {\n continue;\n }\n }\n if (min == \"\" && max == \"\") {\n continue;\n }\n return option.appliedValue;\n }\n }\n else {\n if (mapValue == eValue) {\n return option.appliedValue;\n }\n }\n }\n }\n return <any>null;\n }\n\n /**\n * Calculates a gradient value. This can return any value type.\n * It is intended to be parsed and validated within a value-type context. Eg: GetColor, GetNumber, GetString.\n * @param value \n * @param entity \n * @returns \n */\n export function GetGradientValue(value: IGradientValue, entity: Entity.IEntity): Color.IColor {\n const min = +value.points[0].position;\n const max = +value.points[value.points.length - 1].position;\n\n const attrPaths: string[][] = parseLegacyPath(value.field);\n for (let i = 0; i < attrPaths.length; i++) {\n const attrPath = attrPaths[i];\n let eValue: any = Entity.GetValue({\n entity: entity,\n path: attrPath\n });\n if (typeof eValue == \"string\") {\n eValue = Number(eValue);\n }\n\n if ((!eValue && eValue != 0) || isNaN(eValue)) {\n continue;\n }\n\n if (eValue >= max) {\n return Color.ColorFromStr(value.points[value.points.length - 1].color);\n }\n else if (eValue <= min) {\n return Color.ColorFromStr(value.points[0].color);\n }\n\n for (let i = 0; i < value.points.length - 1; i++) {\n const pointA = value.points[i];\n const pointB = value.points[i+1];\n\n if (eValue >= pointA.position && eValue <= pointB.position) {\n if (pointA.position == pointB.position) {\n return Color.ColorFromStr(pointA.color);\n }\n const distance = (eValue - pointA.position)/(pointB.position - pointA.position);\n const colorA = Color.ColorFromStr(pointA.color);\n const colorB = Color.ColorFromStr(pointB.color);\n return {\n red: colorA.red + (colorB.red - colorA.red) * distance,\n green: colorA.green + (colorB.green - colorA.green) * distance,\n blue: colorA.blue + (colorB.blue - colorA.blue) * distance,\n alpha: colorA.alpha + (colorB.alpha - colorA.alpha) * distance\n }\n }\n }\n }\n return Color.ColorFromStr(value.points[0].color);\n }\n\n /**\n * Calculates an input value. This can return any value type.\n * It is intended to be parsed and validated within a value-type context. Eg: GetColor, GetNumber, GetString.\n * @param value \n * @param entity \n * @returns \n */\n export function GetInputValue(value: string, entity: Entity.IEntity): string | number {\n if (typeof value == \"string\") {\n try {\n value = BruceVariable.SwapValues({\n str: value,\n entity: entity\n });\n\n const isJsEval = value.startsWith(\"JS:\");\n const MATH_REGEX = /(\\d+\\.?\\d*|\\.\\d+)([+\\-*/])(\\d+\\.?\\d*|\\.\\d+)/;\n const isMathEval = isJsEval || MATH_REGEX.test(value);\n\n if (isJsEval || isMathEval) {\n if (isJsEval) {\n value = value.replace(\"JS:\", \"\");\n value = value.trim();\n }\n\n // https://rollupjs.org/guide/en/#avoiding-eval\n // This stops eval warning.\n const eval2 = eval;\n return eval2(value);\n }\n }\n catch (exception) {\n const e = exception as any;\n let suppress: boolean = false;\n if (e && typeof e == \"object\") {\n const msg: string = e.message;\n suppress = !!msg && (msg.includes(\"Unexpected end\") || msg.includes(\"got end of script\"));\n }\n if (!suppress) {\n console.error(e);\n }\n }\n }\n return value;\n }\n}","import { Entity } from \"../entity/entity\";\nimport { Carto } from \"./carto\";\nimport { Geometry } from \"./geometry\";\n\nexport namespace Bounds {\n /**\n * Description of an entity's bounding box.\n */\n export interface IBounds {\n // Values are in degrees.\n maxLatitude: number;\n maxLongitude: number;\n minLatitude: number;\n minLongitude: number;\n // Values are in meters.\n maxAltitude?: number;\n minAltitude?: number;\n }\n\n /**\n * Describes the boundaries used in entity requests.\n */\n export interface IReqBounds {\n south: number;\n west: number;\n north: number;\n east: number;\n\n // Used to exclude requests from UI that fall outside of min-max boundaries.\n // TODO: Migrate into \"entity-filter-getter.ts\", \"entity-globe.ts\" and then remove from here.\n alt?: number;\n }\n\n /**\n * Calculates boundaries from entity.\n * This will not use the entity's boundaries and instead calculate from geometry and location.\n * @param entity \n */\n export function FromEntity(entity: Entity.IEntity): IBounds {\n const bounds: IBounds = {\n maxAltitude: null,\n maxLatitude: null,\n maxLongitude: null,\n minAltitude: null,\n minLatitude: null,\n minLongitude: null\n };\n const points: Carto.ICarto[] = [];\n\n const location = Entity.GetValue({\n entity: entity,\n path: [\"Bruce\", \"Location\"]\n })\n if (location) {\n points.push(location);\n }\n\n const geometry = Entity.GetValue({\n entity: entity,\n path: [\"Bruce\", \"VectorGeometry\"]\n });\n const processGeometry = (geometry: Geometry.IGeometry, depth = 0) => {\n if (!geometry || depth > 5) {\n return;\n }\n if (geometry.Point) {\n points.push(...Geometry.ParsePoints(geometry.Point));\n }\n if (geometry.LineString) {\n points.push(...Geometry.ParsePoints(geometry.LineString));\n }\n if (geometry.Polygon) {\n for (const ring of geometry.Polygon) {\n points.push(...Geometry.ParsePoints(ring.LinearRing));\n }\n }\n if (geometry.MultiGeometry) {\n for (const multiGeometry of geometry.MultiGeometry) {\n processGeometry(multiGeometry, depth + 1);\n }\n }\n };\n\n processGeometry(geometry);\n \n for (const point of points) {\n if (bounds.maxLatitude == null || point.latitude > bounds.maxLatitude) {\n bounds.maxLatitude = point.latitude;\n }\n if (bounds.maxLongitude == null || point.longitude > bounds.maxLongitude) {\n bounds.maxLongitude = point.longitude;\n }\n if (bounds.maxAltitude == null || point.altitude > bounds.maxAltitude) {\n bounds.maxAltitude = point.altitude;\n }\n if (bounds.minLatitude == null || point.latitude < bounds.minLatitude) {\n bounds.minLatitude = point.latitude;\n }\n if (bounds.minLongitude == null || point.longitude < bounds.minLongitude) {\n bounds.minLongitude = point.longitude;\n }\n if (bounds.minAltitude == null || point.altitude < bounds.minAltitude) {\n bounds.minAltitude = point.altitude;\n }\n }\n \n return bounds;\n }\n}","interface IBruceEventCallback {\n _id: number;\n removeCallback: () => void;\n callback: (data: any) => void;\n}\n\n/**\n * Simple event utility.\n * Instantiate the model, then subscribe and trigger events.\n */\nexport class BruceEvent<TArgs> {\n // Counter to help differentiate subscriptions.\n private _counter: number = 0;\n // Record of all callback subscriptions for this event.\n private callbacks: IBruceEventCallback[] = [];\n\n /**\n * Subscribes to this event.\n * The provided callback will be called when the event is triggered.\n * @param callback \n * @returns A function that can be called to unsubscribe from this event.\n */\n public Subscribe(callback: (data: TArgs) => void): (() => void) {\n let id = this._counter++;\n let newBruceEventCallback: IBruceEventCallback = {\n \t_id: id,\n \tremoveCallback: () => {\n \t\tthis.Unsubscribe(id);\n \t},\n \tcallback: callback\n };\n this.callbacks.push(newBruceEventCallback);\n return newBruceEventCallback.removeCallback;\n }\n\n /**\n * Unsubscribes from this event.\n * @param id specific subscription entry to remove.\n * @warning please use the returned function from Subscribe() instead of this function.\n */\n public Unsubscribe(id: number): void {\n let index = this.callbacks.findIndex(x => x._id == id);\n if (index > -1) {\n this.callbacks.splice(index, 1);\n }\n }\n\n /**\n * Triggers this event with optional data.\n * This will call all subscribed callbacks.\n * @param data \n */\n public Trigger(data?: TArgs): void {\n let callbacks = this.callbacks;\n for (let i = 0; i < callbacks.length; i++) {\n let callback = callbacks[i];\n if (callback.callback) {\n callback.callback(data);\n }\n }\n }\n\n /**\n * Clears all subscriptions.\n */\n public Clear(): void {\n this.callbacks = [];\n }\n}","export namespace Camera {\n export enum EFrustum {\n Perspective,\n Orthographic\n }\n}","/**\n * Describes 2d and 3d coordinates.\n * \n * In 2d the x/y typically refers to a window left/top offset.\n * In 3d the x/y/z, the units are in meters.\n */\nexport namespace Cartes {\n export interface ICartes2 {\n x: number;\n y: number;\n }\n\n export interface ICartes3 extends ICartes2 {\n z: number;\n }\n\n export function ValidateCartes2(cartes: ICartes2): boolean {\n if (!cartes) {\n return false;\n }\n else if (!cartes.x && cartes.x != 0) {\n return false;\n }\n else if (!cartes.y && cartes.y != 0) {\n return false;\n }\n return true;\n }\n\n export function ValidateCartes3(cartes: ICartes3): boolean {\n if (!ValidateCartes2(cartes)) {\n return false;\n }\n else if (!cartes.z && cartes.z != 0) {\n return false;\n }\n return true;\n }\n\n export function IsEqualCartes2(a: ICartes2, b: ICartes2): boolean {\n if (a.x != b.x) {\n return false;\n }\n else if (a.y != b.y) {\n return false;\n }\n return true;\n }\n\n export function IsEqualCartes3(a: ICartes3, b: ICartes3): boolean {\n if (!IsEqualCartes2(a, b)) {\n return false;\n }\n else if (a.z != b.z) {\n return false;\n }\n return true;\n }\n\n /**\n * Returns true if the given ring is closed.\n * A ring is closed if the first and last point are equal.\n * A ring with less than 2 points is not closed.\n * @param points \n * @returns \n */\n export function IsRing2Closed(points: ICartes2[]) {\n if (points.length < 2) {\n return false;\n }\n else if (!IsEqualCartes2(points[0], points[points.length - 1])) {\n return false;\n }\n return true;\n }\n\n /**\n * Returns true if the given ring is closed.\n * A ring is closed if the first and last point are equal.\n * A ring with less than 2 points is not closed.\n * @param points \n * @returns \n */\n export function IsRing3Closed(points: ICartes3[]) {\n if (points.length < 2) {\n return false;\n }\n else if (!IsEqualCartes3(points[0], points[points.length - 1])) {\n return false;\n }\n return true;\n }\n\n /**\n * Closes given ring by adding the first point to the end of the array.\n * This will mutate the given array.\n * Will not do anything if the ring is already closed.\n * @param points \n * @returns \n */\n export function CloseRing2(points: ICartes2[]) {\n if (points.length < 2) {\n return;\n }\n else if (IsRing2Closed(points)) {\n return;\n }\n points.push(points[0]);\n }\n\n /**\n * Closes given ring by adding the first point to the end of the array.\n * This will mutate the given array.\n * Will not do anything if the ring is already closed.\n * @param points \n * @returns \n */\n export function CloseRing3(points: ICartes3[]) {\n if (points.length < 2) {\n return;\n }\n else if (IsRing3Closed(points)) {\n return;\n }\n points.push(points[0]);\n }\n}","/**\n * Describes a geographic point.\n * The units of the stored data should be in Degrees.\n * Utilities may use this in Radians for temporary calculations.\n */\nexport namespace Carto {\n export interface ICarto {\n latitude: number;\n longitude: number;\n altitude: number;\n }\n\n export function ValidateCarto(carto: ICarto): boolean {\n if (!carto) {\n return false;\n }\n else if (!carto.longitude && carto.longitude != 0) {\n return false;\n }\n else if (!carto.latitude && carto.latitude != 0) {\n return false;\n }\n return true;\n }\n\n export function IsEqual(a: ICarto, b: ICarto): boolean {\n if (a.longitude != b.longitude) {\n return false;\n }\n else if (a.latitude != b.latitude) {\n return false;\n }\n return true;\n }\n\n export function GetCenter(list: ICarto[]): ICarto {\n let center = { \n longitude: 0, \n latitude: 0, \n altitude: 0 \n };\n for (let i = 0; i < list.length; i++) {\n const carto = list[i];\n center.longitude += carto.longitude;\n center.latitude += carto.latitude;\n if (carto.altitude) {\n center.altitude += carto.altitude;\n }\n }\n if (center.longitude) {\n center.longitude /= list.length;\n }\n if (center.latitude) {\n center.latitude /= list.length;\n }\n if (center.altitude) {\n center.altitude /= list.length;\n }\n return center;\n }\n}","/**\n * Controls the flow of method calls.\n * If you have a method that may be called often, but you don't want it to run often, use this.\n */\nexport class DelayQueue {\n // The callback is the method we want to control queue for.\n private callback: () => void;\n // Millisecond delay.\n public delay: number = 200;\n // Date-time stamp for the last callback call.\n private lastCallTime: number = <any>null;\n // The delay timeout for calling update.\n private delayTimeout: any;\n\n constructor(callback: () => void, delay: number = 200) {\n this.callback = callback;\n this.delay = delay;\n }\n\n /**\n * Request a call on the callback.\n * @param force If true, the callback will be called immediately.\n */\n public Call(force: boolean = false): void {\n if (this.lastCallTime == null) {\n force = true;\n }\n if (force) {\n let endDate = new Date().getTime();\n this.doCall(endDate);\n }\n else {\n const endDate = new Date().getTime();\n const seconds = (endDate - this.lastCallTime) / 1000;\n const delay = this.delay / 1000;\n if (seconds > delay) {\n this.doCall(endDate);\n }\n else if (this.delayTimeout == null) {\n const diff = (delay - seconds) * 1000;\n this.delayTimeout = setTimeout(() => {\n this.delayTimeout = null;\n this.Call();\n }, diff + 0.02);\n }\n }\n }\n\n private doCall(endDate: number): void {\n if (this.delayTimeout != null) {\n clearTimeout(this.delayTimeout);\n this.delayTimeout = null;\n }\n this.lastCallTime = endDate;\n this.callback();\n }\n\n /**\n * Dispose of this object.\n */\n public Dispose(): void {\n if (this.delayTimeout != null) {\n clearTimeout(this.delayTimeout);\n this.delayTimeout = null;\n }\n }\n}","/**\n * Describes a Bruce stored date.\n */\nexport namespace UTC {\n export enum EMonth {\n January = 1,\n February = 2,\n March = 3,\n April = 4,\n May = 5,\n June = 6,\n July = 7,\n August = 8,\n September = 9,\n October = 10,\n November = 11,\n December = 12\n }\n\n export interface IUTC {\n d: number;\n hh: number;\n m: EMonth | number;\n mm: number;\n ss: number;\n y: number;\n }\n\n /**\n * Returns an ISO 8601 string representation of the provided date.\n * @param utc \n */\n export function ToString(utc: IUTC): string {\n return ToDate(utc).toISOString();\n }\n\n export function ToDate(utc: IUTC): Date {\n return new Date(Date.UTC(utc.y, utc.m - 1, utc.d, utc.hh, utc.mm, utc.ss, 0));\n }\n\n export function FromDate(utc: Date): IUTC {\n return {\n y: utc.getUTCFullYear(),\n m: utc.getUTCMonth() + 1,\n d: utc.getUTCDate(),\n hh: utc.getUTCHours(),\n mm: utc.getUTCMinutes(),\n ss: utc.getUTCSeconds()\n };\n }\n\n /**\n * Returns how many seconds have passed between two dates.\n * If the second date is not provided, it will be the current date.\n * @param from \n * @param to \n * @returns \n */\n export function GetPassedSeconds(from: IUTC, to?: IUTC): number {\n if (!to) {\n to = FromDate(new Date());\n }\n const fromTime = ToDate(from).getTime();\n const toTime = ToDate(to).getTime();\n return Math.floor((toTime - fromTime) / 1000);\n }\n\n /**\n * Returns a human-readable string that describes how much time has passed since the provided date.\n * @param utc \n */\n export function GetPassedTime(utc: IUTC): string {\n const passedSeconds = GetPassedSeconds(utc);\n if (passedSeconds < 60) {\n return `${passedSeconds} second${passedSeconds > 1 ? \"s\" : \"\"} ago`;\n }\n const passedMinutes = Math.floor(passedSeconds / 60);\n if (passedMinutes < 60) {\n return `${passedMinutes} minute${passedMinutes > 1 ? \"s\" : \"\"} ago`;\n }\n const passedHours = Math.floor(passedMinutes / 60);\n if (passedHours < 24) {\n return `${passedHours} hour${passedHours > 1 ? \"s\" : \"\"} ago`;\n }\n const passedDays = Math.floor(passedHours / 24);\n if (passedDays < 30) {\n return `${passedDays} day${passedDays > 1 ? \"s\" : \"\"} ago`;\n }\n const passedMonths = Math.floor(passedDays / 30);\n if (passedMonths < 12) {\n return `${passedMonths} month${passedMonths > 1 ? \"s\" : \"\"} ago`;\n }\n const passedYears = Math.floor(passedMonths / 12);\n return `${passedYears} year${passedYears > 1 ? \"s\" : \"\"} ago`;\n }\n\n /**\n * Returns a human-readable string that describes the provided date.\n * If a timezone is not provided then it will use the locale timezone.\n * @param utc \n * @param timezone\n */\n export function GetDateTime(utc: IUTC, timezone?: string): string {\n const date = ToDate(utc);\n // Possibly could just pass the timezone and it might get ignored if missing.\n if (timezone) {\n return date.toLocaleString(\"en-US\", { \n timeZone: timezone,\n hour12: true,\n hour: \"numeric\",\n minute: \"numeric\",\n year: \"2-digit\",\n month: \"2-digit\",\n day: \"2-digit\"\n }) + \" \" + getTimezoneName(timezone);\n }\n return date.toLocaleString(undefined, { \n hour12: true, \n hour: \"numeric\", \n minute: \"numeric\", \n year: \"2-digit\", \n month: \"2-digit\", \n day: \"2-digit\" \n });\n }\n}\n\n// Found here https://stackoverflow.com/questions/9772955/how-can-i-get-the-timezone-name-in-javascript\n// Formats a given timezone into a human readable format.\nfunction getTimezoneName(timezone: string): string {\n const today = new Date();\n const short = today.toLocaleDateString(undefined, { timeZone: timezone });\n const full = today.toLocaleDateString(undefined, { timeZoneName: \"long\", timeZone: timezone });\n\n // Trying to remove date from the string in a locale-agnostic way\n const shortIndex = full.indexOf(short);\n if (shortIndex >= 0) {\n const trimmed = full.substring(0, shortIndex) + full.substring(shortIndex + short.length);\n\n // by this time `trimmed` should be the timezone's name with some punctuation -\n // trim it from both sides\n return trimmed.replace(/^[\\s,.\\-:;]+|[\\s,.\\-:;]+$/g, \"\");\n }\n\n // in some magic case when short representation of date is not present in the long one, \n // just return the long one as a fallback, since it should contain the timezone's name\n return full;\n}","/**\n * A simple LRU cache implementation.\n * LRU cache is a cache that evicts the least recently used item when it is full.\n */\nexport class LRUCache<TKey, TValue> {\n private readonly capacity: number;\n private readonly cache: Map<TKey, TValue>;\n\n constructor(capacity: number) {\n this.capacity = capacity;\n this.cache = new Map<TKey, TValue>();\n }\n\n /**\n * Get a value from the cache.\n * @param key \n * @returns \n */\n public Get(key: TKey): TValue | undefined {\n const value = this.cache.get(key);\n if (value) {\n this.cache.delete(key);\n this.cache.set(key, value);\n }\n return value;\n }\n\n /**\n * Set a value in the cache.\n * @param key \n * @param value \n */\n public Set(key: TKey, value: TValue): void {\n if (this.cache.size >= this.capacity) {\n const leastRecentlyUsedKey = this.cache.keys().next().value;\n this.cache.delete(leastRecentlyUsedKey);\n }\n this.cache.set(key, value);\n }\n\n public Entries(): IterableIterator<[TKey, TValue]> {\n return this.cache.entries();\n }\n\n public Clear() {\n this.cache.clear();\n }\n}\n","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { ENVIRONMENT } from \"../environment\";\n\ntype Type = EntityAttachmentType.EType | string;\n\n/**\n * Describes the \"Entity Attachment Type\" concept within Nextspace.\n * It is a record that describes the purpose of an attachment.\n */\nexport namespace EntityAttachmentType {\n /**\n * Describes an attachment type record.\n */\n export interface IType {\n // Attachment type description.\n Description: string;\n // Attachment type ID.\n ID: Type;\n // Human readable attachment type name.\n Name: string;\n }\n\n // Known attachment types.\n export enum EType {\n // Attachments with this type will appear in the media tab within the entity details.\n Photo = \"photo\",\n Document = \"document\"\n }\n\n /**\n * Gets an attachment type record by ID.\n * @param params \n * @returns \n */\n export async function Get(params: {\n attachmentTypeId: Type;\n api?: BruceApi.Api,\n req?: Api.IReqParams\n }): Promise<{\n attachmentType: IType\n }> {\n let { api, attachmentTypeId, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n if (!attachmentTypeId) {\n throw(\"Type ID is required.\");\n }\n\n reqParams = Api.PrepReqParams(reqParams);\n const cacheData = api.GetCacheItem(GetCacheKey(attachmentTypeId), reqParams);\n if (cacheData?.found) {\n return cacheData.data;\n }\n const prom = api.GET(`entityAttachmentType/${attachmentTypeId}`, Api.PrepReqParams(reqParams));\n api.SetCacheItem({\n key: GetCacheKey(attachmentTypeId),\n value: prom,\n req: reqParams\n });\n return prom;\n }\n\n /**\n * Deletes an attachment type.\n * @param params \n */\n export async function Delete(params: {\n api?: BruceApi.Api,\n // The attachment type ID to delete.\n attachmentTypeId: Type,\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, attachmentTypeId, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n if (!attachmentTypeId) {\n throw(\"Type ID is required.\");\n }\n await api.DELETE(`entityAttachmentType/${attachmentTypeId}`, Api.PrepReqParams(reqParams));\n api.Cache.Remove(GetCacheKey(attachmentTypeId));\n api.Cache.Remove(GetListCacheKey());\n }\n\n /**\n * Creates or updates an attachment type.\n * @param params \n * @returns \n */\n export async function Update(params: {\n api?: BruceApi.Api,\n // The attachment type to create or update.\n attachmentType: IType,\n req?: Api.IReqParams\n }): Promise<{\n attachmentType: IType\n }> {\n let { api, attachmentType: data, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n if (!data?.ID) {\n throw(\"Type ID is required.\");\n }\n const res = await api.POST(`entityAttachmentType/${data.ID}`, data, Api.PrepReqParams(reqParams));\n api.Cache.Remove(GetCacheKey(data.ID));\n api.Cache.Remove(GetListCacheKey());\n return {\n attachmentType: res\n };\n }\n\n /**\n * Gets a list of all attachment types.\n * @param params \n * @returns \n */\n export async function GetList(params: {\n api?: BruceApi.Api,\n req?: Api.IReqParams\n }): Promise<{\n // The list of attachment types.\n attachmentTypes: IType[]\n }> {\n let { api, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const cache = await api.GetCacheItem(GetListCacheKey(), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const req: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(`entityAttachmentTypes`, Api.PrepReqParams(reqParams));\n res({\n attachmentTypes: data.Items\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key: GetListCacheKey(),\n value: req,\n req: reqParams\n });\n return req;\n }\n\n /**\n * Returns cache identifier for an attachment type by ID.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetCacheKey(\"123\");\n * api.Cache.Remove(key);\n * }\n * @param id \n * @returns \n */\n export function GetCacheKey(id: Type): string {\n return Api.ECacheKey.AttachmentType + Api.ECacheKey.Id + id;\n }\n \n /**\n * Returns cache identifier for a list of attachment types.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetListCacheKey();\n * api.Cache.Remove(key);\n * }\n * @param typeId \n * @returns \n */\n export function GetListCacheKey(): string {\n return Api.ECacheKey.AttachmentType;\n }\n}","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { ClientFile } from \"../client-file/client-file\";\nimport { ENVIRONMENT } from \"../environment\";\nimport { EntityAttachmentType } from \"./entity-attachment-type\";\n\ntype Type = EntityAttachmentType.EType | string;\n\n/**\n * Describes the \"Entity Attachment\" concept within Nextspace.\n * An entity attachment is an arbitrary file record that is linked to an entity record.\n * The same file can be attached to multiple entities.\n */\nexport namespace EntityAttachment {\n /**\n * Describes an attachment record.\n */\n export interface IAttachment {\n // Attachment ID.\n ID: number;\n // Associated client file record.\n ClientFile?: ClientFile.IFile;\n // Associated client file ID.\n \"ClientFile.ID\": string;\n // Display order among sibling attachments.\n DisplayOrder?: number;\n // Entity this attachment is associated with.\n \"Entity.ID\": string;\n // Attachment type ID.\n \"EntityAttachmentType.ID\": Type;\n // @deprecated. Use attachment types as groups.\n Group?: string;\n }\n\n /**\n * Updates one or many attachment records.\n * @param params \n * @returns \n */\n export async function Update(params: {\n api?: BruceApi.Api,\n // The entity ID the record is associated with.\n entityId: string,\n // Attachments to update.\n attachments: IAttachment[],\n req?: Api.IReqParams\n }): Promise<{\n attachments: IAttachment[]\n }> {\n let { api, attachments, req, entityId } = params;\n if (!attachments?.length) {\n return Promise.resolve({\n attachments: []\n });\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const res = await api.POST(`entity/${entityId}/attachments`, {\n attachments\n }, Api.PrepReqParams(req));\n for (let i = 0; i < attachments.length; i++) {\n if (attachments[i].ID) {\n api.Cache.Remove(GetCacheKey(attachments[i].ID));\n }\n }\n await api.Cache.Remove(GetListCacheKey(entityId));\n return {\n attachments: res.attachments\n };\n }\n\n /**\n * Updates the display order of attachments.\n * @param params \n */\n export async function UpdateOrder(params: {\n api?: BruceApi.Api,\n // The entity ID the record is associated with.\n entityId: string,\n // The attachment type ID.\n attachmentTypeId: Type,\n // Attachments to update.\n attachments: IAttachment[],\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, entityId, attachmentTypeId: typeId, attachments, req: reqParams } = params;\n if (!entityId || !typeId) {\n throw(\"Entity ID and Type ID are required.\");\n }\n if (!attachments?.length) {\n return Promise.resolve();\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const reqData = {\n \t\"DisplayOrder.Start\": 0,\n \t\"ClientFile.ID\": attachments.map(x => x[\"ClientFile.ID\"])\n };\n await api.POST(`entity/${entityId}/attachments/${typeId}/setOrder`, reqData, Api.PrepReqParams(reqParams));\n for (let i = 0; i < attachments.length; i++) {\n api.Cache.Remove(GetCacheKey(attachments[i].ID));\n }\n await api.Cache.RemoveByStartsWith(GetListCacheKey(entityId));\n }\n\n /**\n * Deletes an attachment record.\n * @param params \n */\n export async function Delete(params: {\n api?: BruceApi.Api,\n entityId: string,\n attachmentId: number,\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, attachmentId, entityId, req } = params;\n if (!attachmentId || !entityId) {\n throw(\"Entity id and attachment id.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n await api.DELETE(`entity/${entityId}/attachments/${attachmentId}`, Api.PrepReqParams(req));\n await api.Cache.Remove(GetCacheKey(attachmentId));\n await api.Cache.Remove(GetListCacheKey(params.entityId));\n }\n\n /**\n * Gets a list of attachments for an entity.\n * @param params \n * @returns \n */\n export async function GetListByEntityId(params: {\n api?: BruceApi.Api,\n // The entity ID to get attachments for.\n entityId: string,\n req?: Api.IReqParams\n }): Promise<{\n // The list of attachments.\n attachments: IAttachment[]\n }> {\n let { api, entityId, req: reqParams } = params;\n if (!entityId) {\n throw(\"Entity ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const cache = await api.GetCacheItem(GetListCacheKey(entityId), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const req: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(`entity/${entityId}/attachments`, Api.PrepReqParams(reqParams));\n res({\n attachments: (data.attachments ? data.attachments : data.Items)\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key: GetListCacheKey(entityId),\n value: req,\n req: reqParams\n });\n return req;\n }\n\n /**\n * Uploads a file as an attachment to an entity.\n * This will create a client file record for the file.\n * @param params \n * @returns \n */\n export async function Upload(params: {\n api?: BruceApi.Api,\n // The file to upload.\n file: File,\n // The entity ID to attach the file to.\n entityId: string,\n // The attachment type ID.\n attachmentTypeId: Type,\n req?: Api.IUploadReqParams\n }): Promise<{\n // The created attachment record.\n attachment: IAttachment\n }> {\n let { api, file, entityId, attachmentTypeId: typeId, req: reqParams } = params;\n if (!entityId || !typeId || !file) {\n throw(\"Entity ID, Type ID, and File are required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const url = `entity/${entityId}/attachment/${typeId}`;\n const res = await api.UPLOAD(url, file, Api.PrepReqParams(reqParams));\n api.Cache.Remove(GetListCacheKey(entityId));\n return {\n attachment: res\n };\n }\n\n /**\n * Returns cache identifier for an attachment by ID.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetCacheKey(\"123\");\n * api.Cache.Remove(key);\n * }\n * @param id \n * @returns \n */\n export function GetCacheKey(id: number): string {\n return Api.ECacheKey.Attachment + Api.ECacheKey.Id + id;\n }\n\n /**\n * Returns cache identifier for a list of attachments for an entity.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetListCacheKey(\"abc\");\n * api.Cache.Remove(key);\n * }\n * @param typeId \n * @returns \n */\n export function GetListCacheKey(entityId: string): string {\n return Api.ECacheKey.Attachment + Api.ECacheKey.Entity + Api.ECacheKey.Id + entityId;\n }\n}","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { UTC } from \"../common/utc\";\nimport { ENVIRONMENT } from \"../environment\";\n\n/**\n * Describes the \"Entity Comment\" concept within Nextspace.\n * An entity comment is a user written message that is linked to an entity record.\n * \n * @deprecated: The Navigator now uses Entity records directly.\n * a utility is being made to manage those records.\n */\nexport namespace EntityComment {\n /**\n * Describes a comment record.\n */\n export interface IComment {\n // Comment text.\n Comment: string;\n // User who created the comment.\n \"Created.ByUser.ID\": string;\n // Date the comment was created.\n \"Created.Date\": UTC.IUTC;\n // Comment ID.\n ID: number;\n // Cache of the number of replies to this comment.\n // Real number is calculated by traversing child comments.\n RepliesCount: number;\n // Comment this comment is a reply to.\n \"ReplyTo.Comment.ID\": number;\n // Target we're commenting on. Typically an entity ID.\n \"TargetObject.ID\": string;\n // Type of target we're commenting on. Typically an entity type ID.\n \"TargetObject.Type\": string;\n }\n\n /**\n * Creates or updates a comment.\n * @param params \n * @returns \n */\n export async function Update(params: {\n api?: BruceApi.Api,\n // The comment to create or update.\n comment: IComment,\n req?: Api.IReqParams\n }): Promise<{\n // The created or updated comment.\n comment: IComment\n }> {\n let { api, comment: data, req: reqParams } = params;\n if (!data?.[\"TargetObject.ID\"]) {\n throw(\"TargetObject.ID (entity id) is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const url = `entity/${data[\"TargetObject.ID\"]}/comment` + (data.ID == null ? \"\" : \"/\" + data.ID);\n const res = await api.POST(url, data, Api.PrepReqParams(reqParams));\n api.Cache.Remove(GetCacheKey(data.ID));\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Comment + Api.ECacheKey.Entity);\n\n return {\n comment: res\n };\n }\n\n /**\n * Deletes a comment.\n * @param params \n */\n export async function Delete(params: {\n api?: BruceApi.Api,\n // The entity ID to delete the comment from.\n entityId: string,\n // The comment ID to delete.\n commentId: number,\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, entityId, commentId, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n if (!commentId) {\n throw(\"Comment ID is required.\");\n }\n await api.DELETE(`entity/${entityId}/comment/${commentId}`, Api.PrepReqParams(reqParams));\n api.Cache.Remove(GetCacheKey(commentId));\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Comment + Api.ECacheKey.Entity);\n }\n\n /**\n * Gets a list of comments for an entity.\n * @param params \n * @returns \n */\n export async function GetListByEntityId(params: {\n api?: BruceApi.Api,\n // The entity ID to get comments for.\n entityId: string,\n req?: Api.IReqParams\n }): Promise<{\n // The list of comments.\n comments: IComment[]\n }> {\n let { api, entityId, req: reqParams } = params;\n if (!entityId) {\n throw(\"Entity ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const cache = await api.GetCacheItem(GetListCacheKey(entityId), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const req: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(`entity/${entityId}/comments`, Api.PrepReqParams(reqParams));\n res({\n comments: data.Items\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key: GetListCacheKey(entityId),\n value: req,\n req: reqParams\n });\n return req;\n }\n\n /**\n * Returns cache identifier for a comment by ID.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetCacheKey(\"123\");\n * api.Cache.Remove(key);\n * }\n * @param id \n * @returns \n */\n export function GetCacheKey(id: number): string {\n return Api.ECacheKey.Comment + Api.ECacheKey.Id + id;\n }\n \n /**\n * Returns cache identifier for a list of comments for an entity.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetListCacheKey(\"abc\");\n * api.Cache.Remove(key);\n * }\n * @param entityId \n * @returns \n */\n export function GetListCacheKey(entityId: string): string {\n return Api.ECacheKey.Comment + Api.ECacheKey.Entity + Api.ECacheKey.Id + entityId;\n }\n}","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { ENVIRONMENT } from \"../environment\";\n\n/**\n * Describes the \"Entity Link\" concept within Nextspace.\n * An entity link is an external URL linked to an entity record.\n */\nexport namespace EntityLink {\n /**\n * Describes a link record.\n */\n export interface ILink {\n // Human readable name of the link.\n DisplayName: string;\n // Link ID.\n ID?: number;\n // ID of the entity this link is linked to.\n \"Entity.ID\": string;\n // URL of the link.\n URL: string;\n }\n\n /**\n * Creates or updates a link record.\n * @param params \n * @returns \n */\n export async function Update(params: {\n api?: BruceApi.Api,\n // Link record to create or update.\n link: ILink,\n req?: Api.IReqParams\n }): Promise<{\n // The link record.\n link: ILink\n }> {\n let { api, link: data, req: reqParams } = params;\n if (!data?.[\"Entity.ID\"]) {\n throw(\"Entity ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const url = `entity/${data[\"Entity.ID\"]}/link` + (data.ID == null ? \"\" : \"/\" + data.ID);\n const res = await api.POST(url, data, Api.PrepReqParams(reqParams));\n api.Cache.Remove(GetCacheKey(<number>data.ID));\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Link + Api.ECacheKey.Entity);\n\n return {\n link: res\n };\n }\n\n /**\n * Deletes a link record.\n * @param params \n */\n export async function Delete(params: {\n api?: BruceApi.Api,\n // The entity ID to delete the link from.\n entityId: string,\n // The link ID to delete.\n linkId: number,\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, entityId, linkId, req: reqParams } = params;\n if (!linkId || !entityId) {\n throw(\"Link ID and Entity ID are required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n \n await api.DELETE(`entity/${entityId}/link/${linkId}`, Api.PrepReqParams(reqParams));\n api.Cache.Remove(GetCacheKey(linkId));\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Link + Api.ECacheKey.Entity);\n }\n\n /**\n * Returns a list of links for an entity.\n * @param params \n * @returns \n */\n export async function GetListByEntityId(params: {\n api?: BruceApi.Api,\n // The entity ID to get links for.\n entityId: string,\n req?: Api.IReqParams\n }): Promise<{\n // The list of links.\n links: ILink[]\n }> {\n let { api, entityId, req: reqParams } = params;\n if (!entityId) {\n throw(\"Entity ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const cache = await api.GetCacheItem(GetListCacheKey(entityId), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const req: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(`entity/${entityId}/links`, Api.PrepReqParams(reqParams));\n res({\n links: data.Items\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key: GetListCacheKey(entityId),\n value: req,\n req: reqParams\n });\n return req;\n }\n\n /**\n * Returns cache identifier for a link record.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetCacheKey(1);\n * api.Cache.Remove(key);\n * }\n * @param id \n * @returns \n */\n export function GetCacheKey(id: number): string {\n return Api.ECacheKey.Link + Api.ECacheKey.Id + id;\n }\n \n /**\n * Returns cache identifier for a list of links for an entity.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetListCacheKey(\"abc\");\n * api.Cache.Remove(key);\n * }\n * @param entityId \n * @returns \n */\n export function GetListCacheKey(entityId: string): string {\n return Api.ECacheKey.Link + Api.ECacheKey.Entity + Api.ECacheKey.Id + entityId;\n }\n}","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { ClientFile } from \"../client-file/client-file\";\nimport { ENVIRONMENT } from \"../environment\";\n\n/**\n * Describes the \"Entity LOD\" concept within Nextspace.\n * LOD stands for Level of Detail.\n * An lod record is a possible 2d/3d visualization of the entity record.\n * The most common kind is a GLB.\n */\nexport namespace EntityLod {\n /**\n * Describes an entity lod record.\n * This is a 2d/3d visualization of the entity record.\n * The most common kind is a GLB.\n */\n export interface ILod {\n // Corresponding client file record.\n ClientFile?: ClientFile.IFile;\n // ID of the related client file record.\n \"ClientFile.ID\": string;\n // ID of the related entity record.\n \"Entity.ID\": string;\n // Entity Type ID for LOD records that are tied to a type rather than an Entity.\n \"EntityType.ID\"?: string;\n // ID of the lod category.\n \"LODCategory.Key\": string;\n // Level of detail. 0 is the highest.\n Level: number;\n // LOD group within its entity type.\n Group?: string;\n }\n\n /**\n * Describes an entity lod record update.\n */\n export interface IEntityLodUpdate {\n // ID of the related client file record.\n \"ClientFile.ID\": string;\n // ID of the lod category.\n \"LODCategory.Key\": string;\n // Level of detail. 0 is the highest.\n Level: number;\n }\n\n /**\n * Returns a url for an entity lod record file.\n * @param params \n * @returns \n */\n export function GetUrl(params: {\n api?: BruceApi.Api,\n // ID of the related entity record.\n entityId: string,\n // ID of the lod category.\n categoryId: string,\n // Level of detail. 0 is the highest.\n level: number,\n // Whether to use strict mode.\n // When not strict it will find the closest level of detail available.\n strict?: boolean\n }): {\n // Url for the entity lod record file.\n url: string\n } {\n let { api, entityId, categoryId, level, strict } = params;\n if (!entityId) {\n throw(\"Entity ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n if (!categoryId) {\n categoryId = \"GLB\";\n }\n if (!level) {\n level = 0;\n }\n return {\n url: api.ConstructUrl({\n url: `entity/${entityId}/lod/${categoryId}/${level}`,\n urlParams: {\n \"strict\": strict ? \"true\" : \"false\"\n }\n })\n };\n }\n\n /**\n * Returns the client file id for an entity lod record file.\n * @param params \n * @returns \n */\n export async function GetUrlFileId(params: {\n api?: BruceApi.Api,\n // Url for the entity lod record file.\n url: string,\n req?: Api.IReqParams\n }): Promise<{\n // ID of the related client file record.\n clientFileId: string\n }> {\n let { api, url, req: reqParams } = params;\n if (!url) {\n throw(\"Url is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const cache = await api.GetCacheItem(GetCacheKey(url), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const req: Promise<any> = new Promise(async (res, rej) => {\n try {\n const record: ILod = await api.get(url, Api.PrepReqParams(reqParams));\n res({\n clientFileId: record[\"ClientFile.ID\"]\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key: GetCacheKey(url),\n value: req,\n req: reqParams\n });\n return req;\n }\n\n /**\n * Returns lods for a specified filter.\n * @param params \n * @returns \n */\n export async function GetLods(params: {\n api?: BruceApi.Api,\n // Filter for the lods to return.\n filter: Filter.IListParams,\n req?: Api.IReqParams\n }): Promise<{\n // List of lods matching the specified filter.\n lods: Filter.IListResItem[]\n }> {\n let { api, filter, req: reqParams } = params;\n if (!filter?.Items?.length) {\n return Promise.resolve({\n lods: []\n });\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const data = await api.POST(\"entity/getlods\", filter, reqParams);\n return {\n lods: data.Items\n };\n }\n\n /**\n * Returns all lods for a specified entity.\n * @param params \n * @returns \n */\n export async function GetEntityLods(params: {\n api?: BruceApi.Api,\n // ID of the related entity record.\n entityId: string,\n req?: Api.IReqParams\n }): Promise<{\n // List of lods for the specified entity.\n lods: ILod[]\n }> {\n let { api, entityId, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n if (!entityId) {\n throw(\"Entity id is required.\");\n }\n const cache = await api.GetCacheItem(GetEntityListKey(entityId), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const req = api.GET(`entity/${entityId}/lods?includeClientFiles=yes`, Api.PrepReqParams(reqParams));\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await req;\n res({\n lods: data.Items\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key: GetEntityListKey(entityId),\n value: prom,\n req: reqParams\n });\n return prom;\n }\n\n /**\n * Returns lods for a specified entity type.\n * @param params\n */\n export async function GetTypeLods(params: {\n api?: BruceApi.Api,\n // ID of the related entity type record.\n entityTypeId: string,\n // LOD group within its entity type.\n group?: string,\n req?: Api.IReqParams\n }): Promise<{\n // List of lods for the specified entity type.\n lods: ILod[]\n }> {\n let { api, entityTypeId: typeId, group, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n if (!group) {\n group = \"DEFAULT\";\n }\n\n const cache = await api.GetCacheItem(GetTypeListKey(typeId, group), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const url = `entityType/${typeId}/lods?includeClientFiles=yes` + (group ? \"&group=\" + group : \"\");\n const req = api.GET(url, Api.PrepReqParams(reqParams));\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await req;\n res({\n lods: data.Items\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key: GetTypeListKey(typeId, group),\n value: prom,\n req: reqParams\n });\n return prom;\n }\n\n /**\n * Updates an entity lod record.\n * @param params \n * @returns \n */\n export async function Update(params: {\n api?: BruceApi.Api,\n // ID of the related entity record.\n entityId: string,\n req?: Api.IReqParams\n } & IEntityLodUpdate): Promise<void> {\n let { api, entityId, req: reqParams } = params;\n if (!params[\"ClientFile.ID\"] || !params[\"LODCategory.Key\"] || (!params.Level && params.Level !== 0)) {\n throw(\"ClientFile.ID, LODCategory.Key and Level are required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const res = await api.POST(`entity/${entityId}/lod/${params[\"LODCategory.Key\"]}/${params.Level}`, {\n \"Level\": params.Level,\n \"ClientFile.ID\": params[\"ClientFile.ID\"]\n }, Api.PrepReqParams(reqParams));\n api.Cache.Remove(GetEntityListKey(entityId));\n return res;\n }\n\n /**\n * Deletes an entity lod record.\n * @param params \n */\n export async function Delete(params: {\n api?: BruceApi.Api,\n // ID of the related entity record.\n entityId: string,\n // ID of the related lod category record.\n lodCategoryId: string,\n // Level of detail. 0 is the highest.\n level: number,\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, entityId, lodCategoryId, level, req: reqParams } = params;\n if (!entityId || !lodCategoryId) {\n throw(\"Entity ID and LOD Category ID are required.\");\n }\n level = +level;\n if (isNaN(level)) {\n throw(\"Level is required. It must be a number.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n await api.POST(`entity/${entityId}/deleteLODs`, {\n Items: [{ \"LODCategory.Key\": lodCategoryId, \"Level\": level }]\n }, Api.PrepReqParams(reqParams));\n api.Cache.Remove(GetEntityListKey(entityId));\n }\n\n /**\n * Describes a filter for getting entity lods.\n */\n export namespace Filter {\n export interface IListParamsItem {\n // ID of the related entity record.\n \"entityId\": string,\n // ID of the related lod category record.\n \"categoryId\": string,\n // LOD group within its entity type.\n \"group\"?: string,\n // Level of detail. 0 is the highest.\n \"level\"?: number\n }\n\n export interface IListParams {\n // Whether to use strict mode.\n // When not strict it will find the closest level of detail available.\n \"strict\": boolean,\n // Whether to traverse external sources. This is much slower.\n \"externalSources\": boolean,\n // List of entity lod filter items.\n \"Items\": IListParamsItem[]\n }\n\n export interface IListResItem {\n // ID of the lod client file.\n clientFileId: string;\n // ID of the related entity record.\n entityId: string;\n // Client account ID where the lod client file is stored.\n accountId: string;\n }\n }\n\n /**\n * Returns cache identifier for an entity lod record.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetCacheKey(\"abc\");\n * api.Cache.Remove(key);\n * }\n * @param url \n * @returns \n */\n export function GetCacheKey(url: string): string {\n return Api.ECacheKey.Lod + Api.ECacheKey.Id + url;\n }\n \n /**\n * Returns cache identifier for a list of entity lods.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetListCacheKey(\"abc\", \"def\");\n * api.Cache.Remove(key);\n * }\n * @param typeId \n * @param group \n * @returns \n */\n export function GetTypeListKey(typeId: string, group: string): string {\n return Api.ECacheKey.Lod + Api.ECacheKey.EntityType + typeId + Api.ECacheKey.Id + group;\n }\n \n /**\n * Returns cache identifier for a list of entity lods.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetListCacheKey(\"abc\");\n * api.Cache.Remove(key);\n * }\n * @param entityId \n * @returns \n */\n export function GetEntityListKey(entityId: string): string {\n return Api.ECacheKey.Lod + Api.ECacheKey.Entity + entityId;\n }\n}","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { ENVIRONMENT } from \"../environment\";\n\n/**\n * Describes the \"Entity LOD Category\" concept within Nextspace.\n * An LOD category is a level of categorization for LODs.\n * This is typically used to group LODs by their extension.\n */\nexport namespace EntityLodCategory {\n /**\n * Describes an entity lod category record.\n */\n export interface ICategory {\n // Description of the category.\n Description?: string;\n // Unique identifier for the category.\n // This is case-insensitive.\n Key: string;\n // Name of the category.\n Name: string;\n }\n\n /**\n * Returns a list of entity lod categories.\n * @param params \n * @returns \n */\n export async function GetList(params: {\n api?: BruceApi.Api,\n req?: Api.IReqParams\n }): Promise<{\n // List of entity lod categories.\n categories: ICategory[]\n }> {\n let { api, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const cache = await api.GetCacheItem(GetListCacheKey(), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const req: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(\"lodCategories\", Api.PrepReqParams(reqParams));\n res({\n categories: data.Items\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key: GetListCacheKey(),\n value: req,\n req: reqParams\n });\n return req;\n }\n\n /**\n * Returns an entity lod category record matching the specified id.\n * @param params \n * @returns \n */\n export async function Get(params: {\n api?: BruceApi.Api,\n // The id of the entity lod category record to return.\n categoryId: string,\n req?: Api.IReqParams\n }): Promise<{\n // Entity lod category record.\n category: ICategory\n }> {\n let { api, categoryId: id, req: reqParams } = params;\n if (!id) {\n throw(\"Lod category id is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const cache = await api.GetCacheItem(GetCacheKey(id), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const req: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(`lodCategory/${id}`, Api.PrepReqParams(reqParams));\n res({\n category: data\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key: GetCacheKey(id),\n value: req,\n req: reqParams\n });\n return req;\n }\n\n /**\n * Deletes an entity lod category record matching the specified id.\n * @param params \n */\n export async function Delete(params: {\n api?: BruceApi.Api,\n // The id of the entity lod category record to delete.\n categoryId: string,\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, categoryId: id, req: reqParams } = params;\n if (!id) {\n throw(\"Lod category id is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n await api.DELETE(`lodCategory/${id}`, Api.PrepReqParams(reqParams));\n api.Cache.Remove(GetCacheKey(id));\n api.Cache.Remove(GetListCacheKey());\n }\n\n /**\n * Creates or updates an entity lod category record.\n * @param params \n * @returns \n */\n export async function Update(params: {\n api?: BruceApi.Api,\n // The entity lod category record to create or update.\n category: ICategory,\n req?: Api.IReqParams\n }): Promise<{\n // Entity lod category record.\n category: ICategory\n }> {\n let { api, category: data, req: reqParams } = params;\n if (!data.Key || !data.Name) {\n throw(\"Lod category key and name are required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const res = await api.POST(`lodCategory/${data.Key}`, data, Api.PrepReqParams(reqParams));\n api.Cache.Remove(GetCacheKey(data.Key));\n api.Cache.Remove(GetListCacheKey());\n\n return {\n category: res\n };\n }\n\n /**\n * Returns cache identifier for an entity lod category record.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetCacheKey(\"abc\");\n * api.Cache.Remove(key);\n * }\n * @param id \n * @returns \n */\n export function GetCacheKey(id: string): string {\n return Api.ECacheKey.LodCategory + Api.ECacheKey.Id + id;\n }\n \n /**\n * Returns cache identifier for a list of entity lod categories.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetListCacheKey();\n * api.Cache.Remove(key);\n * }\n * @returns \n */\n export function GetListCacheKey(): string {\n return Api.ECacheKey.LodCategory;\n }\n}","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { ENVIRONMENT } from \"../environment\";\nimport { ObjectUtils } from \"../util/object-utils\";\n\n/**\n * Describes the \"Entity Relationship Type\" concept within Nextspace.\n * A relationship type record describes the purpose of a relationship.\n */\nexport namespace EntityRelationType {\n /**\n * Describes an entity relation type record.\n */\n export interface IType {\n // ID of the relation type.\n ID: string;\n // Name of the \"parent to child\" direction.\n ForwardName: string;\n // Name of the \"child to parent\" direction.\n ReverseName: string;\n // Name of the relationship type as a whole.\n Name: string;\n // If the drawn direction should be flipped.\n // A drawn direction is the 3D parabola that is drawn between related entities.\n FlipDisplayDirection?: boolean;\n // Style ID for the rendered relationship.\n EntityDisplaySettingID?: string | number;\n // ID of the entity type used to define the schema.\n \"Relation.EntityType.ID\"?: string;\n }\n\n /**\n * Gets a single entity relation type record.\n * @param params \n * @returns \n */\n export async function Get(params: {\n api?: BruceApi.Api,\n // ID of the entity relation type.\n relationTypeId: string,\n req?: Api.IReqParams\n }): Promise<{\n // Entity relation type record.\n relationType: IType\n }> {\n let { api, relationTypeId: typeId, req: reqParams } = params;\n if (!typeId) {\n throw(\"Type ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const key = GetCacheKey(typeId);\n const cache = await api.GetCacheItem(key, reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(`entityRelationType/${typeId}`, Api.PrepReqParams(reqParams));\n res({\n relationType: data\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key,\n value: prom,\n req: reqParams\n });\n return prom;\n }\n\n /**\n * Deletes an entity relation type record.\n * @param params \n */\n export async function Delete(params: {\n api?: BruceApi.Api,\n // ID of the entity relation type.\n relationTypeId: string,\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, relationTypeId: typeId, req: reqParams } = params;\n if (!typeId) {\n throw(\"Type ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n await api.DELETE(`entityRelationType/${typeId}`, Api.PrepReqParams(reqParams));\n api.Cache.Remove(GetCacheKey(typeId));\n api.Cache.Remove(GetListCacheKey());\n }\n\n /**\n * Gets a list of entity relation type records.\n * @param params \n * @returns \n */\n export async function GetList(params: {\n api?: BruceApi.Api,\n req?: Api.IReqParams\n }): Promise<{\n // List of entity relation type records.\n relationTypes: IType[]\n }> {\n let { api, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const cache = await api.GetCacheItem(GetListCacheKey(), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const req: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(\"entityRelationTypes\", Api.PrepReqParams(reqParams));\n res({\n relationTypes: data.Items\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key: GetListCacheKey(),\n value: req,\n req: reqParams\n });\n return req;\n }\n\n /**\n * Creates or updates an entity relation type record.\n * @param params \n * @returns \n */\n export async function Update(params: {\n api?: BruceApi.Api,\n // Entity relation type record to create or update.\n relationType: IType,\n req?: Api.IReqParams\n }): Promise<{\n // Entity relation type record.\n relationType: IType\n }> {\n let { api, relationType: data, req: reqParams } = params;\n if (!data?.ForwardName || !data?.ReverseName) {\n throw(\"Forward and reverse names are required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n if (!data.ID) {\n data.ID = ObjectUtils.UId();\n }\n const res = await api.POST(`entityRelationType/${data.ID}`, data, Api.PrepReqParams(reqParams));\n api.Cache.Remove(GetCacheKey(data.ID));\n api.Cache.Remove(GetListCacheKey());\n return {\n relationType: res\n };\n }\n\n /**\n * Returns cache identifier for an entity relation type record.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetCacheKey(\"abc\");\n * api.Cache.Remove(key);\n * }\n * @param id \n * @returns \n */\n export function GetCacheKey(id: string): string {\n return Api.ECacheKey.RelationType + Api.ECacheKey.Id + id;\n }\n\n /**\n * Returns cache identifier for a list of entity relation types.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetListCacheKey();\n * api.Cache.Remove(key);\n * }\n * @returns \n */\n export function GetListCacheKey(): string {\n return Api.ECacheKey.RelationType;\n }\n}","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { ENVIRONMENT } from \"../environment\";\nimport { Entity } from \"./entity\";\n\n/**\n * Describes the \"Entity Relationship\" concept within Nextspace.\n * An entity relationship is an arbitrary link between two entity records.\n * The relationship can have a \"data entity\" linked to it as well for the relationship to store arbitrary data about itself.\n */\nexport namespace EntityRelation {\n /**\n * Describes an entity relation record.\n */\n export interface IRelation {\n // ID of the principal (parent) entity.\n \"Principal.Entity.ID\": string;\n // ID of the related (child) entity.\n \"Related.Entity.ID\": string;\n // Related entity data.\n RelatedEntity?: Entity.IEntity;\n // Principal entity data.\n PrincipalEntity?: Entity.IEntity;\n // ID of the relation type.\n \"Relation.Type.ID\": string;\n // Relation type data.\n RelationType?: any;\n // ID of the data entity.\n // The data entity is where the relationship attribute data is stored.\n \"Data.Entity.ID\"?: string;\n }\n\n export interface IListParams {\n // ID of the relation type.\n relationTypeId?: string;\n // If the relation should be one-way only.\n // If false only child relationships will be loaded for the entity.\n oneWayOnly?: boolean;\n // If entity data should be loaded for the related entities.\n loadEntityData?: boolean;\n }\n\n /**\n * Creates a new entity relation.\n * @param params \n */\n export async function Create(params: {\n api?: BruceApi.Api,\n // Entity relation data.\n relation: IRelation,\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, relation: data, req: reqParams } = params;\n if (!data[\"Principal.Entity.ID\"] || !data[\"Related.Entity.ID\"] || !data[\"Relation.Type.ID\"]) {\n throw(\"Principal Entity ID, Related Entity ID, and Relation Type ID are required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const reqData = {\n \"Related.Entity.ID\": [data[\"Related.Entity.ID\"]]\n };\n const url = `entity/${data[\"Principal.Entity.ID\"]}/relation/${data[\"Relation.Type.ID\"]}/add`;\n await api.POST(url, reqData, Api.PrepReqParams(reqParams));\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Relation + Api.ECacheKey.Id + data[\"Principal.Entity.ID\"]);\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Relation + Api.ECacheKey.Id + data[\"Related.Entity.ID\"]);\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Relation + Api.ECacheKey.RelationType);\n if (data[\"Data.Entity.ID\"]) {\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Relation + Api.ECacheKey.Entity + Api.ECacheKey.Id + data[\"Data.Entity.ID\"]);\n }\n }\n\n /**\n * Deletes an entity relation.\n * @param params \n */\n export async function Delete(params: {\n api?: BruceApi.Api,\n // ID of the principal (parent) entity.\n principalEntityId: string,\n // ID of the related (child) entity.\n relatedEntityId: string,\n // ID of the relation type.\n relationTypeId: string,\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, principalEntityId, relatedEntityId, relationTypeId, req: reqParams } = params;\n if (!principalEntityId || !relatedEntityId || !relationTypeId) {\n throw new Error(\"Principal Entity ID, Related Entity ID, and Relation Type ID are required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const url = `entity/${principalEntityId}/relation/${relationTypeId}/delete`;\n await api.POST(url, {\n \"Related.Entity.ID\": [relatedEntityId]\n }, Api.PrepReqParams(reqParams));\n\n // Remove related cache entries\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Relation + Api.ECacheKey.Id + principalEntityId);\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Relation + Api.ECacheKey.Id + relatedEntityId);\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Relation + Api.ECacheKey.RelationType + Api.ECacheKey.Id + relationTypeId);\n }\n\n /**\n * Updates an entity relation.\n * Eg: data entity ID was changed.\n * @param params \n */\n export async function Update(params: {\n api?: BruceApi.Api,\n // Entity relation data.\n relation: IRelation,\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, relation: data, req: reqParams } = params;\n if (!data[\"Principal.Entity.ID\"] || !data[\"Related.Entity.ID\"] || !data[\"Relation.Type.ID\"]) {\n throw(\"Principal Entity ID, Related Entity ID, and Relation Type ID are required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const url = `entity/${data[\"Principal.Entity.ID\"]}/otherEntityID/${data[\"Related.Entity.ID\"]}/relation/${data[\"Relation.Type.ID\"]}/update`;\n const res = await api.POST(url, data, Api.PrepReqParams(reqParams));\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Relation + Api.ECacheKey.Id + data[\"Principal.Entity.ID\"]);\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Relation + Api.ECacheKey.Id + data[\"Related.Entity.ID\"]);\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Relation + Api.ECacheKey.RelationType + Api.ECacheKey.Id + data[\"Relation.Type.ID\"]);\n if (data[\"Data.Entity.ID\"]) {\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Relation + Api.ECacheKey.Entity + Api.ECacheKey.Id + data[\"Data.Entity.ID\"]);\n }\n }\n\n /**\n * Returns a list of relationships for an entity.\n * @param params \n * @returns \n */\n export async function GetList(params: {\n api?: BruceApi.Api,\n // ID of the entity to get relationships for.\n entityId: string,\n // Filter parameters.\n filter: IListParams,\n req?: Api.IReqParams\n }): Promise<{\n // List of entity relations.\n relations: IRelation[]\n }> {\n let { api, entityId, filter, req: reqParams } = params;\n if (!entityId) {\n throw(\"Entity ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n filter = {\n relationTypeId: \"\",\n oneWayOnly: false,\n loadEntityData: false,\n ...filter\n }\n const cache = await api.GetCacheItem(GetListCacheKey(entityId, filter), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const req: Promise<any> = new Promise(async (res, rej) => {\n try {\n let url = `entity/${entityId}/relations`;\n if (filter.relationTypeId) {\n url += \"/\" + filter.relationTypeId;\n }\n url += `?Oneway=${filter.oneWayOnly}&LoadInfo=${filter.loadEntityData}`;\n const data = await api.GET(url, Api.PrepReqParams(reqParams));\n res({\n relations: data.Items\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key: GetListCacheKey(entityId, filter),\n value: req,\n req: reqParams\n });\n return req;\n }\n\n /**\n * Returns an entity relationship by the data entity ID.\n * @param params \n * @returns \n */\n export async function GetByDataEntityId(params: {\n api?: BruceApi.Api,\n // ID of the data entity.\n entityId: string,\n req?: Api.IReqParams\n }): Promise<{\n // Entity relation record.\n relation: IRelation\n }> {\n let { api, entityId, req: reqParams } = params;\n if (!entityId) {\n throw(\"Entity ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const cache = await api.GetCacheItem(GetEntityCacheKey(entityId), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(`entity/relation/${entityId}/dataentity`, Api.PrepReqParams(reqParams));\n res({\n relation: data\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key: GetEntityCacheKey(entityId),\n value: prom,\n req: reqParams\n });\n return prom;\n }\n\n /**\n * Returns cache identifier for an entity relation record.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetCacheKey(\"abc\", \"def\", \"ghi\");\n * api.Cache.Remove(key);\n * }\n * @param id \n * @returns \n */\n export function GetCacheKey(entityA: string, entityB: string, typeId: string): string {\n return `${Api.ECacheKey.Relation}${Api.ECacheKey.Id}${entityA}${Api.ECacheKey.Id}${entityB}${Api.ECacheKey.Id}${typeId}`;\n }\n \n /**\n * Returns cache identifier for a list of entity relations.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetCacheKey(\"abc\");\n * api.Cache.Remove(key);\n * }\n * @param id \n * @returns \n */\n export function GetEntityCacheKey(entityId: string): string {\n return Api.ECacheKey.Relation + Api.ECacheKey.Entity + Api.ECacheKey.Id + entityId;\n }\n \n /**\n * Returns cache identifier for a list of entity relations.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetCacheKey(\"abc\", {...});\n * api.Cache.Remove(key);\n * }\n * @param id \n * @returns \n */\n export function GetListCacheKey(entityId: string, params: IListParams): string {\n return Api.ECacheKey.Relation + Api.ECacheKey.RelationType +\n Api.ECacheKey.Id + params.relationTypeId +\n Api.ECacheKey.Id + params.oneWayOnly +\n Api.ECacheKey.Id + params.loadEntityData +\n Api.ECacheKey.Entity + Api.ECacheKey.Id + entityId;\n }\n}","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { IDictionary } from \"../common/dictionary\";\nimport { ENVIRONMENT } from \"../environment\";\n/**\n * Describes the \"Entity Source\" concept within Nextspace.\n * An entity source is a record which links an arbitrary source id to a Nextspace entity id.\n * For example an OSM building id to a Nextspace entity id.\n */\nexport namespace EntitySource {\n /**\n * Describes an entity source record.\n */\n export interface ISource {\n // ID of the data source.\n \"Source.ID\": number;\n // ID of the Nextspace entity.\n \"Entity.ID\": string;\n // Key of the external source entity.\n \"SourceRecord.Key\": string;\n }\n\n /**\n * Returns an entity source record for the given source id and source key.\n * @param params \n * @returns \n */\n export async function Get(params: {\n api?: BruceApi.Api,\n // ID of the data source.\n sourceId: number,\n // ID of the external source entity.\n sourceKey: string,\n req?: Api.IReqParams\n }): Promise<{\n // Entity source record.\n source: ISource\n }> {\n let { api, sourceId, sourceKey, req: reqParams } = params;\n if (!sourceId || !sourceKey) {\n throw(\"Source ID and Source Key are required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const res = await GetListByKeys({\n api: api,\n sourceId: sourceId,\n sourceKeys: [sourceKey],\n req: reqParams\n })\n return {\n source: res.sources?.length ? res.sources[0] : null\n };\n }\n\n /**\n * Returns a list of entity source records for the given source id and source keys.\n * @param params \n * @returns \n */\n export async function GetListByKeys(params: {\n api?: BruceApi.Api,\n // ID of the data source.\n sourceId: number,\n // Array of external source IDs.\n sourceKeys: string[],\n req?: Api.IReqParams\n }): Promise<{\n // Array of entity source records.\n sources: ISource[]\n }> {\n let { api, sourceId, sourceKeys, req: reqParams } = params;\n if (!sourceId) {\n throw(\"Source ID is required.\");\n }\n if (!sourceKeys?.length) {\n return Promise.resolve({\n sources: []\n });\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const reqKeys: string[] = [];\n const reqs: Promise<ISource>[] = [];\n for (let i = 0; i < sourceKeys.length; i++) {\n const sourceKey = sourceKeys[i];\n const cache = await api.GetCacheItem(GetCacheKey(sourceId, sourceKey), reqParams);\n if (cache?.found) {\n reqs.push(cache.data);\n }\n else {\n reqKeys.push(sourceKey);\n }\n }\n if (reqKeys.length) {\n const prom: Promise<ISource[]> = new Promise(async (res, rej) => {\n try {\n const data = await api.POST(`entitysource/${sourceId}`, { SourceRecordKeys: reqKeys }, Api.PrepReqParams(reqParams));\n res(data.Items);\n }\n catch (e) {\n rej(e);\n }\n });\n for (let i = 0; i < reqKeys.length; i++) {\n const req: Promise<ISource> = new Promise(async (res, rej) => {\n try {\n const sources = await prom;\n res(<ISource>sources.find((s: ISource) => s[\"SourceRecord.Key\"] === reqKeys[i]));\n }\n catch (e) {\n rej(<any>e);\n }\n });\n reqs.push(req);\n }\n }\n return {\n sources: (await Promise.all(reqs)).filter(x => !!x)\n };\n }\n\n /**\n * Returns a mapping of entity source records for the given source id and source keys.\n * @param params \n * @returns \n */\n export async function GetEntityIdsBySourceKeys(params: {\n api?: BruceApi.Api,\n // ID of the data source.\n sourceId: number,\n // Array of external source IDs.\n sourceKeys: string[],\n req?: Api.IReqParams\n }): Promise<{\n // Source key to entity id mapping.\n idMapping: IDictionary<string>\n }> {\n let { api, sourceId, sourceKeys, req: reqParams } = params;\n if (!sourceId) {\n throw(\"Source ID and Source Keys are required.\");\n }\n if (!sourceKeys?.length) {\n return Promise.resolve({\n idMapping: {}\n });\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const result: IDictionary<string> = {};\n if (sourceKeys.length > 0) {\n const {sources} = await GetListByKeys({\n api,\n sourceId,\n sourceKeys,\n req: reqParams\n });\n for (let i = 0; i < sources.length; i++) {\n const source = sources[i];\n for (let i = 0; i < sourceKeys.length; i++) {\n const key = sourceKeys[i];\n if (key == source[\"SourceRecord.Key\"]) {\n result[key] = source[\"Entity.ID\"];\n }\n }\n }\n }\n return {\n idMapping: result\n };\n }\n\n /**\n * Creates a new entity source record.\n * @param params \n * @returns \n */\n export async function CreateLink(params: {\n api?: BruceApi.Api\n // Entity source record.\n source: ISource\n }): Promise<{\n // Created entity source record.\n source: ISource\n }> {\n let {source, api} = params;\n if (!source[\"Entity.ID\"] || !source[\"Source.ID\"] || !source[\"SourceRecord.Key\"]) {\n throw(\"Entity ID, Source ID and Source Key are required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const res = await api.POST(\"entitysource\", source);\n const cacheKey = GetCacheKey(source[\"Source.ID\"], source[\"SourceRecord.Key\"]);\n await api.Cache.Remove(cacheKey);\n return {\n source: res\n }\n }\n\n /**\n * Returns cache identifier for an entity source record.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetCacheKey(1, \"def\");\n * api.Cache.Remove(key);\n * }\n * @param sourceId\n * @param sourceKey \n * @returns \n */\n export function GetCacheKey(sourceId: number, sourceKey: string): string {\n return `${Api.ECacheKey.EntitySource}${Api.ECacheKey.Id}${sourceId}${Api.ECacheKey.Id}${sourceKey}`;\n }\n}","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { ENVIRONMENT } from \"../environment\";\n\n/**\n * Describes the \"Entity Tag\" concept within Nextspace.\n * An entity tag is used to categorize an entity record.\n * Entity tags can be used in filters, or to restrict entity access.\n */\nexport namespace EntityTag {\n /**\n * Describes an entity tag record.\n */\n export interface ITag {\n // ID of the tag.\n ID: number;\n // Human readable name of the tag.\n Name?: string;\n // Description of the tag.\n Description?: string;\n // If tag access (and tagged entity access) should be restricted.\n // When a tag is restricted a user must have the \"Layer_<tag_id>\" permission to view the tag.\n IsAccessRestricted?: boolean;\n // If the tag is restricted to a specific entity type.\n \"EntityType.ID\"?: string;\n // Colour of the tag to use when styling entities or displaying a tag icon.\n Color?: string;\n // Parent tag ID.\n // Purely for organizational purposes.\n \"Parent.Layer.ID\"?: number;\n }\n\n /**\n * Returns an entity tag record for the given tag id.\n * @param params \n * @returns \n */\n export async function Get(params: {\n api?: BruceApi.Api,\n // ID of the tag.\n tagId: number,\n req?: Api.IReqParams\n }): Promise<{\n // Entity tag record.\n tag: ITag\n }> {\n let { api, tagId, req: reqParams } = params;\n if (!tagId) {\n throw(\"Tag ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const {tags} = await GetListByIds({\n api,\n tagIds: [tagId],\n req: reqParams\n });\n return {\n tag: tags.length ? tags[0] : null\n };\n }\n\n /**\n * Returns a list of entity tag records for the given tag ids.\n * @param params \n * @returns \n */\n export async function GetListByIds(params: {\n api?: BruceApi.Api,\n // Array of tag IDs.\n tagIds: number[],\n req?: Api.IReqParams\n }): Promise<{\n // Array of entity tag records.\n tags: ITag[]\n }> {\n let { api, tagIds, req: reqParams } = params;\n if (!tagIds.length) {\n return Promise.resolve({\n tags: []\n });\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const reqIds: number[] = [];\n const reqs: Promise<{ tag: ITag }>[] = [];\n for (let i = 0; i < tagIds.length; i++) {\n const tagId = tagIds[i];\n const cache = api.GetCacheItem(GetCacheKey(tagId), reqParams);\n if (cache?.found) {\n if (cache.data instanceof Promise) {\n // Request that is in progress.\n reqs.push(cache.data);\n }\n else if (cache.data) {\n // Direct tag record.\n if (cache.data.ID) {\n reqs.push({\n tag: cache.data\n } as any);\n }\n // Resolved promise. So an object with a \"tag\" property that contains the record.\n else {\n reqs.push(cache.data);\n }\n }\n }\n else {\n reqIds.push(tagId);\n }\n }\n\n if (reqIds.length) {\n const prom: Promise<ITag[]> = new Promise(async (res, rej) => {\n try {\n const data = await api.POST(\"layers/get\", { layerIds: reqIds }, Api.PrepReqParams(reqParams));\n res(data.Items);\n }\n catch (e) {\n rej(e);\n }\n });\n for (let i = 0; i < reqIds.length; i++) {\n const id = reqIds[i];\n const req: Promise<{ tag: ITag }> = new Promise(async (res, rej) => {\n try {\n const tags = await prom;\n const tag = tags.find((t: ITag) => t.ID === id);\n res({\n tag: tag\n });\n }\n catch (e) {\n rej(<any>e);\n }\n });\n await api.SetCacheItem({\n key: GetCacheKey(id),\n value: req,\n req: reqParams\n });\n reqs.push(req);\n }\n }\n \n return {\n tags: (await Promise.all(reqs)).map(x => x?.tag).filter(x => !!x)\n };\n }\n\n /**\n * Returns a list of entity tag records.\n * @param params \n * @returns \n */\n export async function GetList(params: {\n api?: BruceApi.Api,\n // ID of the entity type to filter by.\n entityTypeId?: string,\n req?: Api.IReqParams\n }): Promise<{\n // Array of entity tag records.\n tags: ITag[]\n }> {\n let { api, entityTypeId, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const cache = await api.GetCacheItem(GetListCacheKey(entityTypeId), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const req: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(entityTypeId ? `entityType/${entityTypeId}/layers` : \"layers\", Api.PrepReqParams(reqParams));\n res({\n tags: data.Items\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key: GetListCacheKey(entityTypeId),\n value: req,\n req: reqParams\n });\n return req;\n }\n\n /**\n * Deletes an entity tag record.\n * @param params \n */\n export async function Delete(params: {\n api?: BruceApi.Api,\n // ID of the tag.\n tagId: number,\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, tagId, req: reqParams } = params;\n if (!tagId) {\n throw(\"Tag ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n await api.DELETE(`layer/${tagId}`, Api.PrepReqParams(reqParams));\n api.Cache.Remove(GetCacheKey(tagId));\n await api.Cache.RemoveByStartsWith(GetListCacheKey());\n }\n\n /**\n * Creates or updates an entity tag record.\n * @param params \n * @returns \n */\n export async function Update(params: {\n api?: BruceApi.Api,\n // Entity tag record.\n tag: ITag,\n req?: Api.IReqParams\n }): Promise<{\n // Entity tag record.\n tag: ITag\n }> {\n let { api, tag: data, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n \n const url = data.ID ? `layer/${data.ID}` : \"layer\";\n const res = await api.POST(url, data, Api.PrepReqParams(reqParams));\n api.Cache.Remove(GetCacheKey(data.ID));\n await api.Cache.RemoveByStartsWith(GetListCacheKey());\n return {\n tag: res\n };\n }\n\n /**\n * Returns cache identifier for an entity tag record.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetCacheKey(1);\n * api.Cache.Remove(key);\n * }\n * @param tagId \n * @returns \n */\n export function GetCacheKey(tagId: number): string {\n return `${Api.ECacheKey.Tag}${Api.ECacheKey.Id}${tagId}`;\n }\n \n /**\n * Returns cache identifier for a list of entity tags.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetListCacheKey(\"abc\");\n * api.Cache.Remove(key);\n * }\n * @param entityTypeId \n * @returns \n */\n export function GetListCacheKey(entityTypeId?: string): string {\n if (entityTypeId) {\n return Api.ECacheKey.Tag + Api.ECacheKey.EntityType + Api.ECacheKey.Id + entityTypeId;\n }\n return Api.ECacheKey.Tag;\n }\n}","export namespace MathUtils {\n /**\n * Rounds a number to a given number of decimal places.\n * @param num \n * @param decimals \n * @returns \n */\n export function Round(num: number, decimals: number = 0): number {\n if (decimals <= 0) {\n return Math.round(num);\n }\n let tmp = \"1\";\n for (let i = 0; i < decimals; i++) {\n tmp += \"0\";\n }\n const d = parseFloat(tmp);\n return Math.round((num + Number.EPSILON) * d) / d;\n }\n\n /**\n * Returns a random integer between min (inclusive) and max (inclusive).\n * @param min \n * @param max \n * @returns \n */\n export function RandInt(min: number, max: number): number {\n if (min == max) {\n return min;\n }\n else if (min > max) {\n throw(\"Min is greater than max.\");\n }\n return Math.floor(Math.random() * (max - min + 1)) + min;\n }\n}","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { Carto } from \"../common/carto\";\nimport { Transform } from \"../common/transform\";\nimport { ENVIRONMENT } from \"../environment\";\nimport { MathUtils } from \"../util/math-utils\";\n\n/**\n * This is a utility to help calculate and manage UCS coordinates for entities.\n */\nexport namespace EntityCoords {\n export const UCS_ENTITY_TYPE_ID = \"Bruce_UCS_Type\";\n\n export interface ILocation extends Carto.ICarto {\n coordinates?: {\n // Original Entity where the X/Y/Z came from.\n \"Entity.ID\"?: string;\n // X/Y/Z offset from origin.\n x?: number;\n y?: number;\n z?: number;\n // Eg: \"EPSG:4326\".\n SRID?: string;\n }\n }\n\n /**\n * Describes a UCS record.\n */\n export interface IUcs {\n // Human readable name of the UCS.\n name: string;\n // ID of the UCS entity.\n \"Entity.ID\": string;\n // UCS location.\n location: ILocation;\n // UCS transform.\n transform: Transform.ITransform;\n }\n\n /**\n * Describes an Entity's coordinates.\n * This includes its own relative assembly position, and the UCS it references (if any).\n */\n export interface IEntityCoords {\n // The Entity's ID.\n \"Entity.ID\": string;\n // The UCS the entity is relative to (if any).\n ucs?: IUcs;\n // Entity's relative assembly position.\n position?: number[][];\n // Entity's transform to the UCS.\n // This allows independent rotation and offsetting from the UCS.\n transform?: Transform.ITransform;\n // Entity's independent location.\n // This is typically set when there is no UCS.\n location?: Carto.ICarto;\n }\n\n /**\n * Params for shifting an entity to be relative to a point.\n */\n export interface IRelToPointParams {\n // Point to be relative to.\n point: Carto.ICarto;\n // If this is a test. Tests are not saved.\n test: boolean;\n // Human readable name of the UCS.\n name?: string;\n }\n\n /**\n * Params for shifting an entity to be relative to an EPSG.\n */\n export interface IRelToEpsgParams {\n // EPSG to be relative to.\n epsg: number;\n // If this is a test. Tests are not saved.\n test: boolean;\n // Human readable name of the UCS.\n name?: string;\n }\n\n /**\n * Params for shifting an entity to be relative to a UCS.\n */\n export interface IRelToUcsParams {\n // UCS to be relative to.\n ucsId: string;\n // If this is a test. Tests are not saved.\n test: boolean;\n // Human readable name of the UCS.\n name?: boolean;\n }\n\n /**\n * Returns an entity's location with expanded UCS information.\n * @param params \n * @returns \n */\n export async function GetEntityCoords(params: {\n api?: BruceApi.Api,\n // Entity to get UCS for. Typically the root entity of a hierarchy.\n rootEntityId: string,\n req?: Api.IReqParams\n }): Promise<{\n // The UCS information for the entity.\n coords: IEntityCoords\n }> {\n let { api, rootEntityId: entityId, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const cache = await api.GetCacheItem(GetCacheKey(entityId), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(`entity/${entityId}/ucs`, reqParams);\n res({\n coords: data\n });\n } catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key: GetCacheKey(entityId),\n value: prom,\n req: reqParams\n });\n return prom;\n }\n\n /**\n * Returns coordinates for an entity when relative to a point.\n * @param params \n * @returns \n */\n export async function EntityRelativeToPoint(params: {\n api?: BruceApi.Api,\n // Entity to get UCS for. Typically the root entity of a hierarchy.\n rootEntityId: string,\n req?: Api.IReqParams\n } & IRelToPointParams): Promise<{\n // The UCS information for the entity.\n coords: IEntityCoords\n }> {\n let { api, rootEntityId: entityId, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n if (!params.test) {\n await UnlinkCoords({\n api,\n rootEntityId: entityId,\n req: reqParams\n });\n }\n const point = params.point;\n const name = params.name || `${MathUtils.Round(point.latitude, 4)}, ${MathUtils.Round(point.longitude, 4)}`;\n const res = await api.POST(`entity/${entityId}/ucs`, {\n \"ucs\": {\n \"Entity.ID\": null,\n \"name\": name,\n \"location\": {\n \"latitude\": point.latitude,\n \"longitude\": point.longitude,\n \"altitude\": point.altitude,\n \"coordinates\": {\n \"Entity.ID\": entityId\n }\n }\n },\n \"test\": params.test\n }, reqParams);\n if (!params.test) {\n api.Cache.Remove(GetCacheKey(entityId));\n }\n return {\n coords: res\n };\n }\n\n /**\n * Returns coordinates for an entity when relative to an EPSG.\n * @param params \n * @returns \n */\n export async function EntityRelativeToEpsg(params: {\n api?: BruceApi.Api,\n // Entity to get UCS for. Typically the root entity of a hierarchy.\n rootEntityId: string,\n req?: Api.IReqParams\n } & IRelToEpsgParams): Promise<{\n // The UCS information for the entity.\n coords: IEntityCoords\n }> {\n let { api, rootEntityId: entityId, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n if (!params.test) {\n await UnlinkCoords({\n api,\n rootEntityId: entityId,\n req: reqParams\n });\n }\n const epsg = params.epsg;\n const name = params.name ?? \"EPSG: \" + epsg;\n const res = await api.POST(`entity/${entityId}/ucs`, {\n \"ucs\": {\n \"Entity.ID\": null,\n \"name\": name,\n \"location\": {\n \"coordinates\": {\n \"SRID\": \"EPSG:\" + epsg,\n \"Entity.ID\": entityId\n }\n }\n },\n \"test\": params.test\n }, reqParams);\n if (!params.test) {\n api.Cache.Remove(GetCacheKey(entityId));\n }\n return {\n coords: res\n };\n }\n\n /**\n * Returns coordinates for an entity when relative to a UCS.\n * @param params \n * @returns \n */\n export async function EntityRelativeToUcs(params: {\n api?: BruceApi.Api,\n // Entity to get UCS for. Typically the root entity of a hierarchy.\n rootEntityId: string,\n req?: Api.IReqParams\n } & IRelToUcsParams): Promise<{\n // The UCS information for the entity.\n coords: IEntityCoords\n }> {\n let { api, rootEntityId: entityId, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n if (!params.test) {\n await UnlinkCoords({\n api,\n rootEntityId: entityId,\n req: reqParams\n });\n }\n const ucsId = params.ucsId;\n const res = await api.POST(`entity/${entityId}/ucs`, {\n \"ucs\": {\n \"Entity.ID\": ucsId\n },\n \"test\": params.test\n }, reqParams);\n if (!params.test) {\n api.Cache.Remove(GetCacheKey(entityId));\n }\n return {\n coords: res\n };\n }\n\n /**\n * Unlinks UCS coordinates from an entity.\n * @param params \n * @returns \n */\n export async function UnlinkCoords(params: {\n api?: BruceApi.Api,\n // Entity to get UCS for. Typically the root entity of a hierarchy.\n rootEntityId: string,\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, rootEntityId: entityId, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n return api.DELETE(`entity/${entityId}/ucs`, reqParams);\n }\n\n /**\n * Returns cache identifier for a UCS by entity id.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetCacheKey(\"123\");\n * api.Cache.Remove(key);\n * }\n * @param entityId \n * @returns \n */\n export function GetCacheKey(entityId: string): string {\n return Api.ECacheKey.EntityCoords + Api.ECacheKey.Entity + Api.ECacheKey.Id + entityId;\n }\n}","/**\n * Deprecated settings for entity types.\n * We now store selection settings within project views.\n */\nexport namespace EntityTypeVisualSettings {\n export enum EAction {\n LeftClick = \"LeftClick.CustomForm.ID\",\n RightClick = \"RightClick.CustomForm.ID\",\n DoubleClick = \"DoubleClick.CustomForm.ID\",\n MouseHover = \"MouseHover.CustomForm.ID\"\n }\n\n export interface ISettings {\n // Custom forms to display when a certain action is performed on related entities.\n // If the form is set to 0, that means use the default panel instead of a form.\n // When the form value is -1 that means don't display anything.\n CustomForms?: {\n // Default is 0.\n [EAction.LeftClick]?: number,\n // Default is -1.\n [EAction.RightClick]?: number,\n // Default is -1.\n [EAction.MouseHover]?: number,\n // Default is -1.\n [EAction.DoubleClick]?: number\n }\n }\n}","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { Calculator } from \"../calculator/calculator\";\nimport { ENVIRONMENT } from \"../environment\";\n\n/**\n * Represents a Table View record.\n * This is a record of how to display a collection of Entities.\n */\nexport namespace EntityTableView {\n export interface IView {\n ID?: number;\n DisplayName: string;\n Description?: string;\n Settings?: {\n // Array of allowed data-lab queries.\n // If empty, all queries are allowed.\n // If only one is set then the user is not prompted to select one.\n dataLabQueryIds?: number[];\n // When no columns are specified, some defaults will be populated.\n columns?: IColumn[];\n // Settings for the rows as a whole.\n row?: {\n // How to colour the row. If unset then it will be a default colour.\n // If set, a calculation is performed against the row's Entity to determine the colour.\n bgColor?: Calculator.IField[];\n }\n };\n }\n\n /**\n * Represents a column in a table view.\n */\n export interface IColumn {\n // Name of the column.\n name: string;\n // Path to the attribute.\n // In some column types this not present as the value is a known calculated type.\n attrPath?: string;\n // Attribute is an editable box, text just displays the contents.\n type: \"ATTRIBUTE\" | \"TEXT\" | \"NAME\" | \"CALCULATOR\";\n \n // Settings specific to the calculator special type.\n // CalcType allows the table to know what kind of value to expect.\n calcType?: \"COLOR\" | \"NUMBER\" | \"PROGRESS_BAR\" | \"TEXT\" | \"FONT_AWESOME_ICON\";\n // Value to pass into our calculator alongside the Entity data.\n calcValue?: Calculator.IField[];\n // Min/Max values for the progress bar.\n // This can be either fixed or calculated per-entity based on the Entity data.\n calcProgressBarMin?: Calculator.IField[];\n calcProgressBarMax?: Calculator.IField[];\n\n // For FontAwesomeIcon, this is the color of the icon.\n // In the future this may impact other things like the cell text.\n color?: Calculator.IField[];\n // For FontAwesomeIcon, this is the background color of the cell.\n // In the future this may impact other cell types.\n bgColor?: Calculator.IField[];\n }\n \n /**\n * Returns a record matching the given viewId.\n * @param params \n */\n export async function Get(params: {\n viewId: number;\n api?: BruceApi.Api;\n req?: Api.IReqParams;\n }): Promise<{\n view: IView;\n }> {\n let { viewId, api, req } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n req = Api.PrepReqParams(req);\n\n const res = await api.GET(`ui.tableview/${viewId}`, req);\n\n return {\n view: res\n };\n }\n\n /**\n * Returns the list of all available Table Views.\n * @param params \n */\n export async function GetList(params?: {\n api?: BruceApi.Api;\n req?: Api.IReqParams;\n }): Promise<{\n views?: IView[];\n }> {\n if (!params) {\n params = {};\n }\n let { api, req } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n req = Api.PrepReqParams(req);\n\n const res = await api.GET(\"ui.tableviews\", req);\n let items = res?.Items;\n if (!items) {\n items = [];\n }\n\n return {\n views: items\n }\n }\n\n /**\n * Creates or updates a Table View record.\n */\n export async function Update(params: {\n view: IView;\n api?: BruceApi.Api;\n req?: Api.IReqParams;\n }): Promise<{\n view: IView;\n }> {\n let { view, api, req } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n req = Api.PrepReqParams(req);\n\n let viewId = view.ID;\n if (!viewId) {\n // New record.\n viewId = 0;\n }\n const res = await api.POST(`ui.tableview/${viewId}`, view, req);\n\n return {\n view: res\n };\n }\n\n /**\n * Deletes a Table View record.\n * @param params \n */\n export async function Delete(params: {\n viewId: number;\n api?: BruceApi.Api;\n req?: Api.IReqParams;\n }): Promise<void> {\n let { viewId, api, req } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n req = Api.PrepReqParams(req);\n return await api.DELETE(`ui.tableview/${viewId}`, req);\n }\n}","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { Calculator } from \"../calculator/calculator\";\nimport { ENVIRONMENT } from \"../environment\";\n\n/**\n * Describes the \"Style\" concept within Nextspace.\n * A legacy way of referring to styles is \"entity display settings\".\n *\n * A style is a collection of settings (which can be calculations to perform on entity data) that\n * describe how an entity should be displayed.\n */\nexport namespace Style {\n /**\n * Types of styles available.\n * The type will dictate what settings are available.\n */\n export enum EType {\n Entity = \"ENTITY\",\n EntityRelationship = \"ENTITY_RELATIONSHIP\"\n }\n\n /**\n * Available types of points.\n * Default is POINT.\n */\n export enum EPointType {\n // Render a sphere with a fixed pixel size.\n Point = \"POINT\",\n // Render an icon.\n Icon = \"ICON\",\n // Render a cylinder with a fixed meter size.\n Cylinder = \"CYLINDER\"\n }\n\n /**\n * Settings for rendering points\n */\n export interface IPointSettings {\n // The type of point. This helps dictate what settings are relevant.\n // The default when unspecific will be \"POINT\".\n Type?: EPointType;\n // CSS color string to use for the point.\n // Only used for the \"POINT\" type.\n color?: Calculator.IField[];\n // The size in pixels of the point.\n // This is only relevant for \"POINT\" types. For \"ICON\" types the size is dictated by the icon image itself.\n // This must resolve in a number to be valid, otherwise it'll default to the application's default value.\n size?: Calculator.IField[];\n // Client file ID of the icon to load.\n // This is to use in place of an icon URL.\n iconId?: string;\n // The url to load an icon from.\n // This is only relevant for \"ICON\" types.\n iconUrl?: Calculator.IField[];\n // The scale factor of the icon.\n // This is only relevant for \"ICON\" types.\n // For example a 50x50 icon with a scale of 2 will render as 100x100 on the screen.\n // This must resolve in a number to be valid, otherwise it'll default to the application's default value.\n iconScale?: Calculator.IField[];\n // The colour to apply to the icon.\n // When empty or null, the icon will render as is.\n iconTintColor?: Calculator.IField[];\n // This dictates what the altitude value of an Entity should mean.\n // For example if you set this to be clamp-to-ground then the altitude value will be ignored.\n // Default is clamped to ground.\n altitudeOption?: any;\n // Indicates if depth-test should be disabled which forces the point to render above all other entities.\n // This is currently for icon points exclusively.\n renderOnTop?: boolean;\n // To review.\n CylinderFillColor?: Calculator.IField[];\n CylinderFillExtrusion?: Calculator.IField[];\n CylinderRadius?: Calculator.IField[];\n CylinderBorderEnabled?: boolean;\n CylinderBorderExtrusion?: Calculator.IField[];\n CylinderBorderWidth?: Calculator.IField[];\n CylinderBorderColor?: Calculator.IField[];\n // To remove.\n ClusterNearbyEntities?: boolean;\n MinimumEntitiesCountForClustering?: Calculator.IField[];\n }\n\n /**\n * Settings for rendering polygons.\n */\n export interface IPolygonSettings {\n // If the polygon should be extruded.\n useExtrusion: boolean;\n // The height of the extrusion in meters.\n // This must resolve into a number to be valid, otherwise it will not extrude.\n extrusionPath: Calculator.IField[];\n // The colour of the fill.\n // This must resolve into a css colour string to be valid, otherwise it'll default to the application's default value.\n fillColor: Calculator.IField[];\n // The colour of the outline.\n // This must resolve into a css colour string to be valid, otherwise it'll default to the application's default value.\n lineColor: Calculator.IField[];\n // Width of outline in meters.\n // This must resolve into a number to be valid, otherwise it'll default to the application's default value.\n lineWidth: Calculator.IField[];\n // Default is \"m\".\n // When units are in px the lines will draw as Cesium Polyline graphics, for meters corridors are used.\n // Meters are more stable and will reduce crashes. Pixels have better FPS.\n lineWidthUnits?: \"px\" | \"m\";\n // Dictates what the altitude value of an Entity should mean.\n // When not set to \"clamp-to-ground\" each individual's altitude will be used.\n // Default is clamped to ground.\n altitudeOption?: any;\n // The z index will dictate what vector appears on top vertically.\n // It is only applied when the altitude option is set to \"clamped-to-ground\".\n // For example a higher z index will appear on top of a lower z index.\n zIndex?: Calculator.IField[];\n // If the polygon should be draped over the terrain or tilesets + terrain.\n // Default is just terrain.\n drapeOver?: \"TERRAIN\" | \"ALL\";\n }\n\n /**\n * Settings for rendering polylines.\n */\n export interface IPolylineSettings {\n // The colour of the line.\n // This must resolve into a css colour string to be valid, otherwise it'll default to the application's default value.\n lineColor: Calculator.IField[];\n // The width of the line in either pixels or meters based on the units specified.\n // This must resolve into a number to be valid, otherwise it'll default to the application's default value.\n lineWidth: Calculator.IField[];\n // Default is \"px\" for backward compatibility.\n // When units are in px the lines will draw as Cesium Polyline graphics, for meters corridors are used.\n // Meters are more stable and will reduce crashes. Pixels have better FPS.\n lineWidthUnits?: \"px\" | \"m\";\n // Polylines do not support relative to ground positioning.\n // When set to \"absolute\" then each point's altitude will be used rather than clamping to the ground.\n // Default is clamped to ground.\n altitudeOption?: any;\n // The z index will dictate what vector appears on top vertically.\n // It is only applied when the altitude option is set to \"clamped-to-ground\".\n // For example a higher z index will appear on top of a lower z index.\n zIndex?: Calculator.IField[];\n // If the polyline should be draped over the terrain or tilesets + terrain.\n // Default is just terrain.\n drapeOver?: \"TERRAIN\" | \"ALL\";\n }\n\n /**\n * Settings for rendering 3d models.\n */\n export interface IModelSettings {\n // Indicates if the 3D model should be coloured by the Style.\n // Default is false.\n customize: boolean;\n // The colour to apply to the model if customize is set to true.\n // This must resolve into a css colour string to be valid, otherwise it'll default to the application's default value.\n fillColor: Calculator.IField[];\n // The model's scale factor.\n // This is multiplied against the Entity's transform scale.\n // For example if the Entity has a scale of 2 and this resolves to 3 then the final scale will be 6.\n // This must resolve into a number to be valid, otherwise it'll default to the application's default value (1).\n scale: Calculator.IField[];\n // Dictates how the colour specified should be applied to the model.\n fillColorBlendMode?: any;\n // If blend is set to \"Mix\" then this will dictate how much of the source colour should be used.\n // This is value between 0 and 1, default is \"0.5\". 1 means only the applied colour is used.\n fillColorBlendAmount?: number;\n // Dictates what the altitude value of an Entity should mean.\n // Default is relative to ground.\n altitudeOption?: any;\n // Dictates LOD group to retreieve from.\n // Default is 'DEFAULT'.\n lodGroup?: Calculator.IField[];\n }\n\n /**\n * Settings for rendering a node in the 2D viewer (graph viewer).\n */\n export interface IGraphNodeSettings {\n shape?: \"CIRCLE\" | \"RECT_LABEL\";\n }\n\n /**\n * Settings for rendering entities.\n */\n export interface IEntitySettings {\n // Settings are split up by the visual's type.\n pointStyle?: IPointSettings;\n polygonStyle?: IPolygonSettings;\n polylineStyle?: IPolylineSettings;\n // 3D model styling is used for both Tileset Entities and 3D model Entities.\n modelStyle?: IModelSettings;\n // Settings for an entity node in the graph viewer.\n graphNode?: IGraphNodeSettings;\n }\n\n /**\n * Settings for rendering entity relationships.\n */\n export interface IRelationSettings {\n // The colour of the parabola line.\n lineColor?: Calculator.IField[];\n // The width of the parabola line in pixels.\n lineWidth?: Calculator.IField[];\n // The height fraction to define the vertex height.\n // For example a \"0.25\" ratio means the height is 1/4 of the distance. A \"0\" ratio results in a straight line. \n heightDistanceRatio?: Calculator.IField[];\n // The duration of the animation in seconds.\n duration?: Calculator.IField[];\n }\n\n export type Settings = IEntitySettings | IRelationSettings;\n\n /**\n * Describes a style record.\n */\n export interface IStyle {\n // ID of the style record.\n ID: number;\n // Human readable name of the style.\n Name: string;\n // Settings based on the style's type.\n Settings: Settings;\n // Type of style.\n Type: EType;\n }\n\n /**\n * Returns a list of styles.\n * @param params \n * @returns \n */\n export async function GetList(params: {\n api?: BruceApi.Api,\n req?: Api.IReqParams\n }): Promise<{\n // List of styles.\n styles: IStyle[]\n }> {\n let { api, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const cache = await api.GetCacheItem(GetListCacheKey(), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const res: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(\"ui.entityDisplaySettings\", Api.PrepReqParams(reqParams));\n res({\n styles: data.Items\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key: GetListCacheKey(),\n value: res,\n req: reqParams\n });\n return res;\n }\n\n /**\n * Returns a style.\n * @param params \n * @returns \n */\n export async function Get(params: {\n api?: BruceApi.Api,\n // ID of the style record.\n styleId: number,\n req?: Api.IReqParams\n }): Promise<{\n // The style record.\n style: IStyle\n }> {\n let { api, styleId: id, req: reqParams } = params;\n if (!id) {\n throw(\"Style ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const cache = await api.GetCacheItem(GetCacheKey(id), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(`ui.entityDisplaySetting/${id}`, Api.PrepReqParams(reqParams));\n res({\n style: data\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key: GetCacheKey(id),\n value: prom,\n req: reqParams\n });\n return prom;\n }\n\n /**\n * Creates or updates a style.\n * @param params \n * @returns \n */\n export async function Update(params: {\n api?: BruceApi.Api,\n // The style record to create or update.\n style: IStyle,\n req?: Api.IReqParams\n }): Promise<{\n // The style record.\n style: IStyle\n }> {\n let { api, style: data, req: reqParams } = params;\n if (!data?.Name) {\n throw(\"Style name is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n if (!data.ID) {\n data.ID = 0;\n }\n const res = await api.POST(`ui.entityDisplaySetting/${data.ID}`, data, Api.PrepReqParams(reqParams));\n api.Cache.Remove(GetCacheKey(data.ID));\n api.Cache.Remove(GetListCacheKey());\n return {\n style: res\n };\n }\n\n /**\n * Deletes a style.\n * @param params \n */\n export async function Delete(params: {\n api?: BruceApi.Api,\n // ID of the style record to delete.\n styleId: number,\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, styleId: id, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n if (!id) {\n throw(\"Style ID is required.\");\n }\n await api.DELETE(`ui.entityDisplaySetting/${id}`, Api.PrepReqParams(reqParams));\n api.Cache.Remove(GetCacheKey(id));\n api.Cache.Remove(GetListCacheKey());\n }\n\n /**\n * Returns cache identifier for a style.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetCacheKey(1);\n * api.Cache.Remove(key);\n * }\n * @param id\n * @returns \n */\n export function GetCacheKey(id: number): string {\n return Api.ECacheKey.Style + Api.ECacheKey.Id + id;\n }\n \n /**\n * Returns cache identifier for a list of styles.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetListCacheKey();\n * api.Cache.Remove(key);\n * }\n * @returns\n */\n export function GetListCacheKey(): string {\n return Api.ECacheKey.Style;\n }\n}","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { UTC } from \"../common/utc\";\nimport { Entity } from \"../entity/entity\";\nimport { EntityAttribute } from \"../entity/entity-attribute\";\nimport { EntityRelationType } from \"../entity/entity-relation-type\";\nimport { EntityType } from \"../entity/entity-type\";\nimport { ENVIRONMENT } from \"../environment\";\nimport { ProjectViewBookmark } from \"../project/project-view-bookmark\";\nimport { Style } from \"../style/style\";\n\n/**\n * Generic comment record and related functions.\n * This uses Entity records with a specific Entity Type.\n * This replaced the original comment system and allows for comments to be placed on any Entity, or by themselves.\n */\nexport namespace Comment {\n // Entity Type used for storing comment records.\n export const ENTITY_TYPE_ID = \"COMMENTS\";\n // Relationship Type ID for linking relies to comments.\n export const REPLY_RELATIONSHIP_TYPE_ID = \"COMMENTS_REPLY\";\n\n // Possible kinds of comments.\n export enum EType {\n Comment = \"COMMENT\",\n Reply = \"REPLY\"\n }\n\n /**\n * Represents a comment Entity record.\n */\n export interface IRecord extends Entity.IEntity {\n // Associated project view.\n viewId: string;\n // Associated bookmark, if any.\n bookmarkId?: string;\n // Comment text content.\n text: string;\n type: EType;\n // Date-time of the last update.\n // If the user makes an edit then this field is updated.\n lastUpdateTime?: UTC.IUTC;\n updates?: number;\n // Related Entity, if any.\n // This is used when you want to link a comment to an Entity.\n entityId?: string;\n // Indicates if the comment is edited.\n edited?: boolean;\n // Stored camera position.\n // This is used to fly to the camera position where the comment was made.\n camera?: ProjectViewBookmark.Web3d.ICamera;\n // Parent comment, if any.\n // This is for replies to comments.\n // @todo possible not needed as we create a relationship between a comment/reply.\n parentId?: string;\n }\n\n /**\n * Returns a list of comments based on the provided filter.\n * @param params \n * @returns \n */\n export async function GetList(params: {\n api?: BruceApi.Api,\n req?: Api.IReqParams,\n filter: {\n viewId?: string;\n bookmarkId?: string;\n userId?: string;\n amount?: number;\n index?: number;\n text?: string;\n entityId?: string;\n }\n }): Promise<{\n comments: IRecord[]\n }> {\n let { api, req, filter } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n req = Api.PrepReqParams(req);\n\n if (!await getEntityTypeExists(api, req)) {\n return {\n comments: []\n }\n }\n\n const reqFilter = {};\n if (filter.viewId) {\n reqFilter[\"viewId\"] = {\n \"equals\": filter.viewId\n };\n }\n if (filter.userId) {\n reqFilter[\"CreatedBy.User.ID\"] = {\n \"equals\": filter.userId\n };\n }\n if (filter.text) {\n reqFilter[\"text\"] = {\n \"contains\": filter.text\n };\n }\n if (filter.entityId) {\n reqFilter[\"entityId\"] = {\n \"equals\": filter.entityId\n };\n }\n\n const records = (await Entity.GetList({\n api,\n req,\n filter: {\n entityTypeId: ENTITY_TYPE_ID,\n pageSize: filter.amount == null ? 20 : filter.amount,\n pageIndex: filter.index == null ? 0 : filter.index,\n entityTypeConditions: reqFilter,\n orderBy: \"lastUpdateTime\"\n },\n migrated: true\n })).entities as IRecord[];\n\n return {\n comments: records\n }\n }\n\n /**\n * Ensure the Entity Type exists.\n * If it does not exist, it will be created.\n * @param params \n */\n export async function AssertEntityType(params: {\n api?: BruceApi.Api,\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, req } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n req = Api.PrepReqParams(req);\n\n // If the Entity Type does not exist, create it.\n if (!await getEntityTypeExists(api, req)) {\n // Create Style and set it to the Entity Type.\n const styleId = await ensureStyleExists(api);\n const template: EntityType.IType = JSON.parse(JSON.stringify(ENTITY_TYPE_TEMPLATE));\n template[\"DisplaySetting.ID\"] = styleId;\n await EntityType.Update({\n api,\n entityType: template\n });\n }\n }\n\n /**\n * Ensure the Relation Type exists.\n * If it does not exist, it will be created.\n * @param params \n */\n export async function AssertRelationType(params: {\n api?: BruceApi.Api,\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, req } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n req = Api.PrepReqParams(req);\n\n await ensureRelationExists(api, req);\n }\n}\n\nasync function getEntityTypeExists(api: BruceApi.Api, req?: Api.IReqParams): Promise<boolean> {\n try {\n const {entityType: data} = await EntityType.Get({\n api,\n req: req,\n entityTypeId: Comment.ENTITY_TYPE_ID\n });\n return !!data;\n }\n catch (e) {\n // TODO: suppress if the error is related to not being found.\n console.error(e);\n }\n return false;\n}\n\nasync function ensureStyleExists(api: BruceApi.Api, req?: Api.IReqParams) {\n try {\n const template: Style.Settings = JSON.parse(JSON.stringify(STYLE_SETTINGS_TEMPLATE));\n const {style} = await Style.Update({\n api,\n req: req,\n style: {\n Name: \"Comment Style\",\n Settings: template,\n Type: Style.EType.Entity,\n ID: 0\n }\n });\n return style.ID;\n }\n catch (e) {\n console.error(e);\n }\n return 0;\n}\n\nasync function ensureRelationExists(api: BruceApi.Api, req?: Api.IReqParams): Promise<void> {\n try {\n const {relationType: data} = await EntityRelationType.Get({\n api,\n req: req,\n relationTypeId: Comment.REPLY_RELATIONSHIP_TYPE_ID\n });\n if (!data) {\n throw(\"Relation Type not found\");\n }\n }\n catch (e) {\n await EntityRelationType.Update({\n api,\n req: req,\n relationType: {\n ID: Comment.REPLY_RELATIONSHIP_TYPE_ID,\n ForwardName: \"Parent of\",\n ReverseName: \"Reply to\",\n Name: \"Comment Reply\"\n }\n });\n }\n}\n\nconst STYLE_SETTINGS_TEMPLATE: Style.Settings = {\n pointStyle: {\n \"color\": [\n {\n \"type\": 0,\n \"value\": \"rgba(33,150,243,0.8)\"\n }\n ],\n \"CylinderBorderEnabled\": false,\n \"CylinderBorderWidth\": [\n {\n \"type\": 1,\n \"value\": \"15\"\n }\n ],\n \"CylinderFillExtrusion\": [\n {\n \"type\": 1,\n \"value\": \"40\"\n }\n ],\n \"Type\": Style.EPointType.Icon,\n \"iconId\": null,\n \"altitudeOption\": {\n \"name\": \"Absolute position\",\n \"id\": 1\n },\n \"size\": [\n {\n \"type\": 1,\n \"value\": \"20\"\n }\n ],\n \"CylinderFillColor\": [\n {\n \"type\": 1,\n \"value\": \"rgba(33,150,243,0.8)\"\n }\n ],\n \"CylinderBorderExtrusion\": [\n {\n \"type\": 1,\n \"value\": \"35\"\n }\n ],\n \"CylinderRadius\": [\n {\n \"type\": 1,\n \"value\": \"20\"\n }\n ],\n \"iconUrl\": [\n {\n \"type\": 1,\n \"value\": \"https://template.api.nextspace-uat.net/file/faf2194d-3a95-40cc-a6b3-6a7aa223f766.png\"\n }\n ],\n \"ClusterNearbyEntities\": false,\n \"CylinderBorderColor\": [\n {\n \"type\": 1,\n \"value\": \"rgba(33,150,243,0.8)\"\n }\n ],\n \"iconScale\": [\n {\n \"type\": 1,\n \"value\": 1\n }\n ],\n \"MinimumEntitiesCountForClustering\": [\n {\n \"type\": 1,\n \"value\": \"2\"\n }\n ]\n }\n};\n\nconst ENTITY_TYPE_TEMPLATE: EntityType.IType = {\n ID: Comment.ENTITY_TYPE_ID,\n Name: \"Comments\",\n DataSchema: {\n \"Key\": \"root\",\n \"Name\": \"Root\",\n \"Type\": EntityAttribute.EType.Structure,\n Structure: [\n {\n \"IsIndexed\": true,\n \"IsImportant\": false,\n \"Type\": EntityAttribute.EType.String,\n \"IsArray\": false,\n \"Size\": 40,\n \"Key\": \"ID\",\n \"Name\": \"Identity\",\n \"IsFamilyAttribute\": false,\n \"IsFamilyAttributeDefault\": false\n },\n {\n \"IsIndexed\": false,\n \"IsImportant\": false,\n \"Type\": EntityAttribute.EType.Geometry,\n \"IsArray\": false,\n \"Size\": 0,\n \"Key\": \"geometry\",\n \"Name\": \"Geometry\",\n \"IsFamilyAttribute\": false,\n \"IsFamilyAttributeDefault\": false\n },\n {\n \"IsImportant\": false,\n \"Type\": EntityAttribute.EType.Structure,\n \"IsArray\": false,\n \"Structure\": [\n {\n \"IsIndexed\": true,\n \"IsImportant\": false,\n \"Type\": EntityAttribute.EType.Double,\n \"IsArray\": false,\n \"Key\": \"minLongitude\",\n \"Name\": \"Min Longitude\",\n \"IsFamilyAttribute\": false,\n \"IsFamilyAttributeDefault\": false\n },\n {\n \"IsIndexed\": true,\n \"IsImportant\": false,\n \"Type\": EntityAttribute.EType.Double,\n \"IsArray\": false,\n \"Key\": \"minLatitude\",\n \"Name\": \"Min Latitude\",\n \"IsFamilyAttribute\": false,\n \"IsFamilyAttributeDefault\": false\n },\n {\n \"IsIndexed\": true,\n \"IsImportant\": false,\n \"Type\": EntityAttribute.EType.Double,\n \"IsArray\": false,\n \"Size\": 0,\n \"Key\": \"minAltitude\",\n \"Name\": \"Min Altitude\",\n \"IsFamilyAttribute\": false,\n \"IsFamilyAttributeDefault\": false\n },\n {\n \"IsIndexed\": true,\n \"IsImportant\": false,\n \"Type\": EntityAttribute.EType.Double,\n \"IsArray\": false,\n \"Key\": \"maxLongitude\",\n \"Name\": \"Max Longitude\",\n \"IsFamilyAttribute\": false,\n \"IsFamilyAttributeDefault\": false\n },\n {\n \"IsIndexed\": true,\n \"IsImportant\": false,\n \"Type\": EntityAttribute.EType.Double,\n \"IsArray\": false,\n \"Key\": \"maxLatitude\",\n \"Name\": \"Max Latitude\",\n \"IsFamilyAttribute\": false,\n \"IsFamilyAttributeDefault\": false\n },\n {\n \"IsIndexed\": true,\n \"IsImportant\": false,\n \"Type\": EntityAttribute.EType.Double,\n \"IsArray\": false,\n \"Size\": 0,\n \"Key\": \"maxAltitude\",\n \"Name\": \"Max Altitude\",\n \"IsFamilyAttribute\": false,\n \"IsFamilyAttributeDefault\": false\n }\n ],\n \"Key\": \"boundaries\",\n \"Name\": \"Boundaries\",\n \"IsFamilyAttribute\": false,\n \"IsFamilyAttributeDefault\": false\n },\n {\n \"IsImportant\": false,\n \"Type\": EntityAttribute.EType.Structure,\n \"IsArray\": false,\n \"Structure\": [\n {\n \"IsIndexed\": true,\n \"IsImportant\": false,\n \"Type\": EntityAttribute.EType.Double,\n \"IsArray\": false,\n \"Key\": \"latitude\",\n \"Name\": \"Latitude\",\n \"IsFamilyAttribute\": false,\n \"IsFamilyAttributeDefault\": false\n },\n {\n \"IsIndexed\": true,\n \"IsImportant\": false,\n \"Type\": EntityAttribute.EType.Double,\n \"IsArray\": false,\n \"Key\": \"longitude\",\n \"Name\": \"Longitude\",\n \"IsFamilyAttribute\": false,\n \"IsFamilyAttributeDefault\": false\n },\n {\n \"IsIndexed\": true,\n \"IsImportant\": false,\n \"Type\": EntityAttribute.EType.Double,\n \"IsArray\": false,\n \"Key\": \"altitude\",\n \"Name\": \"Altitude\",\n \"IsFamilyAttribute\": false,\n \"IsFamilyAttributeDefault\": false\n }\n ],\n \"Key\": \"location\",\n \"Name\": \"Location\",\n \"IsFamilyAttribute\": false,\n \"IsFamilyAttributeDefault\": false\n },\n {\n \"IsIndexed\": true,\n \"IsImportant\": true,\n \"Type\": EntityAttribute.EType.String,\n \"IsArray\": false,\n \"Size\": 60,\n \"Key\": \"viewId\",\n \"Name\": \"View Id\",\n \"IsFamilyAttribute\": false,\n \"IsFamilyAttributeDefault\": false\n },\n {\n \"IsIndexed\": true,\n \"IsImportant\": true,\n \"Type\": EntityAttribute.EType.String,\n \"IsArray\": false,\n \"Size\": 60,\n \"Key\": \"bookmarkId\",\n \"Name\": \"Bookmark Id\",\n \"IsFamilyAttribute\": false,\n \"IsFamilyAttributeDefault\": false\n },\n {\n \"IsIndexed\": true,\n \"IsImportant\": true,\n \"Type\": EntityAttribute.EType.String,\n \"IsArray\": false,\n \"Key\": \"text\",\n \"Name\": \"Comment\",\n \"IsFamilyAttribute\": false,\n \"IsFamilyAttributeDefault\": false\n },\n {\n \"IsIndexed\": true,\n \"IsImportant\": true,\n \"Type\": EntityAttribute.EType.Datetime,\n \"IsArray\": false,\n \"Key\": \"lastUpdateTime\",\n \"Name\": \"Last Update Time\",\n \"IsFamilyAttribute\": false,\n \"IsFamilyAttributeDefault\": false\n },\n {\n \"IsIndexed\": true,\n \"IsImportant\": true,\n \"Type\": EntityAttribute.EType.String,\n \"IsArray\": false,\n \"Key\": \"entityId\",\n \"Name\": \"Related Entity ID\",\n \"IsFamilyAttribute\": false,\n \"IsFamilyAttributeDefault\": false\n }\n ]\n },\n \"DisplaySetting.ID\": 0\n};","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { ENVIRONMENT } from \"../environment\";\nimport { ObjectUtils } from \"../util/object-utils\";\n\n/**\n * Utility for uploading files.\n */\nexport namespace Uploader {\n export const MIN_LARGE_FILE_SIZE = 100000000; // 100MB.\n\n export interface IProgress {\n percent: number;\n uploaded: boolean;\n }\n\n /**\n * Uploads a file to the server.\n * @param params \n * @returns \n */\n export async function DoMultiPartUpload(params: {\n // File to upload.\n file: File,\n // API to use for upload.\n api?: BruceApi.Api,\n // URL suffix to use for upload.\n // This is appended to the API's base url.\n urlSuffix: string,\n req?: Api.IUploadReqParams,\n // Callback for progress updates.\n onProgress?: (progress: IProgress) => void\n }) {\n let { file, api, urlSuffix: url, req, onProgress } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const FILE_PORTION_SIZE = 100000000; // 100MB.\n let fileSize = file.size;\n let fileOffset = 0;\n let filePartsCount = fileSize / FILE_PORTION_SIZE;\n let t = Math.trunc(filePartsCount);\n filePartsCount = filePartsCount > t ? t + 1 : t;\n let filePartIndex = 1;\n let uploadToken = ObjectUtils.UId();\n let data: any;\n while (fileOffset < fileSize) {\n let partSize = Math.min(FILE_PORTION_SIZE, fileSize - fileOffset);\n let retryCount: number = 5;\n let retryWait: number = 1000;\n while (retryCount > 0) {\n try {\n const blob = file.slice(fileOffset, fileOffset + partSize);\n const partialFile = new File([blob], file.name, { type: file.type });\n const formData = new FormData();\n formData.append(\"originalFileName\", file.name);\n formData.append(\"token\", uploadToken);\n formData.append(\"count\", \"\" + filePartsCount);\n formData.append(\"part\", \"\" + filePartIndex);\n formData.append(\"file\", partialFile);\n const reqParams = Api.PrepReqParams(req) as Api.IUploadReqParams;\n reqParams.formData = formData;\n reqParams.onProgress = (progress: ProgressEvent) => {\n const sofar = fileOffset + progress.loaded;\n const percent = Math.round ((sofar / file.size) * 100);\n onProgress?.({\n percent: percent,\n uploaded: false\n });\n };\n data = await api.UPLOAD(url, partialFile, reqParams)\n retryCount = 0;\n }\n catch (up) {\n retryCount -= 1;\n if (retryCount <= 0) {\n throw up;\n }\n await new Promise((res) => setTimeout(res, retryWait));\n retryWait = retryWait * 2;\n }\n }\n fileOffset += partSize;\n filePartIndex++;\n }\n onProgress?.({\n percent: 100,\n uploaded: true\n });\n return data;\n }\n}","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { IDictionary, UrlUtils } from \"../bruce-models\";\nimport { UTC } from \"../common/utc\";\nimport { ENVIRONMENT } from \"../environment\";\nimport { Uploader } from \"../internal/uploader\";\n\n/**\n * Describes the \"Client File\" concept within Nextspace.\n * A client file is a record of a file uploaded to Bruce.\n */\nexport namespace ClientFile {\n /**\n * Describes a client file record.\n */\n export interface IFile {\n // The ID of the file.\n ID: string;\n // The file's extension.\n // Currently a mess with conflicting records with and without the dot.\n FileExt: string;\n // The file's mime type.\n MIMEType: string;\n // The file's original name. This includes the extension.\n OriginalFileName: string;\n // The file's size in bytes.\n OriginalLength: number;\n // The user's ID who uploaded the file.\n \"UploadedByUser.ID\": string;\n // An optional category for the file.\n // Some Nextspace default purposes have additional meaning.\n Purpose: Purpose;\n // UTC date/time when the file was uploaded.\n UploadedTimeUTC: UTC.IUTC;\n }\n\n // Client file purpose. This is an optional level of categorization for a file.\n export type Purpose = string | EPurpose;\n export enum EPurpose {\n // Use this purpose for uploading bookmark thumbnail images.\n // This will allow lower level privileges to upload (small) bookmark thumbnails.\n BookmarkThumbnail = \"Bookmark Thumbnail\"\n }\n\n /**\n * Returns the URL for a client file.\n * @param params \n * @returns \n */\n export function GetUrl(params: {\n api?: BruceApi.Api,\n // The related client file ID.\n fileId: string,\n // If true, and if the CDN url is set in the API, the CDN url will be returned.\n // Default = false.\n viaCdn?: boolean\n }): string {\n let { api, fileId, viaCdn } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n return api.ConstructUrl({\n cdn: viaCdn,\n url: `file/${fileId}`,\n urlParams: {\n // Invalidating cache manually because we have a wave of invalid headers now cached across devices.\n cc: \"1\"\n }\n });\n }\n\n /**\n * Returns the URL for a client file with the extension.\n * @param params \n * @returns \n */\n export function GetUrlWithExt(params: {\n api?: BruceApi.Api,\n // The related client file record.\n file: IFile,\n // If true, and if the CDN url is set in the API, the CDN url will be returned.\n // Default = false.\n viaCdn?: boolean\n }): string {\n let { api, file, viaCdn } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n let ext = file.FileExt;\n if (!ext && file.OriginalFileName && file.OriginalFileName.includes(\".\")) {\n ext = file.OriginalFileName.split(\".\").pop();\n }\n if (ext && !ext.startsWith(\".\")) {\n ext = \".\" + ext;\n }\n const urlSuffix = ext ? `file/${file.ID}${ext}` : `file/${file.ID}`;\n\n return api.ConstructUrl({\n cdn: viaCdn,\n url: urlSuffix,\n urlParams: {\n // Invalidating cache manually because we have a wave of invalid headers now cached across devices.\n cc: \"1\"\n }\n });\n }\n\n /**\n * Returns a client file record by ID.\n * @param params \n * @returns \n */\n export async function Get(params: {\n api?: BruceApi.Api,\n fileId: string,\n req?: Api.IReqParams\n }): Promise<{\n clientFile: IFile\n }> {\n let { api, fileId, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n if (!fileId) {\n throw(\"File ID is required.\");\n }\n const key = GetCacheKey(fileId);\n const cache = await api.GetCacheItem(key, reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(`file/${fileId}/details`, Api.PrepReqParams(reqParams));\n res({\n clientFile: data\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key,\n value: prom,\n req: reqParams\n });\n return prom;\n }\n\n /**\n * Deletes one or many client file records by IDs.\n * @param params \n */\n export async function Delete(params: {\n api?: BruceApi.Api,\n fileIds: string[],\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, fileIds, req: reqParams } = params;\n if (!fileIds.length) {\n return Promise.resolve();\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n const data = {\n Items: fileIds\n };\n await api.POST(\"deleteFiles\", data, Api.PrepReqParams(reqParams));\n for (let i = 0; i < fileIds.length; i++) {\n const key = GetCacheKey(fileIds[i]);\n api.Cache.Remove(key);\n }\n }\n\n /**\n * Uploads a file and creates a new client file record.\n * @param params \n * @returns \n */\n export async function Upload(params: {\n api?: BruceApi.Api,\n file: File,\n purpose?: string,\n onProgress?: (progress: Uploader.IProgress) => void,\n req?: Api.IUploadReqParams\n }): Promise<{\n clientFile: IFile\n }> {\n let { api, file, purpose, req, onProgress } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n if (!file) {\n throw(\"File is required.\");\n }\n const size = file?.size;\n if (!size) {\n throw(\"You cannot upload a 0byte sized file.\");\n }\n req = Api.PrepReqParams(req) as Api.IUploadReqParams;\n let clientFile: IFile;\n if (size > Uploader.MIN_LARGE_FILE_SIZE) {\n clientFile = await Uploader.DoMultiPartUpload({\n api,\n file,\n urlSuffix: \"fileUpload\",\n req,\n onProgress\n });\n // TODO: Check if we can add it to the request like the small file upload.\n if (clientFile?.ID && purpose) {\n await UpdatePurpose({\n api,\n fileId: clientFile.ID,\n purpose,\n req\n })\n }\n }\n else {\n req.onProgress = (progress: ProgressEvent) => {\n const percent = Math.round ((progress.loaded / file.size) * 100);\n onProgress?.({\n percent: percent,\n uploaded: false\n });\n };\n if (purpose) {\n req.formData = {\n Purpose: purpose\n };\n }\n clientFile = await api.UPLOAD(\"file/uploadNew\", file, req);\n }\n onProgress?.({\n percent: 100,\n uploaded: true\n });\n return {\n clientFile\n };\n }\n\n /**\n * Updates the purpose of a client file.\n * @param params \n */\n export async function UpdatePurpose(params: {\n api?: BruceApi.Api,\n fileId: string,\n purpose: string,\n req?: Api.IReqParams\n }) {\n let { api, fileId, purpose, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n if (!purpose) {\n purpose = \"\";\n }\n await api.POST(\"file/updatepurpose/\" + fileId + \"/?Purpose=\" + purpose, {\n Purpose: purpose\n }, Api.PrepReqParams(reqParams));\n const cacheKey = GetCacheKey(fileId);\n api.Cache.RemoveByContains(cacheKey);\n }\n\n /**\n * Uploads a temp file.\n * This will return a temp file ID.\n * @param params\n * @returns\n */\n export async function UploadTemp(params: {\n api?: BruceApi.Api,\n file: File,\n onProgress?: (progress: Uploader.IProgress) => void,\n req?: Api.IUploadReqParams\n }): Promise<{\n tempFileId: string\n }> {\n let { api, file, req, onProgress } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n if (!file) {\n throw(\"File is required.\");\n }\n const size = file?.size;\n if (!size) {\n throw(\"You cannot upload a 0byte sized file.\");\n }\n req = Api.PrepReqParams(req) as Api.IUploadReqParams;\n let tempFile: any;\n if (size > Uploader.MIN_LARGE_FILE_SIZE) {\n tempFile = await Uploader.DoMultiPartUpload({\n api,\n file,\n urlSuffix: \"tempFileUpload\",\n req,\n onProgress\n });\n }\n else {\n req.onProgress = (progress: ProgressEvent) => {\n const percent = Math.round ((progress.loaded / file.size) * 100);\n onProgress?.({\n percent: percent,\n uploaded: false\n });\n };\n tempFile = await api.UPLOAD(\"file/uploadTemp\", file, req);\n }\n onProgress?.({\n percent: 100,\n uploaded: true\n });\n return {\n tempFileId: tempFile[\"TempFile.ID\"]\n };\n }\n\n /**\n * Returns a dictionary of purpose counts for client files.\n * @param params \n * @returns \n */\n export async function GetCountsPurpose(params: {\n api?: BruceApi.Api,\n req?: Api.IReqParams\n }): Promise<{\n counts: IDictionary<number>\n }> {\n let { api, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n reqParams = Api.PrepReqParams(reqParams);\n\n const key = GetCountsPurposeCacheKey();\n const cache = api.GetCacheItem(key, reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(\"file/purpose/counts\", Api.PrepReqParams(reqParams));\n res({\n counts: data\n });\n }\n catch (e) {\n rej(e);\n }\n });\n api.SetCacheItem({\n key,\n value: prom,\n req: reqParams,\n // Short 30 second cache duration.\n duration: 30 * 1000\n });\n return prom;\n }\n\n /**\n * Returns a dictionary of MIME type counts for client files.\n * @param params \n * @returns \n */\n export async function GetCountsExtension(params: {\n api?: BruceApi.Api,\n req?: Api.IReqParams\n }): Promise<{\n counts: IDictionary<number>\n }> {\n let { api, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n reqParams = Api.PrepReqParams(reqParams);\n\n const key = GetCountsExtensionCacheKey();\n const cache = api.GetCacheItem(key, reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(\"file/extension/counts\", Api.PrepReqParams(reqParams));\n res({\n counts: data\n });\n }\n catch (e) {\n rej(e);\n }\n });\n api.SetCacheItem({\n key,\n value: prom,\n req: reqParams,\n // Short 30 second cache duration.\n duration: 30 * 1000\n });\n return prom;\n }\n\n /**\n * Returns a dictionary of MIME type counts for client files.\n * @param params \n * @returns \n */\n export async function GetCountsMIMEType(params: {\n api?: BruceApi.Api,\n req?: Api.IReqParams\n }): Promise<{\n counts: IDictionary<number>\n }> {\n let { api, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n reqParams = Api.PrepReqParams(reqParams);\n\n const key = GetCountsMIMETypeCacheKey();\n const cache = api.GetCacheItem(key, reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(\"file/mimetype/counts\", Api.PrepReqParams(reqParams));\n res({\n counts: data\n });\n }\n catch (e) {\n rej(e);\n }\n });\n api.SetCacheItem({\n key,\n value: prom,\n req: reqParams,\n // Short 30 second cache duration.\n duration: 30 * 1000\n });\n return prom;\n }\n\n /**\n * Returns a dictionary of user counts for client files.\n * @param params \n * @returns \n */\n export async function GetCountsUser(params: {\n api?: BruceApi.Api,\n req?: Api.IReqParams\n }): Promise<{\n counts: IDictionary<number>\n }> {\n let { api, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n reqParams = Api.PrepReqParams(reqParams);\n\n const key = GetCountsUserCacheKey();\n const cache = api.GetCacheItem(key, reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(\"file/user/counts\", Api.PrepReqParams(reqParams));\n res({\n counts: data\n });\n }\n catch (e) {\n rej(e);\n }\n });\n api.SetCacheItem({\n key,\n value: prom,\n req: reqParams,\n // Short 30 second cache duration.\n duration: 30 * 1000\n });\n return prom;\n }\n\n /**\n * Filter definitions for requesting a list of client files.\n */\n export namespace Filter {\n export enum EColumn {\n ID = \"id\",\n Name = \"name\",\n DateTime = \"datetime\",\n MIMEType = \"mimeType\",\n Size = \"size\",\n User = \"user\",\n Extension = \"extension\"\n }\n\n export enum ESortOrder {\n ASC = \"asc\",\n DEC = \"desc\"\n }\n\n export enum ERowOperator {\n AND = \"AND\",\n OR = \"OR\"\n }\n\n export interface IRow {\n column: EColumn;\n value: any;\n valueOperator: string;\n includes: boolean;\n rowOperator: ERowOperator;\n rows?: IRow[];\n }\n }\n\n export interface IFilter {\n PageSize?: number;\n PageIndex?: number;\n OrderBy?: Filter.EColumn;\n SortOrder?: Filter.ESortOrder;\n Purpose?: string;\n FilterRows?: Filter.IRow[];\n }\n\n /**\n * Returns a list of client files matching the filter.\n * @param params \n * @returns \n */\n export async function GetList(params: {\n api?: BruceApi.Api,\n filter: IFilter,\n req?: Api.IReqParams\n }): Promise<{\n clientFiles: IFile[],\n // Total available matching the filter.\n // This is not the total returned in the current page.\n totalCount: number\n }> {\n let { api, filter, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const data = await api.POST(\"files/filtered\", filter, Api.PrepReqParams(reqParams));\n return {\n clientFiles: data.Items,\n totalCount: data.TotalCount\n };\n }\n\n /**\n * Deletes a list of client files matching the filter.\n * @param params \n */\n export async function DeleteList(params: {\n api?: BruceApi.Api,\n filter: IFilter,\n req?: Api.IReqParams\n }): Promise<{\n success: boolean,\n deletedCount: number\n }> {\n let { api, filter, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const res = await api.POST(\"files/filtered/delete\", filter, Api.PrepReqParams(reqParams));\n\n // We'll clear cache if at least one file was deleted.\n if (res?.OK && res?.DeleteFilesCount > 0) {\n api.Cache.RemoveByStartsWith(Api.ECacheKey.ClientFile);\n }\n\n return {\n success: res?.OK,\n deletedCount: res?.DeleteFilesCount\n }\n }\n\n /**\n * Utility for processing client files.\n * Commonly used to convert a file to a different format. Eg: FBX to GLB.\n */\n export namespace Processor {\n /**\n * Describes the result of a file processing operation.\n */\n export interface IResult {\n success: boolean;\n clientFileId: string;\n clientFileName: string;\n }\n\n /**\n * The desired file format to convert to.\n */\n export enum EConvertExt {\n // Recommended.\n GLB = \".glb\",\n // Unstable.\n SKP = \".skp\",\n }\n\n export async function ConvertFormat(params: {\n api?: BruceApi.Api,\n // ID of client file we're processing.\n fileId: string,\n // The desired file format to convert to.\n // If not specified, the file will be converted to GLB.\n ext?: EConvertExt | string,\n req?: Api.IReqParams\n }): Promise<IResult> {\n let { api, fileId: clientFileId, ext, req: reqParams } = params;\n if (!clientFileId) {\n throw(\"Client File ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n if (!ext) {\n ext = EConvertExt.GLB;\n }\n \n return api.POST(\"convertFileToFile\", {\n clientFileId: clientFileId,\n destinationFormat: ext,\n operations: []\n }, reqParams);\n }\n }\n\n /**\n * Returns cache identifier for a client file by ID.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetCacheKey(\"123\");\n * api.Cache.Remove(key);\n * }\n * @param fileId \n * @returns \n */\n export function GetCacheKey(fileId: string): string {\n return `${Api.ECacheKey.ClientFile}${Api.ECacheKey.Id}${fileId}`;\n }\n\n export function GetCountsPurposeCacheKey() {\n return `${Api.ECacheKey.ClientFile}${Api.ECacheKey.ClientFileCountsPurpose}`;\n }\n\n export function GetCountsExtensionCacheKey() {\n return `${Api.ECacheKey.ClientFile}${Api.ECacheKey.ClientFileCountsExtension}`;\n }\n\n export function GetCountsMIMETypeCacheKey() {\n return `${Api.ECacheKey.ClientFile}${Api.ECacheKey.ClientFileCountsMIMEType}`;\n }\n\n export function GetCountsUserCacheKey() {\n return `${Api.ECacheKey.ClientFile}${Api.ECacheKey.ClientFileCountsUser}`;\n }\n}","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { ENVIRONMENT } from \"../environment\";\n\ntype Id = ProgramKey.EProgramId | string;\n\n/**\n * Describes the \"Program Key\" concept within Nextspace.\n * A program key is an access token for an arbitrary software.\n */\nexport namespace ProgramKey {\n /**\n * Known program IDs that Nextspace applications will reference.\n */\n export enum EProgramId {\n // Cesium Ion token. Used for Cesium World Terrain and Bing Maps within CesiumJS.\n CesiumIon = \"CesiumIon\",\n // Bing Maps key. Used for Bing Maps within Unreal.\n BingMaps = \"BingMaps\",\n // Mapbox key. Used for Mapbox within CesiumJS and Unreal.\n Mapbox = \"Mapbox\",\n // Google Maps key. Used for Google Maps 3D tileset for CesiumJS and Unreal.\n Google = \"Google\",\n // Stadiamaps key. Used for watercolor and toner\n StadiaMaps = \"StadiaMaps\",\n // Thunderforest key, Used for cycle and transport and landscape\n Thunderforest = \"Thunderforest\"\n }\n\n /**\n * Describes a program key record.\n */\n export interface IKey {\n // ID of the program key record.\n ProgramId: Id;\n // The program key.\n Key: string;\n // If access to the plugin should be restricted.\n // When a plugin is restricted a user must have the \"ProgramKey_<pluginId>\" permission.\n IsAccessRestricted?: boolean;\n }\n\n /**\n * Returns a program key record.\n * @param params \n * @returns \n */\n export async function Get(params: {\n api?: BruceApi.Api,\n // ID of the program key record.\n programId: Id,\n req?: Api.IReqParams\n }): Promise<{\n // The program key record.\n programKey: IKey\n }> {\n let { api, programId, req: reqParams } = params;\n if (!programId) {\n throw(\"Program ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n // Our API throws an error when a key is not set which is a bit annoying.\n // Since we only use these keys for a few specific things we'll just request the list and avoid the error.\n // If this becomes useful for more things we'll make requesting a key that doesn't exist just return empty JSON.\n\n const prom = await GetList({\n api,\n req: reqParams\n });\n const key = prom.programKeys.find(k => k.ProgramId === programId);\n \n\n // const key = GetCacheKey(programId);\n // const cache = await api.GetCacheItem(key, reqParams);\n // if (cache?.found) {\n // return cache.data;\n // }\n // const prom: Promise<any> = new Promise(async (res, rej) => {\n // try {\n // const data = await api.GET(`programkey/${programId}`, Api.PrepReqParams(reqParams));\n // res({\n // programKey: data\n // });\n // }\n // catch (e) {\n // rej(e);\n // }\n // });\n // await api.SetCacheItem({\n // key,\n // value: prom,\n // req: reqParams\n // });\n\n return {\n programKey: key\n };\n }\n\n /**\n * Returns a list of program key records.\n * @param params \n * @returns \n */\n export async function GetList(params: {\n api?: BruceApi.Api,\n req?: Api.IReqParams\n }): Promise<{\n // The list of program key records.\n programKeys: IKey[]\n }> {\n let { api, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const cache = await api.GetCacheItem(GetListCacheKey(), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const req: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(\"programkeys\", Api.PrepReqParams(reqParams));\n res({\n programKeys: data.Items\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key: GetListCacheKey(),\n value: req,\n req: reqParams\n });\n return req;\n }\n\n /**\n * Deletes a program key record.\n * @param params \n */\n export async function Delete(params: {\n api?: BruceApi.Api,\n // ID of the program key record.\n programId: Id,\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, programId, req: reqParams } = params;\n if (!programId) {\n throw(\"Program ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n await api.DELETE(`programkey/${programId}`, Api.PrepReqParams(reqParams));\n api.Cache.Remove(GetCacheKey(programId));\n api.Cache.Remove(GetListCacheKey());\n }\n\n /**\n * Creates or updates a program key record.\n * @param params \n * @returns \n */\n export async function Update(params: {\n api?: BruceApi.Api,\n // The program key record.\n programKey: IKey,\n req?: Api.IReqParams\n }): Promise<{\n // The program key record.\n programKey: IKey\n }> {\n let { api, programKey: data, req: reqParams } = params;\n if (!data?.ProgramId) {\n throw(\"Program ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const res = await api.POST(\"programkey\", data, Api.PrepReqParams(reqParams));\n api.Cache.Remove(GetCacheKey(data.ProgramId));\n api.Cache.Remove(GetListCacheKey());\n return {\n programKey: res\n };\n }\n\n /**\n * Returns cache identifier for a program key.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetCacheKey(\"abc\");\n * api.Cache.Remove(key);\n * }\n * @param programId\n * @returns \n */\n export function GetCacheKey(programId: string): string {\n return Api.ECacheKey.ProgramKey + Api.ECacheKey.Id + programId;\n }\n \n /**\n * Returns cache identifier for a list of program keys.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetListCacheKey();\n * api.Cache.Remove(key);\n * }\n * @returns\n */\n export function GetListCacheKey(): string {\n return Api.ECacheKey.ProgramKey;\n }\n}","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { UTC } from \"../common/utc\";\nimport { PendingAction } from \"../server/pending-action\";\nimport { GlobalApi } from \"../api/global-api\";\nimport { Transform } from \"../common/transform\";\nimport { Carto } from \"../common/carto\";\nimport { Bounds } from \"../common/bounds\";\nimport { Uploader } from \"../internal/uploader\";\nimport { IDictionary } from \"../common/dictionary\";\nimport { ENVIRONMENT } from \"../environment\";\nimport { Account, AccountSettings, ApiGetters } from \"../bruce-models\";\n\n/**\n * Converts legacy records into something easier to work with alongside the newer ones.\n * On save we'll convert back to the legacy format.\n * @param record record we need to convert into a new version\n * @param newer supplementary newer one that lacks the legacy fields\n * @returns \n */\nfunction convertLegacyRec(record: any, newer?: Tileset.ITileset): Tileset.ITileset {\n const tileset: Tileset.ITileset = {\n id: record.ID,\n name: record.Name,\n type: record.Type ?? newer?.type,\n rootFileName: record.RootFileName,\n settings: {\n creationTypeId: record[\"TilesetCreation.EntityType.ID\"],\n creationEntityFilter: record[\"TilesetCreation.EntitiesFilter\"],\n creationTerrainSrc: record[\"TilesetCreation.TerrainSource\"],\n creationSettings: record[\"TilesetCreation.Settings\"],\n creationZoomControl: record[\"TilesetCreation.ZoomControl\"],\n origin: {\n ...record.Settings?.origin\n },\n positionOffset: {\n ...record.Settings?.positionOffset\n },\n rotation: {\n ...record.Settings?.rotation\n },\n visual: {\n ...record.Settings?.visual\n },\n dontRotate: record.Settings?.etc?.dontRotate,\n dontTransform: record.Settings?.etc?.dontTransform,\n ExternalTilesetURL: record.Settings?.etc?.ExternalTilesetURL,\n showAdvancedSettings: record.Settings?.etc?.showAdvancedSettings\n } as Tileset.Settings.ILegacy,\n // Not returned in legacy data.\n creationTime: newer?.creationTime,\n // Not returned in legacy data.\n fileIds: newer?.fileIds,\n // Not returned in legacy data.\n generateVersion: newer?.generateVersion,\n // Not returned in legacy data.\n loadUrl: null,\n // Not returned in legacy data.\n modificationTime: newer?.modificationTime,\n // Not returned in legacy data.\n isDeleteDisabled: newer?.isDeleteDisabled,\n // Not returned in legacy data.\n isRestricted: newer?.isRestricted\n };\n return tileset;\n}\n\nfunction convertBackToLegacy(tileset: Tileset.ITileset): any {\n const settings = (tileset.settings ?? {}) as Tileset.Settings.ILegacy;\n const record: any = {\n ID: tileset.id,\n Name: tileset.name,\n Type: tileset.type,\n RootFileName: tileset.rootFileName,\n Settings: {\n origin: {\n ...settings?.origin\n },\n positionOffset: {\n ...settings?.positionOffset\n },\n rotation: {\n ...settings?.rotation\n },\n visual: {\n ...settings?.visual\n },\n etc: {\n dontRotate: settings?.dontRotate,\n dontTransform: settings?.dontTransform,\n showAdvancedSettings: settings?.showAdvancedSettings,\n ExternalTilesetURL: settings?.ExternalTilesetURL\n }\n },\n \"TilesetCreation.EntityType.ID\": settings?.creationTypeId,\n \"TilesetCreation.EntitiesFilter\": settings?.creationEntityFilter,\n \"TilesetCreation.TerrainSource\": settings?.creationTerrainSrc,\n \"TilesetCreation.Settings\": settings?.creationSettings,\n \"TilesetCreation.ZoomControl\": settings?.creationZoomControl\n };\n return record;\n}\n\ntype Settings = Tileset.Settings.IPointcloud |\n Tileset.Settings.ICad |\n Tileset.Settings.IEntitiesMap |\n Tileset.Settings.IEntities |\n Tileset.Settings.IExternalMap |\n Tileset.Settings.IExternalTerrain |\n Tileset.Settings.IMap |\n Tileset.Settings.ITerrain |\n Tileset.Settings.ILegacy;\n\n/**\n * Describes the \"Tileset\" concept in Nextspace.\n *\n * Tilesets come in three possible variants,\n * 1- A set of instructions to generate a tileset.\n * 2- Settings to load a tileset hosted elsewhere.\n * 3- A set of user-provided files to serve.\n *\n * Read the individual tileset-type settings for each variant.\n */\nexport namespace Tileset {\n /**\n * Describes a tileset record.\n */\n export interface ITileset {\n // ID of the tileset record.\n id: string;\n // Human readable name of the tileset.\n name: string;\n // Type of the tileset.\n type: EType;\n // Root file name. Default = \"tileset.json\".\n rootFileName?: string;\n // Tileset settings.\n settings?: Settings;\n // Array of files that make up the tileset.\n fileIds?: string[];\n // Date/time the tileset was created.\n creationTime?: UTC.IUTC;\n // Date/time the tileset was last modified.\n modificationTime?: UTC.IUTC;\n // Version of the tileset. This is bumped on regeneration.\n generateVersion?: number;\n // If deletion is locked. If locked the deleting will throw an error.\n isDeleteDisabled?: boolean;\n // URL to load the tileset with.\n loadUrl?: string;\n // If access to the tileset should be restricted.\n // When a tileset is restricted a user must have the \"Tileset_<tilesetId>\" permission.\n isRestricted?: boolean;\n }\n\n /**\n * Available tileset types.\n */\n export enum EType {\n PointCloud = \"POINT_CLOUD\",\n GeoMap = \"GEO_MAP\", // Previously gtfRasterMaps.\n EntitiesMap = \"ENTITIES_MAP\", // Previously rasterMap.\n EntitiesSet = \"ENTITIES_SET\", // Previously dynamic.\n Cad = \"MODEL\", // Generated CAD tileset from entity id.\n Terrain = \"GEO_TERR\",\n ExternalTerrain = \"EXTERNAL_TERR\",\n ExternalGeoMap = \"EXTERNAL_MAP\",\n LegacyEntitiesSet = \"D\",\n LegacyStatic = \"S\",\n LegacyExternal = \"X\"\n }\n\n /**\n * Available tileset pivot types.\n */\n export enum EPivot {\n // Leaves the pivot as is. This will use the root entity's defined position.\n // Recommended.\n None = \"none\",\n // Moves pivot to the center of the bounding box.\n Box = \"box\",\n // Moves pivot to the graphical center.\n // This will try ignore anomalies.\n Weight = \"weight\",\n // @deprecated.\n UCS = \"ucs\"\n }\n\n /**\n * Returns a tileset record.\n * @param params \n * @returns \n */\n export async function Get(params: {\n api?: BruceApi.Api,\n // ID of the tileset record.\n tilesetId: string,\n // If the tileset files should be loaded.\n // Recommended to be false.\n loadFiles?: boolean,\n req?: Api.IReqParams\n }): Promise<{\n // The tileset record.\n tileset: ITileset\n }> {\n let { api, tilesetId, loadFiles, req: reqParams } = params;\n if (!tilesetId) {\n throw(\"Tileset ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const cache = await api.GetCacheItem(GetCacheKey(tilesetId, loadFiles), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n let data = await api.GET(`tileset/get/${tilesetId}?noFiles=${Boolean(loadFiles) ? 0 : 1}`, reqParams) as Tileset.ITileset;\n // If this is a legacy record we have to re-request using the old endpoint and convert.\n if (data.type == EType.LegacyEntitiesSet || data.type == EType.LegacyStatic || data.type == EType.LegacyExternal) {\n const tmp = await api.GET(`ui.tileset/${tilesetId}`, reqParams);\n data = convertLegacyRec(tmp, data);\n }\n\n res({\n tileset: data\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key: GetCacheKey(tilesetId, loadFiles),\n value: prom,\n req: reqParams\n });\n return prom;\n }\n\n /**\n * Returns tileset types for given tileset ids.\n * @param params\n * @deprecated Just use GetList and Get to find the type from the tileset record.\n * @returns\n */\n export async function GetTypes(params: {\n api?: BruceApi.Api,\n tilesetIds: string[],\n req?: Api.IReqParams\n }): Promise<{\n // Tileset id -> type mapping.\n typeMapping: IDictionary<EType>\n }> {\n // UPDATE: This was corrected, this will be removed.\n // Our api is auto-converting legacy types right now which makes it impossible to know what they are.\n // This uses the legacy end-point which doesn't do that...\n let { api, tilesetIds, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const mapping = {};\n if (tilesetIds.length == 1) {\n const tileset = await api.GET(\"ui.tileset/\" + tilesetIds[0], Api.PrepReqParams(reqParams));\n if (tileset) {\n mapping[tilesetIds[0]] = tileset.Type;\n }\n }\n else if (tilesetIds.length > 1) {\n const tilesets = await api.GET(\"ui.tilesets\", Api.PrepReqParams(reqParams));\n for (const tileset of tilesets) {\n if (tilesetIds.indexOf(tileset.ID) >= 0) {\n mapping[tileset.ID] = tileset.Type;\n }\n }\n }\n return {\n typeMapping: mapping\n };\n }\n\n /**\n * Returns a list of tileset records.\n * @param params \n * @returns \n */\n export async function GetList(params: {\n api?: BruceApi.Api,\n req?: Api.IReqParams\n }): Promise<{\n // The list of tileset records.\n tilesets: ITileset[]\n }> {\n let { api, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const cache = await api.GetCacheItem(GetListCacheKey(), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const req: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(\"tileset/getList\", reqParams) as ITileset[];\n\n // Convert legacy records.\n // Commented out because it spams :)\n // Should use the legacy getList perhaps and substitute needed records.\n /*\n for (let i = 0; i < data.length; i++) {\n const record = data[i];\n if (record.type == EType.LegacyEntitiesSet || record.type == EType.LegacyStatic || record.type == EType.LegacyExternal) {\n data[i] = convertLegacyRec(await api.GET(`ui.tileset/${record.id}`, reqParams), data[i]);\n }\n }\n */\n \n res({\n tilesets: data\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key: GetListCacheKey(),\n value: req,\n req: reqParams\n });\n return req;\n }\n\n /**\n * Deletes a tileset record.\n * @param params \n */\n export async function Delete(params: {\n api?: BruceApi.Api,\n // ID of the tileset record to delete.\n tilesetId: string,\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, tilesetId, req: reqParams } = params;\n if (!tilesetId) {\n throw(\"Tileset ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n await api.DELETE(`tileset/delete/${tilesetId}`, reqParams);\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Tileset + Api.ECacheKey.Id + tilesetId);\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Tileset);\n }\n\n /**\n * Creates or updates a tileset record.\n * @param params \n * @returns \n */\n export async function Update(params: {\n api?: BruceApi.Api,\n // Tileset record to create or update.\n tileset: ITileset,\n req?: Api.IReqParams\n }): Promise<{\n // The tileset record.\n tileset: ITileset\n }> {\n let { api, tileset: data, req: reqParams } = params;\n if (!data?.name || !data?.type) {\n throw(\"Tileset name and type are required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n // We check if the tileset has settings.\n // This is to stop invalid responses from API when we make new tilesets and call an update on them.\n const hasSettings = data.settings && Object.keys(data.settings).length > 0;\n const isNew = !data.id;\n\n if (isNew) {\n const res: ITileset = await api.GET(`tileset/new?type=${data.type}&name=${Api.Encode(data.name)}`, reqParams);\n data = {\n ...res,\n ...data,\n settings: {\n ...res.settings,\n ...data.settings\n },\n id: res.id\n }\n }\n\n // Legacy path. We use a different endpoint and we convert before saving.\n if (data.type == EType.LegacyEntitiesSet || data.type == EType.LegacyStatic || data.type == EType.LegacyExternal) {\n const legacy = convertBackToLegacy(data);\n await api.POST(`ui.tileset/${data.id}`, legacy, Api.PrepReqParams(reqParams));\n }\n else {\n // Avoid calling an update on a new tileset with no settings.\n if (!isNew || hasSettings) {\n await api.POST(`tileset/update/${data.id}`, data, Api.PrepReqParams(reqParams));\n }\n }\n\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Tileset + Api.ECacheKey.Id + data.id);\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Tileset);\n return {\n tileset: data\n };\n }\n\n /**\n * Uploads a file to a tileset.\n * @param params \n */\n export async function UploadFile(params: {\n api?: BruceApi.Api,\n // ID of the tileset to upload to.\n tilesetId: string,\n // File to upload.\n file: File,\n // (Optional) Progress callback.\n onProgress?: (progress: Uploader.IProgress) => void,\n req?: Api.IUploadReqParams\n }): Promise<void> {\n let { api, file, req, tilesetId, onProgress } = params;\n if (!tilesetId || !file) {\n throw(\"Tileset ID and file are required.\");\n }\n const size = file?.size;\n if (!size) {\n throw(\"You cannot upload a 0byte sized file.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n req = Api.PrepReqParams(req) as Api.IUploadReqParams;\n if (size > Uploader.MIN_LARGE_FILE_SIZE) {\n await Uploader.DoMultiPartUpload({\n api,\n file,\n urlSuffix: `tileset/uploadFileEx/${tilesetId}/add`,\n req,\n onProgress\n });\n }\n else {\n req.onProgress = (progress: ProgressEvent) => {\n const percent = Math.round ((progress.loaded / file.size) * 100);\n onProgress?.({\n percent: percent,\n uploaded: false\n });\n };\n await api.UPLOAD(`tileset/uploadFile/${tilesetId}/files`, file, req);\n }\n api.Cache.Remove(GetCacheKey(tilesetId, true));\n onProgress?.({\n percent: 100,\n uploaded: true\n });\n }\n\n /**\n * Deletes a file from a tileset.\n * @param params \n */\n export async function DeleteFile(params: {\n api?: BruceApi.Api,\n // ID of the tileset to delete from.\n tilesetId: string,\n // Name of the file to delete.\n file: string,\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, tilesetId, file, req: reqParams } = params;\n if (!tilesetId || !file) {\n throw(\"Tileset ID and file are required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n await api.DELETE(`tileset/deleteFile/${tilesetId}/files/${file}`, reqParams);\n api.Cache.Remove(GetCacheKey(tilesetId, true));\n }\n\n /**\n * Deletes all files from a tileset.\n * @param params \n */\n export async function DeleteAllFiles(params: {\n api?: BruceApi.Api,\n // ID of the tileset to delete all files from.\n tilesetId: string\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, tilesetId, req } = params;\n if (!tilesetId) {\n throw(\"Tileset ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n req = Api.PrepReqParams(req);\n await api.DELETE(`ui.tileset/${tilesetId}/files`, req);\n\n const cacheKey = `${Api.ECacheKey.Tileset}${Api.ECacheKey.Id}${tilesetId}`;\n api.Cache.RemoveByStartsWith(cacheKey);\n }\n\n /**\n * Uploads a file to a tileset.\n * Src files are used to generate tilesets.\n * @param params \n * @returns \n */\n export async function UploadSrcFile(params: {\n api?: BruceApi.Api,\n // ID of the tileset to upload to.\n tilesetId: string,\n // File to upload.\n file: File,\n // (Optional) Progress callback.\n onProgress?: (progress: Uploader.IProgress) => void,\n req?: Api.IUploadReqParams\n }): Promise<void> {\n let { api, file, req, tilesetId, onProgress } = params;\n if (!tilesetId || !file) {\n throw(\"Tileset ID and file are required.\");\n }\n const size = file?.size;\n if (!size) {\n throw(\"You cannot upload a 0byte sized file.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n req = Api.PrepReqParams(req) as Api.IUploadReqParams;\n if (size > Uploader.MIN_LARGE_FILE_SIZE) {\n await Uploader.DoMultiPartUpload({\n api,\n file,\n urlSuffix: `tileset/uploadFileEx/${tilesetId}/src`,\n req,\n onProgress\n });\n }\n else {\n req.onProgress = (progress: ProgressEvent) => {\n const percent = Math.round ((progress.loaded / file.size) * 100);\n onProgress?.({\n percent: percent,\n uploaded: false\n });\n };\n await api.UPLOAD(`tileset/uploadFile/${tilesetId}/src`, file, req);\n }\n api.Cache.Remove(GetCacheKey(tilesetId, true));\n onProgress?.({\n percent: 100,\n uploaded: true\n });\n return;\n }\n\n /**\n * Deletes a file from a tileset.\n * Src files are used to generate tilesets.\n * @param params \n */\n export async function DeleteSrcFile(params: {\n api?: BruceApi.Api,\n // ID of the tileset to delete from.\n tilesetId: string,\n // Name of the file to delete.\n file: string,\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, tilesetId, file, req: reqParams } = params;\n if (!tilesetId || !file) {\n throw(\"Tileset ID and file are required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n await api.DELETE(`tileset/deleteFile/${tilesetId}/src/${file}`, reqParams);\n api.Cache.Remove(GetCacheKey(tilesetId, true));\n }\n\n /**\n * Returns file url for a file + tileset.\n * @param params \n * @returns \n */\n export function GetFileUrl(params: {\n api?: BruceApi.Api,\n // ID of the tileset.\n tilesetId: string,\n // Default = false.\n viaCdn?: boolean,\n // (Optional) Cache killing token to append to the request url.\n // It is recommended to pass the tileset's generation version.\n cacheToken?: number | string,\n // If this is a legacy tileset, eg: static or dynamic.\n // They have a slightly different folder structure so we adjust the url.\n legacy?: boolean,\n // File or file path to get.\n file: string,\n }): string {\n let { api, tilesetId, file, cacheToken, legacy, viaCdn } = params;\n if (!tilesetId) {\n throw(\"Tileset ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n if (!file) {\n file = \"\";\n }\n return api.ConstructUrl({\n cdn: viaCdn,\n url: `v3/tilesets/${tilesetId}/files/${legacy ? \"\" : \"files/\"}${file}`,\n urlParams: {\n \"cacheToken\": String(cacheToken ? cacheToken : 0)\n }\n });\n }\n\n /**\n * Returns file url for a src file + tileset.\n * @param params \n * @returns \n */\n export function GetSrcFileUrl(params: {\n api?: BruceApi.Api,\n // ID of the tileset.\n tilesetId: string,\n // Name of the file.\n file: string\n }): string {\n let { api, tilesetId, file } = params;\n if (!tilesetId) {\n throw(\"Tileset ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n if (!file) {\n file = \"\";\n }\n return api.ConstructUrl({\n url: `tileset/getFile/${tilesetId}/src/${file}`\n });\n }\n\n /**\n * Returns file url for a file + tileset.\n * @param params \n * @deprecated Use GetFileUrl instead.\n * @returns \n */\n export function GetPublicFileUrl(params: {\n api?: BruceApi.Api,\n // ID of the tileset.\n tilesetId: string,\n // Default = false.\n viaCdn?: boolean,\n // (Optional) Cache killing token to append to the request url.\n viaCdnCacheToken?: number | string,\n file: string\n }): string {\n let { api, tilesetId, file, viaCdn, viaCdnCacheToken } = params;\n if (!tilesetId) {\n throw(\"Tileset ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n if (!file) {\n file = \"\";\n }\n return api.ConstructUrl({\n cdn: viaCdn,\n url: `tileset/file/${tilesetId}/${file}`,\n urlParams: {\n \"cacheToken\": String(viaCdnCacheToken ? viaCdnCacheToken : 0)\n }\n });\n }\n\n /**\n * Calls the generate end-point for a tileset.\n * The requirements for successful generation are based on the type of tileset.\n * @param params \n * @returns \n */\n export async function Generate(params: {\n api?: BruceApi.Api,\n // ID of the tileset to generate.\n tilesetId: string,\n req?: Api.IReqParams\n }): Promise<{\n // ID of the pending action to monitor.\n pendingActionId: number\n }> {\n let { api, tilesetId, req: reqParams } = params;\n if (!tilesetId) {\n throw(\"Tileset ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const res: PendingAction.IAction = await api.GET(`tileset/generate/${tilesetId}`, Api.PrepReqParams(reqParams));\n return {\n pendingActionId: res.ID\n };\n }\n\n /**\n * Utils for publishing the tileset to other Nextspace accounts.\n */\n export namespace Publish {\n export function GetCacheKey(accountId: string, tilesetId?: string): string {\n if (!tilesetId) {\n tilesetId = \"\";\n }\n return Api.ECacheKey.PublishTileset + Api.ECacheKey.Id + accountId + Api.ECacheKey.Id + tilesetId;\n }\n\n export function GetAccessAllowedCacheKey(tilesetId: string, sourceAccountId: string, forAccountId: string) {\n return Api.ECacheKey.PublishTileset + Api.ECacheKey.TilesetAccess + Api.ECacheKey.Id + tilesetId + Api.ECacheKey.Id + sourceAccountId + Api.ECacheKey.Id + forAccountId;\n }\n\n export interface IPublish {\n ID?: number;\n Name: string;\n \"Tileset.ID\"?: string;\n \"PublishedBy.ClientAccount.ID\"?: string;\n \"PublishedBy.User.ID\"?: string;\n \"Published.DateTime\"?: UTC.IUTC;\n IsPublic: boolean;\n \"EnabledFor.ClientAccount.ID\"?: string[];\n }\n\n export async function Update(params: {\n api?: GlobalApi.Api,\n published: IPublish,\n req?: Api.IReqParams\n }): Promise<{\n published: IPublish\n }> {\n let { api, published: data, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetGlobalApi();\n }\n\n if (!data?.[\"Tileset.ID\"] || !data?.[\"PublishedBy.ClientAccount.ID\"] || !data?.[\"PublishedBy.User.ID\"]) {\n throw(\"Tileset ID, client account ID, and user ID are required.\");\n }\n if (!data.ID) {\n data.ID = 0;\n }\n const res: IPublish = await api.POST(`tileset/${data.ID}`, data, reqParams);\n const req = {\n \"ClientAccount.ID\": data[\"EnabledFor.ClientAccount.ID\"]\n };\n data.ID = res.ID;\n await api.POST(`tileset/${data.ID}/enableForAccounts`, req, reqParams);\n await api.Cache.Remove(GetCacheKey(data[\"PublishedBy.ClientAccount.ID\"], data[\"Tileset.ID\"]));\n await api.Cache.Remove(GetCacheKey(data[\"PublishedBy.ClientAccount.ID\"]));\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.PublishTileset + Api.ECacheKey.TilesetAccess);\n return {\n published: data\n };\n }\n\n export async function Get(params: {\n api?: GlobalApi.Api,\n accountId: string,\n tilesetId: string,\n req?: Api.IReqParams\n }): Promise<{\n published: IPublish\n }> {\n let { api, accountId, tilesetId, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetGlobalApi();\n }\n\n if (!accountId || !tilesetId) {\n throw(\"Client account ID and tileset ID are required.\");\n }\n const cache = await api.GetCacheItem(GetCacheKey(accountId, tilesetId), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(`tilesetByPublisher/${accountId}/${tilesetId}`, reqParams);\n res({\n published: data\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key: GetCacheKey(accountId, tilesetId),\n value: prom,\n req: reqParams\n });\n return prom;\n }\n\n export async function GetList(params: {\n api?: GlobalApi.Api,\n accountId: string,\n req?: Api.IReqParams\n }): Promise<{\n published: IPublish[]\n }> {\n let { api, accountId, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetGlobalApi();\n }\n\n if (!accountId) {\n throw(\"Client account ID is required.\");\n }\n const cache = await api.GetCacheItem(GetCacheKey(accountId), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const req: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(`tilesets/enabledForAccount/${accountId}`, reqParams);\n res({\n published: data.Items\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key: GetCacheKey(accountId),\n value: req,\n req: reqParams\n });\n return req;\n }\n\n /**\n * Returns if a given tileset is allowed to be loaded for a given account.\n * @param params \n */\n export async function IsAccessAllowed(params: {\n // Tileset + account from which to load.\n tilesetId: string,\n sourceAccountId: string,\n getters?: ApiGetters,\n // Account we're loading in.\n forAccountId?: string,\n // Default is true.\n checkFreeOption?: boolean,\n req?: Api.IReqParams\n }): Promise<boolean> {\n let { tilesetId, sourceAccountId, getters, forAccountId, checkFreeOption, req } = params;\n if (!forAccountId) {\n forAccountId = ENVIRONMENT.PARAMS.accountId;\n }\n if (checkFreeOption == null) {\n checkFreeOption = true;\n }\n\n // Null source account id means it's a tileset from within the same account.\n // We also don't want to bother looking for records if we're loading in our own account.\n if (forAccountId == sourceAccountId || !sourceAccountId) {\n return true;\n }\n if (!getters) {\n getters = ENVIRONMENT.Api();\n }\n req = Api.PrepReqParams(req);\n const globalApi = getters.GetGlobalApi();\n\n const key = GetAccessAllowedCacheKey(tilesetId, sourceAccountId, forAccountId);\n const cacheData = globalApi.GetCacheItem(key, req);\n if (cacheData?.found) {\n return cacheData.data;\n }\n const prom: Promise<boolean> = new Promise(async (res, rej) => {\n try {\n // We try find the published record for the tileset.\n // If it doesn't exist, then it's not published.\n const {published} = await GetList({\n accountId: forAccountId,\n api: globalApi,\n });\n const tileset = published.find(x => x[\"Tileset.ID\"] == tilesetId && x[\"PublishedBy.ClientAccount.ID\"] == sourceAccountId);\n const allowed = tileset != null;\n if (allowed) {\n res(true);\n }\n\n // If not allowed we'll check if this is a CC3D tileset and if it's set as the selected \"free\" one.\n // This is a placeholder feature until a marketplace system is made.\n if (String(sourceAccountId).toLowerCase().trim() == \"cc3d\" && checkFreeOption) {\n const settings = (await Account.GetAppSettings({\n accountId: forAccountId,\n appId: Account.EAppId.Navigator,\n api: getters.GetGuardianApi()\n })).settings as AccountSettings.INavigator;\n const cc3dTilesetId = settings?.published?.freeCC3dTilesetId;\n if (cc3dTilesetId == tilesetId) {\n res(true);\n }\n }\n\n res(false);\n }\n catch (e) {\n rej(e);\n }\n });\n globalApi.SetCacheItem({\n key: key,\n value: prom,\n req: req\n });\n return prom;\n }\n }\n\n export namespace Settings {\n export interface ICad {\n rootEntityId: string;\n entityTypeId: string;\n styleId?: number;\n lodKey?: string;\n movePivot?: Tileset.EPivot;\n ucsId?: number;\n epsg?: number;\n thumbFileId?: string;\n location?: Carto.ICarto;\n offset?: any;\n transform?: Transform.ITransform;\n doubleSided?: boolean;\n b3dmFileSize?: number;\n maximumScreenSpaceError?: number;\n }\n\n export enum EMapTileSize {\n IMG_256 = 256,\n IMG_512 = 512,\n IMG_1024 = 1024,\n IMG_2048 = 2048\n }\n\n export interface IEntitiesMap {\n imageSize: EMapTileSize;\n levelMin: number;\n levelMax: number;\n entityTypeId: string;\n styleId: number;\n filter: any;\n boundaries: Bounds.IBounds;\n }\n\n export interface IEntities {\n zoomControl?: any[];\n boundaries?: Bounds.IBounds;\n filter?: any;\n altitudeRefType?: string;\n terrainSource?: string;\n terrainUri?: string;\n doubleSided?: boolean;\n entityTypeId?: string;\n styleId?: number;\n tilesetId?: string;\n }\n\n export enum EExternalMapType {\n TileMapImagery = \"TileMapImagery\",\n OpenStreetMapImagery = \"OpenStreetMapImagery\",\n MapBoxImagery = \"MapBoxImagery\",\n CesiumIon = \"CesiumIon\",\n CustomTemplate = \"Static\"\n }\n\n export interface IExternalMap {\n url?: string;\n mapType?: EExternalMapType;\n fileExtension?: string;\n externalId?: number | string;\n styleId?: string;\n account?: string;\n key?: string;\n iconClientFileId?: string;\n }\n\n export interface IExternalTerrain {\n requestVertexNormals?: boolean;\n url?: string;\n }\n\n export interface IMap {\n sourceFileId: string;\n imageSize: number;\n levelMin: number;\n levelMax: number;\n boundaries?: Bounds.IBounds;\n }\n\n export interface IPointcloud {\n sourceFileIds: string[];\n location: Carto.ICarto;\n transform: Transform.ITransform;\n pntFileSize?: number;\n epsg?: number;\n attenuation?: boolean;\n attenuationMax?: number;\n movePivot?: Tileset.EPivot;\n maximumScreenSpaceError?: number;\n }\n\n export interface ITerrain {\n sourceFileId?: string;\n startLevel?: number;\n }\n\n /**\n * Legacy settings for legacy tileset types that we still need to upgrade.\n */\n export interface ILegacy {\n creationTypeId?: string;\n creationEntityFilter?: any;\n creationTerrainSrc?: any; \n creationSettings?: any;\n creationZoomControl?: any;\n origin?: {\n latitude: number;\n longitude: number;\n altitude: number;\n usingBoundingBox: boolean;\n };\n positionOffset?: {\n north: number;\n east: number;\n altitude: number;\n };\n rotation?: {\n x: number;\n y: number;\n z: number;\n };\n visual?: {\n maximumScreenSpaceError?: number;\n attenuation?: boolean;\n attenuationMax?: number;\n colorMask?: string;\n },\n dontRotate?: boolean;\n dontTransform?: boolean;\n showAdvancedSettings?: boolean;\n ExternalTilesetURL?: string;\n }\n }\n\n /**\n * Returns cache identifier for a tileset.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetCacheKey(\"abc\", false);\n * api.Cache.Remove(key);\n * }\n * @param tilesetId\n * @param loadFiles\n * @returns \n */\n export function GetCacheKey(tilesetId: string, loadFiles: boolean): string {\n return `${Api.ECacheKey.Tileset}${Api.ECacheKey.Id}${tilesetId}${Api.ECacheKey.Id}${loadFiles}`;\n }\n\n /**\n * Returns cache identifier for a list of tilesets.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetListCacheKey();\n * api.Cache.Remove(key);\n * }\n * @returns\n */\n export function GetListCacheKey(): string {\n return Api.ECacheKey.Tileset;\n }\n}","import {IDictionary} from \"../bruce-models\";\nimport { Entity } from \"../entity/entity\";\nimport { Tileset } from \"../tileset/tileset\";\nimport { ObjectUtils } from \"../util/object-utils\";\nimport { ZoomControl } from \"./zoom-control\";\n\n/**\n * Describes a menu item found in project views.\n * Menu items are used to dictate what data to load in a scene.\n * A menu item may be a container for other items.\n */\nexport namespace MenuItem {\n /**\n * Possible types of menu items.\n */\n export enum EType {\n // Container for other menu items.\n None = \"NONE\",\n // Renders Nextspace Entities based on an Entity Type ID and optional attribute filter.\n Entities = \"BruceEntity\",\n // Renders a single Entity by ID.\n Entity = \"SingleEntity\",\n // Renders Cesium OSM Buildings.\n Osm = \"OSMBuildingsTileset\",\n // Renders a Cesium Tileset made from importing an assembly file into Nextspace.\n CadTileset = \"ModelTileset\",\n // Renders legacy Nextspace tilesets.\n // This is primarily used for static Tilesets as they don't have an upgraded version yet.\n ArbTileset = \"ArbitraryTileset\",\n // Renders a Cesium Tileset by Ion asset ID.\n IonTileset = \"Cesium3DTileset\",\n // Renders a KML file in Cesium.\n // No data is managed, this is purely visual.\n Kml = \"StaticKML\",\n // Renders rows of a CSV as Cesium Entities.\n // This a single-purpose proof of concept feature. Avoid using.\n Csv = \"StaticCSV\",\n // Renders a Cesium Tileset made from arbitrary Nextspace Entities.\n EntityTileset = \"EntitiesTileset\",\n // Renders a Cesium Imagery made from arbitrary Nextspace Entities.\n // @deprecated.\n EntityRaster = \"RasterEntitiesTileset\",\n // Renders a Cesium Point Cloud imported from LAS/LAZ file into Nextspace.\n PointCloud = \"PointCloudTileset\",\n // Renders preloaded Entity records.\n EntitiesLoaded = \"LoadedEntities\",\n // Renders Entities matching specific IDs.\n EntitiesIds = \"EntitiesIds\",\n // @deprecated. Use Relationships instead.\n Relations = \"Relations\",\n // Renders Entity relationships.\n // This renders specified downstream relationship types for specified Entity IDs.\n Relationships = \"Relationships\",\n // Renders the Cesium Google photogrammetry tileset.\n GooglePhotoTileset = \"GooglePhotoTileset\",\n // Renders the result of a Google search.\n // Eg: the Menu Item can be configured to render 'restaurants' around the viewport.\n GoogleSearch = \"GoogleSearch\",\n // Renders a ArcGIS I3S scene.\n I3sTileset = \"I3STileset\",\n }\n\n /**\n * @derepcated.\n */\n export interface ILegend {\n model3d: boolean;\n point: boolean;\n polygon: boolean;\n polylines: boolean;\n tileset3d: boolean;\n }\n\n /**\n * Settings related to how authoring for a menu item should behave.\n */\n export interface IAuthorSettings {\n // If true, the clicked entity will be read and used to update the authored entity.\n readClickedEntity?: boolean;\n // Optional relationship type to use when relating to the clicked entity.\n clickedRelationTypeId?: string;\n // If set, specified attributes will be copied between the clicked and authored entities.\n copyClickedAttrMapping?: {\n // String is a wrapped path, check PathUtils.\n fromPathStr: string;\n toPathStr: string;\n }[];\n }\n\n /**\n * Describes a menu item found in project views.\n */\n export interface IItem {\n // Unique id for this menu item.\n id: string;\n // Human readable name for this menu item.\n Caption: string;\n // Description for this menu item. Optional.\n Description?: string;\n // If this menu item is pinned.\n // This makes it visible to viewers without it having been enabled in the bookmark.\n // This is used to focus the panel to only parts the editor wants the viewer to control.\n Pinned?: boolean;\n // If the item's type is null or None then it is a container for other items.\n Children?: IItem[];\n // The type of menu item.\n Type: EType;\n // If true, the menu item's children will be hidden from UI.\n hideChildren?: boolean;\n // @deprecated.\n legend?: ILegend;\n // If true, the menu item will allow the user to author entities in the scene.\n // This is only available for certain menu item types.\n authoringEnabled?: boolean;\n // Settings related to how authoring for a menu item should behave.\n authoring?: IAuthorSettings;\n // @deprecated.\n LabelColor?: string;\n // Priority in relation to other menu items.\n // Higher number priority graphics take priority over lower number priority graphics.\n // This is important of two of the same entity are rendered between different menu items.\n renderPriority?: number;\n // Default = false.\n cdnEnabled?: boolean;\n // Used to kill cache. Default = 0.\n // Tilesets have their own counter within their records.\n // This is used for non-tileset items.\n cdnCounter?: number;\n }\n\n /**\n * Creates a menu item for a single entity.\n * @param entityId \n * @param typeId \n * @param styleId \n * @returns \n */\n export function CreateFromEntityId(entityId: string, typeId: string, styleId?: number): IItem {\n return <Item.IEntity>{\n id: ObjectUtils.UId(),\n Type: EType.Entity,\n Caption: \"Generated Entity Menu Item\",\n BruceEntity: {\n \"EntityType.ID\": typeId,\n EntityId: entityId\n },\n CameraZoomSettings: [\n {\n DisplayType: ZoomControl.EDisplayType.Model3D,\n MaxZoom: 1000000,\n MinZoom: 0,\n StyleID: styleId\n }\n ]\n };\n }\n\n /**\n * Creates a menu item for an entity type.\n * @param typeId \n * @param styleId \n * @returns \n */\n export function CreateFromTypeId(typeId: string, styleId?: number): IItem {\n return <Item.IEntities>{\n id: ObjectUtils.UId(),\n Type: EType.Entities,\n Caption: \"Generated Entity Type Menu Item\",\n BruceEntity: {\n \"EntityType.ID\": typeId\n },\n CameraZoomSettings: [\n {\n DisplayType: ZoomControl.EDisplayType.Model3D,\n MaxZoom: 100000,\n MinZoom: 0,\n StyleID: styleId\n }\n ]\n };\n }\n\n /**\n * Creates a menu item for a tileset.\n * @param tilesetId \n * @param type \n * @returns \n */\n export function CreateFromTilesetId(tilesetId: string, type: Tileset.EType): IItem {\n if (type === Tileset.EType.Cad) {\n return <Item.ICadTileset>{\n\t id: ObjectUtils.UId(),\n\t Type: EType.CadTileset,\n Caption: \"Generated CAD Menu Item\",\n\t FlyTo: false,\n\t\t\t\ttileset: {\n\t\t\t\t\tTilesetID: tilesetId\n\t\t\t\t}\n };\n }\n else if (type == Tileset.EType.EntitiesSet) {\n return <Item.IEntitiesTileset>{\n id: ObjectUtils.UId(),\n Type: EType.EntityTileset,\n Caption: \"Generated Entities Menu Item\",\n FlyTo: false,\n tileset: {\n TilesetID: tilesetId\n }\n };\n }\n else if (type == Tileset.EType.PointCloud) {\n return <Item.IPointcloud>{\n id: ObjectUtils.UId(),\n Type: EType.PointCloud,\n Caption: \"Generated Point Cloud Menu Item\",\n FlyTo: false,\n tileset: {\n TilesetID: tilesetId\n }\n };\n }\n else if (type == Tileset.EType.EntitiesMap) {\n return <Item.IEntitiesRaster>{\n id: ObjectUtils.UId(),\n Type: EType.EntityRaster,\n Caption: \"Generated Entities Menu Item\",\n tileset: {\n TilesetID: tilesetId\n }\n };\n }\n throw(\"Tileset type not supported.\");\n }\n\n export namespace Item {\n /**\n * Tileset load information.\n */\n export interface ITileset {\n // Failsafe. Not recommended to use.\n TilesetURL?: string;\n // Client account ID where the tileset is hosted.\n // If unspecified then it will assume the same account as the project view.\n ClientAccountID?: string;\n // Tileset ID.\n TilesetID?: string;\n // @deprecated.\n TilesetName?: string;\n }\n\n /**\n * Settings related to how entity clustering should behave.\n */\n export interface IClustering {\n // Minimum distance to an entity for it to cluster.\n // bruce-cesium/point-clustering.ts will have 5000 as default.\n minDistance?: number;\n // Minimum total loaded for the menu item for clustering to kick in.\n // bruce-cesium/point-clustering.ts will have 0 as default.\n // It will always try to cluster when points are near each-other and camera is far away.\n minTotalCount?: number;\n // TODO: Zoom control-like settings for clustering.\n // Between x and y meters the points should cluster with z distance.\n // Eg: \"Between 5,000 and 15,000 meters the points should cluster within 500 meters.\"\n }\n\n /**\n * Menu item for loading Nextspace vector or 3D model entities.\n */\n export interface IEntities extends IItem {\n Type: EType.Entities;\n BruceEntity: {\n // Entity type ID to filter against.\n \"EntityType.ID\": string;\n // (Optional) Entity attribute filter.\n Filter?: IDictionary<string>;\n\n // (Optional) Attribute path to filter for historic Entity records.\n // The viewer's date-time value will be used in combination with this attribute to filter records.\n // When set, the Menu Item will monitor the date-time value changing and re-request records.\n historicAttrKey?: string;\n\n // (Optional) alternative schema to request.\n // This is used to calculate read-only entity data.\n schemaId?: string;\n\n // (Optional) If true, Menu Item will display individual sub-items for Tags.\n ExpandLayers?: boolean;\n // If ExpandLayers = true, this is the saved sub-items to render.\n // If this is null or empty, that means there is nothing to render for this menu item.\n SelectedExpandLayers?: number[];\n };\n // Zoom control to dictate how entities look at different distances from the camera.\n CameraZoomSettings?: ZoomControl.IItem[];\n // If true, historic Entities will interpolate between records based on current scene time.\n // This will slow down initial render as more data will be required for the render.\n historicInterpolation?: boolean;\n\n // If true, menu item will render point and icon entities as clustered points when close together.\n enableClustering?: boolean;\n clustering?: IClustering;\n\n // If BruceEntity.ExpandLayers = true,\n // this will dictate if camera should be used to scan for tags in view.\n filterLayersByCameraLocation?: boolean;\n showAllLayersExcludeBelow?: boolean;\n layers?: number[];\n extLayers?: {\n ID: number,\n checked: boolean\n }[];\n\n // Experimental flag for rendering entities as geojson.\n // This only supports polygons and polylines.\n // Only works OK with flat terrain and no ground occlusion.\n renderAsGeojson?: boolean;\n }\n\n /**\n * Menu item for loading a single Nextspace vector or 3D model entity.\n */\n export interface IEntity extends IItem {\n Type: EType.Entity;\n BruceEntity: {\n // Entity type ID to filter against.\n \"EntityType.ID\"?: string;\n // Entity ID to load.\n EntityId: string;\n };\n // Zoom control to dictate how entities look at different distances from the camera.\n CameraZoomSettings?: ZoomControl.IItem[];\n showAllLayers?: boolean;\n showAllLayersExcludeBelow?: boolean;\n }\n\n /**\n * Menu item for loading a legacy tileset.\n */\n export interface IArbTileset extends IItem {\n Type: EType.ArbTileset | EType.IonTileset;\n // @deprecated\n FlyTo?: boolean;\n BruceEntity?: {\n // Preferred entity type ID for making new entity records.\n // When a graphic is selected in UI and no record is found, this type ID will be used as the suggested type.\n \"EntityType.ID\"?: string;\n };\n // Tileset load information.\n tileset?: ITileset;\n // Style mapping between entity type IDs to style IDs.\n StyleMapping?: any[];\n // Fallback style ID when no mapped style is found.\n styleId?: number;\n // If true, the menu item will apply styles to the tileset.\n ApplyStyles?: boolean;\n // If set, an ion asset is loaded in place of a Nextspace tileset.\n IonResource?: {\n AssetID: string | number;\n // If not supplied then the client account default is used.\n AccessToken?: string;\n }\n }\n export interface IIonTileset extends IArbTileset {}\n\n /**\n * Menu item for loading a CAD tileset.\n */\n export interface ICadTileset extends IItem {\n Type: EType.CadTileset;\n // Tileset load information.\n tileset: ITileset;\n // @deprecated\n FlyTo?: boolean;\n // Style mapping between entity type IDs to style IDs.\n StyleMapping?: any[];\n // Setting for how the style colours should be blended.\n StyleBlending?: {\n // Hightlight = 0, replace = 1, mix = 2.\n blendMode: 0 | 1 | 2;\n // 1 = 100% new colour. 0 = original colour.\n blendPercent: number;\n };\n // Fallback style ID when no mapped style is found.\n styleId?: number;\n BruceEntity?: {\n // Optional restriction.\n // When not null, only entities matching supplied ids will be visible.\n EntityIds?: string[];\n // Optional styling.\n // When entity ids are set, other entities can optionally be \"ghosts\".\n // This means they will be available but at low opacity.\n Ghosts?: boolean;\n }\n }\n\n /**\n * Menu item for loading a point cloud tileset.\n */\n export interface IPointcloud extends IItem {\n Type: EType.PointCloud;\n // @deprecated\n FlyTo?: boolean;\n // Tileset load information.\n tileset: ITileset;\n }\n\n /**\n * Menu item for loading a raster tileset.\n * This is deprecated and unsupported in the latest web-Navigator.\n * If needed, load through the imagery panel.\n */\n export interface IEntitiesRaster extends IItem {\n Type: EType.EntityRaster;\n tileset: ITileset;\n }\n\n /**\n * Menu item for loading a Cesium OSM tileset.\n */\n export interface IOsm extends IItem {\n Type: EType.Osm;\n BruceEntity?: {\n // Preferred entity type ID for making new entity records.\n // When a graphic is selected in UI and no record is found, this type ID will be used as the suggested type.\n \"EntityType.ID\"?: string;\n // Source record for loading and saving the mapping between OSM IDs and Nextspace IDs.\n SourceId: string;\n };\n // If enabled then pending OSM buildings will be partially transparent.\n // A building is considered pending while it hasn't checked for a corresponding Nextspace ID.\n ghostLoading?: boolean;\n }\n\n /**\n * Menu item for loading a static KML file.\n */\n export interface IKml extends IItem {\n Type: EType.Kml;\n // Array of KML files to load.\n KML?: {\n // KML file to load.\n ClientFile?: {\n ID: string;\n },\n // Arbitrarily hosted file to load instead of a client file.\n fileUrl?: string;\n }[]\n }\n\n /**\n * Menu item for loading a static CSV file.\n * This is made for a specific proof of concept purpose and will likely not work with other CSV files.\n * Avoid using.\n */\n export interface ICsv extends IItem {\n Type: EType.Csv;\n // Array of CSV files to load.\n CSV?: {\n // CSV file to load.\n ClientFile?: {\n ID: string;\n },\n // Arbitrarily hosted file to load instead of a client file.\n fileUrl?: string;\n // 3D model client file ID used for animated CSV \"journey\" lines.\n vehicleFileId?: string;\n // CSS color string for the line.\n lineColor?: string;\n // File to use for the alert icons.\n alertFileId?: string;\n // Entity ID to link the vehicle to.\n // This will make the vehicle selectable in the scene.\n vehicleEntityId?: string;\n }[]\n }\n\n /**\n * Menu item for loading a tileset made from entities.\n */\n export interface IEntitiesTileset extends IItem {\n BruceEntity?: {\n // Preferred entity type ID for making new entity records.\n // When a graphic is selected in UI and no record is found, this type ID will be used as the suggested type.\n // (Commonly used for shared tilesets across accounts).\n \"EntityType.ID\"?: string;\n };\n Type: EType.EntityTileset;\n // @deprecated\n FlyTo: boolean;\n // Tileset load information.\n tileset: ITileset;\n // Point cloud settings as this tileset can include point clouds and 3d models.\n // The use-case is that this tileset is made from entities and what the user wants to show between bookmarks is different.\n // Bookmarks have \"menuItemAlternations\" to have different settings for menu items per bookmark.\n attenuation?: boolean;\n attenuationMax?: number;\n // Style ID to apply when ApplyStyles is true.\n styleId?: number;\n // If true, the menu item will apply styles to the tileset.\n // Only 3d-model styling is applied as all entities in this tileset are considered 3d-models.\n ApplyStyles?: boolean;\n }\n\n /**\n * Menu item that loads preloaded entity records.\n */\n export interface IEntitiesLoaded extends MenuItem.IItem {\n Type: EType.EntitiesLoaded;\n BruceEntity: {\n // TODO: is this needed?\n \"EntityType.ID\"?: string;\n // Array of entity records to load.\n Entities: Entity.IEntity[];\n };\n // Zoom control to dictate how entities look at different distances from the camera.\n CameraZoomSettings?: ZoomControl.IItem[];\n\n // Experimental flag for rendering entities as geojson.\n // This only supports polygons and polylines.\n // Only works OK with flat terrain and no ground occlusion.\n renderAsGeojson?: boolean;\n }\n\n /**\n * Menu item that loads specific entity ids.\n */\n export interface IEntityIds extends MenuItem.IItem {\n Type: EType.EntitiesIds;\n BruceEntity: {\n // Array of entity ids to load.\n EntityIds: string[];\n };\n // Zoom control to dictate how entities look at different distances from the camera.\n CameraZoomSettings?: ZoomControl.IItem[];\n\n // If true, menu item will render point and icon entities as clustered points when close together.\n // Default = false.\n enableClustering?: boolean;\n clustering?: IClustering;\n\n // Experimental flag for rendering entities as geojson.\n // This only supports polygons and polylines.\n // Only works OK with flat terrain and no ground occlusion.\n renderAsGeojson?: boolean;\n }\n\n /**\n * Auto-generated menu item when entity-relationships are marked to be rendered.\n * @deprecated, use IRelationships instead.\n */\n export interface ILegacyRelationships extends MenuItem.IItem {\n Type: EType.Relations;\n BruceEntity?: {\n EntityIds?: string[];\n },\n }\n\n /**\n * Describes a relationship group to render.\n */\n export interface IRenderedRelations {\n // Entities to drawn relationships for.\n // Downstream relationships will be drawn for these entities.\n entityIds: string[];\n // The relationship type to render for the ids.\n relationTypeId: string;\n }\n\n /**\n * Auto-generated menu item when entity-relationships are marked to be rendered.\n */\n export interface IRelationships extends MenuItem.IItem {\n Type: EType.Relationships;\n // Relationships to render.\n // This is an entityIds -> relationship type grouping.\n // The relationships will be drawn downstream only.\n relations?: IRenderedRelations[];\n }\n\n export interface IGooglePhotoTileset extends IItem {\n Type: EType.GooglePhotoTileset;\n // Css color string to apply to the tileset.\n // This follows Cesium logic for when color is pure white,\n // that means don't apply colour and only apply alpha.\n colorMask?: string;\n }\n\n export interface IGoogleSearch extends IItem {\n Type: EType.GoogleSearch;\n // Search keyword, eg: 'restaurants'.\n keyword: string;\n // Google API Key to use.\n // If not provided then the account default will be used.\n accessToken?: string;\n }\n\n export interface II3sTileset extends IItem {\n Type: EType.I3sTileset;\n // Terrain provider which provides geoid conversion between gravity related and ellipsoidal based height systems.\n geoidServiceUrl?: string;\n tileset?: {\n // URL to the Tileset we want to load.\n TilesetURL?: string;\n }\n }\n }\n}","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { Camera } from \"../common/camera\";\nimport { IDictionary } from \"../common/dictionary\";\nimport { UTC } from \"../common/utc\";\nimport { ENVIRONMENT } from \"../environment\";\nimport { Markup } from \"../markup/markup\";\nimport { Section } from \"../common/section\";\nimport { MenuItem } from \"./menu-item\";\nimport { ProjectViewTile } from \"./project-view-tile\";\n\n/**\n * Describe the \"Project View Bookmark\" concept within Nextspace.\n * This is referred to as \"slides\" in older code.\n *\n * A bookmark is a snapshot of what should be displayed and how in a particular project view.\n */\nexport namespace ProjectViewBookmark {\n // This is the expected default version for the DataVersion value.\n // This value should NOT be changed without looking at our API and seeing what the default value is.\n export const DEFAULT_DATA_VERSION = 2;\n\n /**\n * Describes a bookmark record.\n */\n export interface IBookmark {\n // ID of the bookmark record.\n ID?: string;\n // Human readable title of the bookmark.\n Title?: string;\n // Human readable description of the bookmark.\n Note?: string;\n // ID of the client file used for the bookmark thumbnail.\n // Must be set. Use an empty string if no thumbnail is desired.\n \"Screenshot.ClientFile.ID\"?: string;\n // ID of the associated project view.\n \"UI.View.ID\"?: string;\n // ID of the user who created the bookmark.\n \"Created.ByUser.ID\"?: string;\n // Date/time the bookmark was created.\n \"Created.Date\"?: UTC.IUTC;\n // Bookmark grouping ID.\n \"UI.SlideGroup.ID\"?: number;\n // This is the version of the data in the bookmark.\n // This is used to determine how to parse the bookmark's settings.\n // 1 - 10,000 are reserved for Nextspace use.\n DataVersion: number;\n // Display order related to sibling bookmarks.\n DisplayOrder?: number;\n // Settings for the bookmark.\n Settings?: Settings;\n // Bookmark camera position.\n Camera?: Web3d.ICamera | Web2d.ICamera;\n // Clipping planes to apply to terrain/entities in the scene.\n // A clipping plane is associated with a tileset by root entity id.\n sections?: Section.ISection[];\n }\n\n export type Settings = ISettings | IWeb3dSettings | IWeb2dSettings;\n\n export interface ISettings {\n // No shared settings yet!\n }\n\n /**\n * Describes the content of a bookmark.\n * As part of a deal we've been commissioned to create an alternative bookmark type to embed content.\n */\n export enum EContentType {\n WEB_3D = \"WEB_3D\",\n IFRAME = \"IFRAME\"\n }\n\n /**\n * These are the base settings expected in any 3D bookmark.\n * The only exception is data-version = 1 which is our deprecated legacy format.\n */\n export interface IWeb3dSettings extends ISettings {\n // Default is WEB_3D. This will render the typical CesiumJS experience.\n // IFRAME will render an embedded iframe in the bookmark.\n contentType?: EContentType;\n // This is the URL to the iframe content.\n // This is only used when contentType = IFRAME.\n iframeUrl?: string;\n\n menuItemIds?: string[];\n // This is a map of menu item ids to their alternations.\n // An alternation is a menu item that has varied settings to the base menu item.\n // For example, the base menu item might be \"enabled certain tags\", and the alternation is \"enabled x,y,z certain tags\" to be specific in a bookmark.\n menuItemAlternations?: IDictionary<MenuItem.IItem>;\n // Array of entity ids for which to draw labels for.\n // If empty, no labels are drawn.\n labelledEntityIds?: string[];\n // Bookmark-wide relationships to render.\n // The lines will render regardless of entities being rendered.\n renderedRelations?: MenuItem.Item.IRenderedRelations[];\n groundOcclusion?: boolean;\n // Null = use default, empty array = no imagery.\n imagery?: ProjectViewTile.IBookmarkImagery[];\n terrain?: ProjectViewTile.IBookmarkTerrain;\n // Css color string to apply to the base globe.\n globeColor?: string;\n // 0 = 0%, 1 = 100%. Default is 100%.\n globeAlpha?: number;\n // If true, the globe will be hidden. Default is false.\n globeHidden?: boolean;\n markup?: Markup.IMarkup;\n shadows?: Web3d.IShadows;\n ambientOcclusion?: Web3d.IAmbientOcclusion;\n lighting?: Web3d.ILighting;\n quality?: Web3d.IQuality;\n contours?: Web3d.IContours;\n // iso8601 date time string.\n // String itself includes timezone information. Navigator will create a UTC string when saving.\n // Eg: '2023-11-20T23:00:00Z' = 2023-11-20 11:00:00 PM UTC.\n dateTime?: string;\n // DateTime movement settings.\n timeline?: Web3d.ITimeline;\n // Entity id -> opacity. Where 1 = 100% opacity.\n entityOpacityMap?: IDictionary<number>;\n // Null = use default, empty array = deselect.\n // If default is null then selected ids should not be altered.\n selectedEntityIds?: string[];\n hiddenEntityIds?: string[];\n isolatedEntityIds?: string[];\n // This enables lighting that makes terrain elevation apparent.\n hillShades?: boolean;\n // This is a list of entity ids that are refreshed every x seconds.\n // We'll enforce about 200 maximum ids. Refresh every 2 - 5 seconds.\n liveEntityIds?: string[];\n // This will enable the wireframe view for the terrain provider.\n terrainWireframe?: boolean;\n // A bit of an awkward transition from the old system.\n // We render \"all\" relationships for given entity ids.\n // This will create a menu item under the hood, later we will use menu items directly.\n // @deprecated, use 'renderedRelations' instead.\n renderedEntityRelations?: string[];\n }\n\n /**\n * These are the base settings expected in any 2D bookmark.\n * This is our WIP graph viewer.\n * @warning as this project is in beta, all updates are subject to breaking changes.\n */\n export interface IWeb2dSettings extends ISettings {\n // Definition for the background of the view.\n background?: Web2d.IBackground;\n // Camera location and zoom level.\n camera?: Web2d.ICamera;\n // Selected Entity IDs.\n selectedIds?: string[];\n // Selected relationship.\n selectedRelation?: Web2d.IRelationMetadata;\n // Rendered array of relationships.\n // Likely to be moved into a client file JSON representing a rendered scene.\n relationships?: Web2d.IRelationship[];\n // Rendered array of entities.\n // Likely to be moved into a client file JSON representing a rendered scene.\n entities?: Web2d.IEntity[];\n }\n\n /**\n * Gets a bookmark record.\n * @param params \n * @returns \n */\n export async function Get(params: {\n api?: BruceApi.Api,\n // ID of the associated project view.\n viewId: string,\n // Bookmark record ID.\n bookmarkId: string,\n req?: Api.IReqParams\n }): Promise<{\n // Bookmark record.\n bookmark: IBookmark\n }> {\n let { api, viewId, bookmarkId, req: reqParams } = params;\n if (!viewId || !bookmarkId) {\n throw(\"View ID and Bookmark ID are required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n \n const key = GetCacheKey(viewId, bookmarkId);\n const cache = await api.GetCacheItem(key, reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(`ui.view/${viewId}/slide/${bookmarkId}`, Api.PrepReqParams(reqParams));\n res({\n bookmark: data\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key,\n value: prom,\n req: reqParams\n });\n return prom;\n }\n\n /**\n * Deletes a bookmark record.\n * @param params \n */\n export async function Delete(params: {\n api?: BruceApi.Api,\n // ID of the associated project view.\n viewId: string,\n // Bookmark record ID.\n bookmarkId: string,\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, viewId, bookmarkId, req: reqParams } = params;\n if (!viewId || !bookmarkId) {\n throw(\"View ID and Bookmark ID are required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n await api.DELETE(`ui.view/${viewId}/slide/${bookmarkId}`, Api.PrepReqParams(reqParams));\n api.Cache.Remove(GetCacheKey(viewId, bookmarkId));\n api.Cache.Remove(GetListCacheKey(viewId));\n }\n\n /**\n * Gets a list of bookmark records.\n * @param params \n * @returns \n */\n export async function GetList(params: {\n api?: BruceApi.Api,\n // ID of the associated project view.\n viewId: string,\n req?: Api.IReqParams\n }): Promise<{\n // List of bookmark records.\n bookmarks: IBookmark[]\n }> {\n let { api, viewId, req: reqParams } = params;\n if (!viewId) {\n throw(\"View ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const cache = await api.GetCacheItem(GetListCacheKey(viewId), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const req: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(`ui.view/${viewId}/slides`, Api.PrepReqParams(reqParams));;\n const items = data.Items ? data.Items : [];\n // Cache individual items.\n // Maybe better to load list cache when getting 1 slide and seeing if it's in there.\n // WARNING: Right now the data matches, in the future the list may contain a shortened result.\n for (let i = 0; i < items.length; i++) {\n const item = items[i] as ProjectViewBookmark.IBookmark;\n const prom = new Promise((res) => {\n res({\n bookmark: item\n });\n });\n await api.SetCacheItem({\n key: GetCacheKey(viewId, item.ID),\n value: prom,\n req: reqParams\n });\n }\n res({\n bookmarks: items\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key: GetListCacheKey(viewId),\n value: req,\n req: reqParams\n });\n return req;\n }\n\n /**\n * Creates or updates a bookmark record.\n * @param params \n * @returns \n */\n export async function Update(params: {\n api?: BruceApi.Api,\n // ID of the associated project view.\n viewId: string,\n // Bookmark record.\n bookmark: IBookmark,\n req?: Api.IReqParams\n }): Promise<{\n // Bookmark record.\n bookmark: IBookmark\n }> {\n let { api, viewId, bookmark: data, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n if (!data?.Title) {\n data.Title = data.ID;\n }\n const res = await api.POST(`ui.view/${viewId}/slide/${data.ID ? data.ID : \"\"}`, data, Api.PrepReqParams(reqParams));\n api.Cache.Remove(GetCacheKey(viewId, <string>data.ID));\n api.Cache.Remove(GetListCacheKey(viewId));\n return {\n bookmark: res\n };\n }\n\n /**\n * Sets the order of bookmarks within a project view.\n * @param params \n */\n export async function SetOrder(params: {\n api?: BruceApi.Api,\n // ID of the associated project view.\n viewId: string,\n // List of bookmark IDs in the order they should be displayed.\n bookmarkIds: string[],\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, viewId, bookmarkIds, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const reqData = {\n \t\"UISlide.ID\": bookmarkIds,\n \t\"DisplayOrder.Start\": 0\n };\n await api.POST(`ui.view/${viewId}/slides/setOrder`, reqData, Api.PrepReqParams(reqParams));\n await api.Cache.RemoveByStartsWith(GetListCacheKey(viewId));\n }\n\n /**\n * Interfaces for 3D bookmark settings.\n */\n export namespace Web3d {\n /**\n * Describes the terrain contours overlay.\n */\n export interface IContours {\n // Default is false.\n enabled: boolean;\n // Units are in meters.\n // Default is 100.\n spacing: number;\n // Units are in meters.\n // Default is 2.\n width: number;\n // Default is true.\n drawLabels: boolean;\n // CSS color string. Alpha will be excluded and applied through the alpha property.\n // Default is white.\n color: string;\n // 0 - 1, 1 = 100% opacity.\n // Default = 0.5.\n alpha: number;\n }\n\n /**\n * Describes the shadows settings for a bookmark.\n */\n export interface IShadows {\n // If true, shadows are enabled.\n enabled: boolean;\n // If true, shadow edges are softened.\n soften: boolean;\n // Pixel size determines shadow quality.\n // This typically increments in sets of 1024.\n pixelSize: number;\n // Darkness of shadows.\n // Default is \"0.3\".\n darkness: number;\n }\n\n /**\n * Describes the ambient occlusion settings for a bookmark.\n */\n export interface IAmbientOcclusion {\n // If true, ambient occlusion is enabled.\n enabled: boolean;\n intensity: number;\n lengthCap: number;\n bias: number;\n blurStepSize: number;\n stepSize: number;\n }\n\n /**\n * Describes the lighting settings for a bookmark.\n */\n export interface ILighting {\n // Colour of the sun.\n color: string;\n // Intensity of the sun.\n intensity: number;\n }\n\n /**\n * Describes the quality settings for a bookmark.\n */\n export interface IQuality {\n // If true, \"smooth rendering\" is enabled.\n fxaa: boolean;\n }\n\n /**\n * Describes the camera settings for a bookmark.\n */\n export interface ICamera {\n // Meters relative to ground.\n altitude: number;\n // In degrees.\n latitude: number;\n longitude: number;\n heading: number;\n pitch: number;\n roll: number;\n // Milliseconds transition from current position to bookmark.\n transition?: number;\n // If frustum is different between two bookmarks, transition should be instant.\n cameraFrustum?: Camera.EFrustum;\n }\n\n export interface ITimeline {\n // ISO8601 date time string for the start of the timeline.\n start: string;\n // ISO8601 date time string for the end of the timeline.\n end: string;\n // Indicates that time should move between start and end at the provided speed.\n playing: boolean;\n // 1 = 1 second per second.\n speed: number;\n }\n }\n\n /**\n * Interfaces for 2D bookmark settings.\n * @warning as this project is in beta, all updates are subject to breaking changes.\n */\n export namespace Web2d {\n export interface ICamera {\n x: number;\n y: number;\n zoom: number;\n }\n\n export interface IBackground {\n type?: \"NONE\" | \"DOTTED\" | \"GRID\" | \"IMAGE\";\n dotColor?: string;\n dotSize?: number;\n dotSpacing?: number;\n bgCssColor?: string;\n gridColor?: string;\n gridStep?: number;\n // Client File ID.\n imageFileId?: string;\n // Cross at center.\n drawCenter?: boolean;\n }\n\n /**\n * Represents a rendered Nextspace Entity.\n */\n export interface IEntity {\n entityId: string;\n x: number;\n y: number;\n size?: number;\n cssColor?: string;\n }\n\n export interface IRelationship {\n // Relationship type ID to draw.\n typeId: string;\n // Specific Entity IDs to render between. If not specified, render between all Entities in scene.\n entityIds?: string[];\n // Width in pixels of the relationship lines.\n width?: number;\n }\n\n export interface IRelationMetadata {\n parentEntityId: string;\n childEntityId: string;\n relationTypeId: string;\n } \n }\n\n /**\n * Returns cache identifier for a bookmark.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetCacheKey(\"abc\", \"def\");\n * api.Cache.Remove(key);\n * }\n * @param viewId\n * @param bookmarkId\n * @returns \n */\n export function GetCacheKey(viewId: string, bookmarkId: string): string {\n return `${Api.ECacheKey.ProjectViewBookmark}${Api.ECacheKey.Id}${viewId}${Api.ECacheKey.Id}${bookmarkId}`;\n }\n \n /**\n * Returns cache identifier for a list of bookmarks.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetListCacheKey(\"abc\");\n * api.Cache.Remove(key);\n * }\n * @param viewId\n * @returns\n */\n export function GetListCacheKey(viewId: string): string {\n return `${Api.ECacheKey.ProjectViewBookmark}${Api.ECacheKey.Id}${viewId}`;\n }\n}","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { ObjectUtils } from \"../util/object-utils\";\nimport { UTC } from \"../common/utc\";\nimport { MenuItem } from \"./menu-item\";\nimport { ProjectViewTile } from \"./project-view-tile\";\nimport { ProjectViewBookmark } from \"./project-view-bookmark\";\nimport { ENVIRONMENT } from \"../environment\";\nimport { ProjectViewSelection } from \"./project-view-selection\";\n\n/**\n * Describes the \"Project View\" concept within Nextspace.\n * A project view is a collection of settings for a visualization application we support.\n * It will describe what panels to show and how, it will also describe all possible ways data can be displayed.\n */\nexport namespace ProjectView {\n // This is the expected default version for the DataVersion value.\n // This value should NOT be changed without looking at our API and seeing what the default value is.\n export const DEFAULT_DATA_VERSION = 2;\n // Our Cesium web navigator.\n export const TYPE_WEB_3D_NAVIGATOR = \"WEB_3D_NAVIGATOR\";\n // Our (currently WIP) 2D web navigator. Also known as our graph viewer.\n export const TYPE_WEB_2D_NAVIGATOR = \"WEB_2D_NAVIGATOR\";\n // Defaulting to 3D navigator for backwards compatibility.\n export const DEFAULT_TYPE = TYPE_WEB_3D_NAVIGATOR;\n\n /**\n * Describes a project view record.\n */\n export interface IView {\n // ID of the project view.\n ID?: string;\n // Human readable name of the project view.\n Name: string;\n // Human readable description of the project view.\n Description?: string;\n // (20) Indicates the type of Project View this is.\n // This is used to determine the expected settings and application. Eg: 3D vs 2D Navigator.\n Type?: typeof TYPE_WEB_3D_NAVIGATOR | typeof TYPE_WEB_2D_NAVIGATOR | string;\n // ID of the user that created the project view.\n \"CreatedByUser.ID\"?: string;\n // Date/time the project view was created.\n CreatedTime?: UTC.IUTC;\n // ID of the default bookmark to load.\n DefaultUISlideID?: string;\n // Version of the UI that created this project view.\n // Set to -1 if unknown.\n CreatedByUIVersion?: string;\n // Version to help parse the data.\n DataVersion: number;\n // Admin only property for what email should be the project view's support line.\n SupportEmail?: string;\n // Settings for the project view.\n Settings?: Settings;\n // If true, this view is considered the default for the account.\n // Operator may use this project view to load default settings.\n IsDefault?: boolean;\n // TODO: document.\n Feature?: string[];\n }\n\n export type Settings = ISettings | IWeb3dSettings | IWeb2dSettings;\n\n /**\n * Base Project View settings.\n */\n export interface ISettings {\n // Describes settings for entity selection for a project view record.\n selection?: ProjectViewSelection.ISelection;\n // If true, anonymous users won't be able to access the view.\n IsLoginRequired?: boolean;\n // If true, users must have the permission \"Permission.EPermPrefix.ACCESS_PROJECT_VIEW + view.ID\" to access the view.\n IsRestricted?: boolean;\n // Per project view branding to compliment the account branding.\n branding?: IBranding;\n // Describes how to present contact information to the users.\n // The contact email is set in \"view.SupportEmail\". Only an admin can read or write this value.\n contact?: IContact;\n plugins?: IPlugins;\n // Default is yellow at 0.5 opacity.\n selectionColor?: string;\n // Default is blue with 0.5 opacity.\n highlightColor?: string;\n // Presentation mode settings.\n present?: IPresent;\n }\n\n /**\n * These are the base settings expected in any 3D project view.\n * The only exception is data-version = 1 which is our deprecated legacy format.\n */\n export interface IWeb3dSettings extends ISettings {\n // Menu item structure that defines how and what to load in the scene.\n menuItems?: MenuItem.IItem[];\n // Imagery and terrains that non-admin users can select from.\n // Sources used in bookmarks will automatically be added to this list.\n imageries?: ProjectViewTile.IViewImagery[];\n terrains?: ProjectViewTile.IViewTerrain[];\n // Defaults are values to apply for bookmarks when either the bookmark-\n // is missing or the value is missing in the bookmark settings.\n defaults?: {\n camera?: ProjectViewBookmark.Web3d.ICamera;\n settings?: ProjectViewBookmark.IWeb3dSettings;\n };\n }\n\n /**\n * These are the base settings expected in any 2D project view.\n * This is our WIP graph viewer.\n */\n export interface IWeb2dSettings extends ISettings {\n\n }\n \n /**\n * Per project view branding to compliment the account branding.\n */\n export interface IBranding {\n // Client file id for the project view's banner.\n // In Navigator this is found within the Navigator's dashboard.\n bannerFileId?: string;\n }\n\n /**\n * Presentation mode settings.\n */\n export interface IPresent {\n // Time in milliseconds to hold bookmarks before moving to the next bookmark.\n // This is a default time and can be overridden by the bookmark's duration.\n bookmarkDuration?: number;\n }\n\n /**\n * Describes how to present contact information to the users.\n */\n export interface IContact {\n // Default = false.\n // Indicates if the user should be able to reach support.\n enabled: boolean;\n // Description to display in the support dialog.\n // Null = application's default text.\n description?: string;\n // FontAwesome icon to use for the support dialog button.\n // Null = application's default icon.\n icon?: string;\n }\n\n /**\n * Describes the plugins enabled for a project view.\n */\n export interface IPlugins {\n // Enabled plugin ids.\n enabledIds: string[];\n }\n\n /**\n * Gets a project view record.\n * @param params \n * @returns \n */\n export async function Get(params: {\n api?: BruceApi.Api,\n // ID of the project view to get.\n viewId: string,\n req?: Api.IReqParams\n }): Promise<{\n // Project view record.\n view: IView\n }> {\n let { api, viewId, req: reqParams } = params;\n if (!viewId) {\n throw(\"View ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const key = GetCacheKey(viewId);\n const cache = await api.GetCacheItem(key, reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(`ui.view/${viewId}`, Api.PrepReqParams(reqParams));\n res({\n view: data\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key,\n value: prom,\n req: reqParams\n });\n return prom;\n }\n\n /**\n * Gets a list of project views.\n * @param params \n * @returns \n */\n export async function GetList(params: {\n api?: BruceApi.Api,\n // Optional filter for the type of project view.\n type?: typeof TYPE_WEB_3D_NAVIGATOR | typeof TYPE_WEB_2D_NAVIGATOR | string,\n req?: Api.IReqParams\n }): Promise<{\n // List of project views.\n views: IView[]\n }> {\n let { api, req: reqParams, type } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const cache = await api.GetCacheItem(GetListCacheKey(type), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(\"ui.view/list\", Api.PrepReqParams(reqParams));\n res({\n views: data.Items\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key: GetListCacheKey(type),\n value: prom,\n req: reqParams\n });\n return prom;\n }\n\n /**\n * Deletes a project view.\n * @param params \n */\n export async function Delete(params: {\n api?: BruceApi.Api,\n // ID of the project view to delete.\n viewId: string,\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, viewId, req: reqParams } = params;\n if (!viewId) {\n throw(\"View ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n await api.DELETE(`ui.view/${viewId}`, Api.PrepReqParams(reqParams));\n api.Cache.Remove(GetCacheKey(viewId));\n api.Cache.RemoveByStartsWith(GetListCacheKey());\n }\n\n /**\n * Creates or updates a project view.\n * @param params \n * @returns \n */\n export async function Update(params: {\n api?: BruceApi.Api,\n // Project view record to create or update.\n view: IView,\n req?: Api.IReqParams\n }): Promise<{\n // Project view record.\n view: IView\n }> {\n let { api, view: data, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n if (!data) {\n data = <any>{};\n }\n const isNew = !data.ID;\n if (!data.ID) {\n // Short ID to keep the URL short.\n // 8 length = 4,294,967,296 combinations.\n data.ID = ObjectUtils.UId(8);\n }\n if (!data.Name) {\n data.Name = data.ID;\n }\n if (!data.CreatedByUIVersion) {\n data.CreatedByUIVersion = \"-1\";\n }\n if (isNew) {\n data = await api.POST(`ui.view/${data.ID}`, data, Api.PrepReqParams(reqParams));\n }\n else {\n data = await api.PUT(`ui.view/${data.ID}`, data, Api.PrepReqParams(reqParams));\n }\n api.Cache.Remove(GetCacheKey(<string>data.ID));\n api.Cache.RemoveByStartsWith(GetListCacheKey());\n return {\n view: data\n };\n }\n\n /**\n * Returns cache identifier for a project view.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetCacheKey(\"abc\");\n * api.Cache.Remove(key);\n * }\n * @param viewId\n * @returns \n */\n export function GetCacheKey(viewId: string): string {\n return `${Api.ECacheKey.ProjectView}${Api.ECacheKey.Id}${viewId}`;\n }\n \n /**\n * Returns cache identifier for a list of project views.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetListCacheKey();\n * api.Cache.Remove(key);\n * }\n * @param type optional filter for the type of project view.\n * @returns\n */\n export function GetListCacheKey(type?: string): string {\n if (type) {\n return `${Api.ECacheKey.ProjectView}${Api.ECacheKey.ListId}${type}`;\n }\n return `${Api.ECacheKey.ProjectView}${Api.ECacheKey.ListId}`;\n }\n}","import { BruceApi } from \"../api/bruce-api\";\nimport { Api } from \"../api/api\";\nimport { ProjectView } from \"./project-view\";\nimport { ENVIRONMENT } from \"../environment\";\nimport { ProjectViewLegacy } from \"./project-view-legacy\";\n\nasync function getTemplateSettings(apiGetter: BruceApi.IGetter, reqParams?: Api.IReqParams): Promise<ProjectViewLegacy.ISettings> {\n const {view} = await ProjectView.Get({\n api: apiGetter.getApi(Api.TEMPLATE_ACCOUNT_ID), \n viewId: \"default\", \n req: reqParams\n });\n return (view.Settings as ProjectViewLegacy.ISettings) ?? <ProjectViewLegacy.ISettings>{};\n}\n\nfunction checkSourceToTemplate(items: ProjectViewLegacyTile.ISource[], templateItem: ProjectViewLegacyTile.ISource, addIfMissing: boolean): void {\n const index = items.findIndex(x => x.Name === templateItem.Name);\n if (index > -1) {\n templateItem.IsDefault = true;\n templateItem.IsEnabled = items[index].IsEnabled;\n items[index] = templateItem;\n }\n else if (addIfMissing) {\n templateItem.IsDefault = true;\n items.push(templateItem);\n }\n}\n\n/**\n * Describes a terrain or map source that are found in project view records.\n * This is a concept we want to trash as we're moving towards storing tileset ids instead.\n * This will help at least understand and manage this dying concept.\n */\nexport namespace ProjectViewLegacyTile {\n export interface ISource {\n SourceUrl?: string;\n IsEnabled?: boolean;\n IsDefault?: boolean;\n Name: string;\n Tooltip?: string;\n IconUrl?: string;\n }\n\n export interface IMapSource extends ISource {\n SourceUrl?: string;\n IonAssetID?: number,\n MapBoxID?: string;\n MapBoxUsername?: string;\n ProgramKey?: string;\n FileExtension?: string,\n Minimum?: number;\n Maximum?: number;\n Type?: string;\n }\n\n export interface ITerrainSource extends ISource {\n RequestWaterMask?: boolean;\n RequestVertexNormals?: boolean;\n }\n\n export async function MergeMapTemplateData(params: {\n getter?: BruceApi.IGetter, \n sources: IMapSource[], \n addIfMissing: boolean, \n req?: Api.IReqParams\n }): Promise<{\n sources: IMapSource[]\n }> {\n let { getter, sources: items, addIfMissing, req: reqParams } = params;\n if (!getter) {\n getter = ENVIRONMENT.Api().GetBruceGetter();\n }\n\n const settings = await getTemplateSettings(getter, reqParams);\n const maps = settings.CesiumMapSources ?? [];\n for (let i = 0; i < maps.length; i++) {\n const mapSource = maps[i];\n checkSourceToTemplate(items, mapSource, addIfMissing);\n }\n return {\n sources: items\n };\n }\n\n export async function MergeTerrainTemplateData(params: {\n getter?: BruceApi.IGetter, \n sources: ITerrainSource[], \n addIfMissing: boolean, \n req?: Api.IReqParams\n }): Promise<{\n sources: ITerrainSource[]\n }> {\n let { getter, sources: items, addIfMissing, req: reqParams } = params;\n if (!getter) {\n getter = ENVIRONMENT.Api().GetBruceGetter();\n }\n\n const settings = await getTemplateSettings(getter, reqParams);\n const terrains = settings.CesiumTerrainSources ?? [];\n for (let i = 0; i < terrains.length; i++) {\n const terrainSource = terrains[i];\n checkSourceToTemplate(items, terrainSource, addIfMissing);\n }\n return {\n sources: items\n };\n }\n}","\n/**\n * A tile is an imagery or terrain tileset definition.\n */\nexport namespace ProjectViewTile {\n export type MapTileId = string | EDefaultImagery;\n export type TerrainTileId = string | EDefaultTerrain;\n\n /**\n * Base information for loading an imagery or terrain tileset record.\n */\n export interface ITileMeta {\n // Null = using a default tile.\n // (Not the same as a template account one. Default means we don't have a database record of it.).\n accountId?: string;\n tilesetId: string;\n }\n\n /**\n * Definition for a project view terrain.\n */\n export interface IViewTerrain extends ITileMeta {\n tilesetId: TerrainTileId;\n }\n\n /**\n * Definition for a project view imagery.\n */\n export interface IViewImagery extends ITileMeta {\n tilesetId: MapTileId;\n }\n\n /**\n * Definition for a bookmark imagery.\n */\n export interface IBookmarkImagery extends IViewImagery {\n // 0 - 1, 1 = 100% opacity.\n // Default = 1.\n alpha?: number;\n // Default = 1.\n brightness?: number;\n // Default = 1.\n saturation?: number;\n // Default = 1.\n contrast?: number;\n // Default = 1.\n gamma?: number;\n // Default = 0.\n hue?: number;\n }\n\n /**\n * Definition for a bookmark terrain.\n */\n export interface IBookmarkTerrain extends IViewTerrain {\n\n }\n\n /**\n * Available imagery defaults.\n */\n export enum EDefaultImagery {\n BingMapsAerial = \"bingmapsaerial\",\n BingMapsAerialWithLabels = \"bingmapsaerialwithlabels\",\n BingMapsRoads = \"bingmapsroads\",\n MapboxSatellite = \"mapboxsatellite\",\n MapBoxStreets = \"mapboxstreets\",\n MapBoxStreetsClassic = \"mapboxstreetsclassic\",\n EsriWorldImagery = \"esriworldimagery\",\n EsriWorldStreetMap = \"esriworldstreetmap\",\n EsriNationalGeographic = \"esrinationalgeographic\",\n OpenStreetMap = \"openstreetmap\",\n LINZ = \"linz\",\n StamenWaterColor = \"stamenwatercolor\",\n StamenToner = \"stamentoner\",\n Grid = \"grid\",\n ThunderforestCycle = \"thunderforestcycle\",\n ThunderforestTransport = \"thunderforesttransport\",\n ThunderforestLandscape = \"thunderforestlandscape\",\n }\n\n /**\n * Definition for a default imagery.\n */\n export interface IDefaultImagery {\n id: EDefaultImagery;\n name: string;\n iconUrl?: string;\n }\n\n /**\n * Prepared array for UI.\n * TODO: Im not happy with icon urls sitting in the code. I'd prefer we ship these icons in the library as files.\n */\n export const DefaultImagery: IDefaultImagery[] = [\n {\n id: EDefaultImagery.BingMapsAerial,\n name: \"Bing Maps Aerial\",\n iconUrl: \"https://template.ui.nextspace.host/Default/media/Cesium/ImageryProviders/bingAerial.png\"\n },\n {\n id: EDefaultImagery.BingMapsAerialWithLabels,\n name: \"Bing Maps Aerial with Labels\",\n iconUrl: \"https://template.ui.nextspace.host/Default/media/Cesium/ImageryProviders/bingAerialLabels.png\"\n },\n {\n id: EDefaultImagery.BingMapsRoads,\n name: \"Bing Maps Roads\",\n iconUrl: \"https://template.ui.nextspace.host/Default/media/Cesium/ImageryProviders/bingRoads.png\"\n },\n {\n id: EDefaultImagery.MapboxSatellite,\n name: \"Mapbox Satellite\",\n iconUrl: \"https://template.ui.nextspace.host/Default/media/Cesium/ImageryProviders/mapboxSatellite.png\"\n },\n {\n id: EDefaultImagery.MapBoxStreets,\n name: \"Mapbox Streets\",\n iconUrl: \"https://template.ui.nextspace.host/Default/media/Cesium/ImageryProviders/mapboxTerrain.png\"\n },\n {\n id: EDefaultImagery.MapBoxStreetsClassic,\n name: \"Mapbox Streets Classic\",\n iconUrl: \"https://template.ui.nextspace.host/Default/media/Cesium/ImageryProviders/mapboxStreets.png\"\n },\n {\n id: EDefaultImagery.EsriWorldImagery,\n name: \"Esri World Imagery\",\n iconUrl: \"https://template.ui.nextspace.host/Default/media/Cesium/ImageryProviders/esriWorldImagery.png\"\n },\n {\n id: EDefaultImagery.EsriWorldStreetMap,\n name: \"Esri World Street Map\",\n iconUrl: \"https://template.ui.nextspace.host/Default/media/Cesium/ImageryProviders/esriWorldStreetMap.png\"\n },\n {\n id: EDefaultImagery.EsriNationalGeographic,\n name: \"Esri National Geographic\",\n iconUrl: \"https://template.ui.nextspace.host/Default/media/Cesium/ImageryProviders/esriNationalGeographic.png\"\n },\n {\n id: EDefaultImagery.OpenStreetMap,\n name: \"Open Street Map\",\n iconUrl: \"https://template.ui.nextspace.host/Default/media/Cesium/ImageryProviders/openStreetMap.png\"\n },\n {\n id: EDefaultImagery.LINZ,\n name: \"LINZ\",\n iconUrl: \"https://template.ui.nextspace.host/media/linz.jpg\"\n },\n {\n id: EDefaultImagery.StamenWaterColor,\n name: \"Stamen Water Color\",\n iconUrl: \"https://template.ui.nextspace.host/Default/media/Cesium/ImageryProviders/stamenWatercolor.png\"\n },\n {\n id: EDefaultImagery.StamenToner,\n name: \"Stamen Toner\",\n iconUrl: \"https://template.ui.nextspace.host/Default/media/Cesium/ImageryProviders/stamenToner.png\"\n },\n {\n id: EDefaultImagery.ThunderforestCycle,\n name: \"Thunderforest Cycle\"\n },\n {\n id: EDefaultImagery.ThunderforestTransport,\n name: \"Thunderforest Transport\"\n },\n {\n id: EDefaultImagery.ThunderforestLandscape,\n name: \"Thunderforest Landscape\"\n },\n {\n id: EDefaultImagery.Grid,\n name: \"Grid\",\n iconUrl: \"https://template.api.nextspace-uat.net/file/2885d8df-028b-4f5c-80b3-2634f7e7cf69.png\"\n }\n ];\n\n /**\n * Available terrain defaults.\n */\n export enum EDefaultTerrain {\n CesiumWorldTerrain = \"cesiumworldterrain\",\n FlatTerrain = \"flatterrain\",\n LINZ = \"linz\"\n }\n\n /**\n * Definition for a default terrain.\n */\n export interface IDefaultTerrain {\n id: EDefaultTerrain;\n name: string;\n iconUrl?: string;\n }\n\n /**\n * Prepared array for UI.\n * TODO: Im not happy with icon urls sitting in the code. I'd prefer we ship these icons in the library as files.\n */\n export const DefaultTerrains: IDefaultTerrain[] = [\n {\n id: EDefaultTerrain.CesiumWorldTerrain,\n name: \"Cesium World Terrain\",\n iconUrl: \"https://template.ui.nextspace.host/Default/media/Cesium/TerrainProviders/CesiumWorldTerrain.png\"\n },\n {\n id: EDefaultTerrain.LINZ,\n name: \"LINZ\",\n iconUrl: \"https://template.ui.nextspace.host/media/linz.jpg\"\n },\n {\n id: EDefaultTerrain.FlatTerrain,\n name: \"Flat Terrain\",\n }\n ]\n}","import { MenuItem } from \"./menu-item\";\nimport { ProjectView as PV } from \"./project-view\";\nimport { ProjectViewLegacyTile } from \"./project-view-legacy-tile\";\n\n/**\n * Deprecated Project View record.\n * This was used in the legacy web Navigator.\n */\nexport namespace ProjectViewLegacy {\n export const DATA_VERSION = 1;\n\n export interface IShadowSettings {\n IsShadowEnabled?: boolean;\n IsShadowSoft?: boolean;\n ShadowSampleSize?: number;\n }\n\n export interface ISettings extends PV.IWeb3dSettings {\n BookmarkTransitionSpeed?: number;\n Camera?: any;\n CameraFrustum?: number;\n CesiumMapSources?: ProjectViewLegacyTile.IMapSource[];\n CesiumTerrainSources?: ProjectViewLegacyTile.ITerrainSource[];\n ControlsSettings?: any;\n DefaultMapTiles?: string;\n DefaultTerrain?: string;\n DisplayTimeline?: boolean;\n GroundOcclusion?: boolean;\n Extensions?: any;\n GlobeColor?: string;\n SelectionHighlightColor?: string;\n LayersMenu?: MenuItem.IItem[];\n OASettings?: any;\n LogoImage?: any;\n LegendImage?: any;\n TilesetBackfaceCulling?: boolean;\n TopPanelComponents?: string[];\n LeftPanelComponents?: string[];\n PostProcessFXAA?: boolean;\n Shadows?: boolean;\n CustomFormSettings?: any;\n PreloadEntityTypes?: boolean;\n ClickActions?: any;\n Shadow?: {\n StaticCamera?: IShadowSettings;\n MovingCamera?: IShadowSettings;\n }\n }\n\n export interface IView extends PV.IView {\n Settings: ISettings;\n }\n}","import { Camera } from \"../common/camera\";\nimport { UTC } from \"../common/utc\";\nimport { Markup } from \"../markup/markup\";\n\n/**\n * Deprecated Project View Bookmark record.\n * This was used in the legacy web Navigator.\n */\nexport namespace ProjectViewLegacyBookmark {\n export const DATA_VERSION = 1;\n\n export interface IBookmark {\n ID?: string;\n Title?: string;\n Camera?: ICamera;\n Settings?: ISettings;\n \"Screenshot.ClientFile.ID\"?: string;\n \"UI.View.ID\"?: string;\n \"Created.ByUser.ID\"?: string;\n \"Created.Date\"?: UTC.IUTC;\n DataVersion: number;\n DisplayOrder?: number;\n }\n\n export interface IBookmarkImagery {\n title: string;\n contrast: number;\n hue: number;\n saturation: number;\n gamma: number;\n brightness: number;\n alpha: number;\n }\n\n export interface ISettings {\n selectedItemIds?: string[];\n order?: number;\n hiddenEntityIds?: string[];\n drawnRelationEntityIDs?: string[];\n imagery?: IBookmarkImagery[];\n terrain?: string;\n globeColor?: string;\n shadows?: boolean;\n groundOcclusion?: boolean;\n ambientOcclusion?: boolean;\n markup?: Markup.IMarkup;\n cameraFrustum?: Camera.EFrustum;\n displayTimeline?: boolean;\n timelineSettings?: any;\n }\n\n /**\n * Lat,lon is in degrees.\n * Altitude is meters relative to ground.\n * Heading, pitch, roll are in radians.\n */\n export interface ICamera {\n position: {\n latitude: number;\n longitude: number;\n height: number;\n };\n heading: number;\n pitch: number;\n roll: number;\n }\n}","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { UTC } from \"../common/utc\";\nimport { ENVIRONMENT } from \"../environment\";\n\n/**\n * Describes the \"Pending Action\" concept within Nextspace.\n * A pending action is a record of a server-side background process.\n * This record is used to monitor its progress and completion state.\n */\nexport namespace PendingAction {\n /**\n * Describes a pending action record.\n */\n export interface IAction {\n // ID of the pending action record.\n ID: number;\n // ID of the application that created the pending action.\n \"CreatedBy.Application\": string;\n // Date/time the pending action was created.\n \"Created.Time\": UTC.IUTC;\n // ID of the user that created the pending action.\n \"CreatedByUser.ID\": string;\n // Result string is a stringified JSON object.\n // This is not always the case so please check the data before parsing it.\n Result: string;\n // Progress % of the pending action.\n Progress: number;\n // Date/time the pending action was marked as done.\n \"Completed.Time\": UTC.IUTC;\n // Description on why the pending action was started.\n Description: string;\n // Status of the pending action.\n Status: EStatus;\n // Date/time the pending action was last updated.\n lastUpdated: UTC.IUTC;\n }\n\n /**\n * Available pending action statuses.\n */\n export enum EStatus {\n InProgress = \"IN_PROGRESS\",\n Cancelled = \"CANCELLED\",\n Complete = \"COMPLETE\",\n Failed = \"FAILED\"\n }\n\n /**\n * Describes a pending action message record.\n */\n export interface IMessage {\n // ID of the pending action record.\n \"PendingAction.ID\": number;\n // ID of the message record.\n ID: number;\n // ID of the application that created the message.\n \"CreatedBy.Application\": string;\n // Date/time the message was created.\n \"Created.Time\": UTC.IUTC;\n // Message type. Certain types can be hidden from end-users as they are only used for debugging.\n \"Message.Type\": EMessageType | string;\n // Message text.\n Message: string;\n }\n\n /**\n * Available message types.\n */\n export enum EMessageType {\n Warn = \"WARNING\",\n Error = \"ERROR\",\n Status = \"STATUS\",\n Info = \"INFO\"\n }\n\n /**\n * Returns a pending action record.\n * @param params \n * @returns \n */\n export async function Get(params: {\n api?: BruceApi.Api,\n // ID of the pending action record.\n actionId: number,\n req?: Api.IReqParams\n }): Promise<{\n // The pending action record.\n action: IAction\n }> {\n let { api, actionId, req: reqParams } = params;\n if (!actionId) {\n throw(\"Action ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const data = await api.GET(`pendingAction/${actionId}`, Api.PrepReqParams(reqParams));\n return {\n action: data\n }\n }\n\n /**\n * Returns a list of pending action records.\n * @param params \n * @returns \n */\n export async function GetRelevantList(params: {\n api?: BruceApi.Api,\n // Reduces the list to only very recent actions.\n // It is recommended to first get the list with stricter=false, then get the list with stricter=true,\n // if you're monitoring the running actions.\n stricter?: boolean,\n reqParams?: Api.IReqParams\n }): Promise<{\n // The list of pending action records.\n actions: IAction[]\n }> {\n let { api, stricter, reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const data = await api.GET(`pendingActions/important?Update=${Boolean(stricter)}`, Api.PrepReqParams(reqParams));\n return {\n actions: data.Items\n };\n }\n\n /**\n * Returns a list of pending action record messages.\n * @param params \n * @returns \n */\n export async function GetMessages(params: {\n api?: BruceApi.Api,\n // ID of the pending action record.\n actionId: number,\n // Sort order of the messages.\n // Default is Asc.\n order?: Api.ESortOrder,\n // Index of the first message to return.\n // Default is 0.\n startIndex?: number,\n // Amount of messages to return.\n // Default is 500.\n amount?: number,\n // Types of messages to return.\n types?: EMessageType[],\n req?: Api.IReqParams\n }): Promise<{\n // The list of pending action record messages.\n messages: IMessage[]\n }> {\n let { api, actionId, order, startIndex, amount, req: reqParams, types } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n if (amount == null) {\n amount = 500;\n }\n if (startIndex == null) {\n startIndex = 0;\n }\n if (order == null) {\n order = Api.ESortOrder.Asc;\n }\n let args = `?SortOrder=${order == Api.ESortOrder.Desc ? \"DESC\" : \"ASC\"}&PageSize=${amount}&PageIndex=${startIndex}`;\n if (types?.length) {\n for (let i = 0; i < types.length; i++) {\n args += `&Type=${types[i]}`;\n }\n }\n const data = await api.GET(`pendingAction/${actionId}/progressMessages` + args, Api.PrepReqParams(reqParams));\n return {\n messages: data.Items\n };\n }\n\n /**\n * Requests to cancel a pending action.\n * @param params \n */\n export async function Cancel(params: {\n api?: BruceApi.Api,\n // ID of the pending action record.\n actionId: number,\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, actionId, req: reqParams } = params;\n if (!actionId) {\n throw(\"Action ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n await api.DELETE(`pendingAction/${actionId}`, Api.PrepReqParams(reqParams));\n }\n}","import { Api } from \"../api/api\";\r\nimport { BruceApi } from \"../api/bruce-api\";\r\nimport { GuardianApi } from \"../api/guardian-api\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\nimport { AccountSettings } from \"./account-settings\";\r\n\r\n// Some dead accounts that we don't want to show in the UI.\r\n// Some accounts may not be \"dead\" but instead purposely don't have a NextspaceAPI database so we'll avoid them too.\r\nconst ACCOUNT_EXCLUSIONS = [\"hyperportal\", \"hypeportal\", \"bviewer\"];\r\n\r\n/**\r\n * Describes the \"Client Account\" concept within Nextspace.\r\n * A client account is a database instance that holds one or many users.\r\n */\r\nexport namespace Account {\r\n /**\r\n * Describes a Nextspace client account record.\r\n */\r\n export interface IAccount {\r\n ID?: string;\r\n Type?: string;\r\n // Subdomain of the account.\r\n // This is used within URL paths to identify the account.\r\n // Eg: the subdomain=\"test\" will resolve through the URL \"https://test.api.nextspace.host\".\r\n Subdomain?: string;\r\n // Name of the account.\r\n Name?: string;\r\n // Associated managing client.\r\n // This is used to identify client accounts managed by a specific client.\r\n \"Client.ID\"?: string;\r\n // The user ID of the account owner.\r\n // This is typically the user who created the account.\r\n \"OwnerUser.ID\"?: string;\r\n // Hosting location key. Links to settings related to host server.\r\n \"HostingLocation.Key\"?: string;\r\n // This will depend on what \"appSettingsId\" you request for.\r\n \"Application.ID\"?: string;\r\n \"Application.Settings\"?: AccountSettings.Settings;\r\n // Calculated endpoints for the account.\r\n \"URL\"?: {\r\n // BruceApi base url.\r\n // Eg: \"https://template.api.nextspace.host/\".\r\n \"Base\": string;\r\n // CDN base url.\r\n // Url param will need to be accounted for when constructing endpoints using this.\r\n // Eg: \"https://some-domain.com/?accountId=template\".\r\n \"CDNBase\"?: string;\r\n // CDN url specific to the '/entities' request.\r\n // This will be phased out in favour of 'CDNBase'.\r\n \"CDNEntities\"?: string;\r\n // CDN url specific to the '/tileset' request.\r\n // This will be phased out in favour of 'CDNBase'.\r\n \"CDNTileset\"?: string;\r\n // CDN url specific to legacy tileset requests.\r\n // This will be phased out in favour of 'CDNBase'.\r\n \"CDNLegacyTileset\"?: string;\r\n },\r\n\r\n // TODO: Check if these are still needed.\r\n \"ClientAccount.ID\"?: string;\r\n \"BruceAPI\"?: string;\r\n \"Settings\"?: any;\r\n \"AccountSettings\"?: any;\r\n }\r\n\r\n /**\r\n * Known Nextspace applications we store settings for.\r\n */\r\n export enum EAppId {\r\n BruceApi = \"BruceAPI\",\r\n Navigator = \"Navigator\",\r\n Operator = \"BruceClientAdmin\"\r\n }\r\n export type AppId = EAppId | string;\r\n\r\n /**\r\n * Possible starter content options.\r\n * When creating a new account you can populate it with certain default data.\r\n */\r\n export enum EStarterContent {\r\n Default = \"default\",\r\n None = \"none\"\r\n }\r\n\r\n /**\r\n * Gets a client account record by ID.\r\n * @param params \r\n * @returns \r\n */\r\n export async function Get(params: {\r\n api?: GuardianApi.Api,\r\n // The ID of the account to get.\r\n accountId: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n account: IAccount\r\n }> {\r\n let { api, accountId: id, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n const cache = await api.GetCacheItem(GetCacheKey(id), reqParams);\r\n if (cache?.found) {\r\n return cache.data;\r\n }\r\n const prom: Promise<any> = new Promise(async (res, rej) => {\r\n try {\r\n const data: Account.IAccount = await api.GET(`accountbyid/${id}`, reqParams);\r\n // Update the cache by subdomain as well in case it's different to the ID.\r\n if (data?.ID && reqParams?.noCache != false) {\r\n await api.SetCacheItem({\r\n key: data.Subdomain,\r\n value: prom,\r\n req: reqParams\r\n });\r\n }\r\n res({\r\n account: data\r\n });\r\n }\r\n catch (e) {\r\n rej(e);\r\n }\r\n });\r\n await api.SetCacheItem({\r\n key: GetCacheKey(id),\r\n value: prom,\r\n req: reqParams\r\n });\r\n return prom;\r\n }\r\n\r\n /**\r\n * Returns a client account record by subdomain or ID.\r\n * @param params \r\n * @returns \r\n */\r\n export async function GetBySubdomain(params: {\r\n api?: GuardianApi.Api,\r\n // Subdomain or ID of the account.\r\n subdomain: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n account: IAccount\r\n }> {\r\n let { api, subdomain, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n \r\n const cache = await api.GetCacheItem(GetCacheKey(subdomain), reqParams);\r\n if (cache?.found) {\r\n return cache.data;\r\n }\r\n const prom: Promise<any> = new Promise(async (res, rej) => {\r\n try {\r\n const data: Account.IAccount = await api.GET(`account/${subdomain}`, reqParams);\r\n // Update the cache by ID as well in case it's different to the subdomain.\r\n if (data?.ID && reqParams?.noCache != false) {\r\n await api.SetCacheItem({\r\n key: data.ID,\r\n value: prom,\r\n req: reqParams\r\n });\r\n }\r\n res({\r\n account: data\r\n });\r\n }\r\n catch (e) {\r\n rej(e);\r\n }\r\n });\r\n await api.SetCacheItem({\r\n key: GetCacheKey(subdomain),\r\n value: prom,\r\n req: reqParams\r\n });\r\n return prom;\r\n }\r\n\r\n /**\r\n * Gets a list of client accounts related to the current session user.\r\n * @param params \r\n * @returns \r\n */\r\n export async function GetRelatedList(params: {\r\n api?: GuardianApi.Api,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // List of accounts related to the current session user.\r\n accounts: IAccount[]\r\n }> {\r\n let { api, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n const cache = await api.GetCacheItem(GetListCacheKey(api.GetSessionId()), reqParams);\r\n if (cache?.found) {\r\n return cache.data;\r\n }\r\n const req = api.GET(\"user/relatedClientAccounts\", reqParams);\r\n const prom: Promise<{ accounts: IAccount[] }> = new Promise(async (res, rej) => {\r\n try {\r\n const data = await req;\r\n const items = data.Items.filter((x: IAccount) => !ACCOUNT_EXCLUSIONS.includes(<string>x.ID))\r\n res({\r\n accounts: items\r\n });\r\n }\r\n catch (e) {\r\n rej(<any>e);\r\n }\r\n });\r\n\r\n await api.SetCacheItem({\r\n key: GetListCacheKey(api.GetSessionId()),\r\n value: prom,\r\n req: reqParams\r\n });\r\n return prom;\r\n }\r\n\r\n /**\r\n * Gets application settings for a specific client account.\r\n * @param params \r\n * @returns \r\n */\r\n export async function GetAppSettings(params: {\r\n api?: GuardianApi.Api,\r\n // The ID of the related account.\r\n accountId: string,\r\n // The ID of the application to get settings for.\r\n appId: AppId,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // Application settings.\r\n settings: AccountSettings.Settings\r\n }> {\r\n let { api, accountId: id, appId, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n const cache = await api.GetCacheItem(GetCacheKey(id, appId), reqParams);\r\n if (cache?.found) {\r\n return cache.data;\r\n }\r\n const req = await api.GET(`account/${id}?ApplicationID=${appId}`, reqParams);\r\n const prom: Promise<any> = new Promise(async (res, rej) => {\r\n try {\r\n const data = await req;\r\n const settings = data?.[ \"Application.Settings\" ] ?? {};\r\n res({\r\n settings: settings\r\n });\r\n }\r\n catch (e) {\r\n rej(e);\r\n }\r\n });\r\n await api.SetCacheItem({\r\n key: GetCacheKey(id, appId),\r\n value: prom,\r\n req: reqParams\r\n });\r\n return prom;\r\n }\r\n\r\n /**\r\n * Updates application settings for a specific client account + application.\r\n * WARNING: Do not update API settings without knowing what you're doing.\r\n * @param params\r\n * @returns\r\n */\r\n export async function UpdateAppSettings(params: {\r\n api?: GuardianApi.Api,\r\n // The ID of the related account.\r\n accountId: string,\r\n // The ID of the application to update settings for.\r\n appId: string,\r\n // Application settings to update.\r\n settings: AccountSettings.Settings,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // Updated application settings.\r\n settings: AccountSettings.Settings\r\n }> {\r\n let { api, accountId: id, appId, settings: data, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n const res = await api.POST(`account/${id}/applicationSettings/${appId}`, data, reqParams);\r\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Account + Api.ECacheKey.Id + id);\r\n return {\r\n settings: res\r\n };\r\n }\r\n\r\n /**\r\n * Creates a new Nextspace account using given details.\r\n * @param params\r\n * @returns\r\n */\r\n export async function Create(params: {\r\n api?: BruceApi.Api,\r\n // The ID of the account to create.\r\n accountId: string,\r\n // The name of the account to create.\r\n name: string,\r\n // The hosting location key to create the account in.\r\n // This is the region that will dictate where the API and database are hosted.\r\n hostingLocationKey: string,\r\n // Starter content to populate the account with.\r\n starterContent?: EStarterContent,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // The newly created account record.\r\n account: IAccount\r\n }> {\r\n let { api, accountId: id, name, hostingLocationKey, starterContent, req: reqParams } = params;\r\n if (!id || !name || !hostingLocationKey) {\r\n throw new Error(\"Id, Name and hostingLocationKey are required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n if (!starterContent) {\r\n starterContent = EStarterContent.None;\r\n }\r\n \r\n const reqData = {\r\n \"Name\": name,\r\n \"HostingLocation.Key\": hostingLocationKey,\r\n \"StarterContent\": starterContent\r\n }\r\n const res = await api.POST(`clientAccount/${id}`, reqData, Api.PrepReqParams(reqParams));\r\n const resData = {\r\n account: res\r\n };\r\n api.Cache.Remove(GetListCacheKey(api.GetSessionId()));\r\n return resData;\r\n }\r\n\r\n /**\r\n * Returns cache identifier for an account by ID.\r\n * Example: {\r\n * const api: BruceApi.Api = ...;\r\n * const key = GetCacheKey(1);\r\n * api.Cache.Remove(key);\r\n * }\r\n * @param accountId \r\n * @param appSettingsId \r\n * @returns \r\n */\r\n export function GetCacheKey(accountId: string, appSettingsId?: string): string {\r\n if (appSettingsId) {\r\n return Api.ECacheKey.Account + Api.ECacheKey.Id + accountId + Api.ECacheKey + appSettingsId;\r\n }\r\n return Api.ECacheKey.Account + Api.ECacheKey.Id + accountId;\r\n }\r\n\r\n /**\r\n * Returns cache identifier for a list of accounts by session ID.\r\n * Example: {\r\n * const api: BruceApi.Api = ...;\r\n * const key = GetListCacheKey(api.GetSessionId());\r\n * api.Cache.Remove(key);\r\n * }\r\n * @param ssid \r\n * @returns \r\n */\r\n export function GetListCacheKey(ssid: string): string {\r\n return Api.ECacheKey.Account + Api.ECacheKey.Session + Api.ECacheKey.Id + ssid;\r\n }\r\n\r\n /**\r\n * Returns cache identifier for a list of database regions.\r\n * Example: {\r\n * const api: BruceApi.Api = ...;\r\n * const key = GetDbRegionListCacheKey();\r\n * api.Cache.Remove(key);\r\n * }\r\n * @returns \r\n */\r\n export function GetDbRegionListCacheKey() {\r\n return Api.ECacheKey.DatabaseRegion;\r\n }\r\n}","import { Account } from \"../account/account\";\nimport { AccountSettings } from \"../account/account-settings\";\nimport { Api } from \"../api/api\";\nimport { GuardianApi } from \"../api/guardian-api\";\nimport { ENVIRONMENT } from \"../environment\";\n\n/**\n * A hosting location is a record for a possible bruce-api server configuration.\n * A hosting location will have one or many database servers as well, this is an additional setting.\n */\nexport namespace HostingLocation {\n /**\n * Describes a hosting location record.\n */\n export interface ILocation {\n // Internal ID.\n ID: number;\n // External ID.\n Key: string;\n // Indicates if creation of a new bruce account is allowed in this region.\n // This should dictate if the record is visible in UI dropdowns as well for non-super-admins.\n IsEnabledForNewAccounts: boolean;\n DisplayName?: string;\n Description?: string;\n // Eg: \"us-west-1\".\n AWSRegion?: string;\n // Eg: \"Singapore\".\n Country?: string;\n // Eg: \"Vultr\".\n Hoster?: string;\n // Eg: \"San Francisco\".\n City?: string;\n // URL template to the corresponding API instance.\n // Eg: \"https://<ACCOUNTID>.api.nextspace-us.host/\".\n BruceAPIURL?: string;\n // Comma separated list of Api.EEnv.\n Environment?: string;\n // Arbitrary settings for the particular location.\n // For example this may include CDN template URLs.\n Settings?: any;\n }\n\n /**\n * Returns a list of hosting locations.\n * @Warning: This will not return the Settings property.\n * @param params\n * @returns\n */\n export async function GetList(params: {\n api?: GuardianApi.Api,\n req?: Api.IReqParams\n }): Promise<{\n // List of hosting locations.\n locations: ILocation[]\n }> {\n let { api, req } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n\n const res = await api.GET(\"hostinglocations\", Api.PrepReqParams(req));\n return {\n locations: res.Items\n };\n }\n\n /**\n * Returns a hosting location record by ID.\n * @param params \n * @returns \n */\n export async function GetById(params: {\n // ID of the hosting location record.\n id: number,\n api?: GuardianApi.Api,\n req?: Api.IReqParams\n }): Promise<{\n // The hosting location record.\n location: ILocation\n }> {\n let { id, api, req } = params;\n if (!id) {\n throw(\"Invalid id\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n\n const res = await api.GET(`hostinglocation/id/${id}`, Api.PrepReqParams(req));\n return {\n location: res\n };\n }\n\n /**\n * Returns a hosting location record by key.\n * @param params \n * @returns \n */\n export async function GetByKey(params: {\n // Key of the hosting location record.\n key: string,\n api?: GuardianApi.Api,\n req?: Api.IReqParams\n }): Promise<{\n location: ILocation\n }> {\n let { key, api, req } = params;\n if (!key) {\n throw(\"Invalid key\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n\n const res = await api.GET(`hostinglocation/key/${key}`, Api.PrepReqParams(req));\n return {\n location: res\n };\n }\n\n /**\n * Returns hostingLocationKey from given db url.\n * Some older accounts don't have this set, so we need to guess it.\n * @param params\n * @returns\n */\n export function GuessKey(params: {\n // Database connection string.\n DBServer?: string\n }) {\n const { DBServer: databaseUrl } = params;\n if (databaseUrl.includes(\"hyperfarm-prod-instance-1\")) {\n return \"HYPERFARM\";\n }\n if (databaseUrl.includes(\"prod-syd1.nextspace.host\")) {\n return \"AU-VULTR-FIRST\";\n }\n else if (databaseUrl.includes(\"prod-nyc1.nextspace.host\")) {\n return \"US-VULTR-FIRST\";\n }\n else if (databaseUrl.includes(\"prod-ams1.nextspace.host\")) {\n return \"EU-VULTR-FIRST\";\n }\n else if (databaseUrl.includes(\"prod-sing1.nextspace.host\")) {\n return \"SE-VULTR-FIRST\";\n }\n else if (databaseUrl.includes(\"dev-first\")) {\n return \"DEV-FIRST\";\n }\n else if (databaseUrl.includes(\".ap-southeast-1.\")) {\n return \"SE\";\n }\n else if (databaseUrl.includes(\".us-west-1.\")) {\n return \"US\";\n }\n else if (databaseUrl.includes(\".eu-west-3.\")) {\n return \"EU\";\n }\n else if (databaseUrl.includes(\"bruce-prod-au\")) {\n return \"AU\";\n }\n else if (databaseUrl.includes(\"bruce-dev\")) {\n return \"DEV\";\n }\n return null;\n }\n\n /**\n * Returns a hosting location key by account ID.\n * @param params \n * @returns \n */\n export async function GetKeyByAccountId(params: {\n // It is recommended to pass accountId and supplement it with account and apiSettings.\n accountId?: string,\n // Optional account record to save getting it.\n account?: Account.IAccount,\n // API settings for the client account.\n apiSettings?: AccountSettings.IBruceApi,\n api?: GuardianApi.Api,\n req?: Api.IReqParams\n }): Promise<{\n // Hosting location key.\n key: string,\n // Indicates if the key was inferred by legacy data.\n isLegacy?: boolean\n }> {\n let { accountId, apiSettings, api, account, req } = params;\n if (!accountId && !apiSettings) {\n throw(\"Invalid accountId or apiSettings\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n\n // We'll prioritize account record if provided.\n if (accountId && !account) {\n account = (await Account.Get({\n accountId,\n api,\n req\n })).account;\n }\n if (account?.[\"HostingLocation.Key\"]) {\n return {\n key: account[\"HostingLocation.Key\"],\n isLegacy: false\n };\n }\n\n // Fallback to settings JSON for older records.\n const settings = apiSettings ? apiSettings : (await Account.GetAppSettings({\n api,\n accountId,\n appId: Account.EAppId.BruceApi\n })).settings as AccountSettings.IBruceApi;\n\n let hostingKey = settings[\"HostingLocation.Key\"];\n let isLegacy = false;\n if (!hostingKey) {\n hostingKey = settings.DBLocation;\n isLegacy = true;\n }\n if (!hostingKey) {\n hostingKey = GuessKey({\n DBServer: settings.DBServer\n });\n isLegacy = true;\n }\n return {\n key: hostingKey,\n isLegacy\n };\n }\n\n /**\n * Returns a hosting location record by account ID.\n * @param params \n * @returns \n */\n export async function GetByAccountId(params: {\n // It is recommended to pass accountId and supplement it with account and apiSettings.\n accountId?: string,\n // Optional account record to save getting it.\n account?: Account.IAccount,\n // API settings for the client account.\n apiSettings?: AccountSettings.IBruceApi,\n api?: GuardianApi.Api,\n req?: Api.IReqParams\n }): Promise<{\n // Hosting location record.\n location: ILocation\n }> {\n let { accountId, apiSettings, api, req, account } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n\n const data = await GetKeyByAccountId({\n accountId,\n account,\n apiSettings,\n api,\n req\n });\n if (!data?.key) {\n return null;\n }\n const key = await GetByKey({\n key: data.key,\n api,\n req\n });\n return key;\n }\n}","/**\n * Permissions in Nextspace are arbitrary strings with meaning in specific contexts.\n * This is a list of known permissions.\n */\nexport namespace Permission {\n export type Perm = EPerm | string;\n\n /**\n * Standalone permissions.\n */\n export enum EPerm {\n // Provides full access to a specific client account.\n ADMIN = \"ADMIN\",\n // Exactly like ADMIN except with no user and organization management.\n POWER = \"POWER\",\n // Provides read-only access to a specific client account.\n ADMIN_VIEW = \"ADMIN_VIEW\",\n // Provides login access to a specific client account.\n // Login and read-only differ in that certain data is restricted to administrator users or users with specific permissions.\n LOGIN = \"LOGIN\",\n // Access to deleting arbitrary entity types.\n DELETE_ENTITY_TYPE = \"DELETE_ENTITY_TYPE\",\n // Access to creating and updating arbitrary entity types.\n CREATE_ENTITY_TYPE = \"CREATE_ENTITY_TYPE\",\n UPDATE_ENTITY_TYPE = \"UPDATE_ENTITY_TYPE\"\n }\n\n /**\n * Permissions that are suffixed with another value.\n * Eg: \"UIVIEW_\" will get the view's ID appended to it and be used as a permission to access the view.\n */\n export enum EPermPrefix {\n // Access to a specific view.\n ACCESS_PROJECT_VIEW = \"UIVIEW_\",\n // Editing capability for a specific view's bookmarks.\n MANAGE_PROJECT_VIEW_BOOKMARKS = \"UIVIEW_MANAGE_BOOKMARKS_\",\n // Access to a specific tileset.\n ACCESS_TILESET = \"TILESET_\"\n }\n}","import { Api } from \"../api/api\";\nimport { GuardianApi } from \"../api/guardian-api\";\nimport { UTC } from \"../common/utc\";\nimport { ENVIRONMENT } from \"../environment\";\nimport { Permission } from \"./permission\";\nimport { User } from \"./user\";\nimport { UserGroup } from \"./user-group\";\n\n/**\n * Describes the \"Session\" concept within Nextspace.\n * A session is a set of settings produced from a user or access token login.\n * The session describes what the access should be allowed to do.\n */\nexport namespace Session {\n /**\n * Describes a session record.\n */\n export interface ISession {\n // Loaded account-level permissions.\n AccessPermissions: IAccountPermissions;\n // Loaded super-level permissions.\n HypeportalAccessPermisssions?: ISuperPermissions;\n // The account ID that was logged in.\n \"ClientAccount.ID\": string;\n // The session ID.\n ID: string;\n // The session's logged in IP.\n IP: string;\n // The session's last access time.\n LastAccessTime: UTC.IUTC;\n // The session's logged in user.\n User: User.IUser;\n }\n\n /**\n * Describes a set of permissions for an account.\n */\n export interface IAccountPermissions {\n // The account ID that these permissions are for.\n \"ClientAccount.ID\"?: string;\n // Array of permissions that are enabled.\n \"EnabledFeatures\"?: Permission.Perm[];\n // Array of group records of names of them.\n // Result depends on the session's permissions.\n \"UserGroups\"?: UserGroup.IGroup[] | string[];\n }\n\n /**\n * Describes a set of permissions for a super user.\n */\n export interface ISuperPermissions {\n // Array of permissions that are enabled.\n EnabledFeatures?: Permission.Perm[];\n // Array of user groups that the user belongs to.\n UserGroups?: string[];\n }\n\n /**\n * Gets a session record.\n * @param params \n * @returns \n */\n export async function Get(params: {\n api?: GuardianApi.Api,\n // If none is specified it'll return an anonymous session.\n sessionId?: string,\n // Optional param to specify the account ID to get permissions for.\n // If not specified, the session's original logged in account will be used.\n accountId?: string,\n req?: Api.IReqParams\n }): Promise<{\n // The session record.\n session: ISession\n }> {\n let { api, sessionId, req: reqParams, accountId } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n\n const key = GetCacheKey(sessionId);\n const cache = await api.GetCacheItem(key, reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(`session/${sessionId}${accountId ? `?account=${accountId}`: \"\"}`, reqParams);\n res({\n session: data\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key,\n value: prom,\n req: reqParams,\n duration: 5000\n });\n return prom;\n }\n\n /**\n * Request to login or to swap existing session to a different account.\n * If api is already logged in, pass account param to swap the session.\n * @param params \n * @returns \n */\n export async function Login(params: {\n api?: GuardianApi.Api,\n // The username to login with.\n username?: string,\n // The password to login with.\n password?: string,\n // The account ID to login into.\n accountId?: string,\n req?: Api.IReqParams\n }): Promise<{\n // Session record.\n session: ISession\n }> {\n let { api, username, password, accountId, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n\n const data: any = await api.POST(\"login\", {\n account: accountId ? accountId : \"\",\n login: username,\n password: password\n }, reqParams);\n const session: ISession = data?.Session;\n const ssid = session?.ID;\n\n api.SetSessionId(ssid);\n api.Cache.Remove(GetCacheKey(ssid));\n\n return {\n session: session\n };\n }\n\n /**\n * Request to logout and void a session.\n * This will use the sessionId set within the provided api instance.\n * @param params \n */\n export async function Logout(params: {\n api?: GuardianApi.Api,\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n\n const ssid = api.GetSessionId();\n if (ssid) {\n await api.POST(\"logout\", null, reqParams);\n api.SetSessionId(<any>null);\n api.Cache.Remove(GetCacheKey(ssid));\n }\n }\n\n /**\n * Returns if a permission is enabled for a session.\n * This check is case-insensitive.\n * Please use 'IsAccountAdmin', 'IsSuperAdmin', and 'IsPowerUser' when needed as they cover all account-level perms.\n * @param params \n * @returns \n */\n export function IsPermEnabled(params: {\n // The session to check.\n session: ISession,\n // The client account ID to check.\n accountId: string,\n // The permission to check.\n perm: string\n }): boolean {\n let { session, accountId, perm } = params;\n if (!perm) {\n throw(\"Perm is required.\");\n }\n\n perm = perm.toLocaleUpperCase();\n accountId = accountId.toLowerCase();\n\n // First we'll scan the user object for the account ID.\n if (session?.User?.AccessPermissions?.length) {\n for (let i = 0; i < session.User.AccessPermissions.length; i++) {\n const aPerms = session.User.AccessPermissions[i];\n const permsAccountId = String(aPerms[\"ClientAccount.ID\"]).toLowerCase();\n // Found account, woo.\n if (permsAccountId == accountId) {\n // Check against the loaded perm array.\n // In newer version this always exists, but in some legacy versions it MIGHT not,\n //therefor we also do a group check after..\n if (aPerms.EnabledFeatures?.length) {\n return aPerms.EnabledFeatures.findIndex(x => x.toLocaleUpperCase() == perm) > -1;\n }\n // Fallback to group check.\n if (aPerms.UserGroups?.length && typeof aPerms.UserGroups[0] != \"string\") {\n for (let j = 0; j < aPerms.UserGroups.length; j++) {\n const group = aPerms.UserGroups[j] as UserGroup.IGroup;\n if (group?.Features?.length) {\n const gPerms = group.Features;\n if (gPerms && gPerms.findIndex(x => x.toLocaleUpperCase() == perm) > -1) {\n return true;\n }\n }\n }\n }\n }\n }\n }\n\n // Fallback to the session perm info.\n // This is deprecated and old as it's only for one account.\n const perms = session?.AccessPermissions;\n if (!perms) {\n return false;\n }\n const pAccountId = String(perms[\"ClientAccount.ID\"]).toLowerCase();\n if (pAccountId != accountId) {\n return false;\n }\n if (perms.EnabledFeatures?.length) {\n return perms.EnabledFeatures.findIndex(x => x.toLocaleUpperCase() == perm) > -1;\n }\n\n return false;\n }\n\n /**\n * Returns if a super permission is enabled for a session.\n * This check is case-insensitive.\n * Please use 'IsSuperAdmin' when needed as it covers all perms.\n * @param params \n * @returns \n */\n export function IsSuperPermEnabled(params: {\n session: ISession,\n perm: string\n }): boolean {\n let { session, perm } = params;\n if (!perm) {\n throw(\"Perm is required.\");\n }\n if (!session) {\n return false;\n }\n\n perm = perm.toLocaleUpperCase();\n\n // First we'll scan the included super perms.\n const superPerms = session.HypeportalAccessPermisssions;\n if (superPerms?.EnabledFeatures?.length) {\n return superPerms.EnabledFeatures.findIndex(x => x.toLocaleUpperCase() == perm) > -1;\n }\n\n // Now we'll fallback to digging through group to find the super group.\n if (session?.User?.AccessPermissions?.length) {\n for (let i = 0; i < session.User.AccessPermissions.length; i++) {\n const perms = session.User.AccessPermissions[i];\n\n // Newer API versions always specify accountId in the collections.\n // If it's set we can do a super account check early.\n if (perms[\"ClientAccount.ID\"] != null) {\n const pAccountId = String(perms[\"ClientAccount.ID\"]).toLowerCase();\n if (pAccountId != Api.SUPER_ACCOUNT_ID) {\n continue;\n }\n }\n\n if (perms?.UserGroups?.length) {\n for (let j = 0; j < perms.UserGroups.length; j++) {\n const group = perms.UserGroups[j];\n if (typeof group != \"string\") {\n const gAccountId = String(group[\"ClientAccount.ID\"]).toLowerCase();\n if (gAccountId != Api.SUPER_ACCOUNT_ID) {\n continue;\n }\n\n const features = group.Features;\n if (features && features.findIndex(x => x.toLocaleUpperCase() == perm) > -1) {\n return true;\n }\n }\n }\n }\n }\n }\n\n return false;\n }\n\n /**\n * Returns if a session is an account admin.\n * Please use 'IsSuperAdmin' when needed as it covers all perms.\n * @param params \n * @returns \n */\n export function IsAccountAdmin(params: {\n // The session to check.\n session: ISession,\n // The client account ID to check.\n accountId: string\n }): boolean {\n return IsPermEnabled({\n perm: Permission.EPerm.ADMIN,\n accountId: params.accountId,\n session: params.session\n });\n }\n\n /**\n * Returns if a session is a power user.\n * Power users are account admins without the ability to manage users and organizations.\n * Please use 'IsSuperAdmin' when needed as it covers all perms.\n * @param params \n * @returns \n */\n export function IsPowerUser(params: {\n // The session to check.\n session: ISession,\n // The client account ID to check.\n accountId: string\n }): boolean {\n return IsPermEnabled({\n perm: Permission.EPerm.POWER,\n accountId: params.accountId,\n session: params.session,\n });\n }\n\n /**\n * Returns if a session is a super admin.\n * @param params \n * @returns \n */\n export function IsSuperAdmin(params: {\n // The session to check.\n session: ISession\n }): boolean {\n return IsSuperPermEnabled({\n session: params.session,\n perm: Permission.EPerm.ADMIN\n });\n }\n\n /**\n * Returns cache identifier for a session.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetCacheKey(\"abc\");\n * api.Cache.Remove(key);\n * }\n * @param sessionId\n * @returns \n */\n function GetCacheKey(sessionId: string): string {\n return `${Api.ECacheKey.Session}${Api.ECacheKey.Id}${sessionId}`;\n }\n}","import { Api } from \"../api/api\";\nimport { GuardianApi } from \"../api/guardian-api\";\nimport { ENVIRONMENT } from \"../environment\";\nimport { Permission } from \"./permission\";\nimport { User } from \"./user\";\n\n/**\n * Describes the \"User Group\" concept within Nextspace.\n * A user group is a collection of permissions (\"Features\") and what users should be in the group.\n */\nexport namespace UserGroup {\n /**\n * Describes a user group record.\n */\n export interface IGroup {\n // The account ID that this group is for.\n \"ClientAccount.ID\"?: string;\n // Array of permissions that are enabled when being in this group.\n \"Features\": Permission.Perm[];\n // The group ID.\n \"ID\": string;\n // Human readable name for the group.\n \"Name\"?: string;\n }\n\n /**\n * Returns a user group by its name.\n * @param params \n * @returns \n */\n export async function GetByName(params: {\n api?: GuardianApi.Api, \n // The account ID that this group is for.\n accountId: string, \n // Name to search for.\n name: string, \n req?: Api.IReqParams\n }): Promise<{\n // The user group record.\n group: IGroup\n }> {\n let { api, accountId, name, req: reqParams } = params;\n if (!name || !accountId) {\n throw(\"Name and AccountID are required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n\n const data = await api.GET(`account/${accountId}/userGroupByName/${name}`, reqParams);\n return {\n group: data\n };\n }\n\n /**\n * Returns all users in a user group.\n * @param params \n * @returns \n */\n export async function GetUsers(params: {\n api?: GuardianApi.Api, \n // The account ID that this group is for.\n accountId: string, \n // The group ID.\n groupId: string, \n req?: Api.IReqParams\n }): Promise<{\n // The users in the group.\n users: User.IUser[]\n }> {\n let { api, accountId, groupId: id, req: reqParams } = params;\n if (!accountId || !id) {\n throw(\"AccountID and ID are required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n\n const data = await api.GET(`userGroup/${accountId}/${id}/users`, reqParams);\n return {\n users: data.Items\n };\n }\n\n /**\n * Returns list of user groups that have a specific permission enabled.\n * @param params \n * @returns \n */\n export async function GetListByPerm(params: {\n api?: GuardianApi.Api,\n // The account ID that this group is for.\n accountId: string, \n // The permission to search for.\n perm: Permission.Perm,\n req?: Api.IReqParams\n }): Promise<{\n // The user groups that have the permission enabled.\n groups: IGroup[]\n }> {\n let { api, accountId, perm, req: reqParams } = params;\n if (!accountId || !perm) {\n throw(\"AccountID and Perm are required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n\n const data = await api.GET(`userGroupsByFeature/${accountId}/${perm}`, reqParams);\n return {\n groups: data.Items\n };\n }\n\n /**\n * Returns all user groups for an account.\n * @param params \n * @returns \n */\n export async function GetList(params: {\n api?: GuardianApi.Api,\n // The account ID that this group is for.\n accountId: string, \n req?: Api.IReqParams\n }): Promise<{\n // The user groups for the account.\n groups: IGroup[]\n }> {\n let { api, accountId, req: reqParams } = params;\n if (!accountId) {\n throw(\"AccountID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n\n const data = await api.GET(`userGroups/${accountId}`, reqParams);\n return {\n groups: data.Items\n };\n }\n\n /**\n * Deletes a user group.\n * @param params \n * @returns \n */\n export async function Delete(params: {\n api?: GuardianApi.Api, \n // The account ID that this group is for.\n accountId: string, \n // The group ID.\n groupId: string, \n req?: Api.IReqParams\n }): Promise<void> {\n let { api, accountId, groupId: id, req: reqParams } = params;\n if (!accountId || !id) {\n throw(\"AccountID and ID are required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n\n return api.DELETE(`account/${accountId}/userGroupID/${id}`, reqParams);\n }\n\n /**\n * Creates or updates a user group.\n * @param params \n * @returns \n */\n export async function Update(params: {\n api?: GuardianApi.Api, \n // The user group to create or update.\n group: IGroup, \n reqParams?: Api.IReqParams\n }): Promise<{\n // The user group record.\n group: IGroup\n }> {\n let { api, group: data, reqParams } = params;\n if (!data.Name || !data[\"ClientAccount.ID\"]) {\n throw(\"User group name and client account ID are required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n\n const res = await api.POST(`userGroup${data.ID ? (\"/\" + data.ID) : \"\"}`, data, reqParams);\n return {\n group: res\n };\n }\n}","import { Api } from \"../api/api\";\nimport { GuardianApi } from \"../api/guardian-api\";\nimport { ENVIRONMENT } from \"../environment\";\nimport { UserGroup } from \"./user-group\";\n\n/**\n * Describes the \"User\" concept within Nextspace.\n * A user is either a login-user or an access-token.\n *\n * You cannot login using an access-token, but both concepts are-\n * treated the same way in terms of permissions and user groups.\n */\nexport namespace User {\n /**\n * Describes a user record.\n */\n export interface IUser {\n // Enabled access permissions.\n AccessPermissions?: IAccessPermission[];\n // User's email address.\n Email?: string;\n // User's username.\n Login?: string;\n // User's full name.\n FullName?: string;\n // User's ID.\n ID?: string;\n // Indicates if the user is activated.\n // This is deprecated and is being replaced by a flags for email and mobile verification statuses.\n IsActivated?: boolean;\n // Indicates if the user is disabled.\n IsDisabled?: boolean;\n // Indicates if the user's password needs to be changed.\n IsPasswordChangeRequired?: boolean;\n // User's mobile number.\n Mobile?: string;\n // User's password.\n // Is not available when reading the record.\n // Set to change the password.\n Password?: string;\n // User's type. Eg: access token instead of a login user.\n Type?: EType;\n }\n\n /**\n * Available user types.\n */\n export enum EType {\n // Typical user. Login to gain access to a session.\n User = \"LOGIN_USER\",\n // Access token. Used to gain access to related permissions.\n AccessToken = \"ACCESS_TOKEN\"\n }\n\n /**\n * Describes a set of permissions for an account.\n */\n export interface IAccessPermission {\n // The account ID that these permissions are for.\n \"ClientAccount.ID\": string;\n // Array of group records of names of them.\n // Result depends on the session's permissions.\n \"UserGroups\"?: UserGroup.IGroup[] | string[];\n // Array of permissions that are enabled.\n \"EnabledFeatures\"?: string[];\n\n // Array of associated user group IDs.\n // @warning: This is only part of the update request, not the response.\n \"UserGroup.ID\"?: string[];\n }\n\n /**\n * Gets a user record.\n * @param params \n * @returns \n */\n export async function Get(params: {\n api?: GuardianApi.Api,\n // The user ID.\n userId: string,\n // The account ID that this user is for.\n accountId?: string,\n req?: Api.IReqParams\n }): Promise<{\n // The user record.\n user: IUser\n }> {\n let { api, userId: id, accountId, req: reqParams } = params;\n if (!id) {\n throw(\"ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n\n const cache = await api.GetCacheItem(GetCacheKey(id, <string>accountId), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(`user/${id}${accountId ? `?clientAccountID=${accountId}` : \"\"}`, reqParams)\n res({\n user: data\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key: GetCacheKey(id, <string>accountId),\n value: prom,\n req: reqParams\n });\n return prom;\n }\n\n /**\n * Updates a user record.\n * @param params \n * @returns \n */\n export async function Update(params: {\n api?: GuardianApi.Api,\n // The user to update.\n user: IUser,\n req?: Api.IReqParams\n }): Promise<{\n // The updated user record.\n user: IUser\n }> {\n let { api, user: data, req: reqParams } = params;\n if (!data?.ID || !data?.Type) {\n throw(\"ID and Type are required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n\n // When getting a user it is structured slightly different to when we update it.\n // We can make up the difference here.\n if (data.AccessPermissions?.length) {\n for (let i = 0; i < data.AccessPermissions.length; i++) {\n const perm = data.AccessPermissions[i];\n if (!perm[\"UserGroup.ID\"] && perm.UserGroups && typeof perm.UserGroups != \"string\") {\n perm[\"UserGroup.ID\"] = [];\n for (let j = 0; j < perm.UserGroups.length; j++) {\n perm[\"UserGroup.ID\"].push((perm.UserGroups as UserGroup.IGroup[])[j].ID);\n }\n }\n }\n }\n const res = await api.POST(`user/${data.ID}`, data, reqParams);\n api.Cache.RemoveByContains(Api.ECacheKey.User + Api.ECacheKey.Id + data.ID);\n if (data.Type == EType.AccessToken) {\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.AccessToken + Api.ECacheKey.Account);\n }\n else if (data.Type == EType.User) {\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.User + Api.ECacheKey.Account);\n }\n return {\n user: res\n };\n }\n\n /**\n * Loads settings for a given user + app.\n * The session's account id is used to separate settings between accounts.\n * @param params\n */\n export async function GetSettings(params: {\n api?: GuardianApi.Api,\n // The user ID.\n userId: string,\n // The app ID.\n appId: string,\n req?: Api.IReqParams\n }): Promise<{\n // The settings record.\n settings: any\n }> {\n let { api, userId, appId, req } = params;\n if (!userId || !appId) {\n throw(\"UserId and appId are required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n\n const cache = await api.GetCacheItem(GetSettingsCacheKey(userId, appId), req);\n if (cache?.found) {\n return cache.data;\n }\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(`user/${userId}/application/${appId}/settings`);\n const settings = data?.Settings ? data.Settings : {};\n res({\n settings: settings\n });\n }\n catch (e) {\n // It will complain if an app id hasn't been used yet.\n // We need to suppress that error.\n if (e && typeof e == \"object\") {\n if (e.ERROR && typeof e.ERROR == \"object\" && e.ERROR.Type == \"NotFound\") {\n res({\n settings: {}\n });\n return;\n }\n }\n rej(e);\n }\n });\n await api.SetCacheItem({\n key: GetSettingsCacheKey(userId, appId),\n value: prom,\n req: req\n });\n return prom;\n }\n\n /**\n * Updates settings for a given accId + user + app.\n * The settings update will replace the existing record, please ensure to merge with existing settings.\n * AccountId is optional and will use a globally shared record if not provided.\n * @param params\n */\n export async function UpdateSettings(params: {\n api?: GuardianApi.Api,\n // The client account's ID.\n accId?: string,\n // The user ID.\n userId: string,\n // The app ID.\n appId: string,\n // The settings to update.\n settings: any,\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, accId, userId, appId, settings, req } = params;\n if (!userId || !appId) {\n throw(\"UserId and appId are required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n\n const postBody = {\n Settings: settings == null ? {} : settings,\n Application: appId,\n ClientAccountID: accId,\n UserID: userId\n };\n const prom = api.POST(`user/${userId}/application/${appId}/settings`, postBody, req);\n api.Cache.Remove(GetSettingsCacheKey(userId, appId));\n return prom;\n }\n\n /**\n * Returns if a username is available.\n * @param params \n * @returns \n */\n export async function GetUsernameAvailable(params: {\n api?: GuardianApi.Api,\n // The username to check.\n username: string,\n // The user ID to exclude from the check.\n // This is useful when updating a user's username.\n excludeUserId?: string,\n req?: Api.IReqParams\n }): Promise<{\n // Indicates if the username is available.\n isAvailable: boolean\n }> {\n let { api, username, excludeUserId, req: reqParams } = params;\n if (!username) {\n throw(\"Username is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n\n const req = api.GET(`user/loginavailable/${username}${excludeUserId ? \"?excludeUserId=\" + excludeUserId : \"\"}`, reqParams);\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await req;\n res({\n isAvailable: data.IsAvailable\n });\n }\n catch (e) {\n rej(<any>e);\n }\n });\n return prom;\n }\n\n export namespace LoginUser {\n /**\n * Returns cache identifier for a list of users.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetListCacheKey(\"abc\");\n * api.Cache.Remove(key);\n * }\n * @param accountId \n * @returns \n */\n export function GetListCacheKey(accountId: string): string {\n return Api.ECacheKey.User + Api.ECacheKey.Account + Api.ECacheKey.Id + accountId;\n }\n\n /**\n * Returns a user by their email address.\n * @param params \n * @returns \n */\n export async function GetByEmail(params: {\n api?: GuardianApi.Api,\n // The email address to search for.\n email: string,\n // An account ID to filter against.\n accountId?: string,\n req?: Api.IReqParams\n }): Promise<{\n // The user record.\n user: IUser\n }> {\n let { api, email, accountId, req: reqParams } = params;\n if (!email) {\n throw(\"Email is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n\n const cache = await api.GetCacheItem(GetEmailCacheKey(email, <string>accountId), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(`userByEmail/${email}${accountId ? `?clientAccountID=${accountId}` : \"\"}`, reqParams);\n res({\n user: data\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key: GetEmailCacheKey(email, <string>accountId),\n value: prom,\n req: reqParams\n });\n return prom;\n }\n\n /**\n * Returns a list of users for an account.\n * @param params \n * @returns \n */\n export async function GetList(params: {\n api?: GuardianApi.Api,\n // The account ID to get users for.\n accountId: string,\n // Indicates if the list should exclude the client account's users.\n exclusive?: boolean,\n req?: Api.IReqParams\n }): Promise<{\n // The list of users.\n users: IUser[]\n }> {\n let { api, accountId, exclusive, req: reqParams } = params;\n if (!accountId) {\n throw(\"Client account ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n if (!exclusive) {\n exclusive = false;\n }\n\n const cache = exclusive ? null : await api.GetCacheItem(GetListCacheKey(accountId), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const req: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(`users?clientAccountID=${accountId}${exclusive ? \"&allExcludingClientAccount=true\" : \"\" }`, reqParams);\n res({\n users: data.Items\n });\n }\n catch (e) {\n rej(e);\n }\n });\n req.then(async (data) => {\n const users = data.users;\n for (let i = 0; i < users.length; i++) {\n await api.SetCacheItem({\n key: GetCacheKey(<string>users[i].ID, accountId),\n value: {\n user: users[i]\n },\n req: reqParams\n });\n }\n });\n if (!exclusive) {\n await api.SetCacheItem({\n key: GetListCacheKey(accountId),\n value: req,\n req: reqParams\n });\n }\n return req;\n }\n\n /**\n * Sends a signup email to the specified email address.\n * @param params\n * @returns\n */\n export async function Signup(params: {\n api?: GuardianApi.Api,\n // The email address to send the signup email to.\n email: string,\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, email, req: reqParams } = params;\n if (!email) {\n throw(\"Email is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n\n return api.POST(\"clientaccount/signup\", {\n Email: email\n }, reqParams);\n }\n\n /**\n * Sends a new signup email using a previous one's expired code.\n * @param params\n * @returns\n */\n export async function SignupResend(params: {\n api?: GuardianApi.Api,\n // The expired activation code.\n expiredCode: string,\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, expiredCode, req: reqParams } = params;\n if (!expiredCode) {\n throw(\"Expired activation code is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n\n return api.POST(`clientaccount/signup/resend?activationKey=${Api.Encode(expiredCode)}`, null, reqParams);\n }\n\n /**\n * Completes signup using user data and a signup code.\n * @param params\n * @returns\n */\n export async function SignupComplete(params: {\n api?: GuardianApi.Api,\n // The signup code.\n code: string,\n // The user data to complete the signup with.\n user: IUser,\n // The account ID to complete the signup for.\n accountId?: string,\n req?: Api.IReqParams\n }): Promise<{\n // The user record.\n user: IUser\n }> {\n let { api, code, user: data, accountId, req: reqParams } = params;\n if (!code || !data?.Login || !data?.Password) {\n throw(\"Login, password, and activation code are required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n\n data = JSON.parse(JSON.stringify(data));\n data.IsActivated = true;\n data.IsDisabled = false;\n (<any>data).key = code;\n const res: IUser = await api.POST(`UserActivate/${accountId ? accountId : \"\"}`, data, reqParams);\n api.Cache.RemoveByContains(Api.ECacheKey.User + Api.ECacheKey.Id + res.ID);\n if (data.Email) {\n api.Cache.RemoveByContains(Api.ECacheKey.User + Api.ECacheKey.UserEmail + data.Email);\n }\n return {\n user: res\n };\n }\n\n /**\n * Sends a password reset email to the specified email address.\n * @param params\n * @returns user id associated with provided email.\n */\n export async function ForgotPassword(params: {\n api?: GuardianApi.Api,\n // AccountId the user is associated with.\n // This dictates the email template to use.\n accountId: string,\n // The email address to send the password reset email to.\n email: string,\n req?: Api.IReqParams\n }): Promise<{\n // The user ID associated with the provided email.\n userId: string\n }> {\n let { api, accountId, email, req: reqParams } = params;\n if (!accountId || !email) {\n throw(\"Account ID and email are required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n\n const req = api.POST(`UserForgotPassword/${accountId}`, {\n Email: email\n }, reqParams);\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await req;\n res({\n userId: data.ID\n });\n }\n catch (e) {\n rej(e);\n }\n });\n return prom;\n }\n\n /**\n * Completes password reset using a password reset code and new password.\n * @param params\n * @returns\n */\n export async function ForgotPasswordComplete(params: {\n api?: GuardianApi.Api,\n // The password reset code.\n code: string,\n // The associated user ID.\n userId: string,\n // The new password.\n password: string,\n req?: Api.IReqParams\n }): Promise<{\n // The related user record.\n user: IUser\n }> {\n let { api, code, userId, password, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n\n const {user} = await Get({\n api: api,\n userId: userId,\n accountId: \"\",\n req: reqParams\n });\n const res = await api.POST(\"UserSetNameAndPassword\", {\n ID: userId,\n Email: user.Email,\n ActivationCode: code,\n Password: password,\n FullName: user.FullName\n }, reqParams);\n return {\n user: res\n };\n }\n }\n\n export namespace AccessToken {\n /**\n * Returns cache identifier for a list of users.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetListCacheKey(\"abc\");\n * api.Cache.Remove(key);\n * }\n * @param accountId \n * @returns \n */\n export function GetListCacheKey(accountId: string): string {\n return Api.ECacheKey.AccessToken + Api.ECacheKey.Account + Api.ECacheKey.Id + accountId;\n }\n\n /**\n * Returns a list of access tokens for an account.\n * @param params \n * @returns \n */\n export async function GetList(params: {\n api?: GuardianApi.Api,\n // The account ID to get access tokens for.\n accountId: string,\n req?: Api.IReqParams\n }): Promise<{\n // The list of access tokens.\n users: IUser[]\n }> {\n let { api, accountId, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n\n const cache = await api.GetCacheItem(GetListCacheKey(accountId), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const req: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(\"usersByClientAccount/accessTokens\", reqParams);\n res({\n users: data.Items\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key: GetListCacheKey(accountId),\n value: req,\n req: reqParams\n });\n return req;\n }\n\n /**\n * Deletes an access token.\n * @param params \n */\n export async function Delete(params: {\n api?: GuardianApi.Api,\n // The access token ID.\n tokenId: string,\n req?: Api.IReqParams\n }): Promise<void> {\n let { api, tokenId: id, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n\n await api.DELETE(`accessToken/${id}`, reqParams);\n api.Cache.RemoveByContains(Api.ECacheKey.User + Api.ECacheKey.Id + id);\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.AccessToken + Api.ECacheKey.Account);\n }\n\n /**\n * Creates a new access token.\n * @param params \n * @returns \n */\n export async function Create(params: {\n api?: GuardianApi.Api,\n // The access token to create.\n token: IUser,\n req?: Api.IReqParams\n }): Promise<{\n // The created access token.\n user: IUser\n }> {\n let { api, token: data, req: reqParams } = params;\n if (!data) {\n data = {};\n }\n if (data.Type == EType.User) {\n throw(\"User type is not allowed.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n if (!data.Type) {\n data.Type = EType.AccessToken;\n }\n\n data = await api.POST(\"accessToken\", data, reqParams);\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.AccessToken + Api.ECacheKey.Account);\n return {\n user: data\n };\n }\n }\n\n /**\n * Returns cache identifier for a user.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetCacheKey(\"abc\", \"def\");\n * api.Cache.Remove(key);\n * }\n * @param userId\n * @param accountId\n * @returns \n */\n export function GetCacheKey(userId: string, accountId?: string): string {\n if (!accountId) {\n accountId = \"\";\n }\n return Api.ECacheKey.User + Api.ECacheKey.Id + userId + Api.ECacheKey.Id + accountId;\n }\n\n /**\n * Returns cache identifier for a user.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetCacheKey(\"abc\", \"def\");\n * api.Cache.Remove(key);\n * }\n * @param email\n * @param accountId\n * @returns \n */\n export function GetEmailCacheKey(email: string, accountId?: string): string {\n if (!accountId) {\n accountId = \"\";\n }\n return Api.ECacheKey.User + Api.ECacheKey.UserEmail + email + Api.ECacheKey.Id + accountId;\n }\n\n /**\n * Returns cache identifier for a user's settings.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetCacheKey(\"abc\", \"def\");\n * api.Cache.Remove(key);\n * }\n * @param userId\n * @param appId\n * @returns \n */\n export function GetSettingsCacheKey(userId: string, appId: string): string {\n return Api.ECacheKey.User + Api.ECacheKey.UserSettings + userId + Api.ECacheKey.Id + appId;\n }\n}","\nimport { Api } from \"../api/api\";\nimport { GuardianApi } from \"../api/guardian-api\";\nimport { UTC } from \"../common/utc\";\nimport { ENVIRONMENT } from \"../environment\";\nimport { User } from \"../user/user\";\n\n/**\n * An account-invite is an invitation to a user to join a client account.\n * New users to Nextspace will setup their user account within the invitation process.\n */\nexport namespace AccountInvite {\n /**\n * Describes an account-invite record.\n */\n export interface IInvite {\n ID: number;\n // Client account the invite is for.\n \"Account.ID\": string;\n // User the invite is for.\n \"Invited.User.ID\": string;\n // User that created the invite.\n \"InvitedBy.User.ID\": string;\n // Date/time the invite was created.\n CreatedDate: UTC.IUTC;\n // How the user was invited. Eg: Email, SMS, Manual.\n InviteMethod: EInviteMethod;\n // Indicates if the invite has expired.\n IsExpired: boolean;\n // Status of the invite. Eg: Sent, Accepted, Denied, Cancelled.\n Status: EStatus;\n }\n\n /**\n * Possible invite statuses.\n */\n export enum EStatus {\n Denied = \"Denied\",\n Cancelled = \"Cancelled\",\n Sent = \"Sent\",\n NotSent = \"NotSent\",\n Accepted = \"Accepted\"\n }\n\n /**\n * Possible invite methods.\n */\n export enum EInviteMethod {\n // Email invites are sent to a user's email address.\n // An email invite will validate the user's email address.\n Email = \"Email\",\n // Manual invites are links that are manually passed to a user.\n // A manual invite will not validate the user's email address or mobile number.\n Manual = \"Manual\",\n // TODO: Implement SMS invites.\n SMS = \"SMS\"\n }\n\n /**\n * Returns an invite matching a provided invite code.\n * @param params \n * @returns \n */\n export async function GetByCode(params: {\n api?: GuardianApi.Api,\n code: string,\n req?: Api.IReqParams\n }): Promise<{\n invite: IInvite\n }> {\n let { api, code, req } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n\n const res = await api.GET(`invite/code?inviteCode=${code}`, Api.PrepReqParams(req));\n return res;\n }\n\n /**\n * Returns a list of invites matching provided criteria.\n * For example you can get a list of invites for a specific account or user (or both).\n * @param params \n * @returns \n */\n export async function GetList(params: {\n api?: GuardianApi.Api,\n // Client account ID to get invites for.\n accountId?: string,\n // User ID to get invites for.\n userId?: string,\n req?: Api.IReqParams\n }): Promise<{\n invites: IInvite[],\n warnings?: string[]\n }> {\n let { api, accountId, userId, req } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n\n const urlParams = new URLSearchParams();\n if (accountId) {\n urlParams.append(\"accountId\", accountId);\n }\n if (userId) {\n urlParams.append(\"userId\", userId);\n }\n const res = await api.GET(\"invites?\" + urlParams.toString(), Api.PrepReqParams(req));\n return res;\n }\n\n /**\n * Updates an invite's status.\n * Once an invite is accepted or denied it cannot be changed.\n * @param params \n * @returns \n */\n export async function Update(params: {\n api?: GuardianApi.Api,\n code: string,\n status: string,\n user?: User.IUser,\n req?: Api.IReqParams\n }) {\n let { api, code, status, user, req } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n\n const res = await api.POST(\"invite/update\", {\n InviteCode: code,\n Status: status,\n User: user\n }, Api.PrepReqParams(req));\n return res;\n }\n\n /**\n * Creates a new invite.\n * Please validate the response invitation records to ensure the desired contact method was used and worked.\n * Eg: It will tell you if the email was sent successfully.\n * @param params \n * @returns \n */\n export async function Create(params: {\n api?: GuardianApi.Api,\n // Client account ID to create the invite for.\n accountId: string,\n // Provide if you want to match against an existing user record using their login (username).\n // User must exist.\n login?: string,\n // Provide if you want to match against an existing user record using their ID.\n // User must exist.\n userId?: string,\n // Provide if you want to match against an existing user record using their email address.\n // If not found then a new user is made.\n email?: string,\n // Provide if you want to match against an existing user record using their mobile number.\n // If not found then a new user is made.\n mobile?: string,\n // Optional email template key to use. If not provided then the default template will be used.\n emailTemplateKey?: string,\n // Array of user groups that the user should be added to.\n // At least one must be specified.\n groupIds: string[],\n // Optional invite method to use.\n // If not provided then the invite method will be determined automatically based on the provided contact details.\n inviteMethod?: EInviteMethod,\n req?: Api.IReqParams\n }): Promise<{\n // Array of warnings that may have occurred during the invite process.\n warnings?: string[],\n // The user record for the user that was invited.\n user: User.IUser,\n // The invite record for the contact method used.\n invite: IInvite,\n // If SMS or Email are used, an additional invite record is generated for the manual invite.\n manualInvite?: IInvite\n manualInviteCode?: string\n }> {\n let { api, accountId, login, userId, email, mobile, emailTemplateKey, groupIds, req, inviteMethod } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n if (!groupIds?.length) {\n throw new Error(\"At least one User Group ID must be provided.\");\n }\n\n const res = await api.POST(\"invite/new\", {\n accountId,\n login,\n email,\n mobile,\n userId,\n groupIds,\n emailTemplateKey,\n inviteMethod\n }, Api.PrepReqParams(req));\n return res;\n }\n}","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../bruce-models\";\nimport { ENVIRONMENT } from \"../environment\";\n\n/**\n * Account Features are a set of flags that can be enabled or disabled for an account.\n * These flags usually represent how data is stored and managed.\n */\nexport namespace AccountFeatures {\n export enum EFeature {\n // Flag to enable data to be stored in the JSON column type.\n // This will enable conversion of the data, and will also enable searches to use that instead.\n EntityJsonData = \"Feature_Entity_JSONData\",\n // Flag to enable a text search against JSON data values.\n // 'EntityJsonData' must also be enabled.\n // @WARNING: Please re-index all Entities first before enabling this feature.\n // Without this the raw 2D geometry will be indexed which will make it much slower, and may cause the update of the flag to fail.\n EntityLexicalSearch = \"Feature_Entity_Lexical_Search\",\n }\n\n /**\n * Gets account features corresponding to the API instance's account.\n * @param params \n * @returns \n */\n export async function Get(params: {\n api?: BruceApi.Api,\n req?: Api.IReqParams\n }): Promise<{\n features: {\n [key: string]: number\n }\n }> {\n let { api, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const accountId = api.AccountId;\n const cache = await api.GetCacheItem(GetCacheKey(accountId), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(\"features\", reqParams);\n const features = data?.Features;\n res({\n features: features ? features : {}\n });\n }\n catch (e) {\n rej(e);\n }\n });\n api.SetCacheItem({\n key: GetCacheKey(accountId),\n value: prom,\n req: reqParams\n });\n return prom;\n }\n\n export async function Update(params: {\n api?: BruceApi.Api,\n // The features to update.\n features: {\n [key: string]: number\n },\n req?: Api.IReqParams\n }): Promise<{\n features: {\n [key: string]: number\n }\n }> {\n let { api, features, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const accountId = api.AccountId;\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.POST(\"features\", {\n Features: features\n }, reqParams);\n const updated = data?.Features;\n res({\n features: updated ? updated : {}\n });\n }\n catch (e) {\n rej(e);\n }\n });\n api.Cache.Remove(GetCacheKey(accountId));\n return prom;\n }\n\n /**\n * Returns cache identifier for an account by ID.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetCacheKey(\"my-account-id\");\n * api.Cache.Remove(key);\n * }\n * @param accountId \n * @returns \n */\n export function GetCacheKey(accountId: string): string {\n return Api.ECacheKey.AccountFeatures + Api.ECacheKey.Id + accountId;\n }\n}","import { Api, ApiGetters, ENVIRONMENT, GuardianApi, IDictionary, MathUtils, PendingAction, ProjectView } from \"../bruce-models\";\n\nexport namespace AccountLimits {\n export enum ELimit {\n MaxProjectViewCount = \"MaxProjectViewCount\",\n MaxStorageUseGigabytes = \"MaxStorageUseGigabytes\",\n MaxEntitiesCount = \"MaxEntitiesCount\",\n MaxFileImportSizeGigabytes = \"MaxFileImportSizeGigabytes\",\n OperatorAccessAllowed = \"OperatorAccessAllowed\",\n DenyPublicAccess = \"DenyPublicAccess\",\n EnableSSOLogin = \"EnableSSOLogin\",\n EnableSSOLoginAutoRedirect = \"EnableSSOLoginAutoRedirect\"\n }\n export type Limit = ELimit | string;\n\n /**\n * Represents a limit for an account.\n * The value type of interest is determined by the limit key.\n */\n export interface ILimit {\n \"Numeric\": number,\n \"String\": string,\n \"Boolean\": boolean\n }\n\n /**\n * Returns a dictionary of limits for the given account.\n * @param params \n * @returns \n */\n export async function GetLimits(params: {\n accountId: string,\n api?: GuardianApi.Api,\n req?: Api.IReqParams\n }): Promise<{\n limits: IDictionary<ILimit>\n }> {\n let { accountId, api, req } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetGuardianApi();\n }\n req = Api.PrepReqParams(req);\n\n const cacheData = api.GetCacheItem(GetLimitsCacheKey(accountId));\n if (cacheData?.found) {\n return cacheData.data;\n }\n const prom: any = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(`account/${accountId}?WithLimits=true`);\n const limits = data.Limits ? data.Limits : {};\n res({\n limits: limits\n });\n }\n catch (e) {\n rej(e);\n }\n });\n api.SetCacheItem({\n key: GetLimitsCacheKey(accountId),\n value: prom,\n req: req\n });\n return prom;\n }\n\n /**\n * Returns a numeric limit for the given account.\n * @param params \n */\n export async function GetNumericLimit(params: {\n // The limit to load.\n key: Limit,\n // The account to load the limit for.\n accountId: string,\n api?: GuardianApi.Api,\n req?: Api.IReqParams,\n // The value to return when there is a server error.\n onErrorValue: any,\n // The value to return when the limit is not set.\n onEmptyValue: number,\n }): Promise<number> { \n const { key, api, req, onErrorValue, onEmptyValue, accountId } = params;\n try {\n const { limits } = await GetLimits({\n accountId: accountId,\n api: api,\n req: req\n });\n const limit = limits[key];\n if (limit == null || limit.Numeric == null) {\n return onEmptyValue;\n }\n return Number(limit.Numeric);\n }\n catch (e) {\n return onErrorValue;\n }\n }\n\n /**\n * Returns a boolean limit for the given account.\n * @param params \n */\n export async function GetBooleanLimit(params: {\n key: Limit,\n accountId: string,\n api?: GuardianApi.Api,\n req?: Api.IReqParams,\n onErrorValue: any,\n onEmptyValue: boolean\n }): Promise<boolean> {\n const { key, api, req, onErrorValue, onEmptyValue, accountId } = params;\n try {\n const { limits } = await GetLimits({\n accountId: accountId,\n api: api,\n req: req\n });\n const limit = limits[key];\n if (limit == null || limit.Boolean == null) {\n return onEmptyValue;\n }\n return Boolean(limit.Boolean);\n }\n catch (e) {\n return onErrorValue;\n }\n }\n\n /**\n * Returns a string limit for the given account.\n * @param params \n */\n export async function GetStringLimit(params: {\n key: Limit,\n accountId: string,\n api?: GuardianApi.Api,\n req?: Api.IReqParams,\n onErrorValue: any,\n onEmptyValue: string\n }): Promise<string> {\n const { key, api, req, onErrorValue, onEmptyValue, accountId } = params;\n try {\n const { limits } = await GetLimits({\n accountId: accountId,\n api: api,\n req: req\n });\n const limit = limits[key];\n if (limit == null || limit.String == null) {\n return onEmptyValue;\n }\n return limit.String;\n }\n catch (e) {\n return onErrorValue;\n }\n }\n\n /**\n * Functions for validating if a user can do things sit here.\n */\n export namespace Assert {\n /**\n * Returns if project view creation is allowed for the account.\n */\n export async function GetCanCreateProjectView(params: {\n accountId?: string,\n getters?: ApiGetters\n }): Promise<{\n allowed: boolean,\n errorText?: string\n }> {\n if (!params.getters) {\n params.getters = ENVIRONMENT.Api();\n }\n if (!params.accountId) {\n params.accountId = params.getters.GetAccountId();\n }\n\n let current = -1;\n let max = await GetNumericLimit({\n accountId: params.accountId,\n key: ELimit.MaxProjectViewCount,\n onEmptyValue: 0,\n onErrorValue: null,\n api: params.getters.GetGuardianApi()\n });\n\n if (max != null) {\n // Should use proper statistic API as this will exclude project views the user cannot access.\n try {\n const {views} = await ProjectView.GetList({\n api: params.getters.GetBruceApi({\n accountId: params.accountId\n })\n });\n current = views.length;\n }\n catch (e) {\n console.error(e);\n max = null;\n }\n }\n\n if (max == null) {\n return {\n allowed: false,\n errorText: \"We apologize but Project View creation is currently unavailable.\"\n };\n }\n else if (max == -1) {\n return {\n allowed: true\n };\n }\n else if (current == -1) {\n return {\n allowed: false,\n errorText: \"We apologize but Project View creation is currently unavailable.\"\n };\n }\n else if (current >= max) {\n return {\n allowed: false,\n errorText: `You have reached the maximum number of Project Views allowed for your account. Your limit is ${max} Project ${max == 1 ? \"View\" : \"Views\"} and you have ${current}.`\n };\n }\n return {\n allowed: true\n };\n }\n\n /**\n * Returns the project view limit for an account.\n * If -1 is returned then it is unlimited.\n * @param params \n * @returns \n */\n export async function GetProjectViewLimit(params: {\n accountId?: string,\n api?: GuardianApi.Api\n }) {\n if (!params.api) {\n params.api = ENVIRONMENT.Api().GetGuardianApi();\n }\n if (!params.accountId) {\n params.accountId = ENVIRONMENT.Api().GetAccountId();\n }\n\n const max = await GetNumericLimit({\n accountId: params.accountId,\n key: ELimit.MaxProjectViewCount,\n onEmptyValue: 0,\n onErrorValue: null,\n api: params.api\n });\n // Our error so we'll just allow unlimited for the time being.\n if (max == null) {\n return -1;\n }\n return max;\n }\n\n /**\n * Returns if file uploads are allowed for the account.\n */\n export async function GetCanUploadFile(params: {\n accountId?: string,\n getters?: ApiGetters,\n // If provided we'll add a provided file size in bytes to the current storage amount for the check.\n fileSize?: number,\n // We'll check more files if this is true.\n // This is false by default.\n // When doing an import we'll check more, but for random things like uploading a picture to an entity we won't.\n thoroughCheck?: boolean\n }): Promise<{\n allowed: boolean,\n errorText?: string\n }> {\n if (!params.getters) {\n params.getters = ENVIRONMENT.Api();\n }\n if (!params.accountId) {\n params.accountId = params.getters.GetAccountId();\n }\n\n let current = -1;\n let max = await GetNumericLimit({\n accountId: params.accountId,\n key: ELimit.MaxStorageUseGigabytes,\n onEmptyValue: 0,\n onErrorValue: null,\n api: params.getters.GetGuardianApi()\n });\n\n if (max != null && max > 0) {\n try {\n const api = params.getters.GetBruceApi({\n accountId: params.accountId\n });\n const stats = await api.GET(\"account/summary-stats\") as PendingAction.IAction;\n if (stats?.ID) {\n const result = stats?.Result;\n try {\n const resJson = JSON.parse(result);\n const fileBytes = resJson.TotalStorageUseBytes;\n const fileGB = fileBytes != null && !isNaN(fileBytes) && fileBytes != -1 ? MathUtils.Round(fileBytes / 1024 / 1024 / 1024, 2) : null;\n\n // Still counting so we'll give unlimited for the time being.\n // This count can take ages so we won't make the user wait.\n if (fileGB == null || isNaN(fileGB)) {\n max = -1;\n }\n else {\n current = fileGB;\n }\n }\n // We won't count this as a fatal error because who knows how stable this is.\n catch (e) {\n console.error(e);\n }\n }\n // Unknown so we'll just give unlimited for the time being.\n else {\n max = -1;\n }\n }\n catch (e) {\n console.error(e);\n max = null;\n }\n }\n\n // Optional param for a file size to add to the current storage amount.\n // Eg: user is uploading a 3gb file, is that allowed right now?\n if (current != -1 && !isNaN(params.fileSize) && params.fileSize) {\n current += MathUtils.Round(params.fileSize / 1024 / 1024 / 1024, 3);\n }\n\n if (max == null) {\n return {\n allowed: false,\n errorText: \"We apologize but file uploads are currently unavailable.\"\n };\n }\n else if (max == -1) {\n return {\n allowed: true\n };\n }\n else if (current == -1) {\n return {\n allowed: false,\n errorText: \"We apologize but file uploads are currently unavailable.\"\n };\n }\n else if (current >= max) {\n return {\n allowed: false,\n errorText: `You have reached the maximum amount of storage allowed for your account. You are limited to ${max.toLocaleString()} ${max == 1 ? \"GB\" : \"GBs\"} of storage.`\n };\n }\n return {\n allowed: true\n };\n }\n\n /**\n * Returns the file limit for an account.\n * If -1 is returned then it is unlimited.\n * @param params \n * @returns \n */\n export async function GetFileGBLimit(params: {\n accountId?: string,\n api?: GuardianApi.Api\n }): Promise<number> {\n if (!params.api) {\n params.api = ENVIRONMENT.Api().GetGuardianApi();\n }\n if (!params.accountId) {\n params.accountId = ENVIRONMENT.Api().GetAccountId();\n }\n\n const max = await GetNumericLimit({\n accountId: params.accountId,\n key: ELimit.MaxStorageUseGigabytes,\n onEmptyValue: 0,\n onErrorValue: null,\n api: params.api\n });\n // Our error so we'll just allow unlimited for the time being.\n if (max == null) {\n return -1;\n }\n return max;\n }\n\n /**\n * Returns the maximum file import size for an account.\n * If -1 is returned then it is unlimited.\n * @param params \n * @returns \n */\n export async function GetMaxImportSizeGB(params: {\n accountId?: string,\n api?: GuardianApi.Api\n }) {\n if (!params.api) {\n params.api = ENVIRONMENT.Api().GetGuardianApi();\n }\n if (!params.accountId) {\n params.accountId = ENVIRONMENT.Api().GetAccountId();\n }\n\n const max = await GetNumericLimit({\n accountId: params.accountId,\n key: ELimit.MaxFileImportSizeGigabytes,\n onEmptyValue: 0,\n onErrorValue: null,\n api: params.api\n });\n // Our error so we'll just allow unlimited for the time being.\n if (max == null) {\n return -1;\n }\n return max;\n }\n\n /**\n * Returns if entity creation is allowed for the account.\n */\n export async function GetCanCreateEntity(params: {\n accountId?: string,\n getters?: ApiGetters,\n // If provided we'll add a provided entity count to the current entity amount for the check.\n count?: number\n }): Promise<{\n allowed: boolean,\n errorText?: string\n }> {\n if (!params.getters) {\n params.getters = ENVIRONMENT.Api();\n }\n if (!params.accountId) {\n params.accountId = params.getters.GetAccountId();\n }\n\n let current = -1;\n let max = await GetNumericLimit({\n accountId: params.accountId,\n key: ELimit.MaxEntitiesCount,\n onEmptyValue: 0,\n onErrorValue: null,\n api: params.getters.GetGuardianApi()\n });\n\n if (max != null && max > 0) {\n try {\n const api = params.getters.GetBruceApi({\n accountId: params.accountId\n });\n const stats = await api.GET(\"account/summary-stats\") as PendingAction.IAction;\n if (stats?.ID) {\n const result = stats?.Result;\n try {\n const resJson = JSON.parse(result);\n const eCount = resJson.EntitiesCount;\n\n // Still counting so we'll give unlimited for the time being.\n // This count can take ages so we won't make the user wait.\n if (eCount == null || isNaN(eCount)) {\n max = -1;\n }\n else {\n current = eCount;\n }\n }\n // We won't count this as a fatal error because who knows how stable this is.\n catch (e) {\n console.error(e);\n }\n }\n // Unknown so we'll just give unlimited for the time being.\n else {\n max = -1;\n }\n }\n catch (e) {\n console.error(e);\n max = null;\n }\n }\n\n // Optional param for an entity count to add to the current entity amount.\n // Eg: user is creating 3 entities, is that allowed right now?\n if (current != -1 && !isNaN(params.count) && params.count) {\n current += params.count;\n // Remove one since we do an inclusive check later in the code.\n current -= 1;\n }\n\n if (max == null) {\n return {\n allowed: false,\n errorText: \"We apologize but Entity creation is currently unavailable.\"\n };\n }\n else if (max == -1) {\n return {\n allowed: true\n };\n }\n else if (current == -1) {\n return {\n allowed: false,\n errorText: \"We apologize but Entity creation is currently unavailable.\"\n };\n }\n else if (current >= max) {\n return {\n allowed: false,\n errorText: `You have reached the maximum number of Entities allowed for your account. You are limited to ${max.toLocaleString()} ${max == 1 ? \"Entity\" : \"Entities\"}.`\n };\n }\n return {\n allowed: true\n };\n }\n\n /**\n * Returns the entity limit for an account.\n * If -1 is returned then it is unlimited.\n */\n export async function GetEntityLimit(params: {\n accountId?: string,\n api?: GuardianApi.Api\n }): Promise<number> {\n if (!params.api) {\n params.api = ENVIRONMENT.Api().GetGuardianApi();\n }\n if (!params.accountId) {\n params.accountId = ENVIRONMENT.Api().GetAccountId();\n }\n\n const max = await GetNumericLimit({\n accountId: params.accountId,\n key: ELimit.MaxEntitiesCount,\n onEmptyValue: 0,\n onErrorValue: null,\n api: params.api\n });\n // Our error so we'll just allow unlimited for the time being.\n if (max == null) {\n return -1;\n }\n return max;\n }\n\n /**\n * Returns if Operator access is allowed for the account.\n * @param params\n * @returns\n */\n export async function GetCanOpenOperator(params: {\n accountId?: string,\n api?: GuardianApi.Api,\n }): Promise<{\n allowed: boolean,\n errorText?: string\n }> {\n if (!params.api) {\n params.api = ENVIRONMENT.Api().GetGuardianApi();\n }\n if (!params.accountId) {\n params.accountId = ENVIRONMENT.Api().GetAccountId();\n }\n\n const allowed = await GetBooleanLimit({\n accountId: params.accountId,\n key: ELimit.OperatorAccessAllowed,\n onEmptyValue: false,\n onErrorValue: null,\n api: params.api\n });\n\n if (allowed == null) {\n return {\n allowed: false,\n errorText: \"We apologize but Operator access is currently unavailable.\"\n };\n }\n else if (allowed) {\n return {\n allowed: true\n };\n }\n else {\n return {\n allowed: false,\n errorText: \"You do not have access to Operator.\"\n };\n }\n }\n\n /**\n * Returns SSO login settings for the account.\n * @param params \n * @returns \n */\n export async function GetSSOLoginSettings(params: {\n accountId?: string,\n api?: GuardianApi.Api,\n }): Promise<{\n enabled: boolean,\n autoRedirect: boolean,\n errorText?: string\n }> {\n if (!params.api) {\n params.api = ENVIRONMENT.Api().GetGuardianApi();\n }\n if (!params.accountId) {\n params.accountId = ENVIRONMENT.Api().GetAccountId();\n }\n\n const enabled = await GetBooleanLimit({\n accountId: params.accountId,\n key: ELimit.EnableSSOLogin,\n onEmptyValue: false,\n onErrorValue: null,\n api: params.api\n });\n const autoRedirect = await GetBooleanLimit({\n accountId: params.accountId,\n key: ELimit.EnableSSOLoginAutoRedirect,\n onEmptyValue: false,\n onErrorValue: null,\n api: params.api\n });\n\n if (enabled == null || autoRedirect == null) {\n return {\n enabled: false,\n autoRedirect: false,\n errorText: \"We apologize but SSO login is currently unavailable.\"\n };\n }\n return {\n enabled: enabled,\n autoRedirect: autoRedirect\n };\n }\n\n /**\n * Returns if public access is denied to this account.\n * @param params \n * @returns \n */\n export async function GetDenyPublicAccess(params: {\n accountId?: string,\n api?: GuardianApi.Api,\n }): Promise<boolean> {\n if (!params.api) {\n params.api = ENVIRONMENT.Api().GetGuardianApi();\n }\n if (!params.accountId) {\n params.accountId = ENVIRONMENT.Api().GetAccountId();\n }\n const enabled = await GetBooleanLimit({\n accountId: params.accountId,\n key: ELimit.DenyPublicAccess,\n // If empty then we'll assume we are not denying public access.\n onEmptyValue: false,\n // If we crash we are denying public access.\n onErrorValue: true,\n api: params.api\n });\n return enabled;\n }\n }\n\n /**\n * Cache key for requesting account limits for a specific account.\n * @param accountId \n */\n export function GetLimitsCacheKey(accountId: string) {\n return Api.ECacheKey.AccountLimits + Api.ECacheKey.Id + accountId;\n }\n}","export namespace EncryptUtils {\n // https://stackoverflow.com/questions/7616461/generate-a-hash-from-string-in-javascript\n export function Cyrb53Hash(str: string, seed: number = 0): number {\n let h1 = 0xdeadbeef ^ seed, h2 = 0x41c6ce57 ^ seed;\n for (let i = 0, ch; i < str.length; i++) {\n ch = str.charCodeAt(i);\n h1 = Math.imul(h1 ^ ch, 2654435761);\n h2 = Math.imul(h2 ^ ch, 1597334677);\n }\n h1 = Math.imul(h1 ^ (h1>>>16), 2246822507) ^ Math.imul(h2 ^ (h2>>>13), 3266489909);\n h2 = Math.imul(h2 ^ (h2>>>16), 2246822507) ^ Math.imul(h1 ^ (h1>>>13), 3266489909);\n return (4294967296 * (2097151 & h2) + (h1>>>0));\n }\n}","export namespace UrlUtils {\n /**\n * Returns a url-safe string that is human readable.\n * Eg: 'My Project View!' into 'My-Project-View'.\n * @param str \n * @returns \n */\n export function ToHumanReadable(str: string) {\n str = str.replace(/[^a-zA-Z0-9]/gi, \"-\");\n // Dedupe underscores.\n str = str.replace(/-+/g, \"-\");\n // Trim underscores.\n str = str.replace(/^-+|-+$/g, \"\");\n return str;\n }\n\n /**\n * Adds a query parameter to a url.\n * Eg: AddQueryParam('http://example.com', 'key', 'value') => 'http://example.com?key=value'\n * @param url \n * @param key \n * @param value \n * @returns \n */\n export function AddQueryParam(url: string, key: string, value: string) {\n const urlObj = new URL(url);\n urlObj.searchParams.append(key, value);\n return urlObj.toString();\n }\n}","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { ENVIRONMENT } from \"../environment\";\nimport { Entity as E } from \"../entity/entity\";\n\n/**\n * Describes the \"Data Lab\" concept within Nextspace.\n * Data lab is a query tool that allows users to search for entities.\n * Data lab queries can be saved for reuse.\n */\nexport namespace DataLab {\n // WIP.\n export interface IQuery {\n [EReqKey.Primary]: {\n OrderBy?: string;\n SortOrder?: Api.ESortOrderStr;\n Items: any[]\n },\n [EReqKey.Secondary]?: any,\n Action?: string,\n PrimaryEntityTypeID?: string;\n PrimaryEntityID?: string;\n }\n\n export enum EReqKey {\n Primary = \"PrimarySelection\",\n Secondary = \"SecondarySelection\"\n }\n\n /**\n * Runs a DataLab query.\n * @param params \n * @returns \n */\n export async function Run(params: {\n api?: BruceApi.Api,\n // The query to run.\n query: IQuery, \n // Key to identify if this is a primary or secondary selection.\n // A secondary selection builds upon or references a primary selection.\n // Default is Primary.\n key?: EReqKey, \n // The number of entities to skip.\n // Default is 0.\n skip?: number, \n // The number of entities to load.\n // Default is 50.\n load?: number,\n migrated?: boolean,\n analysis?: boolean,\n req?: Api.IReqParams\n }): Promise<{\n // The list of entities matching the query.\n // Returned if analysis=false.\n entities?: E.IEntity[]\n // Returned if analysis=true.\n totalCount?: number;\n }> \n {\n let { api, query, key, skip, load, req: reqParams, migrated, analysis } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n if (!key) {\n key = EReqKey.Primary;\n }\n if (!skip) {\n skip = 0;\n }\n if (!load) {\n load = 50;\n }\n\n let url = null;\n if (analysis) {\n url = \"entities/datalab/getMatchesCount/PrimarySelection\";\n }\n else {\n url = `entities/datalab/getMatchingEntities/${key}?skip=${skip}&load=${load}&hasMigrated=${Boolean(migrated)}`;\n }\n\n const req = api.POST(url, \n query, \n Api.PrepReqParams(reqParams)\n );\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await req;\n res({\n entities: data.Items,\n totalCount: data.MatchesCount\n });\n }\n catch (e) {\n rej(e);\n }\n });\n return prom;\n }\n}","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { ENVIRONMENT } from \"../environment\";\n\n/**\n * TODO: The analysis result is currently a mix of multiple layers of legacy.\n * We will first decide what we want it to do and then describe just the needed portions of the existing implementation.\n */\nexport namespace ImportCad {\n export interface IAnalyzeParams {\n \"TempFile.ID\": string;\n \"OriginalIFCFile.Name\": string;\n }\n\n export interface IAnalyzeRes {\n PendingActionID: number;\n }\n\n export interface IImportParams {\n \"BRZFilePath\"?: string;\n \"TempFile.ID\": string;\n \"OriginalIFCFile.Name\": string;\n \"IFCSettings\": {\n \"ClassificationRules\": {\n \"NewIFCStandard.Name\": string;\n \"IFCStandard\": string;\n \"IsExtendingAllowed\": boolean;\n \"AllowAddingNewEntityTypes\": boolean;\n \"AllowAddingNewAttributes\": boolean;\n \"EntityTypesDerivedFromAttribute\": string;\n }\n }\n }\n\n export interface IImportRes {\n PendingActionID: number;\n }\n\n export async function Analyze(params: {\n api?: BruceApi.Api, \n fileAnalyze: IAnalyzeParams, \n req?: Api.IReqParams\n }): Promise<IAnalyzeRes> {\n let { api, fileAnalyze, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n return api.POST(\"entities/PrepareIFCForImport\", fileAnalyze, Api.PrepReqParams(reqParams));\n }\n\n export async function ImportEntities(params: {\n api?: BruceApi.Api, \n fileImport: IImportParams, \n req?: Api.IReqParams\n }): Promise<IImportRes> {\n let { api, fileImport, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n return api.POST(\"entities/importIFCWithProgress\", fileImport, Api.PrepReqParams(reqParams));\n }\n\n /**\n * Parses the completed pending action result from running \"ImportEntities\".\n * This will return the root entity's id if any is present.\n * @param paResult \n */\n export function ParseRootId(paResult: string | Object): string {\n try {\n const obj = typeof paResult == \"string\" ? JSON.parse(paResult) : paResult;\n if (obj?.result?.length) {\n return obj.result[0];\n }\n }\n catch {\n // Failed to parse json.\n }\n return <any>null;\n }\n}","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { ENVIRONMENT } from \"../environment\";\n\nexport namespace ImportCsv {\n export interface IImportParams {\n \"TempFile.ID\": string;\n \"CSVSettings\": {\n \"IsTitleRow\": boolean;\n \"Delimiter\": string;\n \"IsRecordQuoted\": boolean;\n \"Columns\": string[];\n },\n \"OriginalCSVFile.Name\": string;\n \"ImportMode\": string;\n \"EntityType.ID\": string;\n \"TargetDataSchema\": any;\n \"DataMapping\": any;\n \"Layers\": number[];\n \"SkipUnresolvedRows\": boolean;\n \"DeleteNonupdatedEntities\": boolean;\n \"Async\": boolean;\n \"SkipFailedEntities\": boolean;\n }\n\n export interface IImportRes {\n PendingActionID: number;\n }\n\n export async function ImportEntities(params: {\n api?: BruceApi.Api, \n fileImport: IImportParams, \n req?: Api.IReqParams\n }): Promise<IImportRes> {\n let { api, fileImport, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n return api.POST(\"entities/importCSVWithProgress2\", fileImport, Api.PrepReqParams(reqParams));\n }\n}","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { ENVIRONMENT } from \"../environment\";\nimport { EntityTag } from \"../entity/entity-tag\";\n\nexport namespace ImportJson {\n export interface ITagExt extends EntityTag.ITag {\n IsSelected: boolean;\n }\n\n export interface IImportParams {\n \"TempFile.ID\": string;\n \"TempFile.Ext\": string;\n \"OriginalJsonFile.Name\": string;\n ImportMode: string;\n \"EntityType.ID\": string;\n DataMappingSchema: any;\n TargetDataSchema: any;\n Layers: ITagExt[];\n }\n\n export interface IImportRes {\n PendingActionID: number;\n }\n\n export async function ImportEntities(params: {\n api?: BruceApi.Api, \n fileImport: IImportParams, \n req?: Api.IReqParams\n }): Promise<IImportRes> {\n let { api, fileImport, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n return api.POST(\"entities/importJsonWithProgress\", fileImport, Api.PrepReqParams(reqParams));\n }\n}","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { ENVIRONMENT } from \"../environment\";\n\nexport namespace ImportKml {\n export interface IImportParams {\n \"TempFile.ID\": string;\n \"OriginalKMLFile.Name\": string;\n KMLFolders: any[];\n ImportMode: string;\n TotalCount: number;\n }\n\n export interface IImportRes {\n PendingActionID: number;\n }\n\n export async function ImportEntities(params: {\n api?: BruceApi.Api, \n fileImport: IImportParams, \n req?: Api.IReqParams\n }): Promise<IImportRes> {\n let { api, fileImport, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n return api.POST(\"entities/importKMLWithProgress2\", fileImport, Api.PrepReqParams(reqParams));\n }\n}","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { ClientFile } from \"../client-file/client-file\";\nimport { ENVIRONMENT } from \"../environment\";\n\n/**\n * Imported file records are created when a file is imported into Nextspace.\n * The associated file may be attached to the record.\n */\nexport namespace ImportedFile {\n /**\n * Returns cache identifier for a imported file record.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetCacheKey(1);\n * api.Cache.Remove(key);\n * }\n * @param fileId \n * @returns \n */\n export function GetCacheKey(fileId: number): string {\n return Api.ECacheKey.ImportedFile + Api.ECacheKey.Id + fileId;\n }\n\n /**\n * Returns cache identifier for a imported file record.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetCacheKey(\"abc\");\n * api.Cache.Remove(key);\n * }\n * @param rootId \n * @returns \n */\n export function GetCacheKeyByRootId(rootId: string): string {\n return Api.ECacheKey.ImportedFile + Api.ECacheKey.Id + rootId;\n }\n\n /**\n * Returns cache identifier for a list of imported files.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetListCacheKey(\"CAD\", 0);\n * api.Cache.Remove(key);\n * }\n * @param type\n * @param pageIndex\n * @returns\n */\n export function GetListCacheKey(type: EFileType, pageIndex: number): string {\n return Api.ECacheKey.ImportedFile + type + pageIndex;\n }\n\n /**\n * Describes an imported file record.\n */\n export interface IFile {\n // ID of the imported file record.\n ID: number;\n // ID of the user that imported the file.\n \"ImportedBy.User.ID\": string;\n // Date and time the file was imported.\n \"Imported.DateTime\": any;\n // Entity type ID if relevant.\n \"EntityType.ID\"?: string;\n // Root entity ID if relevant.\n \"RootEntity.ID\"?: string;\n // Data source ID if relevant.\n \"Source.ID\"?: number;\n // Pending action ID if available.\n \"PendingAction.ID\"?: number;\n // Count of new entities created.\n NewEntitiesCount?: number;\n // Count of updated entities.\n UpdatedEntitiesCount?: number;\n // ID of the client file record. May not exist.\n \"ClientFile.ID\"?: string;\n // Client file record for the imported file.\n ClientFile?: ClientFile.IFile;\n }\n\n /**\n * Known file types we can filter against.\n */\n export enum EFileType {\n CAD = \"CAD\",\n All = \"All\"\n }\n\n /**\n * Returns a list of imported files.\n * @param params \n * @returns \n */\n export async function GetList(params: {\n api?: BruceApi.Api,\n // The type of file to filter against.\n fileType?: EFileType,\n // The page index to return.\n pageIndex?: number,\n req?: Api.IReqParams\n }): Promise<{\n // The list of imported files.\n importedFiles: IFile[]\n }> {\n let { api, fileType: type, pageIndex, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n if (!type) {\n type = EFileType.All;\n }\n if (!pageIndex) {\n pageIndex = 0;\n }\n const cache = await api.GetCacheItem(GetListCacheKey(type, pageIndex), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n\n let first = true;\n let url = \"entityImportFiles\";\n if (type != EFileType.All) {\n url += \"?FileType=\" + type;\n first = false;\n }\n if (pageIndex > 0) {\n url += (first ? \"?\" : \"&\") + \"pageIndex=\" + pageIndex;\n }\n const req = api.GET(url, Api.PrepReqParams(reqParams));\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await req;\n res({\n importedFiles: data.Items\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key: GetListCacheKey(type, pageIndex),\n value: prom,\n req: reqParams\n });\n return prom;\n }\n\n /**\n * Returns a list of imported files for a root entity.\n * @param params \n * @returns \n */\n export async function GetListByRootId(params: {\n api?: BruceApi.Api,\n // The root entity ID to filter against.\n rootId: string,\n req?: Api.IReqParams\n }): Promise<{\n // The list of imported files.\n importedFiles: IFile[]\n }> {\n let { api, rootId, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const cache = await api.GetCacheItem(GetCacheKeyByRootId(rootId), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(`entityImportFiles?Entity.ID=${rootId}`, Api.PrepReqParams(reqParams));\n res({\n importedFiles: data.Items\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key: GetCacheKeyByRootId(rootId),\n value: prom,\n req: reqParams\n });\n return prom;\n }\n\n /**\n * Returns an imported file record.\n * @param params \n * @returns \n */\n export async function Get(params: {\n api?: BruceApi.Api,\n // The ID of the imported file record.\n importedFileId: number,\n req?: Api.IReqParams\n }): Promise<{\n // The imported file record.\n importedFile: IFile\n }> {\n let { api, importedFileId: fileId, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const cache = await api.GetCacheItem(GetCacheKey(fileId), reqParams);\n if (cache?.found) {\n return cache.data;\n }\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(`entityImportFile/${fileId}`, Api.PrepReqParams(reqParams));\n res({\n importedFile: data\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key: GetCacheKey(fileId),\n value: prom,\n req: reqParams\n });\n return prom;\n }\n}","import { Cartes, EntityAttachmentType } from \"../bruce-models\";\n\n/**\n * Description of a \"Markup\" which is stored in bookmark records.\n */\nexport namespace Markup {\n /**\n * Describes a markup that is embedded in a bookmark.\n */\n export interface IMarkup {\n // Array of HTML divs to render.\n // These are used for text boxes, and shapes.\n divs?: Div.IDiv[];\n // Array of lines to render.\n // These can be used for callout lines, lines that connect between divs, etc.\n vectors?: (Line.ILine | FreePaint.IPaint)[];\n // Array of cesium entities to render.\n cesiumObjects?: (Polygon.IPolygon | Polyline.IPolyline | Circle.ICircle | Walkscore.IWalkscore)[];\n // Width/height of the markup in pixels.\n // This is used to scale against the viewer's screen size.\n width?: number;\n height?: number;\n // @Deprecated.\n defaultCameraPos?: any;\n // Default = true.\n visible?: boolean;\n }\n\n /**\n * Base of all markup elements.\n */\n export interface IElement {\n // Unique id of the element within the markup.\n // Warning: IAnchor elements are not elements and do not have an id.\n // Anchors only exist as sub elements to other items.\n id: string;\n // Human readable name for the element.\n // This is presented in editing screens to help differentiate elements.\n name?: string;\n // Default = true.\n visible?: boolean;\n // The screen position of the original drawn element.\n // Used to determine if anything needs to change based on viewer's screen size.\n screenWidth?: number;\n screenHeight?: number;\n }\n\n export namespace Div {\n // Types of div that can be created.\n export enum EType {\n // Default, no special handling.\n Default = \"default\",\n // Callout, assumes it will be positioned in 3d space.\n // Assumes existence of line that is used to anchor it.\n Callout = \"callout\"\n }\n\n export enum EAnchorDivSide {\n // “absolute” is now deprecated and a legacy value for TopLeft\n TopLeft = \"TopLeft\",\n BottomLeft = \"BottomLeft\",\n BottomRight = \"BottomRight\",\n TopRight = \"TopRight\"\n }\n\n export interface IDiv extends IElement {\n // Type of div. Determines how it is rendered / positioned.\n type?: EType;\n // The div's content.\n contentRows: IRow[];\n // Css box shadow.\n boxShadow?: IBoxShadow;\n // Css border radius.\n borderRadius?: number;\n // If the border radius should be in pixels or percent.\n borderUsingPercent?: boolean;\n // Css border color.\n borderColor?: string;\n // Css border width.\n borderWidth?: number;\n // Screen x/y position in pixels.\n // @deprecated. Use left/top/right/bottom instead depending on position.\n x?: number;\n y?: number;\n // Left/top/right/bottom in pixels.\n left?: number;\n top?: number;\n right?: number;\n bottom?: number;\n // Width/height in pixels.\n width: number;\n height: number;\n // Default is absolute. When fixed the UI panels won't shift the div.\n position?: EAnchorDivSide | \"fixed\" | \"absolute\";\n backgroundColor?: string;\n fontColor?: string;\n fontSize?: number;\n }\n\n // Describes css box shadow.\n export interface IBoxShadow {\n horizontal: number;\n vertical: number;\n blur: number;\n spread: number;\n color: string;\n }\n\n // Describes a content row.\n export interface IRow {\n items: IRowItem[];\n height: number;\n }\n\n // Describes expected content of a row cell.\n export enum EItemType {\n // Default, no special handling.\n Default = \"DEFAULT\",\n // Embed, assume content is html.\n // Make it take over the whole cell instead of padding it and such.\n Embed = \"EMBED\",\n // Content is expected to be an SVG or font-awesome icon.\n Icon = \"ICON\",\n // Content is expected to be an image.\n Image = \"IMAGE\",\n // No content. Only a shape.\n None = \"NONE\"\n }\n\n export interface IRowItem {\n // Text or HTML to display.\n text?: string;\n // Embedded HTML to render when item type is \"EMBED\".\n // Different to text as text will be auto-cleaned.\n embedRaw?: string;\n // Embedded ICON to render when item type is \"ICON\".\n // Icon is expected to be a font-awesome icon.\n icon?: string;\n // Action ot perform when this cell is clicked.\n action?: ItemAction.IItemAction;\n // Background image to use.\n bgImage?: IRowItemImage;\n // Css background color.\n backgroundColor?: string;\n // Css font color.\n fontColor?: string;\n // Css font size.\n fontSize?: number;\n // Css horizontal text alignment.\n textAlign?: string;\n // Css vertical text alignment.\n verticalAlign?: string;\n // Padding in pixels to apply to all 4 sides.\n // @deprecated, use innerPadding instead.\n padding?: number;\n // Css padding to apply.\n innerPadding?: string;\n // Css text shadow.\n textShadow?: ITextShadow;\n // Expected content type. Dictates if special handling is needed.\n contentType?: EItemType;\n // Width of the cell in percent of total row width.\n width?: number;\n }\n\n // Describes a cell's background image.\n export interface IRowItemImage {\n // Client file id of the image.\n FileID?: string;\n // If the markup's entity's default image should be used.\n UseEntityDefault?: boolean;\n }\n\n // Describes css text shadow.\n export interface ITextShadow {\n horizontal: number;\n vertical: number;\n blur: number;\n color: string;\n }\n\n export namespace ItemAction {\n export interface IActionLinkParams {\n // URL to open.\n // URL may be a path to the markup's entity's attribute data.\n // If \"${\" and \"}\" exist in the URL, then it has entity attribute data.\n URL?: string;\n // If the URL should be opened in a new tab.\n openInNewTab?: boolean;\n // If the markup should be closed when the link is opened.\n closeMarkupOnOpen?: boolean;\n }\n \n export interface IActionBookmarkParams {\n // Id of the bookmark to enable.\n // Assumes view id matches currently rendering view.\n bookmarkID?: string;\n }\n\n export interface IActionInfoViewParams {\n\n }\n\n export interface IActionRelationParams {\n\n }\n\n export interface IActionGalleryParams {\n documentType?: EntityAttachmentType.EType | string;\n }\n\n export interface IItemAction {\n type: ItemAction.EType;\n params: IActionLinkParams | IActionInfoViewParams | IActionRelationParams | IActionGalleryParams;\n }\n\n // Types of actions that can be performed when a cell is clicked.\n // Null = \"NONE\".\n export enum EType {\n None = \"NONE\",\n // Open a link specified in params.\n OpenLink = \"LINK\",\n // Open the markup's entity's details panel.\n OpenInfoView = \"INFOVIEW\",\n // Open the markup's entity's gallery popup.\n OpenEntityGallery = \"GALLERY\",\n // Toggle visibility of the markup's entity's relationships.\n ToggleRelationships = \"RELATIONSHIPS\",\n // Dictates this cell can be used to drag the div around.\n Draggable = \"DRAGABBLE\",\n // Closes the markup.\n Close = \"CLOSE\",\n // Opens a bookmark specified in params.\n OpenBookmark = \"BOOKMARK\"\n }\n }\n\n export const DEFAULT: IDiv = {\n contentRows: [\n {\n height: 100,\n items: [\n {\n contentType: EItemType.Default,\n text: \"Type here...\",\n width: 100,\n backgroundColor: \"white\",\n fontColor: \"black\",\n textAlign: \"center\",\n verticalAlign: \"center\",\n fontSize: 15\n }\n ]\n }\n ],\n height: null,\n width: null,\n id: null,\n left: null,\n top: null,\n right: null,\n bottom: null,\n borderColor: \"black\",\n borderWidth: 1,\n borderUsingPercent: false,\n borderRadius: 8,\n type: EType.Default\n };\n }\n\n export namespace Line {\n // Describes a line end's head.\n export enum ELineHead {\n None = \"NONE\",\n Circle = \"CIRCLE\",\n Arrow = \"ARROW\"\n }\n\n export interface ILine extends IElement {\n pathType: \"LINE\";\n // SVG path string.\n path: string;\n // SVG transform string.\n transform: string;\n // Snaps determine where the ends of the line snap to.\n // This can be 3d positions, screen positions or links to markup DIVs.\n // Calculated positions of the snaps will then alter the path of the line.\n snaps: IAnchor[];\n // Css color of the line.\n brushColor?: string;\n // Css stroke width of the line.\n brushSize?: number;\n // Determines if the line should angle towards its destination instead of being straight.\n angled?: boolean;\n // Backwards compatibility.\n // Use brushHead on anchors instead when available.\n brushHead?: ELineHead;\n // Css color of the brush head.\n outlineColor?: string;\n }\n\n // Dictates where on a DIV an anchor should snap to.\n export enum EAnchorDivSide {\n TopLeft = 0,\n TopRight = 1,\n BottomLeft = 2,\n BottomRight = 3,\n Center = 4,\n CenterLeft = 5,\n CenterRight = 6,\n CenterTop = 7,\n CenterBottom = 8\n }\n\n // Dictates what end of the line an anchor should render on.\n export enum EAnchorLineSide {\n Start = 0,\n End = 1,\n }\n\n export interface IAnchor {\n // Id of markup DIV that this anchor is attached to.\n id?: string;\n // Side of the markup DIV we are attached to.\n snapPosition?: EAnchorDivSide;\n // Side of the line we are attached to.\n side?: EAnchorLineSide;\n // How the anchor should be drawn in the context of a line.\n brushHead?: ELineHead;\n // Css fill color.\n fill?: string;\n // Determines size of anchor's \"ARROW\" head.\n size?: number;\n // Multiplied by \"size\" to determine size of anchor \"CIRCLE\" head.\n outlineFactor?: number;\n // Css stroke color.\n stroke?: string;\n // 3d world position.\n cartesian?: Cartes.ICartes3;\n // 2d screen position.\n screenPos?: Cartes.ICartes2;\n // If the anchor's position should be relative to the markup's entity.\n positionFromEntity?: boolean;\n }\n\n export const DEFAULT: ILine = {\n brushColor: \"rgba(255, 255, 255, 1)\",\n brushSize: 4,\n path: null,\n pathType: \"LINE\",\n transform: null,\n snaps: null,\n id: null\n };\n }\n\n export namespace FreePaint {\n // Describes a free-paint end's head.\n export enum EPaintHead {\n None = \"NONE\",\n Circle = \"CIRCLE\",\n Arrow = \"ARROW\"\n }\n\n export interface IPaint extends IElement {\n pathType: \"PLAIN\";\n // SVG path string.\n path: string;\n // SVG transform string.\n transform: string;\n // Css color of the line.\n brushColor?: string;\n // Css stroke width of the line.\n brushSize?: number;\n // Style of the ends of the free-paint.\n brushHead?: EPaintHead;\n // Css color of the brush head if one is used.\n // Eg arrow or circle heads.\n outlineColor?: string;\n }\n\n export const DEFAULT: IPaint = {\n brushColor: \"rgba(255, 255, 255, 1)\",\n brushSize: 4,\n path: null,\n pathType: \"PLAIN\",\n transform: null,\n id: null\n };\n }\n\n export namespace Polygon {\n // Determines if terrain and 3d models should be overlapped or not.\n export enum EClassificationType {\n // 3d models and terrain are overlapped.\n Both = \"BOTH\",\n // Only terrain is overlapped.\n Terrain = \"TERRAIN\"\n }\n\n export interface IPolygon extends IElement {\n type: \"POLYGON\";\n // 3d positions of the polygon.\n positions: Cartes.ICartes3[];\n // Css color of the polygon.\n color?: string;\n // Css color of the polygon's outline.\n outlineColor?: string;\n // Width of the polygon's outline in pixels.\n outlineWidth?: number;\n // Height of the polygon in meters.\n extrudedHeight?: number;\n // Determines if terrain and 3d models should be overlapped or not.\n classificationType?: EClassificationType;\n // Determines how many times to run Chaikin's algorithm on the polygon.\n // Null or 0 means no smoothing.\n smoothen?: number;\n }\n\n export const DEFAULT: IPolygon = {\n type: \"POLYGON\",\n id: null,\n positions: null,\n color: \"rgba(254, 234, 57, 0.54)\",\n outlineColor: \"rgba(215, 215, 215, 0)\",\n outlineWidth: 2,\n extrudedHeight: 0,\n classificationType: EClassificationType.Both,\n smoothen: 0\n };\n }\n\n export namespace Polyline {\n export interface IPolyline extends IElement {\n type: \"POLYLINE\";\n // 3d positions of the polyline.\n positions: Cartes.ICartes3[];\n // Css color of the polyline.\n color?: string;\n // Width of the polyline in pixels.\n outlineWidth?: number;\n // Determines how many times to run Chaikin's algorithm on the polygon.\n // Null or 0 means no smoothing.\n smoothen?: number;\n }\n\n export const DEFAULT: IPolyline = {\n type: \"POLYLINE\",\n id: null,\n positions: null,\n color: \"rgba(254, 234, 57, 0.54)\",\n outlineWidth: 4,\n smoothen: 0\n };\n }\n\n export namespace Circle {\n export interface ICircle extends IElement {\n type: \"CIRCLE\",\n // 3d position of the circle.\n position: Cartes.ICartes3;\n // Radius of the circle in meters.\n radius: number;\n // Css color of the circle.\n color?: string;\n // Width of the outline in meters.\n outlineWidth?: number;\n // Height of the circle in meters.\n extrudedHeight?: number;\n // Height of the circle's outline in meters.\n outlineExtrusion?: number;\n // Css color of the circle's outline.\n outlineColor?: string;\n }\n\n export const DEFAULT: ICircle = {\n type: \"CIRCLE\",\n id: null,\n position: null,\n radius: 50,\n color: \"rgba(254, 234, 57, 0.54)\"\n };\n }\n\n export namespace Walkscore {\n export interface IWalkscore extends IElement {\n type: \"WALKSCORE\";\n // 3d position of the walkscore.\n cartesian: Cartes.ICartes3;\n // Walkscore value out of 100.\n details: number;\n }\n }\n}","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { UTC } from \"../common/utc\";\nimport { ENVIRONMENT } from \"../environment\";\nimport { Uploader } from \"../internal/uploader\";\nimport { ObjectUtils } from \"../util/object-utils\";\n\nexport namespace Plugin {\n /**\n * Describes a plugin record.\n */\n export interface IPlugin {\n // ID of the plugin.\n ID: string,\n // Human readable name of the plugin.\n Name: string,\n // Description of the plugin.\n Description?: string,\n // Version of the plugin. This is bumped when you upload a new code bundle.\n Version?: number,\n // Icon to display for the plugin.\n // This is either a font-awesome icon or a client file ID.\n Icon?: string,\n // Dictates how the icon should be interpreted.\n IconSource?: \"FONT_AWESOME\" | \"CLIENT_FILE\",\n // Location where the plugin can be used.\n // This is specific to various applications.\n Location: string,\n // If access to the plugin should be restricted.\n // When a plugin is restricted a user must have the \"Plugin_<pluginId>\" permission.\n IsAccessRestricted?: boolean,\n // If the plugin requires a user to be logged in to use it.\n IsLoginRequired?: boolean,\n // Last date/time the plugin was updated.\n \"LastUpdated.Date\"?: UTC.IUTC,\n // Date/time the plugin was created.\n \"Created.Date\"?: UTC.IUTC\n }\n\n /**\n * Returns a plugin record.\n * @param params \n * @returns \n */\n export async function Get(params: {\n api?: BruceApi.Api,\n // ID of the plugin to get.\n pluginId: string,\n req?: Api.IReqParams\n }): Promise<{\n // Plugin record.\n plugin: IPlugin\n }> {\n let { api, pluginId, req } = params;\n if (!pluginId) {\n throw (\"Plugin ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const cache = await api.GetCacheItem(GetCacheKey(pluginId), req);\n if (cache?.found) {\n return cache.data;\n }\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(`ui.plugin/${pluginId}`, Api.PrepReqParams(req));\n res({\n plugin: data\n });\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key: GetCacheKey(pluginId),\n value: prom,\n req: req\n });\n return prom;\n }\n\n /**\n * Returns a list of plugins.\n * @param params \n * @returns \n */\n export async function GetList(params: {\n api?: BruceApi.Api,\n req?: Api.IReqParams\n }): Promise<{\n // List of plugins.\n plugins: IPlugin[]\n }> {\n let { api, req } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const cache = await api.GetCacheItem(GetListCacheKey(), req);\n if (cache?.found) {\n return cache.data;\n }\n const prom: Promise<any> = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(\"ui.plugins\", Api.PrepReqParams(req));\n res({\n plugins: data.Items\n })\n }\n catch (e) {\n rej(e);\n }\n });\n await api.SetCacheItem({\n key: GetListCacheKey(),\n value: prom,\n req: req\n });\n return prom;\n }\n\n /**\n * Returns a URL to load a plugin.\n * @param params \n * @returns \n */\n export function GetLoadUrl(params: {\n api?: BruceApi.Api,\n // ID of the plugin to load.\n pluginId: string,\n // Version of the plugin to load.\n cacheKey?: number | string\n }): {\n // URL to load the plugin.\n indexFileUrl: string\n } {\n let { api, pluginId, cacheKey } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n if (!cacheKey) {\n cacheKey = 0;\n }\n return {\n indexFileUrl: api.ConstructUrl({\n url: `ui.plugin/${pluginId}/file/index.jsc`,\n urlParams: {\n \"version\": String(cacheKey)\n }\n })\n }\n }\n\n /**\n * Creates or updates a plugin.\n * @param params \n */\n export async function Update(params: {\n // Plugin to create or update.\n plugin: IPlugin,\n api?: BruceApi.Api,\n req?: Api.IReqParams\n }): Promise<void> {\n let { plugin, api, req } = params;\n if (!plugin.Name) {\n throw(\"Plugin name is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n if (!plugin.ID) {\n plugin.ID = ObjectUtils.UId();\n }\n await api.POST(`ui.plugin/${plugin.ID}`, plugin, Api.PrepReqParams(req));\n api.Cache.Remove(GetCacheKey(plugin.ID));\n api.Cache.Remove(GetListCacheKey());\n api.Cache.RemoveByStartsWith(GetIndexFileCacheKey(plugin.ID, \"\"));\n }\n\n /**\n * Deletes a plugin.\n * @param params \n */\n export async function Delete(params: {\n // ID of the plugin to delete.\n pluginId: string,\n api?: BruceApi.Api,\n req?: Api.IReqParams\n }): Promise<void> {\n let { pluginId, api, req } = params;\n if (!pluginId) {\n throw(\"Plugin ID is required.\");\n }\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n await api.DELETE(`ui.plugin/${pluginId}`, Api.PrepReqParams(req));\n api.Cache.Remove(GetCacheKey(pluginId));\n api.Cache.Remove(GetListCacheKey());\n api.Cache.RemoveByStartsWith(GetIndexFileCacheKey(pluginId, \"\"));\n }\n\n /**\n * Warning: This will replace the contents of your plugin.\n * Upload only ZIP files.\n * @param params \n */\n export async function Upload(params: {\n pluginId: string,\n api?: BruceApi.Api,\n file: File,\n onProgress?: (progress: Uploader.IProgress) => void,\n req?: Api.IUploadReqParams\n }): Promise<void> {\n let { pluginId, api, file, onProgress, req } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n if (!pluginId || !file) {\n throw(\"Plugin ID and file are required.\");\n }\n req = Api.PrepReqParams(req) as Api.IUploadReqParams;\n req.onProgress = (progress: ProgressEvent) => {\n const percent = Math.round ((progress.loaded / file.size) * 100);\n onProgress?.({\n percent: percent,\n uploaded: false\n });\n };\n await api.UPLOAD(`ui.plugin/${pluginId}/file`, file, req);\n api.Cache.Remove(GetCacheKey(pluginId));\n api.Cache.Remove(GetListCacheKey());\n api.Cache.RemoveByStartsWith(GetIndexFileCacheKey(pluginId, \"\"));\n }\n\n /**\n * Returns a run function to call that'll load a plugin within your provided container element.\n * The run function will return a dispose function to call to remove the plugin.\n * @param params \n * @returns \n */\n export async function GetRunFunction(params: {\n // If container does not have an HTML ID, one will be assigned to it.\n containerId?: string;\n container?: HTMLElement;\n\n // Arbitrary params to pass into the plugin.\n pluginParams?: any;\n \n // Params required to get the plugin load file.\n api?: BruceApi.Api,\n // Either plugin or plugin ID must be supplied.\n pluginId?: string,\n plugin?: Plugin.IPlugin,\n\n req?: Api.IReqParams\n }): Promise<{\n // Function to run to initialize the plugin.\n // This function will run eval on a generated script within your container.\n // It will return a dispose function to call.\n run: () => () => void\n }> {\n let { containerId, container, pluginParams, pluginId, plugin, api, req } = params;\n if (!containerId && container) {\n containerId = container.id;\n if (!containerId) {\n containerId = ObjectUtils.UId();\n container.id = containerId;\n }\n }\n if (!plugin && pluginId) {\n plugin = (await Plugin.Get({\n pluginId,\n api\n })).plugin;\n }\n if (plugin && !pluginId) {\n pluginId = plugin.ID;\n }\n const { indexFileUrl } = GetLoadUrl({\n api,\n pluginId,\n cacheKey: plugin.Version\n });\n\n req = Api.PrepReqParams(req) as Api.IUploadReqParams;\n const cacheData = api.GetCacheItem(GetIndexFileCacheKey(pluginId, indexFileUrl), req)\n\n let fileContentProm = null;\n if (cacheData?.found) {\n fileContentProm = cacheData.data;\n }\n else {\n fileContentProm = fetch(indexFileUrl).then((res) => res.text());\n api.SetCacheItem({\n key: GetIndexFileCacheKey(pluginId, indexFileUrl),\n value: fileContentProm,\n req: req \n });\n }\n\n // We changed the expected plugin code without changing the API response so we need to read and reformat the file content.\n // TODO: Create a v3 request that gives us the plugin code in a more usable format.\n\n let fileContent = await fileContentProm;\n const start = fileContent.indexOf(\"{\");\n const end = fileContent.lastIndexOf(\"}\");\n fileContent = fileContent.substring(start + 1, end);\n\n const paramsId = ObjectUtils.UId();\n window[paramsId] = pluginParams ? pluginParams : {};\n const disposeId = ObjectUtils.UId();\n const elementId = ObjectUtils.UId();\n\n let script = `\n function run() {\n ${fileContent}\n\n const paramsId = \"${paramsId}\";\n const containerId = \"${containerId}\";\n let container;\n if (containerId) {\n container = document.getElementById(\"${containerId}\");\n }\n\n let pluginHTML = null;\n if (container) {\n pluginHTML = document.createElement(\"div\");\n pluginHTML.id = \"${elementId}\";\n container.appendChild(pluginHTML);\n }\n\n {TEMPLATE_CODE}\n const params = window[\"${paramsId}\"];\n\n window[\"${disposeId}\"] = Run({\n element: pluginHTML,\n container: container,\n pluginParams: params,\n pluginId: \"${pluginId}\"\n });\n }\n run();\n `;\n if (script.includes(\"var template\")) {\n script = script.replace(\"{TEMPLATE_CODE}\", `\n if (pluginHTML && template) {\n pluginHTML.innerHTML = template;\n }\n `);\n }\n else {\n script = script.replace(\"{TEMPLATE_CODE}\", \"\");\n }\n\n return {\n run: () => {\n // 'eval2 = eval' stops the linter from complaining about using eval.\n const eval2 = eval;\n eval2(script);\n\n // Ensure a function is returned, even if the plugin is not configured properly to return one.\n if (!window[disposeId] || typeof window[disposeId] !== \"function\") {\n window[disposeId] = () => {\n console.warn(\"Plugin called to be disposed but no dispose function was found.\");\n };\n }\n const callDispose = window[disposeId];\n return () => {\n if (elementId) {\n const element = (window as any).document.getElementById(elementId);\n if (element && element.parentElement) {\n element.parentElement.removeChild(element);\n }\n }\n callDispose();\n };\n }\n }\n }\n\n /**\n * Returns cache identifier for a plugin.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetCacheKey(\"abc\");\n * api.Cache.Remove(key);\n * }\n * @param pluginId\n * @returns \n */\n export function GetCacheKey(pluginId: string): string {\n return `${Api.ECacheKey.Plugin}${Api.ECacheKey.Id}${pluginId}`;\n }\n \n /**\n * Returns cache identifier for a list of plugins.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetListCacheKey();\n * api.Cache.Remove(key);\n * }\n * @returns\n */\n export function GetListCacheKey(): string {\n return Api.ECacheKey.Plugin;\n }\n\n /**\n * Returns cache identifier for a plugin index file.\n * @param pluginId\n * @param indexFileUrl \n * @returns \n */\n export function GetIndexFileCacheKey(pluginId: string, indexFileUrl: string): string {\n return `${Api.ECacheKey.PluginIndexFile}${Api.ECacheKey.Id}${pluginId}${Api.ECacheKey.Id}${indexFileUrl}`;\n }\n}","import { Api } from \"../api/api\";\nimport { BruceApi } from \"../api/bruce-api\";\nimport { EntityAttribute } from \"../entity/entity-attribute\";\nimport { ENVIRONMENT } from \"../environment\";\n\nexport namespace DataSource {\n /**\n * Describes a data source record.\n */\n export interface ISource {\n // Not set for new records.\n ID?: number;\n // Human readable data source name.\n Name: string;\n // The data source baseurl.\n URL?: string;\n // The kind of data source this is.\n // This helps guide the Nextspace API and UI on how to use this data source.\n Type?: Type;\n // Data boundaries in degrees if known.\n MinLatitude?: number;\n MaxLatitude?: number;\n MinLongitude?: number;\n MaxLongitude?: number;\n // Data schema for the external source.\n DataSchema?: EntityAttribute.IAttribute;\n // Settings for the external source.\n Parameters?: object;\n }\n\n // Known data source types.\n export enum EType {\n // A data source that is simply a mapping between external IDs and internal IDs.\n // This is used by the Cesium OSM source for example.\n IDMapping = \"IDMapping\"\n }\n export type Type = EType | string;\n\n /**\n * Creates or updates a data source.\n * @param params \n * @returns \n */\n export async function Update(params: {\n // The data source to create or update.\n source: ISource,\n api?: BruceApi.Api,\n req?: Api.IReqParams\n }) {\n let { source: data, api, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n const url = `source` + (data.ID == null ? \"\" : \"/\" + data.ID);\n const res = await api.POST(url, data, Api.PrepReqParams(reqParams));\n await api.Cache.Remove(GetCacheKey(<number>data.ID));\n await api.Cache.Remove(GetListCacheKey());\n\n return {\n source: res\n };\n }\n\n /**\n * Deletes a data source.\n * @param params \n */\n export async function Delete(params: {\n // The ID of the data source to delete.\n id: number,\n api?: BruceApi.Api,\n req?: Api.IReqParams\n }) {\n let { id, api, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n await api.DELETE(`source/${id}`, Api.PrepReqParams(reqParams));\n await api.Cache.Remove(GetCacheKey(id));\n await api.Cache.Remove(GetListCacheKey());\n }\n\n /**\n * Gets a data source by ID.\n * @param params \n * @returns \n */\n export async function Get(params: {\n // The ID of the data source to get.\n id: number,\n api?: BruceApi.Api,\n req?: Api.IReqParams\n }) {\n let { id, api, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n reqParams = Api.PrepReqParams(reqParams);\n const cacheData = await api.GetCacheItem(GetCacheKey(id), reqParams);\n if (cacheData?.found) {\n return cacheData.data;\n }\n\n const prom = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(`source/${id}`, Api.PrepReqParams(reqParams));\n res({\n source: data\n });\n }\n catch (e) {\n rej(e);\n }\n });\n api.SetCacheItem({\n key: GetCacheKey(id),\n value: prom,\n req: reqParams\n });\n return prom;\n }\n\n /**\n * Gets a list of data sources.\n * @param params \n * @returns \n */\n export async function GetList(params: {\n api?: BruceApi.Api,\n req?: Api.IReqParams\n }) {\n let { api, req: reqParams } = params;\n if (!api) {\n api = ENVIRONMENT.Api().GetBruceApi();\n }\n\n reqParams = Api.PrepReqParams(reqParams);\n const cacheData = await api.GetCacheItem(GetListCacheKey(), reqParams);\n if (cacheData?.found) {\n return cacheData.data;\n }\n \n const prom = new Promise(async (res, rej) => {\n try {\n const data = await api.GET(\"sources\", Api.PrepReqParams(reqParams))\n res({\n sources: data?.Items\n });\n }\n catch (e) {\n rej(e);\n }\n });\n api.SetCacheItem({\n key: GetListCacheKey(),\n value: prom,\n req: reqParams\n });\n return prom;\n }\n\n /**\n * Returns cache identifier for a data source by ID.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetCacheKey(1);\n * api.Cache.Remove(key);\n * }\n * @param id \n * @returns \n */\n export function GetCacheKey(id: number): string {\n return Api.ECacheKey.DataSource + Api.ECacheKey.Id + id;\n }\n \n /**\n * Returns cache identifier for a list of data sources.\n * Example: {\n * const api: BruceApi.Api = ...;\n * const key = GetListCacheKey();\n * api.Cache.Remove(key);\n * }\n * @returns\n */\n export function GetListCacheKey(): string {\n return Api.ECacheKey.DataSource;\n }\n}","export * from \"./ann-document/ann-document\";\n\nexport * from \"./custom-form/custom-form\";\nexport * from \"./custom-form/custom-form-content\";\n\nexport * from \"./api/abstract-api\";\nexport * from \"./api/api\";\nexport * from \"./api/bruce-api\";\nexport * from \"./api/global-api\";\nexport * from \"./api/guardian-api\";\nexport * from \"./api/api-getters\";\n\nexport * from \"./calculator/calculator\";\n\nexport * from \"./common/bounds\";\nexport * from \"./common/bruce-event\";\nexport * from \"./common/cache\";\nexport * from \"./common/camera\";\nexport * from \"./common/cartes\";\nexport * from \"./common/carto\";\nexport * from \"./common/color\";\nexport * from \"./common/delay-queue\";\nexport * from \"./common/dictionary\";\nexport * from \"./common/geometry\";\nexport * from \"./common/transform\";\nexport * from \"./common/utc\";\nexport * from \"./common/bruce-variable\";\nexport * from \"./common/lru-cache\";\nexport * from \"./common/section\";\n\nexport * from \"./entity/entity-attachment-type\";\nexport * from \"./entity/entity-attachment\";\nexport * from \"./entity/entity-comment\";\nexport * from \"./entity/entity-link\";\nexport * from \"./entity/entity-lod\";\nexport * from \"./entity/entity-lod-category\";\nexport * from \"./entity/entity-relation-type\";\nexport * from \"./entity/entity-relation\";\nexport * from \"./entity/entity-source\";\nexport * from \"./entity/entity-tag\";\nexport * from \"./entity/entity-type\";\nexport * from \"./entity/entity\";\nexport * from \"./entity/entity-coords\";\nexport * from \"./entity/entity-type-visual-settings\";\nexport * from \"./entity/entity-attribute\";\nexport * from \"./entity/entity-historic-data\";\nexport * from \"./entity/entity-table-view\";\n\nexport * from \"./entity-type-model/comment\";\n\nexport * from \"./client-file/client-file\";\n\nexport * from \"./program-key/program-key\";\n\nexport * from \"./project/zoom-control\";\nexport * from \"./project/menu-item\";\nexport * from \"./project/project-view-bookmark\";\nexport * from \"./project/project-view\";\nexport * from \"./project/project-view-legacy-tile\";\nexport * from \"./project/project-view-tile\";\nexport * from \"./project/project-view-selection\";\nexport * from \"./project/project-view-legacy\";\nexport * from \"./project/project-view-legacy-bookmark\";\n\nexport * from \"./server/pending-action\";\nexport * from \"./server/message-broker\";\nexport * from \"./server/hosting-location\";\n\nexport * from \"./style/style\";\n\nexport * from \"./tileset/tileset\";\n\nexport * from \"./user/permission\";\nexport * from \"./user/session\";\nexport * from \"./user/user-group\";\nexport * from \"./user/user\";\n\nexport * from \"./account/account\";\nexport * from \"./account/account-settings\";\nexport * from \"./account/account-invite\";\nexport * from \"./account/account-features\";\nexport * from \"./account/account-limits\";\n\nexport * from \"./util/encrypt-utils\";\nexport * from \"./util/math-utils\";\nexport * from \"./util/object-utils\";\nexport * from \"./util/path-utils\";\nexport * from \"./util/url-utils\";\n\nexport * from \"./data-lab/data-lab\";\n\nexport * from \"./import/import-cad\";\nexport * from \"./import/import-csv\";\nexport * from \"./import/import-json\";\nexport * from \"./import/import-kml\";\nexport * from \"./import/imported-file\";\n\nexport * from \"./markup/markup\";\nexport * from \"./internal/uploader\";\nexport * from \"./plugin/plugin\";\nexport * from \"./environment\";\nexport * from \"./data-source/data-source\";\n\n// This is updated with the package.json version on build.\nexport const VERSION = \"4.6.3\";"],"names":["Api","MessageBroker","A","GuardianApi","Account","BruceApi","GlobalApi","ENVIRONMENT","AnnDocument","CustomForm","Color","Geometry","ObjectUtils","EntityAttribute","EntityType","PathUtils","ZoomControl","Entity","EntityHistoricData","BruceVariable","Calculator","Bounds","Camera","Cartes","Carto","UTC","EntityAttachmentType","EntityAttachment","EntityComment","EntityLink","EntityLod","EntityLodCategory","EntityRelationType","EntityRelation","EntitySource","EntityTag","MathUtils","EntityCoords","EntityTypeVisualSettings","EntityTableView","Style","Comment","Uploader","ClientFile","ProgramKey","Tileset","MenuItem","ProjectViewBookmark","ProjectView","ProjectViewLegacyTile","ProjectViewTile","ProjectViewLegacy","ProjectViewLegacyBookmark","PendingAction","HostingLocation","Permission","Session","UserGroup","User","AccountInvite","AccountFeatures","AccountLimits","EncryptUtils","UrlUtils","DataLab","ImportCad","ImportCsv","ImportJson","ImportKml","ImportedFile","Markup","Plugin","DataSource"],"mappings":"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"}